diff --git a/.gitignore b/.gitignore index 1f236e77908..1f0dde4c51f 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,8 @@ bin gen *.log +# Ignore macOS Spotlight rubbish +.DS_Store # TODO: specify what these ignores are for (releasing?) diff --git a/README.md b/README.md index 7e4bedb6df9..26c3d1e5e0a 100644 --- a/README.md +++ b/README.md @@ -2,7 +2,7 @@ [Official GitLab repo](https://git.cardforge.org/core-developers/forge). -Dev instructions here: [Getting Started](https://www.slightlymagic.net/wiki/Forge:How_to_Get_Started_Developing_Forge) (Somewhat outdated) +Dev instructions here: [Getting Started](https://git.cardforge.org/core-developers/forge/-/wikis/(SM-autoconverted)-how-to-get-started-developing-forge) (Somewhat outdated) Discord channel [here](https://discordapp.com/channels/267367946135928833/267742313390931968) @@ -168,11 +168,11 @@ The resulting snapshot will be found at: forge-gui-desktop/target/forge-gui-desk ## IntelliJ -Quick start guide for [setting up the Forge project within IntelliJ](https://git.cardforge.org/core-developers/forge/wikis/intellij-setup). +Quick start guide for [setting up the Forge project within IntelliJ](https://git.cardforge.org/core-developers/forge/-/wikis/Development/intellij-setup). ## Card Scripting -Visit [this page](https://www.slightlymagic.net/wiki/Forge_API) for information on scripting. +Visit [this page](https://git.cardforge.org/core-developers/forge/-/wikis/Card-scripting-API/Card-scripting-API) for information on scripting. Card scripting resources are found in the forge-gui/res/ path. diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index c3ef8885a03..e0c01f01feb 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -54,7 +54,6 @@ import forge.util.TextUtil; import forge.util.collect.FCollectionView; -//doesHumanAttackAndWin() uses the global variable AllZone.getComputerPlayer() /** *

* ComputerUtil_Attack2 class. @@ -412,12 +411,10 @@ public class AiAttackController { final Player opp = this.defendingOpponent; - // Increase the total number of blockers needed by 1 if Finest Hour in - // play + // Increase the total number of blockers needed by 1 if Finest Hour in play // (human will get an extra first attack with a creature that untaps) // In addition, if the computer guesses it needs no blockers, make sure - // that - // it won't be surprised by Exalted + // that it won't be surprised by Exalted final int humanExaltedBonus = opp.countExaltedBonus(); if (humanExaltedBonus > 0) { @@ -427,8 +424,7 @@ public class AiAttackController { // total attack = biggest creature + exalted, *2 if Rafiq is in play int humanBasePower = getAttack(this.oppList.get(0)) + humanExaltedBonus; if (finestHour) { - // For Finest Hour, one creature could attack and get the - // bonus TWICE + // For Finest Hour, one creature could attack and get the bonus TWICE humanBasePower = humanBasePower + humanExaltedBonus; } final int totalExaltedAttack = opp.isCardInPlay("Rafiq of the Many") ? 2 * humanBasePower @@ -449,7 +445,6 @@ public class AiAttackController { return notNeededAsBlockers; } - // this uses a global variable, which isn't perfect public final boolean doesHumanAttackAndWin(final Player ai, final int nBlockingCreatures) { int totalAttack = 0; int totalPoison = 0; @@ -681,7 +676,6 @@ public class AiAttackController { * @return a {@link forge.game.combat.Combat} object. */ public final void declareAttackers(final Combat combat) { - if (this.attackers.isEmpty()) { return; } @@ -716,7 +710,7 @@ public class AiAttackController { int attackMax = restrict.getMax(); if (attackMax == -1) { // check with the local limitations vs. the chosen defender - attackMax = ComputerUtilCombat.getMaxAttackersFor(defender); + attackMax = restrict.getDefenderMax().get(defender) == null ? -1 : restrict.getDefenderMax().get(defender); } if (attackMax == 0) { @@ -776,7 +770,6 @@ public class AiAttackController { return; } - if (bAssault) { if (LOG_AI_ATTACKS) System.out.println("Assault"); @@ -850,7 +843,6 @@ public class AiAttackController { // no more creatures to attack return; } - // ******************* // Evaluate the creature forces @@ -935,12 +927,9 @@ public class AiAttackController { // ********************* // if outnumber and superior ratio work out whether attritional all out - // attacking will work - // attritional attack will expect some creatures to die but to achieve - // victory by sheer weight - // of numbers attacking turn after turn. It's not calculate very - // carefully, the accuracy - // can probably be improved + // attacking will work attritional attack will expect some creatures to die but to achieve + // victory by sheer weight of numbers attacking turn after turn. It's not calculate very + // carefully, the accuracy can probably be improved // ********************* boolean doAttritionalAttack = false; // get list of attackers ordered from low power to high @@ -974,7 +963,6 @@ public class AiAttackController { doAttritionalAttack = true; } } - // System.out.println(doAttritionalAttack + " = do attritional attack"); // ********************* // end attritional attack calculation // ********************* @@ -1024,11 +1012,9 @@ public class AiAttackController { // end see how long until unblockable attackers will be fatal // ***************** - // decide on attack aggression based on a comparison of forces, life - // totals and other considerations - // some bad "magic numbers" here, TODO replace with nice descriptive - // variable names + // totals and other considerations some bad "magic numbers" here + // TODO replace with nice descriptive variable names if (ratioDiff > 0 && doAttritionalAttack) { this.aiAggression = 5; // attack at all costs } else if ((ratioDiff >= 1 && this.attackers.size() > 1 && (humanLifeToDamageRatio < 2 || outNumber > 0)) @@ -1223,9 +1209,8 @@ public class AiAttackController { } // look at the attacker in relation to the blockers to establish a - // number of factors about the attacking - // context that will be relevant to the attackers decision according to - // the selected strategy + // number of factors about the attacking context that will be relevant + // to the attackers decision according to the selected strategy for (final Card defender : validBlockers) { // if both isWorthLessThanAllKillers and canKillAllDangerous are false there's nothing more to check if (isWorthLessThanAllKillers || canKillAllDangerous || numberOfPossibleBlockers < 2) { @@ -1299,14 +1284,11 @@ public class AiAttackController { } if (numberOfPossibleBlockers > 2 - || (numberOfPossibleBlockers >= 1 && CombatUtil.canAttackerBeBlockedWithAmount(attacker, 1, combat)) - || (numberOfPossibleBlockers == 2 && CombatUtil.canAttackerBeBlockedWithAmount(attacker, 2, combat))) { + || (numberOfPossibleBlockers >= 1 && CombatUtil.canAttackerBeBlockedWithAmount(attacker, 1, this.defendingOpponent)) + || (numberOfPossibleBlockers == 2 && CombatUtil.canAttackerBeBlockedWithAmount(attacker, 2, this.defendingOpponent))) { canBeBlocked = true; } - /*System.out.println(attacker + " canBeKilledByOne: " + canBeKilledByOne + " canKillAll: " - + canKillAll + " isWorthLessThanAllKillers: " + isWorthLessThanAllKillers + " canBeBlocked: " + canBeBlocked);*/ - // decide if the creature should attack based on the prevailing strategy - // choice in aiAggression + // decide if the creature should attack based on the prevailing strategy choice in aiAggression switch (this.aiAggression) { case 6: // Exalted: expecting to at least kill a creature of equal value or not be blocked if ((canKillAll && isWorthLessThanAllKillers) || !canBeBlocked) { @@ -1441,7 +1423,7 @@ public class AiAttackController { public String toProtectAttacker(SpellAbility sa) { //AiAttackController is created with the selected attacker as the only entry in "attackers" if (sa.getApi() != ApiType.Protection || oppList.isEmpty() || getPossibleBlockers(oppList, attackers).isEmpty()) { - return null; //not protection sa or attacker is already unblockable + return null; //not protection sa or attacker is already unblockable } final List choices = ProtectEffect.getProtectionList(sa); String color = ComputerUtilCard.getMostProminentColor(getPossibleBlockers(oppList, attackers)), artifact = null; @@ -1451,7 +1433,7 @@ public class AiAttackController { if (!choices.contains(color)) { color = null; } - for (Card c : oppList) { //find a blocker that ignores the currently selected protection + for (Card c : oppList) { //find a blocker that ignores the currently selected protection if (artifact != null && !c.isArtifact()) { artifact = null; } @@ -1484,7 +1466,7 @@ public class AiAttackController { break; } } - if (color == null && artifact == null) { //nothing can make the attacker unblockable + if (color == null && artifact == null) { //nothing can make the attacker unblockable return null; } } @@ -1562,4 +1544,4 @@ public class AiAttackController { return true; } -} // end class ComputerUtil_Attack2 +} diff --git a/forge-ai/src/main/java/forge/ai/AiBlockController.java b/forge-ai/src/main/java/forge/ai/AiBlockController.java index ca567fdcb4a..a6b16cb648d 100644 --- a/forge-ai/src/main/java/forge/ai/AiBlockController.java +++ b/forge-ai/src/main/java/forge/ai/AiBlockController.java @@ -180,11 +180,9 @@ public class AiBlockController { // Good Blocks means a good trade or no trade private void makeGoodBlocks(final Combat combat) { - List currentAttackers = new ArrayList<>(attackersLeft); for (final Card attacker : attackersLeft) { - if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") || attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.") || attacker.hasKeyword(Keyword.MENACE)) { @@ -192,7 +190,6 @@ public class AiBlockController { } Card blocker = null; - final List blockers = getPossibleBlockers(combat, attacker, blockersLeft, true); final List safeBlockers = getSafeBlockers(combat, attacker, blockers); @@ -305,7 +302,6 @@ public class AiBlockController { } Card blocker = null; - final List blockers = getPossibleBlockers(combat, attacker, blockersLeft, true); for (Card b : blockers) { @@ -366,10 +362,9 @@ public class AiBlockController { final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker) + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, blocker, combat, false); // if the total damage of the blockgang was not enough - // without but is enough with this blocker finish the - // blockgang + // without but is enough with this blocker finish the blockgang if (ComputerUtilCombat.totalFirstStrikeDamageOfBlockers(attacker, blockGang) < damageNeeded - || CombatUtil.needsBlockers(attacker) > blockGang.size()) { + || CombatUtil.getMinNumBlockersForAttacker(attacker, ai) > blockGang.size()) { blockGang.add(blocker); if (ComputerUtilCombat.totalFirstStrikeDamageOfBlockers(attacker, blockGang) >= damageNeeded) { currentAttackers.remove(attacker); @@ -407,7 +402,7 @@ public class AiBlockController { boolean foundDoubleBlock = false; // if true, a good double block is found // AI can't handle good blocks with more than three creatures yet - if (CombatUtil.needsBlockers(attacker) > (considerTripleBlock ? 3 : 2)) { + if (CombatUtil.getMinNumBlockersForAttacker(attacker, ai) > (considerTripleBlock ? 3 : 2)) { continue; } @@ -444,7 +439,7 @@ public class AiBlockController { final int addedValue = ComputerUtilCard.evaluateCreature(blocker); final int damageNeeded = ComputerUtilCombat.getDamageToKill(attacker) + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, blocker, combat, false); - if ((damageNeeded > currentDamage || CombatUtil.needsBlockers(attacker) > blockGang.size()) + if ((damageNeeded > currentDamage || CombatUtil.getMinNumBlockersForAttacker(attacker, ai) > blockGang.size()) && !(damageNeeded > currentDamage + additionalDamage) // The attacker will be killed && (absorbedDamage2 + absorbedDamage > attacker.getNetCombatDamage() @@ -454,8 +449,7 @@ public class AiBlockController { || (lifeInDanger && ComputerUtilCombat.lifeInDanger(ai, combat))) // or life is in danger && CombatUtil.canBlock(attacker, blocker, combat)) { - // this is needed for attackers that can't be blocked by - // more than 1 + // this is needed for attackers that can't be blocked by more than 1 currentAttackers.remove(attacker); combat.addBlocker(attacker, blocker); if (CombatUtil.canBlock(attacker, leader, combat)) { @@ -496,7 +490,7 @@ public class AiBlockController { final int addedValue3 = ComputerUtilCard.evaluateCreature(secondBlocker); final int netCombatDamage = attacker.getNetCombatDamage(); - if ((damageNeeded > currentDamage || CombatUtil.needsBlockers(attacker) > blockGang.size()) + if ((damageNeeded > currentDamage || CombatUtil.getMinNumBlockersForAttacker(attacker, ai) > blockGang.size()) && !(damageNeeded > currentDamage + additionalDamage2 + additionalDamage3) // The attacker will be killed && ((absorbedDamage2 + absorbedDamage > netCombatDamage && absorbedDamage3 + absorbedDamage > netCombatDamage @@ -510,8 +504,7 @@ public class AiBlockController { // or life is in danger && CombatUtil.canBlock(attacker, secondBlocker, combat) && CombatUtil.canBlock(attacker, thirdBlocker, combat)) { - // this is needed for attackers that can't be blocked by - // more than 1 + // this is needed for attackers that can't be blocked by more than 1 currentAttackers.remove(attacker); combat.addBlocker(attacker, thirdBlocker); if (CombatUtil.canBlock(attacker, secondBlocker, combat)) { @@ -587,12 +580,10 @@ public class AiBlockController { * @param combat a {@link forge.game.combat.Combat} object. */ private void makeTradeBlocks(final Combat combat) { - List currentAttackers = new ArrayList<>(attackersLeft); List killingBlockers; for (final Card attacker : attackersLeft) { - if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") || attacker.hasKeyword(Keyword.MENACE) || attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { @@ -628,7 +619,6 @@ public class AiBlockController { // Chump Blocks (should only be made if life is in danger) private void makeChumpBlocks(final Combat combat) { - List currentAttackers = new ArrayList<>(attackersLeft); makeChumpBlocks(combat, currentAttackers); @@ -639,7 +629,6 @@ public class AiBlockController { } private void makeChumpBlocks(final Combat combat, List attackers) { - if (attackers.isEmpty() || !ComputerUtilCombat.lifeInDanger(ai, combat)) { return; } @@ -694,11 +683,9 @@ public class AiBlockController { // Block creatures with "can't be blocked except by two or more creatures" private void makeMultiChumpBlocks(final Combat combat) { - List currentAttackers = new ArrayList<>(attackersLeft); for (final Card attacker : currentAttackers) { - if (!attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") && !attacker.hasKeyword(Keyword.MENACE) && !attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { @@ -730,14 +717,12 @@ public class AiBlockController { /** Reinforce blockers blocking attackers with trample (should only be made if life is in danger) */ private void reinforceBlockersAgainstTrample(final Combat combat) { - List chumpBlockers; List tramplingAttackers = CardLists.getKeyword(attackers, Keyword.TRAMPLE); tramplingAttackers = CardLists.filter(tramplingAttackers, Predicates.not(rampagesOrNeedsManyToBlock)); - // TODO - should check here for a "rampage-like" trigger that replaced - // the keyword: + // TODO - should check here for a "rampage-like" trigger that replaced the keyword: // "Whenever CARDNAME becomes blocked, it gets +1/+1 until end of turn for each creature blocking it." for (final Card attacker : tramplingAttackers) { @@ -764,7 +749,6 @@ public class AiBlockController { /** Support blockers not destroying the attacker with more blockers to try to kill the attacker */ private void reinforceBlockersToKill(final Combat combat) { - List safeBlockers; List blockers; List targetAttackers = CardLists.filter(blockedButUnkilled, Predicates.not(rampagesOrNeedsManyToBlock)); @@ -1036,27 +1020,21 @@ public class AiBlockController { } else { lifeInDanger = false; } - // if life is still in danger - // Reinforce blockers blocking attackers with trample if life is - // still - // in danger + // Reinforce blockers blocking attackers with trample if life is still in danger if (lifeInDanger && ComputerUtilCombat.lifeInDanger(ai, combat)) { reinforceBlockersAgainstTrample(combat); } else { lifeInDanger = false; } // Support blockers not destroying the attacker with more blockers - // to - // try to kill the attacker + // to try to kill the attacker if (!lifeInDanger) { reinforceBlockersToKill(combat); } - // == 2. If the AI life would still be in danger make a safer - // approach == + // == 2. If the AI life would still be in danger make a safer approach == if (lifeInDanger && ComputerUtilCombat.lifeInDanger(ai, combat)) { - clearBlockers(combat, possibleBlockers); // reset every block - // assignment + clearBlockers(combat, possibleBlockers); // reset every block assignment makeTradeBlocks(combat); // choose necessary trade blocks // if life is in danger makeGoodBlocks(combat); @@ -1066,8 +1044,7 @@ public class AiBlockController { } else { lifeInDanger = false; } - // Reinforce blockers blocking attackers with trample if life is - // still in danger + // Reinforce blockers blocking attackers with trample if life is still in danger if (lifeInDanger && ComputerUtilCombat.lifeInDanger(ai, combat)) { reinforceBlockersAgainstTrample(combat); } else { @@ -1077,11 +1054,9 @@ public class AiBlockController { reinforceBlockersToKill(combat); } - // == 3. If the AI life would be in serious danger make an even - // safer approach == + // == 3. If the AI life would be in serious danger make an even safer approach == if (lifeInDanger && ComputerUtilCombat.lifeInSeriousDanger(ai, combat)) { - clearBlockers(combat, possibleBlockers); // reset every block - // assignment + clearBlockers(combat, possibleBlockers); // reset every block assignment makeChumpBlocks(combat); // choose chump blocks if (ComputerUtilCombat.lifeInDanger(ai, combat)) { makeTradeBlocks(combat); // choose necessary trade @@ -1090,15 +1065,13 @@ public class AiBlockController { if (!ComputerUtilCombat.lifeInDanger(ai, combat)) { makeGoodBlocks(combat); } - // Reinforce blockers blocking attackers with trample if life is - // still in danger + // Reinforce blockers blocking attackers with trample if life is still in danger else { reinforceBlockersAgainstTrample(combat); } makeGangBlocks(combat); // Support blockers not destroying the attacker with more - // blockers - // to try to kill the attacker + // blockers to try to kill the attacker reinforceBlockersToKill(combat); } } @@ -1108,7 +1081,7 @@ public class AiBlockController { chumpBlockers.addAll(CardLists.getKeyword(blockersLeft, "CARDNAME blocks each combat if able.")); // if an attacker with lure attacks - all that can block for (final Card blocker : blockersLeft) { - if (CombatUtil.mustBlockAnAttacker(blocker, combat)) { + if (CombatUtil.mustBlockAnAttacker(blocker, combat, null)) { chumpBlockers.add(blocker); } } @@ -1118,7 +1091,7 @@ public class AiBlockController { blockers = getPossibleBlockers(combat, attacker, chumpBlockers, false); for (final Card blocker : blockers) { if (CombatUtil.canBlock(attacker, blocker, combat) && blockersLeft.contains(blocker) - && (CombatUtil.mustBlockAnAttacker(blocker, combat) + && (CombatUtil.mustBlockAnAttacker(blocker, combat, null) || blocker.hasKeyword("CARDNAME blocks each turn if able.") || blocker.hasKeyword("CARDNAME blocks each combat if able."))) { combat.addBlocker(attacker, blocker); @@ -1137,7 +1110,6 @@ public class AiBlockController { } } - // check to see if it's possible to defend a Planeswalker under attack with a chump block, // unless life is low enough to be more worried about saving preserving the life total if (ai.getController().isAI() && !ComputerUtilCombat.lifeInDanger(ai, combat)) { diff --git a/forge-ai/src/main/java/forge/ai/AiController.java b/forge-ai/src/main/java/forge/ai/AiController.java index ede9f756fde..e1a9e70e8da 100644 --- a/forge-ai/src/main/java/forge/ai/AiController.java +++ b/forge-ai/src/main/java/forge/ai/AiController.java @@ -34,6 +34,7 @@ import forge.ai.ability.ChangeZoneAi; import forge.ai.ability.ExploreAi; import forge.ai.ability.LearnAi; import forge.ai.simulation.SpellAbilityPicker; +import forge.card.CardStateName; import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.deck.CardPool; @@ -46,6 +47,7 @@ import forge.game.Game; import forge.game.GameActionUtil; import forge.game.GameEntity; import forge.game.GlobalRuleChange; +import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.ability.SpellApiBased; @@ -78,6 +80,7 @@ import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; import forge.game.replacement.ReplaceMoved; import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementLayer; import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilitySub; import forge.game.spellability.LandAbility; @@ -307,6 +310,8 @@ public class AiController { } exSA.setTrigger(tr); + // need to set TriggeredObject + exSA.setTriggeringObject(AbilityKey.Card, card); // for trigger test, need to ignore the conditions SpellAbilityCondition cons = exSA.getConditions(); @@ -432,17 +437,22 @@ public class AiController { } } - // don't play the land if it has cycling and enough lands are available - final FCollectionView spellAbilities = c.getSpellAbilities(); - final CardCollectionView hand = player.getCardsIn(ZoneType.Hand); CardCollection lands = new CardCollection(battlefield); lands.addAll(hand); lands = CardLists.filter(lands, CardPredicates.Presets.LANDS); int maxCmcInHand = Aggregates.max(hand, CardPredicates.Accessors.fnGetCmc); - for (final SpellAbility sa : spellAbilities) { - if (sa.isCycling()) { - if (lands.size() >= Math.max(maxCmcInHand, 6)) { + + if (lands.size() >= Math.max(maxCmcInHand, 6)) { + // don't play MDFC land if other side is spell and enough lands are available + if (!c.isLand() || (c.isModal() && !c.getState(CardStateName.Modal).getType().isLand())) { + return false; + } + + // don't play the land if it has cycling and enough lands are available + final FCollectionView spellAbilities = c.getSpellAbilities(); + for (final SpellAbility sa : spellAbilities) { + if (sa.isCycling()) { return false; } } @@ -503,20 +513,35 @@ public class AiController { //try to skip lands that enter the battlefield tapped if (!nonLandsInHand.isEmpty()) { - CardCollection nonTappeddLands = new CardCollection(); + CardCollection nonTappedLands = new CardCollection(); for (Card land : landList) { - // Is this the best way to check if a land ETB Tapped? - if (land.hasSVar("ETBTappedSVar")) { + // check replacement effects if land would enter tapped or not + final Map repParams = AbilityKey.mapFromAffected(land); + repParams.put(AbilityKey.Origin, land.getZone().getZoneType()); + repParams.put(AbilityKey.Destination, ZoneType.Battlefield); + repParams.put(AbilityKey.Source, land); + + boolean foundTapped = false; + for (ReplacementEffect re : player.getGame().getReplacementHandler().getReplacementList(ReplacementType.Moved, repParams, ReplacementLayer.Other)) { + SpellAbility reSA = re.ensureAbility(); + if (reSA == null || !ApiType.Tap.equals(reSA.getApi())) { + continue; + } + reSA.setActivatingPlayer(reSA.getHostCard().getController()); + if (reSA.metConditions()) { + foundTapped = true; + break; + } + } + + if (foundTapped) { continue; } - // Glacial Fortress and friends - if (land.hasSVar("ETBCheckSVar") && CardFactoryUtil.xCount(land, land.getSVar("ETBCheckSVar")) == 0) { - continue; - } - nonTappeddLands.add(land); + + nonTappedLands.add(land); } - if (!nonTappeddLands.isEmpty()) { - landList = nonTappeddLands; + if (!nonTappedLands.isEmpty()) { + landList = nonTappedLands; } } @@ -587,8 +612,7 @@ public class AiController { SpellAbility currentSA = sa; sa.setActivatingPlayer(player); // check everything necessary - - + AiPlayDecision opinion = canPlayAndPayFor(currentSA); //PhaseHandler ph = game.getPhaseHandler(); // System.out.printf("Ai thinks '%s' of %s @ %s %s >>> \n", opinion, sa, Lang.getPossesive(ph.getPlayerTurn().getName()), ph.getPhase()); @@ -1301,15 +1325,6 @@ public class AiController { } public boolean confirmStaticApplication(Card hostCard, GameEntity affected, String logic, String message) { - if (logic.equalsIgnoreCase("ProtectFriendly")) { - final Player controller = hostCard.getController(); - if (affected instanceof Player) { - return !((Player) affected).isOpponentOf(controller); - } - if (affected instanceof Card) { - return !((Card) affected).getController().isOpponentOf(controller); - } - } return true; } @@ -1408,8 +1423,6 @@ public class AiController { private List singleSpellAbilityList(SpellAbility sa) { if (sa == null) { return null; } - // System.out.println("Chosen to play: " + sa); - final List abilities = Lists.newArrayList(); abilities.add(sa); return abilities; @@ -1454,6 +1467,13 @@ public class AiController { if (!game.getPhaseHandler().is(PhaseType.MAIN1) || !isSafeToHoldLandDropForMain2(land)) { final List abilities = Lists.newArrayList(); + // TODO extend this logic to evaluate MDFC with both sides land + // this can only happen if its a MDFC land + if (!land.isLand()) { + land.setState(CardStateName.Modal, true); + land.setBackSide(true); + } + LandAbility la = new LandAbility(land, player, null); la.setCardState(land.getCurrentState()); if (la.canPlay()) { @@ -1704,10 +1724,8 @@ public class AiController { for (int i = 0; i < numToExile; i++) { Card chosen = null; for (final Card c : grave) { // Exile noncreatures first in - // case we can revive. Might - // wanna do some additional - // checking here for Flashback - // and the like. + // case we can revive. Might wanna do some additional + // checking here for Flashback and the like. if (!c.isCreature()) { chosen = c; break; @@ -1746,12 +1764,21 @@ public class AiController { * @param sa the sa * @return true, if successful */ - public final boolean aiShouldRun(final ReplacementEffect effect, final SpellAbility sa) { + public final boolean aiShouldRun(final ReplacementEffect effect, final SpellAbility sa, GameEntity affected) { Card hostCard = effect.getHostCard(); if (hostCard.hasAlternateState()) { hostCard = game.getCardState(hostCard); } + if (effect.hasParam("AILogic") && effect.getParam("AILogic").equalsIgnoreCase("ProtectFriendly")) { + final Player controller = hostCard.getController(); + if (affected instanceof Player) { + return !((Player) affected).isOpponentOf(controller); + } + if (affected instanceof Card) { + return !((Card) affected).getController().isOpponentOf(controller); + } + } if (effect.hasParam("AICheckSVar")) { System.out.println("aiShouldRun?" + sa); final String svarToCheck = effect.getParam("AICheckSVar"); @@ -1766,7 +1793,7 @@ public class AiController { compareTo = Integer.parseInt(strCmpTo); } catch (final Exception ignored) { if (sa == null) { - compareTo = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(strCmpTo)); + compareTo = AbilityUtils.calculateAmount(hostCard, hostCard.getSVar(strCmpTo), effect); } else { compareTo = AbilityUtils.calculateAmount(hostCard, hostCard.getSVar(strCmpTo), sa); } @@ -1776,7 +1803,7 @@ public class AiController { int left = 0; if (sa == null) { - left = CardFactoryUtil.xCount(hostCard, hostCard.getSVar(svarToCheck)); + left = AbilityUtils.calculateAmount(hostCard, svarToCheck, effect); } else { left = AbilityUtils.calculateAmount(hostCard, svarToCheck, sa); } @@ -1866,11 +1893,13 @@ public class AiController { } else if ("LowestLoseLife".equals(logic)) { return MyRandom.getRandom().nextInt(Math.min(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1; } else if ("HighestLoseLife".equals(logic)) { - return MyRandom.getRandom().nextInt(Math.max(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1; + return Math.min(player.getLife() -1,MyRandom.getRandom().nextInt(Math.max(player.getLife() / 3, player.getWeakestOpponent().getLife())) + 1); } else if ("HighestGetCounter".equals(logic)) { return MyRandom.getRandom().nextInt(3); } else if (source.hasSVar("EnergyToPay")) { return AbilityUtils.calculateAmount(source, source.getSVar("EnergyToPay"), sa); + } else if ("Vermin".equals(logic)) { + return MyRandom.getRandom().nextInt(Math.max(player.getLife() - 5, 0)); } return max; } @@ -1965,7 +1994,6 @@ public class AiController { return result; } - // this is where the computer cheats // changes AllZone.getComputerPlayer().getZone(Zone.Library) @@ -2245,10 +2273,8 @@ public class AiController { } } - // AI logic for choosing which replacement effect to apply - // happens here. + // AI logic for choosing which replacement effect to apply happens here. return Iterables.getFirst(list, null); } } - diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 17fb2007fab..99f2234841e 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -280,7 +280,7 @@ public class ComputerUtil { SpellAbility newSA = sa.copyWithNoManaCost(); newSA.setActivatingPlayer(ai); - if (!CostPayment.canPayAdditionalCosts(newSA.getPayCosts(), newSA)) { + if (!CostPayment.canPayAdditionalCosts(newSA.getPayCosts(), newSA) || !ComputerUtilMana.canPayManaCost(newSA, ai, 0)) { return false; } @@ -1125,7 +1125,7 @@ public class ComputerUtil { creatures2.add(creatures.get(i)); } } - if (((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0)).size()) > 1) + if (((creatures2.size() + CardUtil.getThisTurnCast("Creature.YouCtrl", vengevines.get(0), null).size()) > 1) && card.isCreature() && card.getManaCost().getCMC() <= 3) { return true; } @@ -2253,10 +2253,8 @@ public class ComputerUtil { String chosen = ""; if (kindOfType.equals("Card")) { // TODO - // computer will need to choose a type - // based on whether it needs a creature or land, - // otherwise, lib search for most common type left - // then, reveal chosenType to Human + // computer will need to choose a type based on whether it needs a creature or land, + // otherwise, lib search for most common type left then, reveal chosenType to Human if (game.getPhaseHandler().is(PhaseType.UNTAP) && logic == null) { // Storage Matrix double amount = 0; for (String type : CardType.getAllCardTypes()) { @@ -2434,8 +2432,7 @@ public class ComputerUtil { if (!source.canReceiveCounters(p1p1Type)) { return opponent ? "Feather" : "Quill"; } - // if source is not on the battlefield anymore, choose +1/+1 - // ones + // if source is not on the battlefield anymore, choose +1/+1 ones if (!game.getCardState(source).isInZone(ZoneType.Battlefield)) { return opponent ? "Feather" : "Quill"; } @@ -2477,8 +2474,7 @@ public class ComputerUtil { return opponent ? "Numbers" : "Strength"; } - // TODO check for ETB to +1/+1 counters - // or over another trigger like lifegain + // TODO check for ETB to +1/+1 counters or over another trigger like lifegain int tokenScore = ComputerUtilCard.evaluateCreature(token); @@ -2556,8 +2552,7 @@ public class ComputerUtil { return "Taxes"; } else { // ai is first voter or ally of controller - // both are not affected, but if opponents controll creatures, - // sacrifice is worse + // both are not affected, but if opponents control creatures, sacrifice is worse return controller.getOpponents().getCreaturesInPlay().isEmpty() ? "Taxes" : "Death"; } default: @@ -2854,7 +2849,6 @@ public class ComputerUtil { } public static boolean lifegainNegative(final Player player, final Card source, final int n) { - if (!player.canGainLife()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java index 19172312c04..b710879376f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCard.java @@ -76,7 +76,7 @@ public class ComputerUtilCard { } }); } - return ComputerUtilCard.getMostExpensivePermanentAI(all); + return getMostExpensivePermanentAI(all); } /** @@ -265,16 +265,14 @@ public class ComputerUtilCard { * @return a {@link forge.game.card.Card} object. */ public static Card getBestAI(final Iterable list) { - // Get Best will filter by appropriate getBest list if ALL of the list - // is of that type + // Get Best will filter by appropriate getBest list if ALL of the list is of that type if (Iterables.all(list, CardPredicates.Presets.CREATURES)) { return ComputerUtilCard.getBestCreatureAI(list); } if (Iterables.all(list, CardPredicates.Presets.LANDS)) { return getBestLandAI(list); } - // TODO - Once we get an EvaluatePermanent this should call - // getBestPermanent() + // TODO - Once we get an EvaluatePermanent this should call getBestPermanent() return ComputerUtilCard.getMostExpensivePermanentAI(list); } @@ -383,7 +381,7 @@ public class ComputerUtilCard { } if (biasLand && Iterables.any(list, CardPredicates.Presets.LANDS)) { - return ComputerUtilCard.getWorstLand(CardLists.filter(list, CardPredicates.Presets.LANDS)); + return getWorstLand(CardLists.filter(list, CardPredicates.Presets.LANDS)); } final boolean hasCreatures = Iterables.any(list, CardPredicates.Presets.CREATURES); @@ -393,7 +391,7 @@ public class ComputerUtilCard { List lands = CardLists.filter(list, CardPredicates.Presets.LANDS); if (lands.size() > 6) { - return ComputerUtilCard.getWorstLand(lands); + return getWorstLand(lands); } if (hasEnchantmants || hasArtifacts) { @@ -410,8 +408,7 @@ public class ComputerUtilCard { return getWorstCreatureAI(CardLists.filter(list, CardPredicates.Presets.CREATURES)); } - // Planeswalkers fall through to here, lands will fall through if there - // aren't very many + // Planeswalkers fall through to here, lands will fall through if there aren't very many return getCheapestPermanentAI(list, null, false); } @@ -444,7 +441,7 @@ public class ComputerUtilCard { public static final Comparator EvaluateCreatureComparator = new Comparator() { @Override public int compare(final Card a, final Card b) { - return ComputerUtilCard.evaluateCreature(b) - ComputerUtilCard.evaluateCreature(a); + return evaluateCreature(b) - evaluateCreature(a); } }; @@ -882,9 +879,9 @@ public class ComputerUtilCard { public static final Predicate AI_KNOWS_HOW_TO_PLAY_ALL_CARDS = new Predicate() { @Override public boolean apply(Deck d) { - for(Entry cp: d) { - for(Entry e : cp.getValue()) { - if ( e.getKey().getRules().getAiHints().getRemAIDecks() ) + for (Entry cp: d) { + for (Entry e : cp.getValue()) { + if (e.getKey().getRules().getAiHints().getRemAIDecks()) return false; } } @@ -982,7 +979,7 @@ public class ComputerUtilCard { for(byte c : MagicColor.WUBRG) { String devotionCode = "Count$Devotion." + MagicColor.toLongString(c); - int devotion = CardFactoryUtil.xCount(sa.getHostCard(), devotionCode); + int devotion = AbilityUtils.calculateAmount(sa.getHostCard(), devotionCode, sa); if (devotion > curDevotion && !CardLists.filter(hand, CardPredicates.isColor(c)).isEmpty()) { curDevotion = devotion; chosenColor = MagicColor.toLongString(c); @@ -1198,7 +1195,7 @@ public class ComputerUtilCard { } String kws = params.get("AddKeyword"); if (kws != null) { - bonusPT += 4 * (1 + StringUtils.countMatches(kws, "&")); //treat each added keyword as a +2/+2 for now + bonusPT += 4 * (1 + StringUtils.countMatches(kws, "&")); //treat each added keyword as a +2/+2 for now } if (bonusPT > 0) { threat = bonusPT * (1 + opp.getCreaturesInPlay().size()) / 10.0f; @@ -1212,7 +1209,7 @@ public class ComputerUtilCard { } final float valueNow = Math.max(valueTempo, threat); - if (valueNow < 0.2) { //hard floor to reduce ridiculous odds for instants over time + if (valueNow < 0.2) { //hard floor to reduce ridiculous odds for instants over time return false; } final float chance = MyRandom.getRandom().nextFloat(); @@ -1310,7 +1307,7 @@ public class ComputerUtilCard { threat *= 2; } if (c.getNetPower() == 0 && c == sa.getHostCard() && power > 0 ) { - threat *= 4; //over-value self +attack for 0 power creatures which may be pumped further after attacking + threat *= 4; //over-value self +attack for 0 power creatures which may be pumped further after attacking } chance += threat; @@ -1644,11 +1641,12 @@ public class ComputerUtilCard { copiedKeywords.insertAll(pumped.getKeywords()); List toCopy = Lists.newArrayList(); for (KeywordInterface k : c.getKeywords()) { - if (!copiedKeywords.contains(k.getOriginal())) { - if (k.getHidden()) { - pumped.addHiddenExtrinsicKeyword(k); + KeywordInterface copiedKI = k.copy(c, true); + if (!copiedKeywords.contains(copiedKI.getOriginal())) { + if (copiedKI.getHidden()) { + pumped.addHiddenExtrinsicKeyword(copiedKI); } else { - toCopy.add(k); + toCopy.add(copiedKI); } } } @@ -1678,37 +1676,27 @@ public class ComputerUtilCard { // remove old boost that might be copied for (final StaticAbility stAb : c.getStaticAbilities()) { vCard.removePTBoost(c.getTimestamp(), stAb.getId()); - final Map params = stAb.getMapParams(); - if (!params.get("Mode").equals("Continuous")) { + if (!stAb.getParam("Mode").equals("Continuous")) { continue; } - if (!params.containsKey("Affected")) { + if (!stAb.hasParam("Affected")) { continue; } - if (!params.containsKey("AddPower") && !params.containsKey("AddToughness")) { + if (!stAb.hasParam("AddPower") && !stAb.hasParam("AddToughness")) { continue; } - final String valid = params.get("Affected"); - if (!vCard.isValid(valid, c.getController(), c, null)) { + if (!vCard.isValid(stAb.getParam("Affected").split(","), c.getController(), c, stAb)) { continue; } int att = 0; - if (params.containsKey("AddPower")) { - String addP = params.get("AddPower"); - if (addP.equals("AffectedX")) { - att = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addP)); - } else { - att = AbilityUtils.calculateAmount(c, addP, stAb); - } + if (stAb.hasParam("AddPower")) { + String addP = stAb.getParam("AddPower"); + att = AbilityUtils.calculateAmount(addP.startsWith("Affected") ? vCard : c, addP, stAb, true); } int def = 0; - if (params.containsKey("AddToughness")) { - String addT = params.get("AddToughness"); - if (addT.equals("AffectedY")) { - def = CardFactoryUtil.xCount(vCard, AbilityUtils.getSVar(stAb, addT)); - } else { - def = AbilityUtils.calculateAmount(c, addT, stAb); - } + if (stAb.hasParam("AddToughness")) { + String addT = stAb.getParam("AddToughness"); + def = AbilityUtils.calculateAmount(addT.startsWith("Affected") ? vCard : c, addT, stAb, true); } vCard.addPTBoost(att, def, c.getTimestamp(), stAb.getId()); } diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java index ebcde781c0e..148952c0840 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCombat.java @@ -33,7 +33,6 @@ import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; @@ -335,7 +334,7 @@ public class ComputerUtilCombat { */ public static int resultingPoison(final Player ai, final Combat combat) { - // ai can't get poision counters, so the value can't change + // ai can't get poison counters, so the value can't change if (!ai.canReceiveCounters(CounterEnumType.POISON)) { return ai.getPoisonCounters(); } @@ -413,7 +412,6 @@ public class ComputerUtilCombat { return false; } - // check for creatures that must be blocked final List attackers = combat.getAttackersOf(ai); @@ -493,8 +491,7 @@ public class ComputerUtilCombat { } public static boolean lifeInSeriousDanger(final Player ai, final Combat combat, final int payment) { - // life in danger only cares about the player's life. Not about a - // Planeswalkers life + // life in danger only cares about the player's life. Not about a Planeswalkers life if (ai.cantLose() || combat == null) { return false; } @@ -569,8 +566,7 @@ public class ComputerUtilCombat { return damage; } - // This calculates the amount of damage a blocker in a blockgang can deal to - // the attacker + // This calculates the amount of damage a blocker in a blockgang can deal to the attacker /** *

* dealsDamageAsBlocker. @@ -583,7 +579,6 @@ public class ComputerUtilCombat { * @return a int. */ public static int dealsDamageAsBlocker(final Card attacker, final Card defender) { - int defenderDamage = predictDamageByBlockerWithoutDoubleStrike(attacker, defender); if (defender.hasKeyword(Keyword.DOUBLE_STRIKE)) { @@ -648,7 +643,6 @@ public class ComputerUtilCombat { * @return a int. */ public static int totalShieldDamage(final Card attacker, final List defenders) { - int defenderDefense = 0; for (final Card defender : defenders) { @@ -672,7 +666,6 @@ public class ComputerUtilCombat { * @return a int. */ public static int shieldDamage(final Card attacker, final Card blocker) { - if (ComputerUtilCombat.canDestroyBlockerBeforeFirstStrike(blocker, attacker, false)) { return 0; } @@ -777,7 +770,6 @@ public class ComputerUtilCombat { public static boolean combatTriggerWillTrigger(final Card attacker, final Card defender, final Trigger trigger, Combat combat, final List plannedAttackers) { final Game game = attacker.getGame(); - final Map trigParams = trigger.getMapParams(); boolean willTrigger = false; final Card source = trigger.getHostCard(); if (combat == null) { @@ -800,29 +792,27 @@ public class ComputerUtilCombat { if (combat.isAttacking(attacker)) { return false; // The trigger should have triggered already } - if (trigParams.containsKey("ValidCard")) { - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(",")) - && !(combat.isAttacking(source) && trigger.matchesValid(source, - trigParams.get("ValidCard").split(",")) - && !trigParams.containsKey("Alone"))) { + if (trigger.hasParam("ValidCard")) { + if (!trigger.matchesValidParam("ValidCard", attacker) + && !(combat.isAttacking(source) && trigger.matchesValidParam("ValidCard", source) + && !trigger.hasParam("Alone"))) { return false; } } - if (trigParams.containsKey("Attacked")) { - if (combat.isAttacking(attacker)) { - GameEntity attacked = combat.getDefenderByAttacker(attacker); - if (!trigger.matchesValid(attacked, trigParams.get("Attacked").split(","))) { - return false; - } - } else { - if ("You,Planeswalker.YouCtrl".equals(trigParams.get("Attacked"))) { - if (source.getController() == attacker.getController()) { - return false; - } - } - } + if (trigger.hasParam("Attacked")) { + if (combat.isAttacking(attacker)) { + if (!trigger.matchesValidParam("Attacked", combat.getDefenderByAttacker(attacker))) { + return false; + } + } else { + if ("You,Planeswalker.YouCtrl".equals(trigger.getParam("Attacked"))) { + if (source.getController() == attacker.getController()) { + return false; + } + } + } } - if (trigParams.containsKey("Alone") && plannedAttackers != null && plannedAttackers.size() != 1) { + if (trigger.hasParam("Alone") && plannedAttackers != null && plannedAttackers.size() != 1) { return false; // won't trigger since the AI is planning to attack with more than one creature } } @@ -830,10 +820,8 @@ public class ComputerUtilCombat { // defender == null means unblocked if ((defender == null) && mode == TriggerType.AttackerUnblocked) { willTrigger = true; - if (trigParams.containsKey("ValidCard")) { - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","))) { - return false; - } + if (!trigger.matchesValidParam("ValidCard", attacker)) { + return false; } } @@ -843,8 +831,8 @@ public class ComputerUtilCombat { if (mode == TriggerType.Blocks) { willTrigger = true; - if (trigParams.containsKey("ValidBlocked")) { - String validBlocked = trigParams.get("ValidBlocked"); + if (trigger.hasParam("ValidBlocked")) { + String validBlocked = trigger.getParam("ValidBlocked"); if (validBlocked.contains(".withLesserPower")) { // Have to check this restriction here as triggering objects aren't set yet, so // ValidBlocked$Creature.powerLTX where X:TriggeredBlocker$CardPower crashes with NPE @@ -857,8 +845,8 @@ public class ComputerUtilCombat { return false; } } - if (trigParams.containsKey("ValidCard")) { - String validBlocker = trigParams.get("ValidCard"); + if (trigger.hasParam("ValidCard")) { + String validBlocker = trigger.getParam("ValidCard"); if (validBlocker.contains(".withLesserPower")) { // Have to check this restriction here as triggering objects aren't set yet, so // ValidCard$Creature.powerLTX where X:TriggeredAttacker$CardPower crashes with NPE @@ -873,29 +861,23 @@ public class ComputerUtilCombat { } } else if (mode == TriggerType.AttackerBlocked || mode == TriggerType.AttackerBlockedByCreature) { willTrigger = true; - if (trigParams.containsKey("ValidBlocker")) { - if (!trigger.matchesValid(defender, trigParams.get("ValidBlocker").split(","))) { - return false; - } + if (!trigger.matchesValidParam("ValidBlocker", defender)) { + return false; } - if (trigParams.containsKey("ValidCard")) { - if (!trigger.matchesValid(attacker, trigParams.get("ValidCard").split(","))) { - return false; - } + if (!trigger.matchesValidParam("ValidCard", attacker)) { + return false; } } else if (mode == TriggerType.DamageDone) { willTrigger = true; - if (trigParams.containsKey("ValidSource")) { - if (!(trigger.matchesValid(defender, trigParams.get("ValidSource").split(",")) + if (trigger.hasParam("ValidSource")) { + if (!(trigger.matchesValidParam("ValidSource", defender) && defender.getNetCombatDamage() > 0 - && (!trigParams.containsKey("ValidTarget") - || trigger.matchesValid(attacker, trigParams.get("ValidTarget").split(","))))) { + && trigger.matchesValidParam("ValidTarget", attacker))) { return false; } - if (!(trigger.matchesValid(attacker, trigParams.get("ValidSource").split(",")) + if (!(trigger.matchesValidParam("ValidSource", attacker) && attacker.getNetCombatDamage() > 0 - && (!trigParams.containsKey("ValidTarget") - || trigger.matchesValid(defender, trigParams.get("ValidTarget").split(","))))) { + && trigger.matchesValidParam("ValidTarget", defender))) { return false; } } @@ -944,30 +926,22 @@ public class ComputerUtilCombat { } final Game game = attacker.getGame(); - // look out for continuous static abilities that only care for blocking - // creatures + // look out for continuous static abilities that only care for blocking creatures final CardCollectionView cardList = CardCollection.combine(game.getCardsIn(ZoneType.Battlefield), game.getCardsIn(ZoneType.Command)); for (final Card card : cardList) { for (final StaticAbility stAb : card.getStaticAbilities()) { - final Map params = stAb.getMapParams(); - if (!params.get("Mode").equals("Continuous")) { + if (!stAb.getParam("Mode").equals("Continuous")) { continue; } - if (!params.containsKey("Affected") || !params.get("Affected").contains("blocking")) { + if (!stAb.hasParam("Affected") || !stAb.getParam("Affected").contains("blocking")) { continue; } - final String valid = TextUtil.fastReplace(params.get("Affected"), "blocking", "Creature"); - if (!blocker.isValid(valid, card.getController(), card, null)) { + final String valid = TextUtil.fastReplace(stAb.getParam("Affected"), "blocking", "Creature"); + if (!blocker.isValid(valid, card.getController(), card, stAb)) { continue; } - if (params.containsKey("AddPower")) { - if (params.get("AddPower").equals("X")) { - power += CardFactoryUtil.xCount(card, card.getSVar("X")); - } else if (params.get("AddPower").equals("Y")) { - power += CardFactoryUtil.xCount(card, card.getSVar("Y")); - } else { - power += Integer.valueOf(params.get("AddPower")); - } + if (stAb.hasParam("AddPower")) { + power += AbilityUtils.calculateAmount(card, stAb.getParam("AddPower"), stAb); } } } @@ -1252,31 +1226,23 @@ public class ComputerUtilCombat { theTriggers.addAll(blocker.getTriggers()); } - // look out for continuous static abilities that only care for attacking - // creatures + // look out for continuous static abilities that only care for attacking creatures if (!withoutCombatStaticAbilities) { final CardCollectionView cardList = CardCollection.combine(game.getCardsIn(ZoneType.Battlefield), game.getCardsIn(ZoneType.Command)); for (final Card card : cardList) { for (final StaticAbility stAb : card.getStaticAbilities()) { - final Map params = stAb.getMapParams(); - if (!params.get("Mode").equals("Continuous")) { + if (!stAb.getParam("Mode").equals("Continuous")) { continue; } - if (!params.containsKey("Affected") || !params.get("Affected").contains("attacking")) { + if (!stAb.hasParam("Affected") || !stAb.getParam("Affected").contains("attacking")) { continue; } - final String valid = TextUtil.fastReplace(params.get("Affected"), "attacking", "Creature"); - if (!attacker.isValid(valid, card.getController(), card, null)) { + final String valid = TextUtil.fastReplace(stAb.getParam("Affected"), "attacking", "Creature"); + if (!attacker.isValid(valid, card.getController(), card, stAb)) { continue; } - if (params.containsKey("AddPower")) { - if (params.get("AddPower").equals("X")) { - power += CardFactoryUtil.xCount(card, card.getSVar("X")); - } else if (params.get("AddPower").equals("Y")) { - power += CardFactoryUtil.xCount(card, card.getSVar("Y")); - } else { - power += Integer.valueOf(params.get("AddPower")); - } + if (stAb.hasParam("AddPower")) { + power += AbilityUtils.calculateAmount(card, stAb.getParam("AddPower"), stAb); } } } @@ -1350,7 +1316,7 @@ public class ComputerUtilCombat { } else if (bonus.contains("TriggeredAttacker$CardToughness")) { bonus = TextUtil.fastReplace(bonus, "TriggeredAttacker$CardToughness", TextUtil.concatNoSpace("Number$", String.valueOf(attacker.getNetToughness()))); } - power += CardFactoryUtil.xCount(source, bonus); + power += AbilityUtils.calculateAmount(source, bonus, sa); } } @@ -1447,8 +1413,7 @@ public class ComputerUtilCombat { theTriggers.addAll(blocker.getTriggers()); } - // look out for continuous static abilities that only care for attacking - // creatures + // look out for continuous static abilities that only care for attacking creatures if (!withoutCombatStaticAbilities) { final CardCollectionView cardList = game.getCardsIn(ZoneType.Battlefield); for (final Card card : cardList) { @@ -1540,7 +1505,7 @@ public class ComputerUtilCombat { } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee bonus = TextUtil.fastReplace(bonus, "TriggeredPlayersDefenders$Amount", "Number$1"); } - toughness += CardFactoryUtil.xCount(source, bonus); + toughness += AbilityUtils.calculateAmount(source, bonus, sa); } } else if (ApiType.PumpAll.equals(sa.getApi())) { @@ -1573,7 +1538,7 @@ public class ComputerUtilCombat { } else if (bonus.contains("TriggeredPlayersDefenders$Amount")) { // for Melee bonus = TextUtil.fastReplace(bonus, "TriggeredPlayersDefenders$Amount", "Number$1"); } - toughness += CardFactoryUtil.xCount(source, bonus); + toughness += AbilityUtils.calculateAmount(source, bonus, sa); } } } @@ -1638,8 +1603,8 @@ public class ComputerUtilCombat { //Check triggers that deal damage or shrink the attacker if (ComputerUtilCombat.getDamageToKill(attacker) - + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, blocker, combat, withoutAbilities) <= 0) { - return true; + + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, blocker, combat, withoutAbilities) <= 0) { + return true; } // check Destroy triggers (Cockatrice and friends) @@ -2256,11 +2221,12 @@ public class ComputerUtilCombat { * @return a int. */ public final static int getDamageToKill(final Card c) { - int killDamage = c.getLethalDamage() + c.getPreventNextDamageTotalShields(); + int damageShield = c.getPreventNextDamageTotalShields(); + int killDamage = c.getLethalDamage() + damageShield; - if ((killDamage > c.getPreventNextDamageTotalShields()) + if ((killDamage > damageShield) && c.hasSVar("DestroyWhenDamaged")) { - killDamage = 1 + c.getPreventNextDamageTotalShields(); + killDamage = 1 + damageShield; } return killDamage; @@ -2282,7 +2248,6 @@ public class ComputerUtilCombat { */ public final static int predictDamageTo(final Player target, final int damage, final Card source, final boolean isCombat) { - final Game game = target.getGame(); int restDamage = damage; @@ -2291,39 +2256,38 @@ public class ComputerUtilCombat { // Predict replacement effects for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { for (final ReplacementEffect re : ca.getReplacementEffects()) { - Map params = re.getMapParams(); - if (!re.getMode().equals(ReplacementType.DamageDone) || !params.containsKey("PreventionEffect")) { + if (!re.getMode().equals(ReplacementType.DamageDone) || + (!re.hasParam("PreventionEffect") && !re.hasParam("Prevent"))) { continue; } // Immortal Coil prevents the damage but has a similar negative effect if ("Immortal Coil".equals(ca.getName())) { continue; } - if (params.containsKey("ValidSource") - && !source.isValid(params.get("ValidSource"), ca.getController(), ca, null)) { + if (!re.matchesValidParam("ValidSource", source)) { continue; } - if (params.containsKey("ValidTarget") - && !target.isValid(params.get("ValidTarget"), ca.getController(), ca, null)) { + if (!re.matchesValidParam("ValidTarget", source)) { continue; } - if (params.containsKey("IsCombat")) { - if (params.get("IsCombat").equals("True")) { - if (!isCombat) { - continue; - } - } else { - if (isCombat) { - continue; - } + if (re.hasParam("IsCombat")) { + if (re.getParam("IsCombat").equals("True") != isCombat) { + continue; + } + } + if (re.hasParam("Prevent")) { + return 0; + } else if (re.getOverridingAbility() != null) { + SpellAbility repSA = re.getOverridingAbility(); + if (repSA.getApi() == ApiType.ReplaceDamage) { + return Math.max(0, restDamage - AbilityUtils.calculateAmount(ca, repSA.getParam("Amount"), repSA)); } - } return 0; } } - restDamage = target.staticDamagePrevention(restDamage, source, isCombat, true); + restDamage = target.staticDamagePrevention(restDamage, 0, source, isCombat); return restDamage; } @@ -2344,13 +2308,7 @@ public class ComputerUtilCombat { // This function helps the AI calculate the actual amount of damage an // effect would deal public final static int predictDamageTo(final Card target, final int damage, final Card source, final boolean isCombat) { - - int restDamage = damage; - - restDamage = target.staticReplaceDamage(restDamage, source, isCombat); - restDamage = target.staticDamagePrevention(restDamage, source, isCombat, true); - - return restDamage; + return predictDamageTo(target, damage, 0, source, isCombat); } @@ -2372,7 +2330,6 @@ public class ComputerUtilCombat { * @return a int. */ public final static int predictDamageTo(final Card target, final int damage, final int possiblePrevention, final Card source, final boolean isCombat) { - int restDamage = damage; restDamage = target.staticReplaceDamage(restDamage, source, isCombat); @@ -2382,7 +2339,6 @@ public class ComputerUtilCombat { } public final static boolean dealsFirstStrikeDamage(final Card combatant, final boolean withoutAbilities, final Combat combat) { - if (combatant.hasKeyword(Keyword.DOUBLE_STRIKE) || combatant.hasKeyword(Keyword.FIRST_STRIKE)) { return true; } @@ -2490,7 +2446,14 @@ public class ComputerUtilCombat { List list = game.getReplacementHandler().getReplacementList( ReplacementType.DamageDone, repParams, ReplacementLayer.Other); - return !list.isEmpty(); + for (final ReplacementEffect re : list) { + Map params = re.getMapParams(); + if (params.containsKey("Prevent") || + (re.getOverridingAbility() != null && re.getOverridingAbility().getApi() != ApiType.ReplaceDamage && re.getOverridingAbility().getApi() != ApiType.ReplaceEffect)) { + return true; + } + } + return false; } public static boolean attackerHasThreateningAfflict(Card attacker, Player aiDefender) { @@ -2499,20 +2462,6 @@ public class ComputerUtilCombat { return afflictDmg > attacker.getNetPower() || afflictDmg >= aiDefender.getLife(); } - public static int getMaxAttackersFor(final GameEntity defender) { - if (defender instanceof Player) { - for (final Card card : ((Player) defender).getCardsIn(ZoneType.Battlefield)) { - if (card.hasKeyword("No more than one creature can attack you each combat.")) { - return 1; - } else if (card.hasKeyword("No more than two creatures can attack you each combat.")) { - return 2; - } - } - } - - return -1; - } - public static List categorizeAttackersByEvasion(List attackers) { List categorizedAttackers = Lists.newArrayList(); @@ -2602,5 +2551,3 @@ public class ComputerUtilCombat { return false; } } - - diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java index f47319913a4..532764b0b1f 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilCost.java @@ -3,6 +3,7 @@ package forge.ai; import java.util.List; import java.util.Set; +import forge.game.ability.ApiType; import org.apache.commons.lang3.ObjectUtils; import org.apache.commons.lang3.StringUtils; @@ -156,7 +157,7 @@ public class ComputerUtilCost { if (typeList.size() > ai.getMaxHandSize()) { continue; } - int num = AbilityUtils.calculateAmount(source, disc.getAmount(), null); + int num = AbilityUtils.calculateAmount(source, disc.getAmount(), sa); for (int i = 0; i < num; i++) { Card pref = ComputerUtil.getCardPreference(ai, source, "DiscardCost", typeList); @@ -557,7 +558,6 @@ public class ComputerUtilCost { boolean payForOwnOnly = "OnlyOwn".equals(aiLogic); boolean payOwner = sa.hasParam("UnlessAI") && aiLogic.startsWith("Defined"); boolean payNever = "Never".equals(aiLogic); - boolean shockland = "Shockland".equals(aiLogic); boolean isMine = sa.getActivatingPlayer().equals(payer); if (payNever) { return false; } @@ -572,26 +572,6 @@ public class ComputerUtilCost { if (sa.getHostCard() == null || payer.equals(sa.getHostCard().getController())) { return false; } - } else if (shockland) { - if (payer.getLife() > 3 && payer.canPayLife(2)) { - final int landsize = payer.getLandsInPlay().size() + 1; - for (Card c : payer.getCardsIn(ZoneType.Hand)) { - // if the new land size would equal the CMC of a card in AIs hand, consider playing it untapped, - // otherwise don't bother running other checks - if (landsize != c.getCMC()) { - continue; - } - // try to determine in the AI is actually planning to play a spell ability from the card - boolean willPlay = ComputerUtil.hasReasonToPlayCardThisTurn(payer, c); - // try to determine if the mana shards provided by the lands would be applicable to pay the mana cost - boolean canPay = c.getManaCost().canBePaidWithAvaliable(ColorSet.fromNames(getAvailableManaColors(payer, source)).getColor()); - - if (canPay && willPlay) { - return true; - } - } - } - return false; } else if ("Paralyze".equals(aiLogic)) { final Card c = source.getEnchantingCard(); if (c == null || c.isUntapped()) { @@ -629,6 +609,29 @@ public class ComputerUtilCost { return false; } + // Check for shocklands and similar ETB replacement effects + if (sa.hasParam("ETB") && sa.getApi().equals(ApiType.Tap)) { + for (final CostPart part : cost.getCostParts()) { + if (part instanceof CostPayLife) { + final CostPayLife lifeCost = (CostPayLife) part; + Integer amount = lifeCost.convertAmount(); + if (payer.getLife() > (amount + 1) && payer.canPayLife(amount)) { + final int landsize = payer.getLandsInPlay().size() + 1; + for (Card c : payer.getCardsIn(ZoneType.Hand)) { + // Check if the AI has enough lands to play the card + if (landsize != c.getCMC()) { + continue; + } + // Check if the AI intends to play the card and if it can pay for it with the mana it has + boolean willPlay = ComputerUtil.hasReasonToPlayCardThisTurn(payer, c); + boolean canPay = c.getManaCost().canBePaidWithAvaliable(ColorSet.fromNames(getAvailableManaColors(payer, source)).getColor()); + return canPay && willPlay; + } + } + } + } + } + // AI will only pay when it's not already payed and only opponents abilities if (alreadyPaid || (payers.size() > 1 && (isMine && !payForOwnOnly))) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java index d05d10c0111..b2dcbc7f6a0 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtilMana.java @@ -609,7 +609,6 @@ public class ComputerUtilMana { String manaProduced = predictManafromSpellAbility(saPayment, ai, toPay); - //System.out.println(manaProduced); payMultipleMana(cost, manaProduced, ai); // remove from available lists diff --git a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java index 917012b236d..201f1436785 100644 --- a/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java +++ b/forge-ai/src/main/java/forge/ai/CreatureEvaluator.java @@ -162,9 +162,9 @@ public class CreatureEvaluator implements Function { value -= subValue(10, "must-attack"); } else if (c.hasStartOfKeyword("CARDNAME attacks specific player each combat if able")) { value -= subValue(10, "must-attack-player"); - } else if (c.hasKeyword("CARDNAME can block only creatures with flying.")) { + }/* else if (c.hasKeyword("CARDNAME can block only creatures with flying.")) { value -= subValue(toughness * 5, "reverse-reach"); - } + }//*/ if (c.hasSVar("DestroyWhenDamaged")) { value -= subValue((toughness - 1) * 9, "dies-to-dmg"); diff --git a/forge-ai/src/main/java/forge/ai/GameState.java b/forge-ai/src/main/java/forge/ai/GameState.java index bc31f46fb98..40ea465041a 100644 --- a/forge-ai/src/main/java/forge/ai/GameState.java +++ b/forge-ai/src/main/java/forge/ai/GameState.java @@ -1215,8 +1215,7 @@ public abstract class GameState { boolean tapped = c.isTapped(); boolean sickness = c.hasSickness(); Map counters = c.getCounters(); - // Note: Not clearCounters() since we want to keep the counters - // var as-is. + // Note: Not clearCounters() since we want to keep the counters var as-is. c.setCounters(Maps.newHashMap()); if (c.isAura()) { // dummy "enchanting" to indicate that the card will be force-attached elsewhere diff --git a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java index 2fe9bd55873..e1cd8b7da92 100644 --- a/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java +++ b/forge-ai/src/main/java/forge/ai/PlayerControllerAi.java @@ -81,9 +81,9 @@ import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; -/** +/** * A prototype for player controller class - * + * * Handles phase skips for now. */ public class PlayerControllerAi extends PlayerController { @@ -94,11 +94,11 @@ public class PlayerControllerAi extends PlayerController { brains = new AiController(p, game); } - + public void allowCheatShuffle(boolean value){ brains.allowCheatShuffle(value); } - + public void setUseSimulation(boolean value) { brains.setUseSimulation(value); } @@ -131,6 +131,12 @@ public class PlayerControllerAi extends PlayerController { return ComputerUtilCombat.distributeAIDamage(attacker, blockers, damageDealt, defender, overrideOrder); } + @Override + public Map divideShield(Card effectSource, Map affected, int shieldAmount) { + // TODO: AI current can't use this so this is not implemented. + return new HashMap<>(); + } + @Override public Integer announceRequirements(SpellAbility ability, String announce) { // For now, these "announcements" are made within the AI classes of the appropriate SA effects @@ -157,7 +163,7 @@ public class PlayerControllerAi extends PlayerController { case BidLife: return 0; default: - return null; + return null; } } return null; // return incorrect value to indicate that @@ -240,7 +246,7 @@ public class PlayerControllerAi extends PlayerController { public boolean confirmAction(SpellAbility sa, PlayerActionConfirmMode mode, String message) { return getAi().confirmAction(sa, mode, message); } - + @Override public boolean confirmBidAction(SpellAbility sa, PlayerActionConfirmMode mode, String string, int bid, Player winner) { @@ -568,8 +574,8 @@ public class PlayerControllerAi extends PlayerController { } @Override - public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question) { - return brains.aiShouldRun(replacementEffect, effectSA); + public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, GameEntity affected, String question) { + return brains.aiShouldRun(replacementEffect, effectSA, affected); } @Override @@ -646,10 +652,9 @@ public class PlayerControllerAi extends PlayerController { public List chooseSpellAbilityToPlay() { return brains.chooseSpellAbilityToPlay(); } - + @Override public boolean playChosenSpellAbility(SpellAbility sa) { - // System.out.println("Playing sa: " + sa); if (sa instanceof LandAbility) { if (sa.canPlay()) { sa.resolve(); @@ -659,7 +664,7 @@ public class PlayerControllerAi extends PlayerController { ComputerUtil.handlePlayingSpellAbility(player, sa, getGame()); } return true; - } + } @Override public CardCollection chooseCardsToDiscardToMaximumHandSize(int numDiscard) { @@ -712,7 +717,7 @@ public class PlayerControllerAi extends PlayerController { public int chooseNumber(SpellAbility sa, String title, int min, int max) { return brains.chooseNumber(sa, title, min, max); } - + @Override public int chooseNumber(SpellAbility sa, String string, int min, int max, Map params) { ApiType api = sa.getApi(); @@ -788,7 +793,8 @@ public class PlayerControllerAi extends PlayerController { case "BetterTgtThanRemembered": if (source.getRememberedCount() > 0) { Card rem = (Card) source.getFirstRemembered(); - if (!rem.isInZone(ZoneType.Battlefield)) { + // avoid pumping opponent creature + if (!rem.isInZone(ZoneType.Battlefield) || rem.getController().isOpponentOf(source.getController())) { return true; } for (Card c : source.getController().getCreaturesInPlay()) { @@ -814,7 +820,7 @@ public class PlayerControllerAi extends PlayerController { /* * (non-Javadoc) - * + * * @see * forge.game.player.PlayerController#chooseBinary(forge.game.spellability. * SpellAbility, java.lang.String, @@ -855,7 +861,7 @@ public class PlayerControllerAi extends PlayerController { } return sa.getChosenList(); } - + @Override public byte chooseColorAllowColorless(String message, Card card, ColorSet colors) { final String c = ComputerUtilCard.getMostProminentColor(player.getCardsIn(ZoneType.Hand)); @@ -901,7 +907,7 @@ public class PlayerControllerAi extends PlayerController { /* * (non-Javadoc) - * + * * @see forge.game.player.PlayerController#chooseCounterType(java.util.List, * forge.game.spellability.SpellAbility, java.lang.String, java.util.Map) */ @@ -917,7 +923,7 @@ public class PlayerControllerAi extends PlayerController { @Override public boolean confirmPayment(CostPart costPart, String prompt, SpellAbility sa) { - return brains.confirmPayment(costPart); // AI is expected to know what it is paying for at the moment (otherwise add another parameter to this method) + return brains.confirmPayment(costPart); // AI is expected to know what it is paying for at the moment (otherwise add another parameter to this method) } @Override @@ -998,6 +1004,7 @@ public class PlayerControllerAi extends PlayerController { emptyAbility.setActivatingPlayer(player); emptyAbility.setTriggeringObjects(sa.getTriggeringObjects()); emptyAbility.setSVars(sa.getSVars()); + emptyAbility.setXManaCostPaid(sa.getRootAbility().getXManaCostPaid()); if (ComputerUtilCost.willPayUnlessCost(sa, player, cost, alreadyPaid, allPayers) && ComputerUtilCost.canPayCost(emptyAbility, player)) { ComputerUtil.playNoStack(player, emptyAbility, getGame()); // AI needs something to resolve to pay that cost return true; @@ -1104,7 +1111,7 @@ public class PlayerControllerAi extends PlayerController { public void revealAnte(String message, Multimap removedAnteCards) { // Ai won't understand that anyway } - + @Override public Collection complainCardsCantPlayWell(Deck myDeck) { return brains.complainCardsCantPlayWell(myDeck); @@ -1152,7 +1159,7 @@ public class PlayerControllerAi extends PlayerController { return new HashMap<>(); } } - + //Do not convoke potential blockers until after opponent's attack final CardCollectionView blockers = ComputerUtilCard.getLikelyBlockers(ai, null); if ((ph.isPlayerTurn(ai) && ph.getPhase().isAfter(PhaseType.COMBAT_BEGIN)) || diff --git a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java index 18ec64fc908..dcb194d663e 100644 --- a/forge-ai/src/main/java/forge/ai/SpecialCardAi.java +++ b/forge-ai/src/main/java/forge/ai/SpecialCardAi.java @@ -39,7 +39,6 @@ import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; @@ -379,7 +378,7 @@ public class SpecialCardAi { } // Do not activate if damage will be prevented - if (source.staticDamagePrevention(predictedPT.getLeft(), source, true, true) == 0) { + if (source.staticDamagePrevention(predictedPT.getLeft(), 0, source, true) == 0) { return false; } @@ -1085,7 +1084,7 @@ public class SpecialCardAi { return false; } String prominentColor = ComputerUtilCard.getMostProminentColor(ai.getCardsIn(ZoneType.Battlefield)); - int devotion = CardFactoryUtil.xCount(sa.getHostCard(), "Count$Devotion." + prominentColor); + int devotion = AbilityUtils.calculateAmount(sa.getHostCard(), "Count$Devotion." + prominentColor, sa); int activationCost = sa.getPayCosts().getTotalMana().getCMC() + (sa.getPayCosts().hasTapCost() ? 1 : 0); // do not use this SA if devotion to most prominent color is less than its own activation cost + 1 (to actually get advantage) diff --git a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java index 6b65082c41a..cab5c81ed2a 100644 --- a/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellAbilityAi.java @@ -162,7 +162,7 @@ public abstract class SpellAbilityAi { if (ComputerUtil.preventRunAwayActivations(sa)) { return false; // prevent infinite loop } - return MyRandom.getRandom().nextFloat() < .8f; // random success + return MyRandom.getRandom().nextFloat() < .8f; // random success } public final boolean doTriggerAI(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { @@ -193,7 +193,7 @@ public abstract class SpellAbilityAi { * Handles the AI decision to play a triggered SpellAbility */ protected boolean doTriggerAINoCost(final Player aiPlayer, final SpellAbility sa, final boolean mandatory) { - if (canPlayWithoutRestrict(aiPlayer, sa)) { + if (canPlayWithoutRestrict(aiPlayer, sa) && (!mandatory || sa.isTargetNumberValid())) { return true; } diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index c95593f5c71..ae17f988dc7 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -98,6 +98,7 @@ public enum SpellApiToAi { .put(ApiType.Learn, LearnAi.class) .put(ApiType.LoseLife, LifeLoseAi.class) .put(ApiType.LosesGame, GameLossAi.class) + .put(ApiType.MakeCard, AlwaysPlayAi.class) .put(ApiType.Mana, ManaEffectAi.class) .put(ApiType.ManaReflected, CannotPlayAi.class) .put(ApiType.Manifest, ManifestAi.class) diff --git a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java index 0cb19367512..eb1e863f80b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AnimateAi.java @@ -100,30 +100,30 @@ public class AnimateAi extends SpellAbilityAi { } // Don't use instant speed animate abilities before AI's COMBAT_BEGIN if (!ph.is(PhaseType.COMBAT_BEGIN) && ph.isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa) - && !sa.hasParam("ActivationPhases") && !sa.hasParam("Permanent")) { + && !sa.hasParam("ActivationPhases") && !"Permanent".equals(sa.getParam("Duration"))) { return false; } // Don't use instant speed animate abilities outside human's // COMBAT_DECLARE_ATTACKERS or if no attackers - if (ph.getPlayerTurn().isOpponentOf(ai) && !sa.hasParam("Permanent") + if (ph.getPlayerTurn().isOpponentOf(ai) && !"Permanent".equals(sa.getParam("Duration")) && (!ph.is(PhaseType.COMBAT_DECLARE_ATTACKERS) || game.getCombat() != null && game.getCombat().getAttackersOf(ai).isEmpty())) { return false; } // Don't activate during MAIN2 unless this effect is permanent - if (ph.is(PhaseType.MAIN2) && !sa.hasParam("Permanent") && !sa.hasParam("UntilYourNextTurn")) { + if (ph.is(PhaseType.MAIN2) && !"Permanent".equals(sa.getParam("Duration")) && !"UntilYourNextTurn".equals(sa.getParam("Duration"))) { return false; } // Don't animate if the AI won't attack anyway or use as a potential blocker Player opponent = ai.getWeakestOpponent(); // Activating as a potential blocker is only viable if it's an ability activated from a permanent, otherwise // the AI will waste resources - boolean activateAsPotentialBlocker = sa.hasParam("UntilYourNextTurn") + boolean activateAsPotentialBlocker = "UntilYourNextTurn".equals(sa.getParam("Duration")) && ai.getGame().getPhaseHandler().getNextTurn() != ai && source.isPermanent(); if (ph.isPlayerTurn(ai) && ai.getLife() < 6 && opponent.getLife() > 6 && Iterables.any(opponent.getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES) - && !sa.hasParam("AILogic") && !sa.hasParam("Permanent") && !activateAsPotentialBlocker) { + && !sa.hasParam("AILogic") && !"Permanent".equals(sa.getParam("Duration")) && !activateAsPotentialBlocker) { return false; } return true; @@ -156,7 +156,7 @@ public class AnimateAi extends SpellAbilityAi { && !c.isEquipping(); // for creatures that could be improved (like Figure of Destiny) - if (!bFlag && c.isCreature() && (sa.hasParam("Permanent") || (!c.isTapped() && !c.isSick()))) { + if (!bFlag && c.isCreature() && ("Permanent".equals(sa.getParam("Duration")) || (!c.isTapped() && !c.isSick()))) { int power = -5; if (sa.hasParam("Power")) { power = AbilityUtils.calculateAmount(c, sa.getParam("Power"), sa); @@ -179,7 +179,7 @@ public class AnimateAi extends SpellAbilityAi { } } - if (!SpellAbilityAi.isSorcerySpeed(sa) && !sa.hasParam("Permanent")) { + if (!SpellAbilityAi.isSorcerySpeed(sa) && !"Permanent".equals(sa.getParam("Duration"))) { if (sa.hasParam("Crew") && c.isCreature()) { // Do not try to crew a vehicle which is already a creature return false; @@ -278,7 +278,7 @@ public class AnimateAi extends SpellAbilityAi { Map data = Maps.newHashMap(); for (final Card c : list) { // don't use Permanent animate on something that would leave the field - if (c.hasSVar("EndOfTurnLeavePlay") && sa.hasParam("Permanent")) { + if (c.hasSVar("EndOfTurnLeavePlay") && "Permanent".equals(sa.getParam("Duration"))) { continue; } @@ -312,9 +312,9 @@ public class AnimateAi extends SpellAbilityAi { // if its player turn, // check if its Permanent or that creature would attack if (ph.isPlayerTurn(ai)) { - if (!sa.hasParam("Permanent") + if (!"Permanent".equals(sa.getParam("Duration")) && !ComputerUtilCard.doesSpecifiedCreatureAttackAI(ai, animatedCopy) - && !sa.hasParam("UntilHostLeavesPlay")) { + && !"UntilHostLeavesPlay".equals(sa.getParam("Duration"))) { continue; } } @@ -360,8 +360,7 @@ public class AnimateAi extends SpellAbilityAi { // This is reasonable for now. Kamahl, Fist of Krosa and a sorcery or // two are the only things // that animate a target. Those can just use AI:RemoveDeck:All until - // this can do a reasonably - // good job of picking a good target + // this can do a reasonably good job of picking a good target return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java index 6d5f7f00076..90051e1cde9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/AttachAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/AttachAi.java @@ -555,12 +555,7 @@ public class AttachAi extends SpellAbilityAi { if (!evenBetterList.isEmpty()) { betterList = evenBetterList; } - evenBetterList = CardLists.filter(betterList, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.isUntapped(); - } - }); + evenBetterList = CardLists.filter(betterList, CardPredicates.Presets.UNTAPPED); if (!evenBetterList.isEmpty()) { betterList = evenBetterList; } @@ -734,17 +729,15 @@ public class AttachAi extends SpellAbilityAi { */ private static Card attachAISpecificCardPreference(final SpellAbility sa, final List list, final boolean mandatory, final Card attachSource) { - // I know this isn't much better than Hardcoding, but some cards need it for now final Player ai = sa.getActivatingPlayer(); final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa); Card chosen = null; if ("Guilty Conscience".equals(sourceName)) { chosen = SpecialCardAi.GuiltyConscience.getBestAttachTarget(ai, sa, list); - } else if ("Bonds of Faith".equals(sourceName)) { - chosen = doPumpOrCurseAILogic(ai, sa, list, "Human"); - } else if ("Clutch of Undeath".equals(sourceName)) { - chosen = doPumpOrCurseAILogic(ai, sa, list, "Zombie"); + } else if (sa.hasParam("AIValid")) { + // TODO: Make the AI recognize which cards to pump based on the card's abilities alone + chosen = doPumpOrCurseAILogic(ai, sa, list, sa.getParam("AIValid")); } // If Mandatory (brought directly into play without casting) gotta @@ -768,7 +761,7 @@ public class AttachAi extends SpellAbilityAi { int powerBuff = 0; for (StaticAbility stAb : sa.getHostCard().getStaticAbilities()) { if ("Card.EquippedBy".equals(stAb.getParam("Affected")) && stAb.hasParam("AddPower")) { - powerBuff = AbilityUtils.calculateAmount(sa.getHostCard(), stAb.getParam("AddPower"), null); + powerBuff = AbilityUtils.calculateAmount(sa.getHostCard(), stAb.getParam("AddPower"), stAb); } } if (combat != null && combat.isAttacking(equipped) && ph.is(PhaseType.COMBAT_DECLARE_BLOCKERS, sa.getActivatingPlayer())) { @@ -1646,7 +1639,7 @@ public class AttachAi extends SpellAbilityAi { return ComputerUtilCombat.canAttackNextTurn(card) && card.getNetCombatDamage() >= 1; } else if (keyword.endsWith("CARDNAME attacks each turn if able.") || keyword.endsWith("CARDNAME attacks each combat if able.")) { return ComputerUtilCombat.canAttackNextTurn(card) && CombatUtil.canBlock(card, true) && !ai.getCreaturesInPlay().isEmpty(); - } else if (keyword.endsWith("CARDNAME can't block.") || keyword.contains("CantBlock")) { + } else if (keyword.endsWith("CARDNAME can't block.")) { return CombatUtil.canBlock(card, true); } else if (keyword.endsWith("CARDNAME's activated abilities can't be activated.")) { for (SpellAbility ability : card.getSpellAbilities()) { @@ -1699,7 +1692,7 @@ public class AttachAi extends SpellAbilityAi { if (!c.getController().equals(ai)) { return false; } - return c.getType().hasCreatureType(type); + return c.isValid(type, ai, sa.getHostCard(), sa); } }); List oppNonType = CardLists.filter(list, new Predicate() { @@ -1709,7 +1702,7 @@ public class AttachAi extends SpellAbilityAi { if (c.getController().equals(ai)) { return false; } - return !c.getType().hasCreatureType(type) && !ComputerUtilCard.isUselessCreature(ai, c); + return !c.isValid(type, ai, sa.getHostCard(), sa) && !ComputerUtilCard.isUselessCreature(ai, c); } }); diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index e8a935cfe4c..95313e06a49 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -165,7 +165,7 @@ public class ChangeZoneAi extends SpellAbilityAi { return sa.isTargetNumberValid(); // Pre-targeted in checkAiLogic } } - if (isHidden(sa)) { + if (sa.isHidden()) { return hiddenOriginCanPlayAI(aiPlayer, sa); } return knownOriginCanPlayAI(aiPlayer, sa); @@ -182,21 +182,12 @@ public class ChangeZoneAi extends SpellAbilityAi { */ @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { - if (isHidden(sa)) { + if (sa.isHidden()) { return hiddenOriginPlayDrawbackAI(aiPlayer, sa); } return knownOriginPlayDrawbackAI(aiPlayer, sa); } - - private static boolean isHidden(SpellAbility sa) { - boolean hidden = sa.hasParam("Hidden"); - if (!hidden && sa.hasParam("Origin")) { - hidden = ZoneType.isHidden(sa.getParam("Origin")); - } - return hidden; - } - /** *

* changeZoneTriggerAINoCost. @@ -232,7 +223,7 @@ public class ChangeZoneAi extends SpellAbilityAi { return delta <= 0; } - if (isHidden(sa)) { + if (sa.isHidden()) { return hiddenTriggerAI(aiPlayer, sa, mandatory); } return knownOriginTriggerAI(aiPlayer, sa, mandatory); @@ -788,7 +779,7 @@ public class ChangeZoneAi extends SpellAbilityAi { return ph.getNextTurn().equals(ai) && ph.is(PhaseType.END_OF_TURN); } - if (isHidden(sa)) { + if (sa.isHidden()) { return true; } @@ -1316,8 +1307,7 @@ public class ChangeZoneAi extends SpellAbilityAi { private static Card canBouncePermanent(final Player ai, SpellAbility sa, CardCollectionView list) { Game game = ai.getGame(); // filter out untargetables - CardCollectionView aiPermanents = CardLists - .filterControlledBy(list, ai); + CardCollectionView aiPermanents = CardLists.filterControlledBy(list, ai); CardCollection aiPlaneswalkers = CardLists.filter(aiPermanents, Presets.PLANESWALKERS); // Felidar Guardian + Saheeli Rai combo support @@ -1870,23 +1860,25 @@ public class ChangeZoneAi extends SpellAbilityAi { })); } - // JAVA 1.8 use Map.Entry.comparingByValue() somehow - Map.Entry> max = Collections.max(data.entrySet(), new Comparator>>() { - @Override - public int compare(Map.Entry> o1, Map.Entry> o2) { - return o1.getValue().getValue() - o2.getValue().getValue(); + if (!data.isEmpty()) { + // JAVA 1.8 use Map.Entry.comparingByValue() somehow + Map.Entry> max = Collections.max(data.entrySet(), new Comparator>>() { + @Override + public int compare(Map.Entry> o1, Map.Entry> o2) { + return o1.getValue().getValue() - o2.getValue().getValue(); + } + }); + + // filter list again by the opponent and a creature of the wanted name that can be targeted + list = CardLists.filter(CardLists.filterControlledBy(list, max.getKey()), + CardPredicates.nameEquals(max.getValue().getKey()), CardPredicates.isTargetableBy(sa)); + + // list should contain only one element or zero + sa.resetTargets(); + for (Card c : list) { + sa.getTargets().add(c); + return true; } - }); - - // filter list again by the opponent and a creature of the wanted name that can be targeted - list = CardLists.filter(CardLists.filterControlledBy(list, max.getKey()), - CardPredicates.nameEquals(max.getValue().getKey()), CardPredicates.isTargetableBy(sa)); - - // list should contain only one element or zero - sa.resetTargets(); - for (Card c : list) { - sa.getTargets().add(c); - return true; } return false; @@ -1987,8 +1979,7 @@ public class ChangeZoneAi extends SpellAbilityAi { boolean setPayX = false; if (unlessCost.equals("X") && sa.getSVar(unlessCost).equals("Count$xPaid")) { setPayX = true; - // TODO use ComputerUtilCost.getMaxXValue if able - toPay = ComputerUtilMana.determineLeftoverMana(sa, ai); + toPay = ComputerUtilCost.getMaxXValue(sa, ai); } else { toPay = AbilityUtils.calculateAmount(source, unlessCost, sa); } diff --git a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java index 46da4dca610..777776f5aa7 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CharmAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CharmAi.java @@ -227,7 +227,7 @@ public class CharmAi extends SpellAbilityAi { if (AiPlayDecision.WillPlay == aic.canPlaySa(sub)) { chosenList.add(sub); if (chosenList.size() == min) { - break; // enough choices + break; // enough choices } } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java index 87bc3c09880..ec12e5ebf3a 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChooseGenericEffectAi.java @@ -52,8 +52,6 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { } } else if ("GideonBlackblade".equals(aiLogic)) { return SpecialCardAi.GideonBlackblade.consider(ai, sa); - } else if ("SoulEcho".equals(aiLogic)) { - return doTriggerAINoCost(ai, sa, true); } else if ("Always".equals(aiLogic)) { return true; } @@ -70,7 +68,7 @@ public class ChooseGenericEffectAi extends SpellAbilityAi { */ @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { - return checkApiLogic(aiPlayer, sa); + return sa.isTrigger() ? doTriggerAINoCost(aiPlayer, sa, sa.isMandatory()) : checkApiLogic(aiPlayer, sa); } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java index d6234051612..1eac12c1226 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CloneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CloneAi.java @@ -56,7 +56,7 @@ public class CloneAi extends SpellAbilityAi { bFlag |= (!c.isCreature() && !c.isTapped() && !(c.getTurnInZone() == phase.getTurn())); // for creatures that could be improved (like Figure of Destiny) - if (c.isCreature() && (sa.hasParam("Permanent") || (!c.isTapped() && !c.isSick()))) { + if (c.isCreature() && (!sa.hasParam("Duration") || (!c.isTapped() && !c.isSick()))) { int power = -5; if (sa.hasParam("Power")) { power = AbilityUtils.calculateAmount(source, sa.getParam("Power"), sa); @@ -72,8 +72,7 @@ public class CloneAi extends SpellAbilityAi { } - if (!bFlag) { // All of the defined stuff is cloned, not very - // useful + if (!bFlag) { // All of the defined stuff is cloned, not very useful return false; } } else { @@ -246,7 +245,7 @@ public class CloneAi extends SpellAbilityAi { // Combat_Begin step if (!ph.is(PhaseType.COMBAT_BEGIN) && ph.isPlayerTurn(ai) && !SpellAbilityAi.isSorcerySpeed(sa) - && !sa.hasParam("ActivationPhases") && !sa.hasParam("Permanent")) { + && !sa.hasParam("ActivationPhases") && sa.hasParam("Duration")) { return false; } @@ -257,6 +256,6 @@ public class CloneAi extends SpellAbilityAi { } // don't activate during main2 unless this effect is permanent - return !ph.is(PhaseType.MAIN2) || sa.hasParam("Permanent"); + return !ph.is(PhaseType.MAIN2) || !sa.hasParam("Duration"); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java index 65f11c69b35..78bdef0ceee 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlExchangeAi.java @@ -31,8 +31,7 @@ public class ControlExchangeAi extends SpellAbilityAi { CardCollection list = CardLists.getValidCards(AiAttackController.choosePreferredDefenderPlayer(ai).getCardsIn(ZoneType.Battlefield), tgt.getValidTgts(), ai, sa.getHostCard(), sa); - // AI won't try to grab cards that are filtered out of AI decks on - // purpose + // AI won't try to grab cards that are filtered out of AI decks on purpose list = CardLists.filter(list, new Predicate() { @Override public boolean apply(final Card c) { diff --git a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java index f2d757d5872..5358f6e670d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ControlGainAi.java @@ -110,8 +110,7 @@ public class ControlGainAi extends SpellAbilityAi { } } - // Don't steal something if I can't Attack without, or prevent it from - // blocking at least + // Don't steal something if I can't Attack without, or prevent it from blocking at least if (lose.contains("EOT") && ai.getGame().getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS) && !sa.isTrigger()) { @@ -211,6 +210,7 @@ public class ControlGainAi extends SpellAbilityAi { } } + // TODO check life of controller and consider stealing from another opponent so the risk of your army disappearing is spread out while (t == null) { // filter by MustTarget requirement CardCollection originalList = new CardCollection(list); @@ -264,7 +264,6 @@ public class ControlGainAi extends SpellAbilityAi { } return true; - } @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java index 764d74822be..37366e9c008 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CounterAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CounterAi.java @@ -113,8 +113,7 @@ public class CounterAi extends SpellAbilityAi { boolean setPayX = false; if (unlessCost.equals("X") && sa.getSVar(unlessCost).equals("Count$xPaid")) { setPayX = true; - // TODO use ComputerUtilCost.getMaxXValue - toPay = Math.min(ComputerUtilMana.determineLeftoverMana(sa, ai), usableManaSources + 1); + toPay = Math.min(ComputerUtilCost.getMaxXValue(sa, ai), usableManaSources + 1); } else { toPay = AbilityUtils.calculateAmount(source, unlessCost, sa); } @@ -124,8 +123,7 @@ public class CounterAi extends SpellAbilityAi { } if (toPay <= usableManaSources) { - // If this is a reusable Resource, feel free to play it most of - // the time + // If this is a reusable Resource, feel free to play it most of the time if (!SpellAbilityAi.playReusable(ai,sa)) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java index 05bea452b91..37222ecc21d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersMultiplyAi.java @@ -120,8 +120,7 @@ public class CountersMultiplyAi extends SpellAbilityAi { CardCollection list = CardLists.getTargetableCards(game.getCardsIn(ZoneType.Battlefield), sa); - // pre filter targetable cards with counters and can receive one of - // them + // pre filter targetable cards with counters and can receive one of them list = CardLists.filter(list, new Predicate() { @Override diff --git a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java index 75c5344095d..c3b3c130950 100644 --- a/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/CountersPutAi.java @@ -866,17 +866,16 @@ public class CountersPutAi extends SpellAbilityAi { choice = Aggregates.random(list); } } - if (choice != null && divided) { - int alloc = Math.max(amount / totalTargets, 1); - if (sa.getTargets().size() == Math.min(totalTargets, sa.getMaxTargets()) - 1) { - sa.addDividedAllocation(choice, left); - } else { - sa.addDividedAllocation(choice, alloc); - left -= alloc; - } + } + if (choice != null && divided) { + int alloc = Math.max(amount / totalTargets, 1); + if (sa.getTargets().size() == Math.min(totalTargets, sa.getMaxTargets()) - 1) { + sa.addDividedAllocation(choice, left); + } else { + sa.addDividedAllocation(choice, alloc); + left -= alloc; } } - if (choice != null) { sa.getTargets().add(choice); list.remove(choice); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java index 3cd8a909a2b..c21c297fe62 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageAiBase.java @@ -111,8 +111,7 @@ public abstract class DamageAiBase extends SpellAbilityAi { final CardCollectionView hand = comp.getCardsIn(ZoneType.Hand); if ((enemy.getLife() - restDamage) < 5) { - // drop the human to less than 5 - // life + // drop the human to less than 5 life return true; } @@ -147,12 +146,12 @@ public abstract class DamageAiBase extends SpellAbilityAi { } } } - if (value > 0) { //more likely to burn with larger hand + if (value > 0) { //more likely to burn with larger hand for (int i = 3; i < hand.size(); i++) { value *= 1.1f; } } - if (value < 0.2f) { //hard floor to reduce ridiculous odds for instants over time + if (value < 0.2f) { //hard floor to reduce ridiculous odds for instants over time return false; } else { final float chance = MyRandom.getRandom().nextFloat(); diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index 06884107ade..1c3cd26a61e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -30,7 +30,6 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CounterEnumType; @@ -41,7 +40,6 @@ import forge.game.keyword.Keyword; import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; -import forge.game.player.PlayerPredicates; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetChoices; @@ -132,7 +130,7 @@ public class DamageDealAi extends DamageAiBase { // Set PayX here to maximum value. It will be adjusted later depending on the target. sa.setXManaCostPaid(dmg); } else if (sa.getSVar(damage).contains("InYourHand") && source.isInZone(ZoneType.Hand)) { - dmg = CardFactoryUtil.xCount(source, sa.getSVar(damage)) - 1; // the card will be spent casting the spell, so actual damage is 1 less + dmg = AbilityUtils.calculateAmount(source, damage, sa) - 1; // the card will be spent casting the spell, so actual damage is 1 less } else if (sa.getSVar(damage).equals("TargetedPlayer$CardsInHand")) { // cards that deal damage by the number of cards in target player's hand, e.g. Sudden Impact if (sa.getTargetRestrictions().canTgtPlayer()) { @@ -734,12 +732,10 @@ public class DamageDealAi extends DamageAiBase { } // When giving priority to targeting Creatures for mandatory - // triggers - // feel free to add the Human after we run out of good targets + // triggers feel free to add the Human after we run out of good targets // TODO: add check here if card is about to die from something - // on the stack - // or from taking combat damage + // on the stack or from taking combat damage final Cost abCost = sa.getPayCosts(); boolean freePing = immediately || abCost == null @@ -796,8 +792,7 @@ public class DamageDealAi extends DamageAiBase { } } } - // TODO: Improve Damage, we shouldn't just target the player just - // because we can + // TODO: Improve Damage, we shouldn't just target the player just because we can if (sa.canTarget(enemy) && tcs.size() < tgt.getMaxTargets(source, sa)) { if (((phase.is(PhaseType.END_OF_TURN) && phase.getNextTurn().equals(ai)) || (SpellAbilityAi.isSorcerySpeed(sa) && phase.is(PhaseType.MAIN2)) @@ -985,7 +980,6 @@ public class DamageDealAi extends DamageAiBase { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { - final Card source = sa.getHostCard(); final String damage = sa.getParam("NumDmg"); int dmg = AbilityUtils.calculateAmount(source, damage, sa); @@ -1042,7 +1036,7 @@ public class DamageDealAi extends DamageAiBase { saTgt = saTgt.getParent(); } - Player opponent = ai.getOpponents().min(PlayerPredicates.compareByLife()); + Player opponent = ai.getWeakestOpponent(); // TODO: somehow account for the possible cost reduction? int dmg = ComputerUtilMana.determineLeftoverMana(sa, ai, saTgt.getParam("XColor")); @@ -1085,7 +1079,7 @@ public class DamageDealAi extends DamageAiBase { saTgt.resetTargets(); saTgt.getTargets().add(tgtCreature != null && dmg < opponent.getLife() ? tgtCreature : opponent); - sa.setXManaCostPaid(dmg); + saTgt.setXManaCostPaid(dmg); return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DigAi.java b/forge-ai/src/main/java/forge/ai/ability/DigAi.java index 33e3c315dc8..7ea8b772b97 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigAi.java @@ -45,9 +45,8 @@ public class DigAi extends SpellAbilityAi { sa.resetTargets(); if (!opp.canBeTargetedBy(sa)) { return false; - } else { - sa.getTargets().add(opp); } + sa.getTargets().add(opp); libraryOwner = opp; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DigMultipleAi.java b/forge-ai/src/main/java/forge/ai/ability/DigMultipleAi.java index 1e3b0350408..76cd8df5362 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigMultipleAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigMultipleAi.java @@ -28,9 +28,8 @@ public class DigMultipleAi extends SpellAbilityAi { sa.resetTargets(); if (!opp.canBeTargetedBy(sa)) { return false; - } else { - sa.getTargets().add(opp); } + sa.getTargets().add(opp); libraryOwner = opp; } diff --git a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java index d421a67f54d..35aa8d58a38 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DigUntilAi.java @@ -60,9 +60,8 @@ public class DigUntilAi extends SpellAbilityAi { sa.resetTargets(); if (!sa.canTarget(opp)) { return false; - } else { - sa.getTargets().add(opp); } + sa.getTargets().add(opp); libraryOwner = opp; } else { if (sa.hasParam("Valid")) { diff --git a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java index 47d95a3698b..722de88e01d 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DrawAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DrawAi.java @@ -257,7 +257,7 @@ public class DrawAi extends SpellAbilityAi { } else { numCards = ComputerUtilCost.getMaxXValue(sa, ai); // try not to overdraw - int safeDraw = Math.min(computerMaxHandSize - computerHandSize, computerLibrarySize - 3); + int safeDraw = Math.abs(Math.min(computerMaxHandSize - computerHandSize, computerLibrarySize - 3)); if (sa.getHostCard().isInstant() || sa.getHostCard().isSorcery()) { safeDraw++; } // card will be spent numCards = Math.min(numCards, safeDraw); @@ -377,7 +377,7 @@ public class DrawAi extends SpellAbilityAi { // checks what the ai prevent from casting it on itself // if spell is not mandatory if (aiTarget && !ai.cantLose()) { - if (numCards >= computerLibrarySize) { + if (numCards >= computerLibrarySize - 3) { if (xPaid) { numCards = computerLibrarySize - 1; if (numCards <= 0 && !mandatory) { @@ -422,8 +422,7 @@ public class DrawAi extends SpellAbilityAi { } root.setXManaCostPaid(numCards); } else { - // Don't draw too many cards and then risk discarding - // cards at EOT + // Don't draw too many cards and then risk discarding cards at EOT if (!drawback && !mandatory) { return false; } @@ -441,7 +440,7 @@ public class DrawAi extends SpellAbilityAi { continue; } - // use xPaid abilties only for itself + // use xPaid abilities only for itself if (xPaid) { continue; } @@ -493,7 +492,7 @@ public class DrawAi extends SpellAbilityAi { // TODO: consider if human is the defined player // ability is not targeted - if (numCards >= computerLibrarySize) { + if (numCards >= computerLibrarySize - 3) { if (ai.isCardInPlay("Laboratory Maniac")) { return true; } @@ -509,8 +508,7 @@ public class DrawAi extends SpellAbilityAi { && game.getPhaseHandler().isPlayerTurn(ai) && !sa.isTrigger() && !assumeSafeX) { - // Don't draw too many cards and then risk discarding cards at - // EOT + // Don't draw too many cards and then risk discarding cards at EOT if (!drawback) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java index 8614c4eb2d2..e643da47300 100644 --- a/forge-ai/src/main/java/forge/ai/ability/EffectAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/EffectAi.java @@ -79,7 +79,7 @@ public class EffectAi extends SpellAbilityAi { if (!game.getStack().isEmpty()) { return false; } - if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) { + if (game.getReplacementHandler().isPreventCombatDamageThisTurn()) { return false; } if (!ComputerUtilCombat.lifeInDanger(ai, game.getCombat())) { diff --git a/forge-ai/src/main/java/forge/ai/ability/FogAi.java b/forge-ai/src/main/java/forge/ai/ability/FogAi.java index 6dc63330369..2fe66864e3f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FogAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FogAi.java @@ -29,7 +29,7 @@ public class FogAi extends SpellAbilityAi { final Card hostCard = sa.getHostCard(); // Don't cast it, if the effect is already in place - if (game.getPhaseHandler().isPreventCombatDamageThisTurn()) { + if (game.getReplacementHandler().isPreventCombatDamageThisTurn()) { return false; } diff --git a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java index 8bdd71b1394..198c1cde15c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/GameLossAi.java @@ -13,8 +13,7 @@ public class GameLossAi extends SpellAbilityAi { return false; } - // Only one SA Lose the Game card right now, which is Door to - // Nothingness + // Only one SA Lose the Game card right now, which is Door to Nothingness final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { @@ -29,19 +28,23 @@ public class GameLossAi extends SpellAbilityAi { @Override protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + Player loser = ai; + // Phage the Untouchable // (Final Fortune would need to attach it's delayed trigger to a // specific turn, which can't be done yet) - Player opp = ai.getGame().getCombat().getDefenderPlayerByAttacker(sa.getHostCard()); + if (ai.getGame().getCombat() != null) { + loser = ai.getGame().getCombat().getDefenderPlayerByAttacker(sa.getHostCard()); + } - if (!mandatory && opp.cantLose()) { + if (!mandatory && loser.cantLose()) { return false; } final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt != null) { sa.resetTargets(); - sa.getTargets().add(opp); + sa.getTargets().add(loser); } return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java index f00d8b18d31..8e95006b596 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeGainAi.java @@ -266,8 +266,7 @@ public class LifeGainAi extends SpellAbilityAi { } if (!hasTgt && mandatory) { // need to target something but its neither negative against - // opponents, - // nor posive against allies + // opponents, nor positive against allies // hurting ally is probably better than healing opponent // look for Lifegain not Negative (case of lifegain negated) @@ -295,8 +294,7 @@ public class LifeGainAi extends SpellAbilityAi { sa.getTargets().add(ally); hasTgt = true; } - // better heal opponent which most life then the one with the - // lowest + // better heal opponent which most life then the one with the lowest if (!hasTgt) { Player opp = opps.max(PlayerPredicates.compareByLife()); sa.getTargets().add(opp); diff --git a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java index 2437c97a49a..df3cecd4588 100644 --- a/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/LifeLoseAi.java @@ -28,7 +28,6 @@ public class LifeLoseAi extends SpellAbilityAi { */ @Override public boolean chkAIDrawback(SpellAbility sa, Player ai) { - final PlayerCollection tgtPlayers = getPlayers(ai, sa); final Card source = sa.getHostCard(); @@ -60,7 +59,6 @@ public class LifeLoseAi extends SpellAbilityAi { return true; } - /* * (non-Javadoc) * @@ -123,12 +121,12 @@ public class LifeLoseAi extends SpellAbilityAi { return false; } - final PlayerCollection tgtPlayers = getPlayers(ai, sa); - if (ComputerUtil.playImmediately(ai, sa)) { return true; } + final PlayerCollection tgtPlayers = getPlayers(ai, sa); + // TODO: check against the amount we could obtain when multiple activations are possible PlayerCollection filteredPlayer = tgtPlayers .filter(Predicates.and(PlayerPredicates.isOpponentOf(ai), PlayerPredicates.lifeLessOrEqualTo(amount))); // killing opponents asap diff --git a/forge-ai/src/main/java/forge/ai/ability/MillAi.java b/forge-ai/src/main/java/forge/ai/ability/MillAi.java index f2216b0a5f8..520a54b63df 100644 --- a/forge-ai/src/main/java/forge/ai/ability/MillAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/MillAi.java @@ -21,6 +21,7 @@ import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerActionConfirmMode; +import forge.game.player.PlayerPredicates; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; @@ -214,13 +215,7 @@ public class MillAi extends SpellAbilityAi { } // get targeted or defined Player with largest library - // TODO in Java 8 find better way - final Player m = Collections.max(list, new Comparator() { - @Override - public int compare(Player arg0, Player arg1) { - return arg0.getCardsIn(ZoneType.Library).size() - arg1.getCardsIn(ZoneType.Library).size(); - } - }); + final Player m = Collections.max(list, PlayerPredicates.compareByZoneSize(ZoneType.Library)); int cardsToDiscard = m.getCardsIn(ZoneType.Library).size(); diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java index 1775616561a..e755393b75b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentAi.java @@ -297,7 +297,7 @@ public class PermanentAi extends SpellAbilityAi { if (!checkPhaseRestrictions(ai, sa, ai.getGame().getPhaseHandler())) { return false; } - return checkApiLogic(ai, sa); + return mandatory || checkApiLogic(ai, sa); } } diff --git a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java index bd7db42f43f..69fc5f3b324 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PermanentNoncreatureAi.java @@ -8,7 +8,6 @@ import forge.game.card.CardCollection; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -import forge.game.spellability.TargetRestrictions; import forge.game.zone.ZoneType; /** @@ -40,10 +39,8 @@ public class PermanentNoncreatureAi extends PermanentAi { if (host.hasSVar("OblivionRing")) { SpellAbility effectExile = AbilityFactory.getAbility(host.getSVar("TrigExile"), host); final ZoneType origin = ZoneType.listValueOf(effectExile.getParam("Origin")).get(0); - final TargetRestrictions tgt = effectExile.getTargetRestrictions(); - final CardCollection list = CardLists.getValidCards(game.getCardsIn(origin), tgt.getValidTgts(), ai, host, - effectExile); - CardCollection targets = CardLists.getTargetableCards(list, sa); + effectExile.setActivatingPlayer(ai); + CardCollection targets = CardLists.getTargetableCards(game.getCardsIn(origin), effectExile); if (sourceName.equals("Suspension Field") || sourceName.equals("Detention Sphere")) { // existing "exile until leaves" enchantments only target diff --git a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java index 324794ea276..0fa0805fe7e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PlayAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PlayAi.java @@ -28,7 +28,6 @@ import forge.game.card.CardPredicates; import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.player.Player; -import forge.game.player.PlayerActionConfirmMode; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityPredicates; @@ -158,16 +157,7 @@ public class PlayAi extends SpellAbilityAi { return true; } - - /* (non-Javadoc) - * @see forge.card.ability.SpellAbilityAi#confirmAction(forge.game.player.Player, forge.card.spellability.SpellAbility, forge.game.player.PlayerActionConfirmMode, java.lang.String) - */ - @Override - public boolean confirmAction(Player player, SpellAbility sa, PlayerActionConfirmMode mode, String message) { - // as called from PlayEffect:173 - return true; - } - + /* (non-Javadoc) * @see forge.card.ability.SpellAbilityAi#chooseSingleCard(forge.game.player.Player, forge.card.spellability.SpellAbility, java.util.List, boolean) */ diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java index b77e246d183..02e582b8e69 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAi.java @@ -400,7 +400,6 @@ public class PumpAi extends PumpAiBase { if (ComputerUtilCard.shouldPumpCard(ai, sa, card, defense, attack, keywords, false)) { return true; } else if (containsUsefulKeyword(ai, keywords, card, sa, attack)) { - Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); if (game.getPhaseHandler().is(PhaseType.COMBAT_DECLARE_ATTACKERS, ai) || game.getPhaseHandler().is(PhaseType.COMBAT_BEGIN, ai)) { @@ -438,7 +437,7 @@ public class PumpAi extends PumpAiBase { && game.getPhaseHandler().getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) && !(sa.isCurse() && defense < 0) && !containsNonCombatKeyword(keywords) - && !sa.hasParam("UntilYourNextTurn") + && !"UntilYourNextTurn".equals(sa.getParam("Duration")) && !"Snapcaster".equals(sa.getParam("AILogic")) && !isFight) { return false; diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java index 0fc65c64997..5e708dbdd9f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAiBase.java @@ -44,7 +44,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { return false; } - public boolean grantsUsefulExtraBlockOpts(final Player ai, final SpellAbility sa, final Card card, List keywords) { PhaseHandler ph = ai.getGame().getPhaseHandler(); Card pumped = ComputerUtilCard.getPumpedCreature(ai, sa, card, 0, 0, keywords); @@ -110,7 +109,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { && (card.getNetCombatDamage() > 0) && !ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_ATTACKERS); } else if (keyword.endsWith("CARDNAME can't attack or block.")) { - if (sa.hasParam("UntilYourNextTurn")) { + if ("UntilYourNextTurn".equals(sa.getParam("Duration"))) { return CombatUtil.canAttack(card, ai) || CombatUtil.canBlock(card, true); } if (!ph.isPlayerTurn(ai)) { @@ -154,14 +153,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { } }); return CombatUtil.canBlockAtLeastOne(card, attackers); - } else if (keyword.endsWith("CantBlockCardUIDSource")) { // can't block CARDNAME this turn - if (!ph.isPlayerTurn(ai) || ph.getPhase().isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) - || ph.getPhase().isBefore(PhaseType.MAIN1) || !CombatUtil.canBlock(sa.getHostCard(), card)) { - return false; - } - // target needs to be a creature, controlled by the player which is attacked - return !sa.getHostCard().isTapped() || (combat != null && combat.isAttacking(sa.getHostCard()) - && card.getController().equals(combat.getDefenderPlayerByAttacker(sa.getHostCard()))); } else if (keyword.endsWith("This card doesn't untap during your next untap step.")) { return !ph.getPhase().isBefore(PhaseType.MAIN2) && !card.isUntapped() && ph.isPlayerTurn(ai) && Untap.canUntap(card); @@ -480,7 +471,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { } }); // leaves all creatures that will be destroyed } // -X/-X end - else if (attack < 0 && !game.getPhaseHandler().isPreventCombatDamageThisTurn()) { + else if (attack < 0 && !game.getReplacementHandler().isPreventCombatDamageThisTurn()) { // spells that give -X/0 boolean isMyTurn = game.getPhaseHandler().isPlayerTurn(ai); if (isMyTurn) { @@ -514,7 +505,6 @@ public abstract class PumpAiBase extends SpellAbilityAi { else { final boolean addsKeywords = !keywords.isEmpty(); if (addsKeywords) { - // If the keyword can prevent a creature from attacking, see if there's some kind of viable prioritization if (keywords.contains("CARDNAME can't attack.") || keywords.contains("CARDNAME can't attack or block.") || keywords.contains("HIDDEN CARDNAME can't attack.") || keywords.contains("HIDDEN CARDNAME can't attack or block.")) { @@ -540,8 +530,7 @@ public abstract class PumpAiBase extends SpellAbilityAi { protected boolean containsNonCombatKeyword(final List keywords) { for (final String keyword : keywords) { - // since most keywords are combat relevant check for those that are - // not + // since most keywords are combat relevant check for those that are not if (keyword.endsWith("This card doesn't untap during your next untap step.") || keyword.endsWith("Shroud") || keyword.endsWith("Hexproof")) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java index 386d043770d..cb68ba3a711 100644 --- a/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/PumpAllAi.java @@ -113,7 +113,7 @@ public class PumpAllAi extends PumpAiBase { if (phase.isAfter(PhaseType.COMBAT_DECLARE_BLOCKERS) || phase.isBefore(PhaseType.COMBAT_DECLARE_ATTACKERS) || game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer()) - || game.getPhaseHandler().isPreventCombatDamageThisTurn()) { + || game.getReplacementHandler().isPreventCombatDamageThisTurn()) { return false; } int totalPower = 0; @@ -151,6 +151,12 @@ public class PumpAllAi extends PumpAiBase { return true; } + @Override + protected boolean doTriggerAINoCost(Player ai, SpellAbility sa, boolean mandatory) { + // important to call canPlay first so targets are added if needed + return canPlayAI(ai, sa) || mandatory; + } + boolean pumpAgainstRemoval(Player ai, SpellAbility sa, List comp) { final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa, true); for (final Card c : comp) { diff --git a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java index b5b9ece8fc5..79edfb3f416 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RegenerateAi.java @@ -49,14 +49,6 @@ import forge.game.zone.ZoneType; */ public class RegenerateAi extends SpellAbilityAi { - // Ex: A:SP$Regenerate | Cost$W | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$Regenerate - // target creature. - // http://www.slightlymagic.net/wiki/Forge_AbilityFactory#Regenerate - - // ************************************************************** - // ********************* Regenerate **************************** - // ************************************************************** - @Override protected boolean checkApiLogic(final Player ai, final SpellAbility sa) { final Game game = ai.getGame(); @@ -65,8 +57,7 @@ public class RegenerateAi extends SpellAbilityAi { boolean chance = false; final TargetRestrictions tgt = sa.getTargetRestrictions(); if (tgt == null) { - // As far as I can tell these Defined Cards will only have one of - // them + // As far as I can tell these Defined Cards will only have one of them final List list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("Defined"), sa); if (!game.getStack().isEmpty()) { @@ -105,8 +96,7 @@ public class RegenerateAi extends SpellAbilityAi { } if (!game.getStack().isEmpty()) { - // check stack for something on the stack will kill anything i - // control + // check stack for something on the stack will kill anything i control final List objects = ComputerUtil.predictThreatenedObjects(sa.getActivatingPlayer(), sa, true); final List threatenedTargets = new ArrayList<>(); @@ -191,8 +181,7 @@ public class RegenerateAi extends SpellAbilityAi { } } - // TODO see if something on the stack is about to kill something i - // can target + // TODO see if something on the stack is about to kill something i can target // choose my best X without regen if (CardLists.getNotType(compTargetables, "Creature").isEmpty()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java index 310ea94efdf..3ec32296b5b 100644 --- a/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/RepeatAi.java @@ -18,7 +18,7 @@ public class RepeatAi extends SpellAbilityAi { final Player opp = AiAttackController.choosePreferredDefenderPlayer(ai); if (sa.usesTargeting()) { - if (!opp.canBeTargetedBy(sa)) { + if (!sa.canTarget(opp)) { return false; } sa.resetTargets(); diff --git a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java index 063daaddd34..9fd83435a03 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ScryAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ScryAi.java @@ -119,11 +119,9 @@ public class ScryAi extends SpellAbilityAi { return false; } - double chance = .4; // 40 percent chance of milling with instant speed - // stuff + double chance = .4; // 40 percent chance of milling with instant speed stuff if (SpellAbilityAi.isSorcerySpeed(sa)) { - chance = .667; // 66.7% chance for sorcery speed (since it will - // never activate EOT) + chance = .667; // 66.7% chance for sorcery speed (since it will never activate EOT) } boolean randomReturn = MyRandom.getRandom().nextFloat() <= Math.pow(chance, sa.getActivationsThisTurn() + 1); diff --git a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java index 98b8e1e16c2..29ded831c7f 100644 --- a/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/SetStateAi.java @@ -52,8 +52,7 @@ public class SetStateAi extends SpellAbilityAi { @Override public boolean chkAIDrawback(SpellAbility sa, Player aiPlayer) { - // Gross generalization, but this always considers alternate - // states more powerful + // Gross generalization, but this always considers alternate states more powerful return !sa.getHostCard().isInAlternateState(); } diff --git a/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java b/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java index f9c3301ed7f..e4101790445 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ShuffleAi.java @@ -17,8 +17,7 @@ public class ShuffleAi extends SpellAbilityAi { return aiPlayer.getGame().getPhaseHandler().is(PhaseType.MAIN2, aiPlayer); } - // not really sure when the compy would use this; maybe only after a - // human + // not really sure when the compy would use this; maybe only after a human // deliberately put a card on top of their library return false; /* diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java index a8f46f2a180..95efebb90c8 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAiBase.java @@ -11,6 +11,7 @@ import forge.ai.ComputerUtilAbility; import forge.ai.ComputerUtilCard; import forge.ai.SpellAbilityAi; import forge.game.Game; +import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; @@ -309,9 +310,8 @@ public abstract class TapAiBase extends SpellAbilityAi { return true; } - // TODO: use Defined to determine, if this is an unfavorable result - - return true; + final List pDefined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + return pDefined.isEmpty() || (pDefined.get(0).isUntapped() && pDefined.get(0).getController() != ai); } else { sa.resetTargets(); if (tapPrefTargeting(ai, source, sa, mandatory)) { diff --git a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java index ff456311037..214cbbc4763 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapAllAi.java @@ -12,7 +12,7 @@ import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; -import forge.game.card.CardPredicates.Presets; +import forge.game.card.CardPredicates; import forge.game.combat.CombatUtil; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -49,7 +49,7 @@ public class TapAllAi extends SpellAbilityAi { } validTappables = CardLists.getValidCards(validTappables, valid, source.getController(), source, sa); - validTappables = CardLists.filter(validTappables, Presets.UNTAPPED); + validTappables = CardLists.filter(validTappables, CardPredicates.Presets.UNTAPPED); if (sa.hasParam("AILogic")) { String logic = sa.getParam("AILogic"); @@ -69,18 +69,8 @@ public class TapAllAi extends SpellAbilityAi { return false; } - final List human = CardLists.filter(validTappables, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getController().equals(opp); - } - }); - final List compy = CardLists.filter(validTappables, new Predicate() { - @Override - public boolean apply(final Card c) { - return c.getController().equals(ai); - } - }); + final List human = CardLists.filterControlledBy(validTappables, opp); + final List compy = CardLists.filterControlledBy(validTappables, ai); if (human.size() <= compy.size()) { return false; } @@ -102,7 +92,7 @@ public class TapAllAi extends SpellAbilityAi { final Game game = source.getGame(); CardCollectionView tmpList = game.getCardsIn(ZoneType.Battlefield); tmpList = CardLists.getValidCards(tmpList, valid, source.getController(), source, sa); - tmpList = CardLists.filter(tmpList, Presets.UNTAPPED); + tmpList = CardLists.filter(tmpList, CardPredicates.Presets.UNTAPPED); return tmpList; } diff --git a/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java b/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java index 949bb217141..e052b4737c9 100644 --- a/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/TapOrUntapAi.java @@ -19,8 +19,7 @@ public class TapOrUntapAi extends TapAiBase { if (!sa.usesTargeting()) { // assume we are looking to tap human's stuff - // TODO - check for things with untap abilities, and don't tap - // those. + // TODO - check for things with untap abilities, and don't tap those. boolean bFlag = false; for (final Card c : AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa)) { @@ -40,6 +39,4 @@ public class TapOrUntapAi extends TapAiBase { return randomReturn; } - - } diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java index 47c443f59b8..8816b0a5506 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAi.java @@ -66,7 +66,7 @@ public class UntapAi extends SpellAbilityAi { if (!sa.usesTargeting()) { final List pDefined = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa); - return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; + return pDefined.isEmpty() || (pDefined.get(0).isTapped() && pDefined.get(0).getController() == ai); } else { return untapPrefTargeting(ai, sa, false); } @@ -82,9 +82,8 @@ public class UntapAi extends SpellAbilityAi { return false; } - // TODO: use Defined to determine, if this is an unfavorable result final List pDefined = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); - return pDefined == null || !pDefined.get(0).isUntapped() || pDefined.get(0).getController() != ai; + return pDefined.isEmpty() || (pDefined.get(0).isTapped() && pDefined.get(0).getController() == ai); } else { if (untapPrefTargeting(ai, sa, mandatory)) { return true; diff --git a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java index a0166598ed1..7c53560db5c 100644 --- a/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/UntapAllAi.java @@ -8,6 +8,7 @@ import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.phase.PhaseType; import forge.game.player.Player; +import forge.game.player.PlayerCollection; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; @@ -29,6 +30,10 @@ public class UntapAllAi extends SpellAbilityAi { valid = sa.getParam("ValidCards"); } list = CardLists.getValidCards(list, valid.split(","), source.getController(), source, sa); + // don't untap if only opponent benefits + PlayerCollection goodControllers = aiPlayer.getAllies(); + goodControllers.add(aiPlayer); + list = CardLists.filter(list, CardPredicates.isControlledByAnyOf(goodControllers)); return !list.isEmpty(); } return false; diff --git a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java index eccdeb48f16..3e9d300fe7b 100644 --- a/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java +++ b/forge-ai/src/main/java/forge/ai/simulation/GameCopier.java @@ -88,7 +88,6 @@ public class GameCopier { newPlayer.setCounters(Maps.newHashMap(origPlayer.getCounters())); newPlayer.setLifeLostLastTurn(origPlayer.getLifeLostLastTurn()); newPlayer.setLifeLostThisTurn(origPlayer.getLifeLostThisTurn()); - newPlayer.setPreventNextDamage(origPlayer.getPreventNextDamage()); newPlayer.getManaPool().add(origPlayer.getManaPool()); newPlayer.setCommanders(origPlayer.getCommanders()); // will be fixed up below playerMap.put(origPlayer, newPlayer); diff --git a/forge-core/src/main/java/forge/StaticData.java b/forge-core/src/main/java/forge/StaticData.java index c769e5055ab..ac7c162207b 100644 --- a/forge-core/src/main/java/forge/StaticData.java +++ b/forge-core/src/main/java/forge/StaticData.java @@ -151,6 +151,11 @@ public class StaticData { return this.editions; } + public final CardEdition.Collection getCustomEditions(){ + return this.customEditions; + } + + private List sortedEditions; public final List getSortedEditions() { if (sortedEditions == null) { @@ -158,12 +163,24 @@ public class StaticData { for (CardEdition set : editions) { sortedEditions.add(set); } + if (customEditions.size() > 0){ + for (CardEdition set : customEditions) { + sortedEditions.add(set); + } + } Collections.sort(sortedEditions); Collections.reverse(sortedEditions); //put newer sets at the top } return sortedEditions; } + public CardEdition getCardEdition(String setCode){ + CardEdition edition = this.editions.get(setCode); + if (edition == null) // try custom editions + edition = this.customEditions.get(setCode); + return edition; + } + public PaperCard getOrLoadCommonCard(String cardName, String setCode, int artIndex, boolean foil) { PaperCard card = commonCards.getCard(cardName, setCode, artIndex); boolean isCustom = false; diff --git a/forge-core/src/main/java/forge/card/CardAiHints.java b/forge-core/src/main/java/forge/card/CardAiHints.java index a7b2c8e7255..746f7297a4f 100644 --- a/forge-core/src/main/java/forge/card/CardAiHints.java +++ b/forge-core/src/main/java/forge/card/CardAiHints.java @@ -6,7 +6,6 @@ package forge.card; */ public class CardAiHints { - private final boolean isRemovedFromAIDecks; private final boolean isRemovedFromRandomDecks; private final boolean isRemovedFromNonCommanderDecks; @@ -15,7 +14,6 @@ public class CardAiHints { private final DeckHints deckNeeds; private final DeckHints deckHas; - public CardAiHints(boolean remAi, boolean remRandom, boolean remUnlessCommander, DeckHints dh, DeckHints dn, DeckHints has) { isRemovedFromAIDecks = remAi; isRemovedFromRandomDecks = remRandom; @@ -90,5 +88,4 @@ public class CardAiHints { } } - } diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index 0e274d60d00..366be7e81f8 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -533,6 +533,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { @Override public int getPrintCount(String cardName, String edition) { int cnt = 0; + if (edition == null || cardName == null) + return cnt; for (PaperCard pc : getAllCards(cardName)) { if (pc.getEdition().equals(edition)) { cnt++; @@ -544,6 +546,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { @Override public int getMaxPrintCount(String cardName) { int max = -1; + if (cardName == null) + return max; for (PaperCard pc : getAllCards(cardName)) { if (max < pc.getArtIndex()) { max = pc.getArtIndex(); @@ -555,6 +559,8 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { @Override public int getArtCount(String cardName, String setName) { int cnt = 0; + if (cardName == null || setName == null) + return cnt; Collection cards = getAllCards(cardName); if (null == cards) { @@ -628,6 +634,23 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { })); } + public Collection getAllNonPromosNonReprintsNoAlt() { + return Lists.newArrayList(Iterables.filter(getAllCardsNoAlt(), new Predicate() { + @Override + public boolean apply(final PaperCard paperCard) { + CardEdition edition = null; + try { + edition = editions.getEditionByCodeOrThrow(paperCard.getEdition()); + if (edition.getType() == Type.PROMOS||edition.getType() == Type.REPRINT) + return false; + } catch (Exception ex) { + return false; + } + return true; + } + })); + } + public String getName(final String cardName) { if (alternateName.containsKey(cardName)) { return alternateName.get(cardName); @@ -749,7 +772,6 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } public PaperCard createUnsupportedCard(String cardName) { - CardRequest request = CardRequest.fromString(cardName); CardEdition cardEdition = CardEdition.UNKNOWN; CardRarity cardRarity = CardRarity.Unknown; @@ -790,7 +812,6 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } return new PaperCard(CardRules.getUnsupportedCardNamed(request.cardName), cardEdition.getCode(), cardRarity, 1); - } private final Editor editor = new Editor(); diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 04d41cdfb89..e5b5e233a95 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -19,7 +19,6 @@ package forge.card; import java.io.File; import java.io.FilenameFilter; -import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Arrays; @@ -121,13 +120,16 @@ public final class CardEdition implements Comparable { // immutable // commonly used printsheets with collector number public enum EditionSectionWithCollectorNumbers { CARDS("cards"), + SPECIAL_SLOT("special slot"), //to help with convoluted boosters PRECON_PRODUCT("precon product"), BORDERLESS("borderless"), SHOWCASE("showcase"), EXTENDED_ART("extended art"), ALTERNATE_ART("alternate art"), + ALTERNATE_FRAME("alternate frame"), BUY_A_BOX("buy a box"), PROMO("promo"), + BUNDLE("bundle"), BOX_TOPPER("box topper"); private final String name; @@ -148,7 +150,7 @@ public final class CardEdition implements Comparable { // immutable } } - public static class CardInSet { + public static class CardInSet implements Comparable { public final CardRarity rarity; public final String collectorNumber; public final String name; @@ -172,6 +174,56 @@ public final class CardEdition implements Comparable { // immutable sb.append(name); return sb.toString(); } + + /** + * This method implements the main strategy to allow for natural ordering of collectorNumber + * (i.e. "1" < "10"), overloading the default lexicographic order (i.e. "10" < "1"). + * Any non-numerical parts in the input collectorNumber will be also accounted for, and attached to the + * resulting sorting key, accordingly. + * + * @param collectorNumber: Input collectorNumber tro transform in a Sorting Key + * @return A 5-digits zero-padded collector number + any non-numerical parts attached. + */ + public static String getSortableCollectorNumber(final String collectorNumber){ + String sortableCollNr = collectorNumber; + if (sortableCollNr == null || sortableCollNr.length() == 0) + sortableCollNr = "50000"; // very big number of 5 digits to have them in last positions + + // Now, for proper sorting, let's zero-pad the collector number (if integer) + int collNr; + try { + collNr = Integer.parseInt(sortableCollNr); + sortableCollNr = String.format("%05d", collNr); + } catch (NumberFormatException ex) { + String nonNumeric = sortableCollNr.replaceAll("[0-9]", ""); + String onlyNumeric = sortableCollNr.replaceAll("[^0-9]", ""); + try { + collNr = Integer.parseInt(onlyNumeric); + } catch (NumberFormatException exon) { + collNr = 0; // this is the case of ONLY-letters collector numbers + } + if ((collNr > 0) && (sortableCollNr.startsWith(onlyNumeric))) // e.g. 12a, 37+, 2018f, + sortableCollNr = String.format("%05d", collNr) + nonNumeric; + else // e.g. WS6, S1 + sortableCollNr = nonNumeric + String.format("%05d", collNr); + } + return sortableCollNr; + } + + @Override + public int compareTo(CardInSet o) { + final int nameCmp = name.compareToIgnoreCase(o.name); + if (0 != nameCmp) { + return nameCmp; + } + String thisCollNr = getSortableCollectorNumber(collectorNumber); + String othrCollNr = getSortableCollectorNumber(o.collectorNumber); + final int collNrCmp = thisCollNr.compareTo(othrCollNr); + if (0 != collNrCmp) { + return collNrCmp; + } + return rarity.compareTo(o.rarity); + } } private final static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); @@ -206,6 +258,7 @@ public final class CardEdition implements Comparable { // immutable private String[] chaosDraftThemes = new String[0]; private final ListMultimap cardMap; + private final List cardsInSet; private final Map tokenNormalized; // custom print sheets that will be loaded lazily private final Map> customPrintSheetsToParse; @@ -215,13 +268,18 @@ public final class CardEdition implements Comparable { // immutable private CardEdition(ListMultimap cardMap, Map tokens, Map> customPrintSheetsToParse) { this.cardMap = cardMap; + this.cardsInSet = new ArrayList<>(cardMap.values()); + Collections.sort(cardsInSet); this.tokenNormalized = tokens; this.customPrintSheetsToParse = customPrintSheetsToParse; } private CardEdition(CardInSet[] cards, Map tokens) { + List cardsList = Arrays.asList(cards); this.cardMap = ArrayListMultimap.create(); - this.cardMap.replaceValues("cards", Arrays.asList(cards)); + this.cardMap.replaceValues("cards", cardsList); + this.cardsInSet = new ArrayList<>(cardsList); + Collections.sort(cardsInSet); this.tokenNormalized = tokens; this.customPrintSheetsToParse = new HashMap<>(); } @@ -256,7 +314,7 @@ public final class CardEdition implements Comparable { // immutable date = date + "-01"; try { return formatter.parse(date); - } catch (ParseException e) { + } catch (Exception e) { return new Date(); } } @@ -287,7 +345,7 @@ public final class CardEdition implements Comparable { // immutable public List getCards() { return cardMap.get("cards"); } public List getAllCardsInSet() { - return Lists.newArrayList(cardMap.values()); + return cardsInSet; } public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others @@ -306,7 +364,10 @@ public final class CardEdition implements Comparable { // immutable if (o == null) { return 1; } - return date.compareTo(o.date); + int dateComp = date.compareTo(o.date); + if (0 != dateComp) + return dateComp; + return name.compareTo(o.name); } @Override @@ -340,7 +401,7 @@ public final class CardEdition implements Comparable { // immutable } public boolean isLargeSet() { - return getAllCardsInSet().size() > 200 && !smallSetOverride; + return this.cardsInSet.size() > 200 && !smallSetOverride; } public int getCntBoosterPictures() { @@ -414,7 +475,7 @@ public final class CardEdition implements Comparable { // immutable * rarity - grouping #4 * name - grouping #5 */ - "(^([0-9]+.?) )?(([SCURML]) )?(.*)$" + "(^([0-9A-Z]+.?) )?(([SCURML]) )?(.*)$" ); ListMultimap cardMap = ArrayListMultimap.create(); diff --git a/forge-core/src/main/java/forge/card/CardRules.java b/forge-core/src/main/java/forge/card/CardRules.java index 4e80fe8bc1a..0aac2fd8695 100644 --- a/forge-core/src/main/java/forge/card/CardRules.java +++ b/forge-core/src/main/java/forge/card/CardRules.java @@ -84,6 +84,12 @@ public final class CardRules implements ICardCharacteristics { boolean isReminder = false; boolean isSymbol = false; String oracleText = face.getOracleText(); + // CR 903.4 colors defined by its characteristic-defining abilities + for (String staticAbility : face.getStaticAbilities()) { + if (staticAbility.contains("CharacteristicDefining$ True") && staticAbility.contains("SetColor$ All")) { + res |= MagicColor.ALL_COLORS; + } + } int len = oracleText.length(); for(int i = 0; i < len; i++) { char c = oracleText.charAt(i); // This is to avoid needless allocations performed by toCharArray() @@ -388,7 +394,6 @@ public final class CardRules implements ICardCharacteristics { this.removedFromNonCommanderDecks = "NonCommander".equalsIgnoreCase(value); } } else if ("AlternateMode".equals(key)) { - //System.out.println(faces[curFace].getName()); this.altMode = CardSplitType.smartValueOf(value); } else if ("ALTERNATE".equals(key)) { this.curFace = 1; @@ -539,7 +544,6 @@ public final class CardRules implements ICardCharacteristics { @Override public final ManaCostShard next() { final String unparsed = st.nextToken(); - // System.out.println(unparsed); if (StringUtils.isNumeric(unparsed)) { this.genericCost += Integer.parseInt(unparsed); return null; @@ -555,7 +559,7 @@ public final class CardRules implements ICardCharacteristics { */ @Override public void remove() { - } // unsuported + } // unsupported } } diff --git a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java index 925e4ceae1b..cd635219665 100644 --- a/forge-core/src/main/java/forge/card/mana/ManaCostParser.java +++ b/forge-core/src/main/java/forge/card/mana/ManaCostParser.java @@ -30,7 +30,6 @@ public class ManaCostParser implements IParserManaCost { */ public ManaCostParser(final String cost) { this.cost = cost.split(" "); - // System.out.println(cost); this.nextToken = 0; this.genericCost = 0; } @@ -66,7 +65,6 @@ public class ManaCostParser implements IParserManaCost { @Override public final ManaCostShard next() { final String unparsed = this.cost[this.nextToken++]; - // System.out.println(unparsed); if (StringUtils.isNumeric(unparsed)) { this.genericCost += Integer.parseInt(unparsed); return null; diff --git a/forge-core/src/main/java/forge/item/IPaperCard.java b/forge-core/src/main/java/forge/item/IPaperCard.java index 198c4b8f4b0..bb2101b862b 100644 --- a/forge-core/src/main/java/forge/item/IPaperCard.java +++ b/forge-core/src/main/java/forge/item/IPaperCard.java @@ -17,10 +17,11 @@ import forge.card.MagicColor; import forge.util.PredicateCard; import forge.util.PredicateString; -//import forge.Card; - public interface IPaperCard extends InventoryItem, Serializable { + String NO_COLLECTOR_NUMBER = "N.A."; // Placeholder for No-Collection number available + int DEFAULT_ART_INDEX = 1; + /** * Number of filters based on CardPrinted values. */ @@ -228,6 +229,7 @@ public interface IPaperCard extends InventoryItem, Serializable { String getName(); String getEdition(); + String getCollectorNumber(); int getArtIndex(); boolean isFoil(); boolean isToken(); diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 58fb032c898..216fddb3852 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -6,12 +6,12 @@ * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. - * + * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. - * + * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ @@ -26,6 +26,7 @@ import com.google.common.base.Function; import forge.ImageKeys; import forge.StaticData; import forge.card.CardDb; +import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.CardRules; import forge.util.CardTranslation; @@ -36,7 +37,7 @@ import forge.util.TextUtil; * A lightweight version of a card that matches real-world cards, to use outside of games (eg. inventory, decks, trade). *

* The full set of rules is in the CardRules class. - * + * * @author Forge */ public final class PaperCard implements Comparable, InventoryItemFromSet, IPaperCard, Serializable { @@ -48,12 +49,19 @@ public final class PaperCard implements Comparable, InventoryItemFro // These fields are kinda PK for PrintedCard private final String name; private final String edition; + /* [NEW] Attribute to store reference to CollectorNumber of each PaperCard. + By default the attribute is marked as "unset" so that it could be retrieved and set. + (see getCollectorNumber()) + */ + private String collectorNumber = null; private final int artIndex; private final boolean foil; private Boolean hasImage; // Calculated fields are below: private transient CardRarity rarity; // rarity is given in ctor when set is assigned + // Reference to a new instance of Self, but foiled! + private transient PaperCard foiledVersion = null; @Override public String getName() { @@ -65,6 +73,23 @@ public final class PaperCard implements Comparable, InventoryItemFro return edition; } + @Override + public String getCollectorNumber() { + /* The collectorNumber attribute is managed in a property-like fashion. + By default it is marked as "unset" (-1), which integrates with all constructors + invocations not including this as an extra parameter. In this way, the new + attribute could be added to the API with minimum disruption to code + throughout the other packages. + If "unset", the corresponding collectorNumber will be retrieved + from the corresponding CardEdition (see retrieveCollectorNumber) + * */ + if (collectorNumber == null) { + collectorNumber = this.retrieveCollectorNumber(); + } + + return collectorNumber; + } + @Override public int getArtIndex() { return artIndex; @@ -90,6 +115,20 @@ public final class PaperCard implements Comparable, InventoryItemFro return rarity; } + /* FIXME: At the moment, every card can get Foiled, with no restriction on the + corresponding Edition - so we could Foil even Alpha cards. + */ + public PaperCard getFoiled() { + if (this.foil) + return this; + + if (this.foiledVersion == null) { + this.foiledVersion = new PaperCard(this.rules, this.edition, this.rarity, + this.artIndex, true, String.valueOf(collectorNumber)); + } + return this.foiledVersion; + } + // @Override // public String getImageKey() { // return getImageLocator(getImageName(), getArtIndex(), true, false); @@ -124,11 +163,16 @@ public final class PaperCard implements Comparable, InventoryItemFro } }; + public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0) { + this(rules0, edition0, rarity0, IPaperCard.DEFAULT_ART_INDEX, false); + } public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, final int artIndex0) { this(rules0, edition0, rarity0, artIndex0, false); } - public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, final int artIndex0, final boolean foil0) { + + public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, final int artIndex0, + final boolean foil0) { if (rules0 == null || edition0 == null || rarity0 == null) { throw new IllegalArgumentException("Cannot create card without rules, edition or rarity"); } @@ -140,6 +184,17 @@ public final class PaperCard implements Comparable, InventoryItemFro rarity = rarity0; } + public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, final int artIndex0, + final String collectorNumber0) { + this(rules0, edition0, rarity0, artIndex0, false, collectorNumber0); + } + + public PaperCard(final CardRules rules0, final String edition0, final CardRarity rarity0, + final int artIndex0, final boolean foil0, final String collectorNumber0) { + this(rules0, edition0, rarity0, artIndex0, foil0); + collectorNumber = collectorNumber0; + } + // Want this class to be a key for HashTable @Override public boolean equals(final Object obj) { @@ -160,32 +215,27 @@ public final class PaperCard implements Comparable, InventoryItemFro if (!edition.equals(other.edition)) { return false; } - if ((other.foil != foil) || (other.artIndex != artIndex)) { + if (!getCollectorNumber().equals(other.getCollectorNumber())) return false; - } - - return true; + return (other.foil == foil) && (other.artIndex == artIndex); } /* * (non-Javadoc) - * + * * @see java.lang.Object#hashCode() */ @Override public int hashCode() { - final int code = (name.hashCode() * 11) + (edition.hashCode() * 59) + (artIndex * 2); + final int code = (name.hashCode() * 11) + (edition.hashCode() * 59) + + (artIndex * 2) + (getCollectorNumber().hashCode() * 383); if (foil) { return code + 1; } return code; } - /* - * (non-Javadoc) - * - * @see java.lang.Object#toString() - */ + // FIXME: Check @Override public String toString() { return CardTranslation.getTranslatedName(name); @@ -194,21 +244,49 @@ public final class PaperCard implements Comparable, InventoryItemFro } /* - * (non-Javadoc) - * - * @see java.lang.Comparable#compareTo(java.lang.Object) + * This (utility) method transform a collectorNumber String into a key string for sorting. + * This method proxies the same strategy implemented in CardEdition.CardInSet class from which the + * collectorNumber of PaperCard instances are originally retrieved. + * This is also to centralise the criterion, whilst avoiding code duplication. + * + * Note: The method has been made private as this is for internal API use **only**, to allow + * for generalised comparison with IPaperCard instances (see compareTo) + * + * The public API of PaperCard includes a method (i.e. getCollectorNumberSortingKey) which applies + * this method on instance's own collector number. + * + * @return a zero-padded 5-digits String + any non-numerical content in the input String, properly attached. */ + private static String makeCollectorNumberSortingKey(final String collectorNumber0){ + String collectorNumber = collectorNumber0; + if (collectorNumber.equals(NO_COLLECTOR_NUMBER)) + collectorNumber = null; + return CardEdition.CardInSet.getSortableCollectorNumber(collectorNumber); + } + + public String getCollectorNumberSortingKey(){ + // Hardly the case, but just invoke getter rather than direct + // attribute to be sure that collectorNumber has been retrieved already! + return makeCollectorNumberSortingKey(getCollectorNumber()); + } + + @Override public int compareTo(final IPaperCard o) { - final int nameCmp = getName().compareToIgnoreCase(o.getName()); + final int nameCmp = name.compareToIgnoreCase(o.getName()); if (0 != nameCmp) { return nameCmp; } - // TODO compare sets properly + //FIXME: compare sets properly int setDiff = edition.compareTo(o.getEdition()); - if ( 0 != setDiff ) + if (0 != setDiff) return setDiff; - + String thisCollNrKey = getCollectorNumberSortingKey(); + String othrCollNrKey = makeCollectorNumberSortingKey(o.getCollectorNumber()); + final int collNrCmp = thisCollNrKey.compareTo(othrCollNrKey); + if (0 != collNrCmp) { + return collNrCmp; + } return Integer.compare(artIndex, o.getArtIndex()); } @@ -216,8 +294,7 @@ public final class PaperCard implements Comparable, InventoryItemFro // default deserialization ois.defaultReadObject(); - IPaperCard pc = null; - pc = StaticData.instance().getCommonCards().getCard(name, edition, artIndex); + IPaperCard pc = StaticData.instance().getCommonCards().getCard(name, edition, artIndex); if (pc == null) { pc = StaticData.instance().getVariantCards().getCard(name, edition, artIndex); if (pc == null) { @@ -228,9 +305,35 @@ public final class PaperCard implements Comparable, InventoryItemFro rarity = pc.getRarity(); } + private String retrieveCollectorNumber() { + StaticData data = StaticData.instance(); + CardEdition edition = data.getEditions().get(this.edition); + if (edition == null) { + edition = data.getCustomEditions().get(this.edition); + if (edition == null) // don't bother continuing - non-existing card! + return NO_COLLECTOR_NUMBER; + } + int artIndexCount = 0; + String collectorNumberInEdition = ""; + for (CardEdition.CardInSet card : edition.getAllCardsInSet()) { + if (card.name.equalsIgnoreCase(this.name)) { + artIndexCount += 1; + if (artIndexCount == this.artIndex) { + collectorNumberInEdition = card.collectorNumber; + break; + } + } + } + // CardEdition stores collectorNumber as a String, which is null if there isn't any. + // In this case, the NO_COLLECTOR_NUMBER value (i.e. 0) is returned. + return ((collectorNumberInEdition != null) && (collectorNumberInEdition.length() > 0)) ? + collectorNumberInEdition : NO_COLLECTOR_NUMBER; + } + @Override public String getImageKey(boolean altState) { - String imageKey = ImageKeys.CARD_PREFIX + name + CardDb.NameSetSeparator + edition + CardDb.NameSetSeparator + artIndex; + String imageKey = ImageKeys.CARD_PREFIX + name + CardDb.NameSetSeparator + + edition + CardDb.NameSetSeparator + artIndex; if (altState) { imageKey += ImageKeys.BACKFACE_POSTFIX; } diff --git a/forge-core/src/main/java/forge/item/PaperToken.java b/forge-core/src/main/java/forge/item/PaperToken.java index 74fc8c4d707..776d17ceed8 100644 --- a/forge-core/src/main/java/forge/item/PaperToken.java +++ b/forge-core/src/main/java/forge/item/PaperToken.java @@ -132,6 +132,12 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard { @Override public String toString() { return name; } @Override public String getEdition() { return edition != null ? edition.getCode() : "???"; } + + @Override + public String getCollectorNumber() { + return IPaperCard.NO_COLLECTOR_NUMBER; + } + @Override public int getArtIndex() { return artIndex; } @Override public boolean isFoil() { return false; } @Override public CardRules getRules() { return card; } diff --git a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java index 33e3fa8eadd..d4301cf2667 100644 --- a/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java +++ b/forge-core/src/main/java/forge/item/generation/BoosterGenerator.java @@ -70,12 +70,14 @@ public class BoosterGenerator { } private static PaperCard generateFoilCard(PrintSheet sheet) { - return StaticData.instance().getCommonCards().getFoiled(sheet.random(1, true).get(0)); + PaperCard randomCard = sheet.random(1, true).get(0); + return randomCard.getFoiled(); } private static PaperCard generateFoilCard(List cardList) { Collections.shuffle(cardList, MyRandom.getRandom()); - return StaticData.instance().getCommonCards().getFoiled(cardList.get(0)); + PaperCard randomCard = cardList.get(0); + return randomCard.getFoiled(); } public static List getBoosterPack(SealedProduct.Template template) { @@ -461,7 +463,7 @@ public class BoosterGenerator { if (toReplace != null) { // Keep the foil state if (toReplace.isFoil()) { - toAdd = StaticData.instance().getCommonCards().getFoiled(toAdd); + toAdd = toAdd.getFoiled(); } booster.remove(toReplace); booster.add(toAdd); diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index d12ef2741ff..64cbdfedf1b 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -21,7 +21,6 @@ import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; -import java.io.FileReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; @@ -208,7 +207,7 @@ public final class FileUtil { if ((file == null) || !file.exists()) { return new ArrayList<>(); } - return FileUtil.readAllLines(new FileReader(file), false); + return FileUtil.readAllLines(file, false); } catch (final Exception ex) { throw new RuntimeException("FileUtil : readFile() error, " + ex); } @@ -248,6 +247,31 @@ public final class FileUtil { } return list; } + /** + * Reads all lines from given file to a list of strings. + * + * @param file is the File to read. + * @param mayTrim defines whether to trim lines. + * @return list of strings + */ + public static List readAllLines(final File file, final boolean mayTrim) { + final List list = new ArrayList<>(); + try { + final BufferedReader in = new BufferedReader( + new InputStreamReader(new FileInputStream(file), "UTF-8")); + String line; + while ((line = in.readLine()) != null) { + if (mayTrim) { + line = line.trim(); + } + list.add(line); + } + in.close(); + } catch (final IOException ex) { + throw new RuntimeException("FileUtil : readAllLines() error, " + ex); + } + return list; + } // returns a list of pairs. if the name is not in the file, it is synthesized from the url public static List> readNameUrlFile(String nameUrlFile) { diff --git a/forge-core/src/main/java/forge/util/ImageUtil.java b/forge-core/src/main/java/forge/util/ImageUtil.java index 3ff22655c5e..63dae0114e3 100644 --- a/forge-core/src/main/java/forge/util/ImageUtil.java +++ b/forge-core/src/main/java/forge/util/ImageUtil.java @@ -99,7 +99,7 @@ public class ImageUtil { final CardDb db = StaticData.instance().getCommonCards(); return db.getRules(card.getMeldWith()).getOtherPart().getName(); } else { - return null; + return null; } else return null; @@ -118,6 +118,27 @@ public class ImageUtil { return getImageRelativePath(cp, backFace, true, true); } + public static String getScryfallDownloadUrl(PaperCard cp, boolean backFace, String setCode){ + return getScryfallDownloadUrl(cp, backFace, setCode, "en"); + } + + public static String getScryfallDownloadUrl(PaperCard cp, boolean backFace, String setCode, String langCode){ + String editionCode; + if ((setCode != null) && (setCode.length() > 0)) + editionCode = setCode; + else + editionCode = cp.getEdition().toLowerCase(); + String cardCollectorNumber = cp.getCollectorNumber(); + // Hack to account for variations in Arabian Nights + cardCollectorNumber = cardCollectorNumber.replace("+", "†"); + String faceParam = ""; + if (cp.getRules().getOtherPart() != null) { + faceParam = (backFace ? "&face=back" : "&face=front"); + } + return String.format("%s/%s/%s?format=image&version=normal%s", editionCode, cardCollectorNumber, + langCode, faceParam); + } + public static String toMWSFilename(String in) { final StringBuilder out = new StringBuilder(); char c; @@ -130,4 +151,4 @@ public class ImageUtil { } return out.toString(); } -} +} \ No newline at end of file diff --git a/forge-core/src/main/java/forge/util/Localizer.java b/forge-core/src/main/java/forge/util/Localizer.java index 60acb7e0b59..741d3c7c79b 100644 --- a/forge-core/src/main/java/forge/util/Localizer.java +++ b/forge-core/src/main/java/forge/util/Localizer.java @@ -15,147 +15,155 @@ import java.util.MissingResourceException; import java.util.ResourceBundle; public class Localizer { - - private static Localizer instance; - private List observers = new ArrayList<>(); - - private Locale locale; - private ResourceBundle resourceBundle; + private static Localizer instance; - public static Localizer getInstance() { - if (instance == null) { - synchronized (Localizer.class) { - instance = new Localizer(); - } - } - return instance; - } - - private Localizer() { - } - - public void initialize(String localeID, String languagesDirectory) { - setLanguage(localeID, languagesDirectory); - } + private List observers = new ArrayList<>(); - public String convert(String value, String fromEncoding, String toEncoding) throws UnsupportedEncodingException { - return new String(value.getBytes(fromEncoding), toEncoding); - } + private Locale locale; + private ResourceBundle resourceBundle; - public String charset(String value, String charsets[]) { - String probe = StandardCharsets.UTF_8.name(); - for(String c : charsets) { - Charset charset = Charset.forName(c); - if(charset != null) { - try { - if (value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) { - return c; - } - } catch(UnsupportedEncodingException ignored) {} - } - } - return StandardCharsets.UTF_8.name(); - } + public static Localizer getInstance() { + if (instance == null) { + synchronized (Localizer.class) { + instance = new Localizer(); + } + } + return instance; + } - public String getMessage(final String key, final Object... messageArguments) { - MessageFormat formatter = null; + private Localizer() { + } - try { - //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); - formatter = new MessageFormat(resourceBundle.getString(key), locale); - } catch (final IllegalArgumentException | MissingResourceException e) { - e.printStackTrace(); - } - - if (formatter == null) { - System.err.println("INVALID PROPERTY: '" + key + "' -- Translation Needed?"); - return "INVALID PROPERTY: '" + key + "' -- Translation Needed?"; - } - - formatter.setLocale(locale); - - String formattedMessage = "CHAR ENCODING ERROR"; - final String[] charsets = { "ISO-8859-1", "UTF-8" }; - //Support non-English-standard characters - String detectedCharset = charset(resourceBundle.getString(key), charsets); + public void initialize(String localeID, String languagesDirectory) { + setLanguage(localeID, languagesDirectory); + } - final int argLength = messageArguments.length; - Object[] syncEncodingMessageArguments = new Object[argLength]; - //when messageArguments encoding not equal resourceBundle.getString(key),convert to equal - //avoid convert to a have two encoding content formattedMessage string. - for (int i = 0; i < argLength; i++) { - String objCharset = charset(messageArguments[i].toString(), charsets); - try { - syncEncodingMessageArguments[i] = convert(messageArguments[i].toString(), objCharset, detectedCharset); - } catch (UnsupportedEncodingException ignored) { - System.err.println("Cannot Convert '" + messageArguments[i].toString() + "' from '" + objCharset + "' To '" + detectedCharset + "'"); - return "encoding '" + key + "' translate string failure"; - } - } + public String convert(String value, String fromEncoding, String toEncoding) throws UnsupportedEncodingException { + return new String(value.getBytes(fromEncoding), toEncoding); + } - try { - formattedMessage = new String(formatter.format(syncEncodingMessageArguments).getBytes(detectedCharset), StandardCharsets.UTF_8); - } catch(UnsupportedEncodingException ignored) {} + public String charset(String value, String charsets[]) { + String probe = StandardCharsets.UTF_8.name(); + for(String c : charsets) { + Charset charset = Charset.forName(c); + if(charset != null) { + try { + if (value.equals(convert(convert(value, charset.name(), probe), probe, charset.name()))) { + return c; + } + } catch(UnsupportedEncodingException ignored) {} + } + } + return StandardCharsets.UTF_8.name(); + } - return formattedMessage; - } + public String getMessageorUseDefault(final String key, final String defaultValue, final Object... messageArguments) { + try { + return getMessage(key, messageArguments); + } catch (Exception e) { + return defaultValue; + } + } + //FIXME: localizer should return default value from english locale or it will crash some GUI element like the NewGameMenu->NewGameScreen Popup when returned null... + public String getMessage(final String key, final Object... messageArguments) { + MessageFormat formatter = null; - public void setLanguage(final String languageRegionID, final String languagesDirectory) { - - String[] splitLocale = languageRegionID.split("-"); - - Locale oldLocale = locale; - locale = new Locale(splitLocale[0], splitLocale[1]); - - //Don't reload the language if nothing changed - if (oldLocale == null || !oldLocale.equals(locale)) { + try { + //formatter = new MessageFormat(resourceBundle.getString(key.toLowerCase()), locale); + formatter = new MessageFormat(resourceBundle.getString(key), locale); + } catch (final IllegalArgumentException | MissingResourceException e) { + e.printStackTrace(); + } - File file = new File(languagesDirectory); - URL[] urls = null; - - try { - urls = new URL[] { file.toURI().toURL() }; - } catch (MalformedURLException e) { - e.printStackTrace(); - } + if (formatter == null) { + System.err.println("INVALID PROPERTY: '" + key + "' -- Translation Needed?"); + return "INVALID PROPERTY: '" + key + "' -- Translation Needed?"; + } - ClassLoader loader = new URLClassLoader(urls); + formatter.setLocale(locale); - try { - resourceBundle = ResourceBundle.getBundle(languageRegionID, new Locale(splitLocale[0], splitLocale[1]), loader); - } catch (NullPointerException | MissingResourceException e) { - //If the language can't be loaded, default to US English - resourceBundle = ResourceBundle.getBundle("en-US", new Locale("en", "US"), loader); - e.printStackTrace(); - } + String formattedMessage = "CHAR ENCODING ERROR"; + final String[] charsets = { "ISO-8859-1", "UTF-8" }; + //Support non-English-standard characters + String detectedCharset = charset(resourceBundle.getString(key), charsets); - System.out.println("Language '" + resourceBundle.toString() + "' loaded successfully."); - - notifyObservers(); - - } - - } - - public List getLanguages() { - //TODO List all languages by getting their files - return null; - } - - public void registerObserver(LocalizationChangeObserver observer) { - observers.add(observer); - } - - private void notifyObservers() { - for (LocalizationChangeObserver observer : observers) { - observer.localizationChanged(); - } - } + final int argLength = messageArguments.length; + Object[] syncEncodingMessageArguments = new Object[argLength]; + //when messageArguments encoding not equal resourceBundle.getString(key),convert to equal + //avoid convert to a have two encoding content formattedMessage string. + for (int i = 0; i < argLength; i++) { + String objCharset = charset(messageArguments[i].toString(), charsets); + try { + syncEncodingMessageArguments[i] = convert(messageArguments[i].toString(), objCharset, detectedCharset); + } catch (UnsupportedEncodingException ignored) { + System.err.println("Cannot Convert '" + messageArguments[i].toString() + "' from '" + objCharset + "' To '" + detectedCharset + "'"); + return "encoding '" + key + "' translate string failure"; + } + } - public static class Language { - public String languageName; - public String languageID; - } + try { + formattedMessage = new String(formatter.format(syncEncodingMessageArguments).getBytes(detectedCharset), StandardCharsets.UTF_8); + } catch(UnsupportedEncodingException ignored) {} + + return formattedMessage; + } + + public void setLanguage(final String languageRegionID, final String languagesDirectory) { + + String[] splitLocale = languageRegionID.split("-"); + + Locale oldLocale = locale; + locale = new Locale(splitLocale[0], splitLocale[1]); + + //Don't reload the language if nothing changed + if (oldLocale == null || !oldLocale.equals(locale)) { + + File file = new File(languagesDirectory); + URL[] urls = null; + + try { + urls = new URL[] { file.toURI().toURL() }; + } catch (MalformedURLException e) { + e.printStackTrace(); + } + + ClassLoader loader = new URLClassLoader(urls); + + try { + resourceBundle = ResourceBundle.getBundle(languageRegionID, new Locale(splitLocale[0], splitLocale[1]), loader); + } catch (NullPointerException | MissingResourceException e) { + //If the language can't be loaded, default to US English + resourceBundle = ResourceBundle.getBundle("en-US", new Locale("en", "US"), loader); + e.printStackTrace(); + } + + System.out.println("Language '" + resourceBundle.toString() + "' loaded successfully."); + + notifyObservers(); + + } + + } + + public List getLanguages() { + //TODO List all languages by getting their files + return null; + } + + public void registerObserver(LocalizationChangeObserver observer) { + observers.add(observer); + } + + private void notifyObservers() { + for (LocalizationChangeObserver observer : observers) { + observer.localizationChanged(); + } + } + + public static class Language { + public String languageName; + public String languageID; + } } diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 78d4bacc2b7..b9db1d3fb06 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -162,6 +162,9 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, * @return a boolean. */ public boolean matchesValid(final Object o, final String[] valids, final Card srcCard) { + if (srcCard == null) { + return false; + } return matchesValid(o, valids, srcCard, srcCard.getController()); } @@ -188,13 +191,17 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, return matchesValid(o, valids, getHostCard()); } - public boolean matchesValidParam(String param, final Object o) { - if (hasParam(param) && !matchesValid(o, getParam(param).split(","))) { + public boolean matchesValidParam(String param, final Object o, final Card srcCard) { + if (hasParam(param) && !matchesValid(o, getParam(param).split(","), srcCard)) { return false; } return true; } + public boolean matchesValidParam(String param, final Object o) { + return matchesValidParam(param, o, getHostCard()); + } + /** * Sets the suppressed. * @@ -341,7 +348,6 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } list = CardLists.getValidCards(list, sIsPresent.split(","), this.getHostCard().getController(), this.getHostCard(), this); - final String rightString = presentCompare.substring(2); int right = AbilityUtils.calculateAmount(getHostCard(), rightString, this); final int left = list.size(); @@ -434,7 +440,7 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, } if (params.containsKey("WerewolfTransformCondition")) { - if (!CardUtil.getLastTurnCast("Card", this.getHostCard()).isEmpty()) { + if (!CardUtil.getLastTurnCast("Card", this.getHostCard(), this).isEmpty()) { return false; } } diff --git a/forge-game/src/main/java/forge/game/Game.java b/forge-game/src/main/java/forge/game/Game.java index cfd9b21e4f7..f322fd5ad39 100644 --- a/forge-game/src/main/java/forge/game/Game.java +++ b/forge-game/src/main/java/forge/game/Game.java @@ -756,7 +756,7 @@ public class Game { // Rule 800.4 Losing a Multiplayer game CardCollectionView cards = this.getCardsInGame(); boolean planarControllerLost = false; - boolean isMultiplayer = this.getPlayers().size() > 2; + boolean isMultiplayer = getPlayers().size() > 2; // 702.142f & 707.9 // If a player leaves the game, all face-down cards that player owns must be revealed to all players. @@ -772,7 +772,7 @@ public class Game { for (Card c : cards) { // CR 800.4d if card is controlled by opponent, LTB should trigger if (c.getOwner().equals(p) && c.getController().equals(p)) { - c.getCurrentState().clearTriggers(); + c.getGame().getTriggerHandler().clearActiveTriggers(c, null); } } @@ -793,16 +793,16 @@ public class Game { } getAction().ceaseToExist(c, false); // CR 603.2f owner of trigger source lost game - triggerHandler.clearDelayedTrigger(c); + getTriggerHandler().clearDelayedTrigger(c); } else { // return stolen permanents - if (c.getController().equals(p) && c.isInZone(ZoneType.Battlefield)) { + if ((c.getController().equals(p) || c.getZone().getPlayer().equals(p)) && c.isInZone(ZoneType.Battlefield)) { c.removeTempController(p); getAction().controllerChangeZoneCorrection(c); } c.removeTempController(p); if (c.getController().equals(p)) { - this.getAction().exile(c, null); + getAction().exile(c, null); } } } else { @@ -830,7 +830,7 @@ public class Game { } // Remove leftover items from - this.getStack().removeInstancesControlledBy(p); + getStack().removeInstancesControlledBy(p); getTriggerHandler().onPlayerLost(p); @@ -1054,7 +1054,8 @@ public class Game { public void onCleanupPhase() { clearCounterAddedThisTurn(); - for (Player player : getPlayers()) { + // some cards need this info updated even after a player lost, so don't skip them + for (Player player : getRegisteredPlayers()) { player.onCleanupPhase(); } } diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 89ec43318e4..b916a1b721e 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -47,6 +47,7 @@ import forge.game.ability.effects.AttachEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; +import forge.game.card.CardDamageMap; import forge.game.card.CardFactory; import forge.game.card.CardLists; import forge.game.card.CardPredicates; @@ -61,6 +62,7 @@ import forge.game.event.GameEventCardTapped; import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventGameStarted; import forge.game.event.GameEventScry; +import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mulligan.MulliganService; import forge.game.player.GameLossReason; @@ -144,8 +146,8 @@ public class GameAction { boolean fromBattlefield = zoneFrom != null && zoneFrom.is(ZoneType.Battlefield); boolean wasFacedown = c.isFaceDown(); - //Rule 110.5g: A token that has left the battlefield can't move to another zone - if (c.isToken() && zoneFrom != null && !fromBattlefield && !zoneFrom.is(ZoneType.Stack)) { + // Rule 111.8: A token that has left the battlefield can't move to another zone + if (!c.isSpell() && c.isToken() && zoneFrom != null && !fromBattlefield && !zoneFrom.is(ZoneType.Stack)) { return c; } @@ -241,7 +243,7 @@ public class GameAction { copied = CardFactory.copyCard(c, false); if (zoneTo.is(ZoneType.Stack)) { - // when moving to stack, copy changed card infomation + // when moving to stack, copy changed card information copied.setChangedCardColors(c.getChangedCardColors()); copied.setChangedCardKeywords(c.getChangedCardKeywords()); copied.setChangedCardTypes(c.getChangedCardTypesMap()); @@ -342,6 +344,7 @@ public class GameAction { c.updateStateForView(); } } + return c; } } @@ -371,7 +374,7 @@ public class GameAction { if (saTargeting != null) { saTargeting.getTargets().replaceTargetCard(c, cards); } - // Replace host rememberd cards + // Replace host remembered cards // But not replace RememberLKI, since it wants to refer to the last known info. Card hostCard = cause.getHostCard(); if (!cause.hasParam("RememberLKI") && hostCard.isRemembered(c)) { @@ -438,7 +441,7 @@ public class GameAction { } if (mergedCards != null) { - // Move components of merged permanet here + // Move components of merged permanent here // Also handle 721.3e and 903.9a boolean wasToken = c.isToken(); if (commanderEffect != null) { @@ -938,7 +941,10 @@ public class GameAction { game.getCombat().removeFromCombat(c); game.getCombat().saveLKI(lki); } - game.getTriggerHandler().registerActiveLTBTrigger(lki); + // again, make sure no triggers run from cards leaving controlled by loser + if (!lki.getController().equals(lki.getOwner())) { + game.getTriggerHandler().registerActiveLTBTrigger(lki); + } final Map runParams = AbilityKey.mapFromCard(c); runParams.put(AbilityKey.CardLKI, lki); runParams.put(AbilityKey.Origin, c.getZone().getZoneType().name()); @@ -1352,8 +1358,7 @@ public class GameAction { if (c.getCounters(CounterEnumType.LORE) < c.getFinalChapterNr()) { return false; } - if (!game.getStack().hasSimultaneousStackEntries() && - !game.getStack().hasSourceOnStack(c, SpellAbilityPredicates.isChapter())) { + if (!game.getStack().hasSourceOnStack(c, SpellAbilityPredicates.isChapter())) { sacrifice(c, null, table); checkAgain = true; } @@ -1680,7 +1685,9 @@ public class GameAction { final Map runParams = AbilityKey.mapFromCard(c); runParams.put(AbilityKey.Causer, activator); game.getTriggerHandler().runTrigger(TriggerType.Destroyed, runParams, false); - + // in case the destroyed card has such a trigger + game.getTriggerHandler().registerActiveLTBTrigger(c); + final Card sacrificed = sacrificeDestroy(c, sa, table); return sacrificed != null; } @@ -1695,7 +1702,7 @@ public class GameAction { } final Card newCard = moveToGraveyard(c, cause, null); - if (table != null) { + if (table != null && newCard != null && newCard.getZone() != null) { table.put(ZoneType.Battlefield, newCard.getZone().getZoneType(), newCard); } @@ -2121,4 +2128,44 @@ public class GameAction { } } } + + public void dealDamage(final boolean isCombat, final CardDamageMap damageMap, final CardDamageMap preventMap, + final GameEntityCounterTable counterTable, final SpellAbility cause) { + // Clear assigned damage if is combat + for (Map.Entry> et : damageMap.columnMap().entrySet()) { + final GameEntity ge = et.getKey(); + if (isCombat && ge instanceof Card) { + ((Card) ge).clearAssignedDamage(); + } + } + + // Run replacement effect for each entity dealt damage + game.getReplacementHandler().runReplaceDamage(isCombat, damageMap, preventMap, counterTable, cause); + + // Actually deal damage according to replaced damage map + for (Map.Entry> et : damageMap.rowMap().entrySet()) { + final Card sourceLKI = et.getKey(); + int sum = 0; + for (Map.Entry e : et.getValue().entrySet()) { + if (e.getValue() <= 0) { + continue; + } + sum += e.getValue(); + e.getKey().addDamageAfterPrevention(e.getValue(), sourceLKI, isCombat, counterTable); + } + + if (sourceLKI.hasKeyword(Keyword.LIFELINK)) { + sourceLKI.getController().gainLife(sum, sourceLKI, cause); + } + } + + preventMap.triggerPreventDamage(isCombat); + preventMap.clear(); + + damageMap.triggerDamageDoneOnce(isCombat, game); + damageMap.clear(); + + counterTable.triggerCountersPutAll(game); + counterTable.clear(); + } } diff --git a/forge-game/src/main/java/forge/game/GameEntity.java b/forge-game/src/main/java/forge/game/GameEntity.java index 285e3e15a0b..ba4a2f26498 100644 --- a/forge-game/src/main/java/forge/game/GameEntity.java +++ b/forge-game/src/main/java/forge/game/GameEntity.java @@ -23,11 +23,11 @@ import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; -import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardDamageMap; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CounterEnumType; @@ -35,19 +35,17 @@ import forge.game.card.CounterType; import forge.game.event.GameEventCardAttachment; import forge.game.keyword.Keyword; import forge.game.player.Player; +import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; import forge.game.spellability.TargetRestrictions; import forge.game.staticability.StaticAbility; -import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; public abstract class GameEntity extends GameObject implements IIdentifiable { protected final int id; private String name = ""; - private int preventNextDamage = 0; protected CardCollection attachedCards = new CardCollection(); - private Map> preventionShieldsWithEffects = Maps.newTreeMap(); protected Map counters = Maps.newHashMap(); protected GameEntity(int id0) { @@ -67,216 +65,61 @@ public abstract class GameEntity extends GameObject implements IIdentifiable { getView().updateName(this); } - public final int addDamage(final int damage, final Card source, boolean isCombat, boolean noPrevention, - final CardDamageMap damageMap, final CardDamageMap preventMap, GameEntityCounterTable counterTable, final SpellAbility cause) { - if (noPrevention) { - return addDamageWithoutPrevention(damage, source, damageMap, preventMap, counterTable, cause); - } else if (isCombat) { - return addCombatDamage(damage, source, damageMap, preventMap, counterTable); - } else { - return addDamage(damage, source, damageMap, preventMap, counterTable, cause); - } - } - - public int addDamage(final int damage, final Card source, final CardDamageMap damageMap, - final CardDamageMap preventMap, GameEntityCounterTable counterTable, final SpellAbility cause) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, false, true, damageMap, preventMap, counterTable, cause); - damageToDo = preventDamage(damageToDo, source, false, preventMap, cause); - - return addDamageAfterPrevention(damageToDo, source, false, damageMap, counterTable); - } - - public final int addCombatDamage(final int damage, final Card source, final CardDamageMap damageMap, - final CardDamageMap preventMap, GameEntityCounterTable counterTable) { - int damageToDo = damage; - - damageToDo = replaceDamage(damageToDo, source, true, true, damageMap, preventMap, counterTable, null); - damageToDo = preventDamage(damageToDo, source, true, preventMap, null); - - if (damageToDo > 0) { - source.getDamageHistory().registerCombatDamage(this); - } - // damage prevention is already checked - return addCombatDamageBase(damageToDo, source, damageMap, counterTable); - } - - protected int addCombatDamageBase(final int damage, final Card source, CardDamageMap damageMap, GameEntityCounterTable counterTable) { - return addDamageAfterPrevention(damage, source, true, damageMap, counterTable); - } - - public int addDamageWithoutPrevention(final int damage, final Card source, final CardDamageMap damageMap, - final CardDamageMap preventMap, GameEntityCounterTable counterTable, final SpellAbility cause) { - int damageToDo = replaceDamage(damage, source, false, false, damageMap, preventMap, counterTable, cause); - return addDamageAfterPrevention(damageToDo, source, false, damageMap, counterTable); - } - - public int replaceDamage(final int damage, final Card source, final boolean isCombat, final boolean prevention, - final CardDamageMap damageMap, final CardDamageMap preventMap, GameEntityCounterTable counterTable, final SpellAbility cause) { - // Replacement effects - final Map repParams = AbilityKey.mapFromAffected(this); - repParams.put(AbilityKey.DamageSource, source); - repParams.put(AbilityKey.DamageAmount, damage); - repParams.put(AbilityKey.IsCombat, isCombat); - repParams.put(AbilityKey.NoPreventDamage, !prevention); - repParams.put(AbilityKey.DamageMap, damageMap); - repParams.put(AbilityKey.PreventMap, preventMap); - repParams.put(AbilityKey.CounterTable, counterTable); - if (cause != null) { - repParams.put(AbilityKey.Cause, cause); - } - - switch (getGame().getReplacementHandler().run(ReplacementType.DamageDone, repParams)) { - case NotReplaced: - return damage; - case Updated: - int newDamage = (int) repParams.get(AbilityKey.DamageAmount); - GameEntity newTarget = (GameEntity) repParams.get(AbilityKey.Affected); - // check if this is still the affected card or player - if (this.equals(newTarget)) { - return newDamage; - } else { - if (prevention) { - newDamage = newTarget.preventDamage(newDamage, source, isCombat, preventMap, cause); - } - newTarget.addDamageAfterPrevention(newDamage, source, isCombat, damageMap, counterTable); - } - default: - return 0; - } - } - // This function handles damage after replacement and prevention effects are applied - public abstract int addDamageAfterPrevention(final int damage, final Card source, final boolean isCombat, CardDamageMap damageMap, GameEntityCounterTable counterTable); + public abstract int addDamageAfterPrevention(final int damage, final Card source, final boolean isCombat, GameEntityCounterTable counterTable); // This should be also usable by the AI to forecast an effect (so it must // not change the game state) - public abstract int staticDamagePrevention(final int damage, final Card source, final boolean isCombat, final boolean isTest); + public int staticDamagePrevention(final int damage, final int possiblePrevention, final Card source, final boolean isCombat) { + if (damage <= 0) { + return 0; + } + if (!source.canDamagePrevented(isCombat)) { + return damage; + } + + if (isCombat && getGame().getReplacementHandler().isPreventCombatDamageThisTurn()) { + return 0; + } + + for (final Card ca : getGame().getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { + for (final ReplacementEffect re : ca.getReplacementEffects()) { + if (!re.getMode().equals(ReplacementType.DamageDone) || + (!re.hasParam("PreventionEffect") && !re.hasParam("Prevent"))) { + continue; + } + if (!re.matchesValidParam("ValidSource", source)) { + continue; + } + if (!re.matchesValidParam("ValidTarget", this)) { + continue; + } + if (re.hasParam("IsCombat")) { + if (re.getParam("IsCombat").equals("True") != isCombat) { + continue; + } + } + if (re.hasParam("Prevent")) { + return 0; + } else if (re.getOverridingAbility() != null) { + SpellAbility repSA = re.getOverridingAbility(); + if (repSA.getApi() == ApiType.ReplaceDamage) { + return Math.max(0, damage - AbilityUtils.calculateAmount(ca, repSA.getParam("Amount"), repSA)); + } + } + return 0; + } + } + + return Math.max(0, damage - possiblePrevention); + } // This should be also usable by the AI to forecast an effect (so it must // not change the game state) public abstract int staticReplaceDamage(final int damage, final Card source, final boolean isCombat); - public final int preventDamage( - final int damage, final Card source, final boolean isCombat, CardDamageMap preventMap, - final SpellAbility cause) { - if (!source.canDamagePrevented(isCombat)) { - return damage; - } - - int restDamage = damage; - - // first try to replace the damage - final Map repParams = AbilityKey.mapFromAffected(this); - repParams.put(AbilityKey.DamageSource, source); - repParams.put(AbilityKey.DamageAmount, damage); - repParams.put(AbilityKey.IsCombat, isCombat); - repParams.put(AbilityKey.Prevention, true); - repParams.put(AbilityKey.PreventMap, preventMap); - if (cause != null) { - repParams.put(AbilityKey.Cause, cause); - } - - switch (getGame().getReplacementHandler().run(ReplacementType.DamageDone, repParams)) { - case NotReplaced: - restDamage = damage; - break; - case Updated: - restDamage = (int) repParams.get(AbilityKey.DamageAmount); - break; - default: - restDamage = 0; - } - - // then apply static Damage Prevention effects - restDamage = staticDamagePrevention(restDamage, source, isCombat, false); - - // then apply ShieldEffects with Special Effect - restDamage = preventShieldEffect(restDamage); - - // then do Shield with only number - if (restDamage <= 0) { - restDamage = 0; - } else if (restDamage >= getPreventNextDamage()) { - restDamage = restDamage - getPreventNextDamage(); - setPreventNextDamage(0); - } else { - setPreventNextDamage(getPreventNextDamage() - restDamage); - restDamage = 0; - } - - // if damage is greater than restDamage, damage was prevented - if (damage > restDamage) { - int prevent = damage - restDamage; - preventMap.put(source, this, damage - restDamage); - - final Map runParams = AbilityKey.newMap(); - runParams.put(AbilityKey.DamageTarget, this); - runParams.put(AbilityKey.DamageAmount, prevent); - runParams.put(AbilityKey.DamageSource, source); - runParams.put(AbilityKey.IsCombatDamage, isCombat); - - getGame().getTriggerHandler().runTrigger(TriggerType.DamagePrevented, runParams, false); - } - - return restDamage; - } - - protected abstract int preventShieldEffect(final int damage); - - public int getPreventNextDamage() { - return preventNextDamage; - } - public void setPreventNextDamage(final int n) { - preventNextDamage = n; - } - public void addPreventNextDamage(final int n) { - preventNextDamage += n; - } - public void subtractPreventNextDamage(final int n) { - preventNextDamage -= n; - } - public void resetPreventNextDamage() { - preventNextDamage = 0; - } - - // PreventNextDamageWithEffect - public Map> getPreventNextDamageWithEffect() { - return preventionShieldsWithEffects; - } public int getPreventNextDamageTotalShields() { - int shields = preventNextDamage; - for (final Map value : preventionShieldsWithEffects.values()) { - shields += Integer.valueOf(value.get("ShieldAmount")); - } - return shields; - } - /** - * Adds a damage prevention shield with an effect that happens at time of prevention. - * @param shieldSource - The source card which generated the shield - * @param effectMap - A map of the effect occurring with the damage prevention - */ - public void addPreventNextDamageWithEffect(final Card shieldSource, Map effectMap) { - if (preventionShieldsWithEffects.containsKey(shieldSource)) { - int currentShields = Integer.valueOf(preventionShieldsWithEffects.get(shieldSource).get("ShieldAmount")); - currentShields += Integer.valueOf(effectMap.get("ShieldAmount")); - effectMap.put("ShieldAmount", Integer.toString(currentShields)); - preventionShieldsWithEffects.put(shieldSource, effectMap); - } else { - preventionShieldsWithEffects.put(shieldSource, effectMap); - } - } - public void subtractPreventNextDamageWithEffect(final Card shieldSource, final int n) { - int currentShields = Integer.valueOf(preventionShieldsWithEffects.get(shieldSource).get("ShieldAmount")); - if (currentShields > n) { - preventionShieldsWithEffects.get(shieldSource).put("ShieldAmount", String.valueOf(currentShields - n)); - } else { - preventionShieldsWithEffects.remove(shieldSource); - } - } - public void resetPreventNextDamageWithEffect() { - preventionShieldsWithEffects.clear(); + return getGame().getReplacementHandler().getTotalPreventionShieldAmount(this); } public abstract boolean hasKeyword(final String keyword); diff --git a/forge-game/src/main/java/forge/game/GameEntityCounterTable.java b/forge-game/src/main/java/forge/game/GameEntityCounterTable.java index 2b881bd9437..222e1a16a58 100644 --- a/forge-game/src/main/java/forge/game/GameEntityCounterTable.java +++ b/forge-game/src/main/java/forge/game/GameEntityCounterTable.java @@ -20,6 +20,13 @@ public class GameEntityCounterTable extends ForwardingTable, Ga private Table, GameEntity, Map> dataMap = HashBasedTable.create(); + public GameEntityCounterTable() { + } + + public GameEntityCounterTable(Table, GameEntity, Map> counterTable) { + putAll(counterTable); + } + /* * (non-Javadoc) * @see com.google.common.collect.ForwardingTable#delegate() diff --git a/forge-game/src/main/java/forge/game/GameFormat.java b/forge-game/src/main/java/forge/game/GameFormat.java index 026b83ea942..ace852683b6 100644 --- a/forge-game/src/main/java/forge/game/GameFormat.java +++ b/forge-game/src/main/java/forge/game/GameFormat.java @@ -101,9 +101,10 @@ public class GameFormat implements Comparable { this.effectiveDate = effectiveDate; if(sets != null) { + StaticData data = StaticData.instance(); Set parsedSets = new HashSet<>(); for (String set : sets) { - if (StaticData.instance().getEditions().get(set) == null) { + if (data.getCardEdition(set) == null) { System.out.println("Set " + set + " in format " + fName + " does not match any valid editions!"); continue; } diff --git a/forge-game/src/main/java/forge/game/StaticEffect.java b/forge-game/src/main/java/forge/game/StaticEffect.java index d0ee86b9945..165c351c46f 100644 --- a/forge-game/src/main/java/forge/game/StaticEffect.java +++ b/forge-game/src/main/java/forge/game/StaticEffect.java @@ -240,7 +240,7 @@ public class StaticEffect { // remove keywords // (Although nothing uses it at this time) if (hasParam("AddKeyword") || hasParam("RemoveKeyword") - || hasParam("RemoveAllAbilities")) { + || hasParam("RemoveAllAbilities") || hasParam("RemoveLandTypes")) { affectedCard.removeChangedCardKeywords(getTimestamp()); } diff --git a/forge-game/src/main/java/forge/game/ability/AbilityKey.java b/forge-game/src/main/java/forge/game/ability/AbilityKey.java index a3d3089fa63..526173cdd87 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityKey.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityKey.java @@ -57,6 +57,7 @@ public enum AbilityKey { DefendingPlayer("DefendingPlayer"), Destination("Destination"), Devoured("Devoured"), + DividedShieldAmount("DividedShieldAmount"), EchoPaid("EchoPaid"), EffectOnly("EffectOnly"), Exploited("Exploited"), @@ -96,12 +97,14 @@ public enum AbilityKey { PayingMana("PayingMana"), Phase("Phase"), Player("Player"), + PreventedAmount("PreventedAmount"), PreventMap("PreventMap"), Prevention("Prevention"), Produced("Produced"), Regeneration("Regeneration"), ReplacementEffect("ReplacementEffect"), ReplacementResult("ReplacementResult"), + ReplacementResultMap("ReplacementResultMap"), Result("Result"), Scheme("Scheme"), Source("Source"), 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 bdf020b1a7e..36df10af917 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -1,8 +1,12 @@ package forge.game.ability; import java.util.ArrayList; +import java.util.EnumSet; +import java.util.HashMap; +import java.util.HashSet; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.Map.Entry; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -15,6 +19,7 @@ import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; +import com.google.common.collect.Sets; import forge.card.CardStateName; import forge.card.CardType; @@ -37,16 +42,19 @@ import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; import forge.game.card.CounterType; +import forge.game.card.CardPredicates.Presets; import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; import forge.game.mana.Mana; import forge.game.mana.ManaConversionMatrix; import forge.game.mana.ManaCostBeingPaid; +import forge.game.phase.PhaseHandler; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.player.PlayerPredicates; import forge.game.spellability.AbilitySub; +import forge.game.spellability.OptionalCost; import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityRestriction; @@ -58,6 +66,7 @@ import forge.game.trigger.TriggerType; import forge.game.zone.ZoneType; import forge.util.Aggregates; import forge.util.Expressions; +import forge.util.MyRandom; import forge.util.TextUtil; import forge.util.collect.FCollection; import forge.util.collect.FCollectionView; @@ -318,7 +327,7 @@ public class AbilityUtils { origin = null; validFilter = workingCopy[2]; } - for (final Card cl : CardUtil.getThisTurnEntered(destination, origin, validFilter, hostCard)) { + for (final Card cl : CardUtil.getThisTurnEntered(destination, origin, validFilter, hostCard, sa)) { Card gameState = game.getCardState(cl, null); // cards that use this should only care about if it is still in that zone // TODO if all LKI needs to be returned, need to change CardCollection return from this function @@ -509,33 +518,33 @@ public class AbilityUtils { if (calcX[0].startsWith("Count")) { val = AbilityUtils.xCount(card, calcX[1], ability); } else if (calcX[0].startsWith("Number")) { - val = CardFactoryUtil.xCount(card, svarval); + val = AbilityUtils.xCount(card, svarval, ability); } else if (calcX[0].startsWith("SVar")) { final String[] l = calcX[1].split("/"); final String m = CardFactoryUtil.extractOperators(calcX[1]); - val = CardFactoryUtil.doXMath(AbilityUtils.calculateAmount(card, l[0], ability), m, card); + val = doXMath(calculateAmount(card, l[0], ability), m, card, ability); } else if (calcX[0].startsWith("PlayerCount")) { final String hType = calcX[0].substring(11); final FCollection players = new FCollection<>(); if (hType.equals("Players") || hType.equals("")) { players.addAll(game.getPlayers()); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("YourTeam")) { players.addAll(player.getYourTeam()); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("Opponents")) { players.addAll(player.getOpponents()); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("RegisteredOpponents")) { players.addAll(Iterables.filter(game.getRegisteredPlayers(),PlayerPredicates.isOpponentOf(player))); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("Other")) { players.addAll(player.getAllOtherPlayers()); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("Remembered")) { for (final Object o : card.getRemembered()) { @@ -543,12 +552,12 @@ public class AbilityUtils { players.add((Player) o); } } - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.equals("NonActive")) { players.addAll(game.getPlayers()); players.remove(game.getPhaseHandler().getPlayerTurn()); - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.startsWith("PropertyYou")) { if (ability instanceof SpellAbility) { @@ -557,7 +566,7 @@ public class AbilityUtils { } else { players.add(player); } - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else if (hType.startsWith("Property")) { String defined = hType.split("Property")[1]; @@ -568,25 +577,16 @@ public class AbilityUtils { players.add(p); } } - val = CardFactoryUtil.playerXCount(players, calcX[1], card); + val = playerXCount(players, calcX[1], card, ability); } else { val = 0; } } - - if (val != null) { - if (maxto) { - val = Math.max(val, 0); - } - return val * multiplier; + else if (calcX[0].equals("OriginalHost")) { + val = xCount(ability.getOriginalHost(), calcX[1], ability); } - - if (calcX[0].equals("OriginalHost")) { - return AbilityUtils.xCount(ability.getOriginalHost(), calcX[1], ability) * multiplier; - } - - if (calcX[0].startsWith("Remembered")) { + else if (calcX[0].startsWith("Remembered")) { // Add whole Remembered list to handlePaid final CardCollection list = new CardCollection(); Card newCard = card; @@ -609,10 +609,9 @@ public class AbilityUtils { } } - return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; + val = handlePaid(list, calcX[1], card, ability); } - - if (calcX[0].startsWith("Imprinted")) { + else if (calcX[0].startsWith("Imprinted")) { // Add whole Imprinted list to handlePaid final CardCollection list = new CardCollection(); Card newCard = card; @@ -629,10 +628,9 @@ public class AbilityUtils { } } - return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; + val = handlePaid(list, calcX[1], card, ability); } - - if (calcX[0].matches("Enchanted")) { + else if (calcX[0].matches("Enchanted")) { // Add whole Enchanted list to handlePaid final CardCollection list = new CardCollection(); if (card.isEnchanting()) { @@ -641,191 +639,187 @@ public class AbilityUtils { list.add(game.getCardState((Card) o)); } } - return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; + val = handlePaid(list, calcX[1], card, ability); } // All the following only work for SpellAbilities - if (!(ability instanceof SpellAbility)) { - return 0; - } - - final SpellAbility sa = (SpellAbility) ability; - if (calcX[0].startsWith("Modes")) { - int chosenModes = 0; - SpellAbility sub = sa; - while(sub != null) { - if (!sub.getSVar("CharmOrder").equals("")) { - chosenModes++; + else if (ability instanceof SpellAbility) { + final SpellAbility sa = (SpellAbility) ability; + if (calcX[0].startsWith("Modes")) { + int chosenModes = 0; + SpellAbility sub = sa; + while(sub != null) { + if (!sub.getSVar("CharmOrder").equals("")) { + chosenModes++; + } + sub = sub.getSubAbility(); } - sub = sub.getSubAbility(); + // Count Math + final String m = CardFactoryUtil.extractOperators(calcX[1]); + val = doXMath(chosenModes, m, card, ability); } - // Count Math - final String m = CardFactoryUtil.extractOperators(calcX[1]); - return CardFactoryUtil.doXMath(chosenModes, m, card) * multiplier; - } - - // Player attribute counting - if (calcX[0].startsWith("TargetedPlayer")) { - final List players = new ArrayList<>(); - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (null != saTargeting) { - Iterables.addAll(players, saTargeting.getTargets().getTargetPlayers()); - } - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; - } - if (calcX[0].startsWith("ThisTargetedPlayer")) { - final List players = new ArrayList<>(); - Iterables.addAll(players, sa.getTargets().getTargetPlayers()); - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; - } - if (calcX[0].startsWith("TargetedObjects")) { - final List objects = new ArrayList<>(); - // Make list of all targeted objects starting with the root SpellAbility - SpellAbility loopSA = sa.getRootAbility(); - while (loopSA != null) { - if (loopSA.getTargetRestrictions() != null) { - Iterables.addAll(objects, loopSA.getTargets()); + // Player attribute counting + else if (calcX[0].startsWith("TargetedPlayer")) { + final List players = new ArrayList<>(); + final SpellAbility saTargeting = sa.getSATargetingPlayer(); + if (null != saTargeting) { + Iterables.addAll(players, saTargeting.getTargets().getTargetPlayers()); } - loopSA = loopSA.getSubAbility(); + val = playerXCount(players, calcX[1], card, ability); } - return CardFactoryUtil.objectXCount(objects, calcX[1], card) * multiplier; - } - if (calcX[0].startsWith("TargetedController")) { - final List players = new ArrayList<>(); - final CardCollection list = getDefinedCards(card, "Targeted", sa); - final List sas = AbilityUtils.getDefinedSpellAbilities(card, "Targeted", sa); + else if (calcX[0].startsWith("ThisTargetedPlayer")) { + final List players = new ArrayList<>(); + Iterables.addAll(players, sa.getTargets().getTargetPlayers()); + val = playerXCount(players, calcX[1], card, ability); + } + else if (calcX[0].startsWith("TargetedObjects")) { + final List objects = new ArrayList<>(); + // Make list of all targeted objects starting with the root SpellAbility + SpellAbility loopSA = sa.getRootAbility(); + while (loopSA != null) { + if (loopSA.getTargetRestrictions() != null) { + Iterables.addAll(objects, loopSA.getTargets()); + } + loopSA = loopSA.getSubAbility(); + } + val = objectXCount(objects, calcX[1], card, ability); + } + else if (calcX[0].startsWith("TargetedController")) { + final List players = new ArrayList<>(); + final CardCollection list = getDefinedCards(card, "Targeted", sa); + final List sas = AbilityUtils.getDefinedSpellAbilities(card, "Targeted", sa); - for (final Card c : list) { - final Player p = c.getController(); - if (!players.contains(p)) { - players.add(p); + for (final Card c : list) { + final Player p = c.getController(); + if (!players.contains(p)) { + players.add(p); + } + } + for (final SpellAbility s : sas) { + final Player p = s.getHostCard().getController(); + if (!players.contains(p)) { + players.add(p); + } + } + val = playerXCount(players, calcX[1], card, ability); + } + else if (calcX[0].startsWith("TargetedByTarget")) { + final CardCollection tgtList = new CardCollection(); + final List saList = getDefinedSpellAbilities(card, "Targeted", sa); + + for (final SpellAbility s : saList) { + tgtList.addAll(getDefinedCards(s.getHostCard(), "Targeted", s)); + // Check sub-abilities, so that modal cards like Abzan Charm are correctly handled. + // TODO: Should this be done in a more general place, like in getDefinedCards()? + AbilitySub abSub = s.getSubAbility(); + while (abSub != null) { + tgtList.addAll(getDefinedCards(abSub.getHostCard(), "Targeted", abSub)); + abSub = abSub.getSubAbility(); + } + } + val = handlePaid(tgtList, calcX[1], card, ability); + } + else if (calcX[0].startsWith("TriggeredPlayers") || calcX[0].equals("TriggeredCardController")) { + String key = calcX[0]; + if (calcX[0].startsWith("TriggeredPlayers")) { + key = "Triggered" + key.substring(16); + } + val = playerXCount(getDefinedPlayers(card, key, sa), calcX[1], card, ability); + } + else if (calcX[0].startsWith("TriggeredPlayer") || calcX[0].startsWith("TriggeredTarget")) { + final SpellAbility root = sa.getRootAbility(); + Object o = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9))); + val = o instanceof Player ? playerXProperty((Player) o, calcX[1], card, ability) : 0; + } + else if (calcX[0].equals("TriggeredSpellAbility")) { + final SpellAbility root = sa.getRootAbility(); + SpellAbility sat = (SpellAbility) root.getTriggeringObject(AbilityKey.SpellAbility); + val = calculateAmount(sat.getHostCard(), calcX[1], sat); + } + else if (calcX[0].startsWith("TriggerCount")) { + // TriggerCount is similar to a regular Count, but just + // pulls Integer Values from Trigger objects + final SpellAbility root = sa.getRootAbility(); + final String[] l = calcX[1].split("/"); + final String m = CardFactoryUtil.extractOperators(calcX[1]); + final Integer count = (Integer) root.getTriggeringObject(AbilityKey.fromString(l[0])); + + val = doXMath(ObjectUtils.firstNonNull(count, 0), m, card, ability); + } + else if (calcX[0].startsWith("ReplaceCount")) { + // ReplaceCount is similar to a regular Count, but just + // pulls Integer Values from Replacement objects + final SpellAbility root = sa.getRootAbility(); + final String[] l = calcX[1].split("/"); + final String m = CardFactoryUtil.extractOperators(calcX[1]); + final Integer count = (Integer) root.getReplacingObject(AbilityKey.fromString(l[0])); + + val = doXMath(ObjectUtils.firstNonNull(count, 0), m, card, ability); + } else { // these ones only for handling lists + Iterable list = null; + if (calcX[0].startsWith("Sacrificed")) { + list = sa.getRootAbility().getPaidList("Sacrificed"); + } + else if (calcX[0].startsWith("Discarded")) { + final SpellAbility root = sa.getRootAbility(); + list = root.getPaidList("Discarded"); + if ((null == list) && root.isTrigger()) { + list = root.getHostCard().getSpellPermanent().getPaidList("Discarded"); + } + } + else if (calcX[0].startsWith("Exiled")) { + list = sa.getRootAbility().getPaidList("Exiled"); + } + else if (calcX[0].startsWith("Milled")) { + list = sa.getRootAbility().getPaidList("Milled"); + } + else if (calcX[0].startsWith("Tapped")) { + list = sa.getRootAbility().getPaidList("Tapped"); + } + else if (calcX[0].startsWith("Revealed")) { + list = sa.getRootAbility().getPaidList("Revealed"); + } + else if (calcX[0].startsWith("Targeted")) { + list = sa.findTargetedCards(); + } + else if (calcX[0].startsWith("ParentTargeted")) { + SpellAbility parent = sa.getParentTargetingCard(); + if (parent != null) { + list = parent.findTargetedCards(); + } + else { + list = null; + } + } + else if (calcX[0].startsWith("TriggerRemembered")) { + final SpellAbility root = sa.getRootAbility(); + list = Iterables.filter(root.getTriggerRemembered(), Card.class); + } + else if (calcX[0].startsWith("TriggerObjects")) { + final SpellAbility root = sa.getRootAbility(); + list = Iterables.filter((Iterable) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(14))), Card.class); + } + else if (calcX[0].startsWith("Triggered")) { + final SpellAbility root = sa.getRootAbility(); + list = new CardCollection((Card) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9)))); + } + else if (calcX[0].startsWith("Replaced")) { + final SpellAbility root = sa.getRootAbility(); + list = new CardCollection((Card) root.getReplacingObject(AbilityKey.fromString(calcX[0].substring(8)))); + } + if (list != null) { + val = handlePaid(list, calcX[1], card, ability); } } - for (final SpellAbility s : sas) { - final Player p = s.getHostCard().getController(); - if (!players.contains(p)) { - players.add(p); - } - } - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; } - if (calcX[0].startsWith("TargetedByTarget")) { - final CardCollection tgtList = new CardCollection(); - final List saList = getDefinedSpellAbilities(card, "Targeted", sa); - for (final SpellAbility s : saList) { - tgtList.addAll(getDefinedCards(s.getHostCard(), "Targeted", s)); - // Check sub-abilities, so that modal cards like Abzan Charm are correctly handled. - // TODO: Should this be done in a more general place, like in getDefinedCards()? - AbilitySub abSub = s.getSubAbility(); - while (abSub != null) { - tgtList.addAll(getDefinedCards(abSub.getHostCard(), "Targeted", abSub)); - abSub = abSub.getSubAbility(); - } + if (val != null) { + if (maxto) { + val = Math.max(val, 0); } - return CardFactoryUtil.handlePaid(tgtList, calcX[1], card) * multiplier; + return val * multiplier; } - if (calcX[0].startsWith("TriggeredPlayers") || calcX[0].equals("TriggeredCardController")) { - String key = calcX[0]; - if (calcX[0].startsWith("TriggeredPlayers")) { - key = "Triggered" + key.substring(16); - } - return CardFactoryUtil.playerXCount(getDefinedPlayers(card, key, sa), calcX[1], card) * multiplier; - } - if (calcX[0].startsWith("TriggeredPlayer") || calcX[0].startsWith("TriggeredTarget")) { - final SpellAbility root = sa.getRootAbility(); - Object o = root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9))); - return o instanceof Player ? CardFactoryUtil.playerXProperty((Player) o, calcX[1], card) * multiplier : 0; - } - if (calcX[0].equals("TriggeredSpellAbility")) { - final SpellAbility root = sa.getRootAbility(); - SpellAbility sat = (SpellAbility) root.getTriggeringObject(AbilityKey.SpellAbility); - return calculateAmount(sat.getHostCard(), calcX[1], sat); - } - // Added on 9/30/12 (ArsenalNut) - Ended up not using but might be useful in future - /* - if (calcX[0].startsWith("EnchantedController")) { - final ArrayList players = new ArrayList(); - players.addAll(AbilityFactory.getDefinedPlayers(card, "EnchantedController", ability)); - return CardFactoryUtil.playerXCount(players, calcX[1], card) * multiplier; - } - */ - - Iterable list; - if (calcX[0].startsWith("Sacrificed")) { - list = sa.getRootAbility().getPaidList("Sacrificed"); - } - else if (calcX[0].startsWith("Discarded")) { - final SpellAbility root = sa.getRootAbility(); - list = root.getPaidList("Discarded"); - if ((null == list) && root.isTrigger()) { - list = root.getHostCard().getSpellPermanent().getPaidList("Discarded"); - } - } - else if (calcX[0].startsWith("Exiled")) { - list = sa.getRootAbility().getPaidList("Exiled"); - } - else if (calcX[0].startsWith("Milled")) { - list = sa.getRootAbility().getPaidList("Milled"); - } - else if (calcX[0].startsWith("Tapped")) { - list = sa.getRootAbility().getPaidList("Tapped"); - } - else if (calcX[0].startsWith("Revealed")) { - list = sa.getRootAbility().getPaidList("Revealed"); - } - else if (calcX[0].startsWith("Targeted")) { - list = sa.findTargetedCards(); - } - else if (calcX[0].startsWith("ParentTargeted")) { - SpellAbility parent = sa.getParentTargetingCard(); - if (parent != null) { - list = parent.findTargetedCards(); - } - else { - list = null; - } - } - else if (calcX[0].startsWith("TriggerRemembered")) { - final SpellAbility root = sa.getRootAbility(); - list = Iterables.filter(root.getTriggerRemembered(), Card.class); - } - else if (calcX[0].startsWith("TriggerObjects")) { - final SpellAbility root = sa.getRootAbility(); - list = Iterables.filter((Iterable) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(14))), Card.class); - } - else if (calcX[0].startsWith("Triggered")) { - final SpellAbility root = sa.getRootAbility(); - list = new CardCollection((Card) root.getTriggeringObject(AbilityKey.fromString(calcX[0].substring(9)))); - } - else if (calcX[0].startsWith("TriggerCount")) { - // TriggerCount is similar to a regular Count, but just - // pulls Integer Values from Trigger objects - final SpellAbility root = sa.getRootAbility(); - final String[] l = calcX[1].split("/"); - final String m = CardFactoryUtil.extractOperators(calcX[1]); - final Integer count = (Integer) root.getTriggeringObject(AbilityKey.fromString(l[0])); - - return CardFactoryUtil.doXMath(ObjectUtils.firstNonNull(count, 0), m, card) * multiplier; - } - else if (calcX[0].startsWith("Replaced")) { - final SpellAbility root = sa.getRootAbility(); - list = new CardCollection((Card) root.getReplacingObject(AbilityKey.fromString(calcX[0].substring(8)))); - } - else if (calcX[0].startsWith("ReplaceCount")) { - // ReplaceCount is similar to a regular Count, but just - // pulls Integer Values from Replacement objects - final SpellAbility root = sa.getRootAbility(); - final String[] l = calcX[1].split("/"); - final String m = CardFactoryUtil.extractOperators(calcX[1]); - final Integer count = (Integer) root.getReplacingObject(AbilityKey.fromString(l[0])); - - return CardFactoryUtil.doXMath(ObjectUtils.firstNonNull(count, 0), m, card) * multiplier; - } - else { - return 0; - } - return CardFactoryUtil.handlePaid(list, calcX[1], card) * multiplier; + return 0; } /** @@ -1239,7 +1233,6 @@ public class AbilityUtils { } else if (defined.startsWith("PlayerNamed_")) { for (Player p : game.getPlayersInTurnOrder()) { - //System.out.println("Named player " + defined.substring(12)); if (p.getName().equals(defined.substring(12))) { players.add(p); } @@ -1558,7 +1551,7 @@ public class AbilityUtils { boolean alreadyPaid = false; for (Player payer : allPayers) { if (unlessCost.equals("LifeTotalHalfUp")) { - String halfup = Integer.toString((int) Math.ceil(payer.getLife() / 2.0)); + String halfup = Integer.toString(Math.max(0,(int) Math.ceil(payer.getLife() / 2.0))); cost = new Cost("PayLife<" + halfup + ">", true); } alreadyPaid |= payer.getController().payCostToPreventEffect(cost, sa, alreadyPaid, allPayers); @@ -1636,6 +1629,8 @@ public class AbilityUtils { } } } + // make sure that when this is from a trigger LKI is updated + host.getGame().updateLastStateForCard(host); } /** @@ -1657,6 +1652,26 @@ public class AbilityUtils { final String expr = CardFactoryUtil.extractOperators(s2); final Player player = ctb == null ? null : ctb instanceof SpellAbility ? ((SpellAbility)ctb).getActivatingPlayer() : ctb.getHostCard().getController(); + // accept straight numbers + if (l[0].startsWith("Number$")) { + final String number = l[0].substring(7); + if (number.equals("ChosenNumber")) { // TODO remove in favor of Count ChosenNumber + int x = c.getChosenNumber() == null ? 0 : c.getChosenNumber(); + return doXMath(x, expr, c, ctb); + } + return doXMath(Integer.parseInt(number), expr, c, ctb); + } + + if (l[0].startsWith("Count$")) { + l[0] = l[0].substring(6); + } + + if (l[0].startsWith("SVar$")) { + String n = l[0].substring(5); + String v = ctb == null ? c.getSVar(n) : ctb.getSVar(n); + return doXMath(xCount(c, v, ctb), expr, c, ctb); + } + final String[] sq; sq = l[0].split("\\."); @@ -1668,12 +1683,8 @@ public class AbilityUtils { final String[] compString = sq[0].split(" "); final int lhs = calculateAmount(c, compString[1], ctb); final int rhs = calculateAmount(c, compString[2].substring(2), ctb); - if (Expressions.compare(lhs, compString[2], rhs)) { - return CardFactoryUtil.doXMath(calculateAmount(c, sq[1], ctb), expr, c); - } - else { - return CardFactoryUtil.doXMath(calculateAmount(c, sq[2], ctb), expr, c); - } + boolean v = Expressions.compare(lhs, compString[2], rhs); + return doXMath(calculateAmount(c, sq[v ? 1 : 2], ctb), expr, c, ctb); } if (ctb instanceof SpellAbility) { final SpellAbility sa = (SpellAbility) ctb; @@ -1685,19 +1696,19 @@ public class AbilityUtils { // 107.3i If an object gains an ability, the value of X within that ability is the value defined by that ability, // or 0 if that ability doesn’t define a value of X. This is an exception to rule 107.3h. This may occur with ability-adding effects, text-changing effects, or copy effects. if (root.getXManaCostPaid() != null) { - return CardFactoryUtil.doXMath(root.getXManaCostPaid(), expr, c); + return doXMath(root.getXManaCostPaid(), expr, c, ctb); } if (root.isTrigger()) { Trigger t = root.getTrigger(); if (t == null) { - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } // ImmediateTrigger should check for the Ability which created the trigger if (t.getSpawningAbility() != null) { root = t.getSpawningAbility().getRootAbility(); - return CardFactoryUtil.doXMath(root.getXManaCostPaid(), expr, c); + return doXMath(root.getXManaCostPaid(), expr, c, ctb); } // 107.3k If an object’s enters-the-battlefield triggered ability or replacement effect refers to X, @@ -1705,68 +1716,54 @@ public class AbilityUtils { // the value of X for that ability is the same as the value of X for that spell, although the value of X for that permanent is 0. if (TriggerType.ChangesZone.equals(t.getMode()) && ZoneType.Battlefield.name().equals(t.getParam("Destination"))) { - return CardFactoryUtil.doXMath(c.getXManaCostPaid(), expr, c); + return doXMath(c.getXManaCostPaid(), expr, c, ctb); } else if (TriggerType.SpellCast.equals(t.getMode())) { // Cast Trigger like Hydroid Krasis SpellAbility castSA = (SpellAbility) root.getTriggeringObject(AbilityKey.SpellAbility); if (castSA == null || castSA.getXManaCostPaid() == null) { - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } - return CardFactoryUtil.doXMath(castSA.getXManaCostPaid(), expr, c); + return doXMath(castSA.getXManaCostPaid(), expr, c, ctb); } else if (TriggerType.Cycled.equals(t.getMode())) { SpellAbility cycleSA = (SpellAbility) sa.getTriggeringObject(AbilityKey.Cause); if (cycleSA == null || cycleSA.getXManaCostPaid() == null) { - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } - return CardFactoryUtil.doXMath(cycleSA.getXManaCostPaid(), expr, c); + return doXMath(cycleSA.getXManaCostPaid(), expr, c, ctb); } else if (TriggerType.TurnFaceUp.equals(t.getMode())) { SpellAbility turnupSA = (SpellAbility) sa.getTriggeringObject(AbilityKey.Cause); if (turnupSA == null || turnupSA.getXManaCostPaid() == null) { - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } - return CardFactoryUtil.doXMath(turnupSA.getXManaCostPaid(), expr, c); + return doXMath(turnupSA.getXManaCostPaid(), expr, c, ctb); } } // If the chosen creature has X in its mana cost, that X is considered to be 0. // The value of X in Altered Ego’s last ability will be whatever value was chosen for X while casting Altered Ego. if (sa.isCopiedTrait() || !sa.getHostCard().equals(c)) { - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } if (root.isReplacementAbility()) { if (sa.hasParam("ETB")) { - return CardFactoryUtil.doXMath(c.getXManaCostPaid(), expr, c); + return doXMath(c.getXManaCostPaid(), expr, c, ctb); } } - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } // Count$Kicked.. if (sq[0].startsWith("Kicked")) { boolean kicked = sa.isKicked() || c.getKickerMagnitude() > 0; - return CardFactoryUtil.doXMath(Integer.parseInt(kicked ? sq[1] : sq[2]), expr, c); + return doXMath(Integer.parseInt(kicked ? sq[1] : sq[2]), expr, c, ctb); } - // Count$UrzaLands.. - if (sq[0].startsWith("UrzaLands")) { - return CardFactoryUtil.doXMath(Integer.parseInt(sa.getActivatingPlayer().hasUrzaLands() ? sq[1] : sq[2]), expr, c); - } - - //Count$SearchedLibrary. - if (sq[0].contains("SearchedLibrary")) { - int sum = 0; - for (Player p : AbilityUtils.getDefinedPlayers(c, sq[1], sa)) { - sum += p.getLibrarySearched(); - } - - return sum; - } //Count$HasNumChosenColors. if (sq[0].contains("HasNumChosenColors")) { int sum = 0; - for (Card card : AbilityUtils.getDefinedCards(sa.getHostCard(), sq[1], sa)) { + for (Card card : AbilityUtils.getDefinedCards(c, sq[1], sa)) { sum += CardUtil.getColors(card).getSharedColors(ColorSet.fromNames(c.getChosenColors())).countColors(); } return sum; @@ -1792,69 +1789,44 @@ public class AbilityUtils { } return count; } - // Count$AttachedTo - if (sq[0].startsWith("AttachedTo")) { - final String[] k = l[0].split(" "); - int sum = 0; - for (Card card : AbilityUtils.getDefinedCards(sa.getHostCard(), k[1], sa)) { - // Hateful Eidolon: the script uses LKI so that the attached cards have to be defined - // This card needs the spellability ("Auras You control", you refers to the activating player) - // CardFactoryUtils.xCount doesn't have the sa parameter, SVar:X:TriggeredCard$Valid cannot handle this - CardCollection list = CardLists.getValidCards(card.getAttachedCards(), k[2].split(","), sa.getActivatingPlayer(), c, sa); - sum += list.size(); - } - return sum; - } // Count$Adamant... if (sq[0].startsWith("Adamant")) { final String payingMana = StringUtils.join(sa.getRootAbility().getPayingMana()); final int num = sq[0].length() > 7 ? Integer.parseInt(sq[0].split("_")[1]) : 3; final boolean adamant = StringUtils.countMatches(payingMana, MagicColor.toShortString(sq[1])) >= num; - return CardFactoryUtil.doXMath(Integer.parseInt(sq[adamant ? 2 : 3]), expr, c); + return doXMath(calculateAmount(c,sq[adamant ? 2 : 3], ctb), expr, c, ctb); } - if (l[0].startsWith("LastStateBattlefield")) { + if (sq[0].startsWith("LastStateBattlefield")) { final String[] k = l[0].split(" "); CardCollectionView list = null; if (sa.getLastStateBattlefield() != null) { list = sa.getLastStateBattlefield(); } else { // LastState is Empty - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } list = CardLists.getValidCards(list, k[1].split(","), sa.getActivatingPlayer(), c, sa); if (k[0].contains("TotalToughness")) { - return CardFactoryUtil.doXMath(Aggregates.sum(list, CardPredicates.Accessors.fnGetNetToughness), expr, c); + return doXMath(Aggregates.sum(list, CardPredicates.Accessors.fnGetNetToughness), expr, c, ctb); } else { - return CardFactoryUtil.doXMath(list.size(), expr, c); + return doXMath(list.size(), expr, c, ctb); } } - if (l[0].startsWith("LastStateGraveyard")) { + if (sq[0].startsWith("LastStateGraveyard")) { final String[] k = l[0].split(" "); CardCollectionView list = null; if (sa.getLastStateGraveyard() != null) { list = sa.getLastStateGraveyard(); } else { // LastState is Empty - return CardFactoryUtil.doXMath(0, expr, c); + return doXMath(0, expr, c, ctb); } list = CardLists.getValidCards(list, k[1].split(","), sa.getActivatingPlayer(), c, sa); - return CardFactoryUtil.doXMath(list.size(), expr, c); - } - - // Count$TargetedLifeTotal (targeted player's life total) - // Not optimal but since xCount doesn't take SAs, we need to replicate while we have it - // Probably would be best if xCount took an optional SA to use in these circumstances - if (sq[0].contains("TargetedLifeTotal")) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) { - return CardFactoryUtil.doXMath(tgtP.getLife(), expr, c); - } - } + return doXMath(list.size(), expr, c, ctb); } if (sq[0].startsWith("CastTotalManaSpent")) { - return CardFactoryUtil.doXMath(c.getCastSA() != null ? c.getCastSA().getTotalManaSpent() : 0, expr, c); + return doXMath(c.getCastSA() != null ? c.getCastSA().getTotalManaSpent() : 0, expr, c, ctb); } if (sq[0].equals("CastTotalSnowManaSpent")) { @@ -1866,35 +1838,954 @@ public class AbilityUtils { } } } - return CardFactoryUtil.doXMath(v, expr, c); + return doXMath(v, expr, c, ctb); } if (sq[0].equals("ResolvedThisTurn")) { - return CardFactoryUtil.doXMath(sa.getResolvedThisTurn(), expr, c); + return doXMath(sa.getResolvedThisTurn(), expr, c, ctb); + } + } else { + // fallback if ctb isn't a spellability + if (sq[0].startsWith("LastStateBattlefield")) { + final String[] k = l[0].split(" "); + CardCollection list = new CardCollection(game.getLastStateBattlefield()); + list = CardLists.getValidCards(list, k[1].split(","), player, c, ctb); + return doXMath(list.size(), expr, c, ctb); + } + + if (sq[0].startsWith("LastStateGraveyard")) { + final String[] k = l[0].split(" "); + CardCollection list = new CardCollection(game.getLastStateGraveyard()); + list = CardLists.getValidCards(list, k[1].split(","), player, c, ctb); + return doXMath(list.size(), expr, c, ctb); + } + + if (sq[0].startsWith("xPaid")) { + return doXMath(c.getXManaCostPaid(), expr, c, ctb); + } + } // end SpellAbility + + // Count$TargetedLifeTotal (targeted player's life total) + // Not optimal but since xCount doesn't take SAs, we need to replicate while we have it + // Probably would be best if xCount took an optional SA to use in these circumstances + if (sq[0].contains("TargetedLifeTotal")) { + for (Player tgtP : AbilityUtils.getDefinedPlayers(c, "TargetedPlayer", ctb)) { + return doXMath(tgtP.getLife(), expr, c, ctb); } } - 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, player, ctb), expr, c); + // Count$DevotionDual.. + // Count$Devotion. + if (sq[0].contains("Devotion")) { + int colorOcurrencices = 0; + String colorName = sq[1]; + if (colorName.contains("Chosen")) { + colorName = MagicColor.toShortString(c.getChosenColor()); + } + byte colorCode = ManaAtom.fromName(colorName); + if (sq[0].equals("DevotionDual")) { + colorCode |= ManaAtom.fromName(sq[2]); + } + for (Card c0 : player.getCardsIn(ZoneType.Battlefield)) { + for (ManaCostShard sh : c0.getManaCost()) { + if (sh.isColor(colorCode)) { + colorOcurrencices++; + } + } + colorOcurrencices += c0.getAmountOfKeyword("Your devotion to each color and each combination of colors is increased by one."); + } + return doXMath(colorOcurrencices, expr, c, ctb); } - // count valid cards in any specified zone/s - if (l[0].startsWith("Valid")) { - String[] lparts = l[0].split(" ", 2); - final String[] rest = lparts[1].split(","); + } // end ctb != null - final CardCollectionView cardsInZones = lparts[0].length() > 5 - ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5))) - : game.getCardsIn(ZoneType.Battlefield); - - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); - return CardFactoryUtil.doXMath(cards.size(), expr, c); + if (sq[0].contains("OppsAtLifeTotal")) { + final int lifeTotal = AbilityUtils.calculateAmount(c, sq[1], ctb); + int number = 0; + for (final Player opp : player.getOpponents()) { + if (opp.getLife() == lifeTotal) { + number++; + } } + return doXMath(number, expr, c, ctb); } - return CardFactoryUtil.xCount(c, s2); + + //Count$SearchedLibrary. + if (sq[0].contains("SearchedLibrary")) { + int sum = 0; + for (Player p : AbilityUtils.getDefinedPlayers(c, sq[1], ctb)) { + sum += p.getLibrarySearched(); + } + return doXMath(sum, expr, c, ctb); + } + + //////////////////// + // card info + + // Count$CardMulticolor.. + if (sq[0].contains("CardMulticolor")) { + final boolean isMulti = CardUtil.getColors(c).isMulticolor(); + return doXMath(Integer.parseInt(sq[isMulti ? 1 : 2]), expr, c, ctb); + } + // Count$Madness.. + if (sq[0].startsWith("Madness")) { + return doXMath(calculateAmount(c, sq[c.isMadness() ? 1 : 2], ctb), expr, c, ctb); + } + + // Count$Foretold.. + if (sq[0].startsWith("Foretold")) { + return doXMath(calculateAmount(c, sq[c.isForetold() ? 1 : 2], ctb), expr, c, ctb); + } + + if (sq[0].startsWith("Kicked")) { // fallback for not spellAbility + return doXMath(calculateAmount(c, sq[c.getKickerMagnitude() > 0 ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].startsWith("Escaped")) { + return doXMath(calculateAmount(c, sq[c.getCastSA() != null && c.getCastSA().isEscape() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].startsWith("AltCost")) { + return doXMath(calculateAmount(c, sq[c.isOptionalCostPaid(OptionalCost.AltCost) ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("ColorsColorIdentity")) { + return doXMath(c.getController().getCommanderColorID().countColors(), expr, c, ctb); + } + + if (sq[0].equals("TotalDamageDoneByThisTurn")) { + return doXMath(c.getTotalDamageDoneBy(), expr, c, ctb); + } + if (sq[0].equals("TotalDamageReceivedThisTurn")) { + return doXMath(c.getTotalDamageReceivedThisTurn(), expr, c, ctb); + } + + if (sq[0].contains("CardPower")) { + return doXMath(c.getNetPower(), expr, c, ctb); + } + if (sq[0].contains("CardToughness")) { + return doXMath(c.getNetToughness(), expr, c, ctb); + } + if (sq[0].contains("CardSumPT")) { + return doXMath((c.getNetPower() + c.getNetToughness()), expr, c, ctb); + } + if (sq[0].contains("CardNumTypes")) { + Card ce; + if (sq[0].contains("Remembered")) { + ce = (Card) c.getFirstRemembered(); + } else { + ce = c; + } + return doXMath(getNumberOfTypes(ce), expr, c, ctb); + } + + if (sq[0].contains("CardNumColors")) { + return doXMath(CardUtil.getColors(c).countColors(), expr, c, ctb); + } + if (sq[0].contains("CardNumAttacksThisTurn")) { + return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), expr, c, ctb); + } + + if (sq[0].contains("CardCounters")) { + // CardCounters.ALL to be used for Kinsbaile Borderguard and anything that cares about all counters + int count = 0; + if (sq[1].equals("ALL")) { + for (Integer i : c.getCounters().values()) { + if (i != null && i > 0) { + count += i; + } + } + } + else { + count = c.getCounters(CounterType.getType(sq[1])); + } + return doXMath(count, expr, c, ctb); + } + + if (sq[0].contains("BushidoPoint")) { + return doXMath(c.getKeywordMagnitude(Keyword.BUSHIDO), expr, c, ctb); + } + if (sq[0].contains("TimesKicked")) { + return doXMath(c.getKickerMagnitude(), expr, c, ctb); + } + if (sq[0].contains("TimesPseudokicked")) { + return doXMath(c.getPseudoKickerMagnitude(), expr, c, ctb); + } + if (sq[0].contains("TimesMutated")) { + return doXMath(c.getTimesMutated(), expr, c, ctb); + } + + if (sq[0].startsWith("DamageDoneByPlayerThisTurn")) { + int sum = 0; + for (Player p : AbilityUtils.getDefinedPlayers(c, sq[1], ctb)) { + sum += c.getReceivedDamageByPlayerThisTurn(p); + } + return doXMath(sum, expr, c, ctb); + } + if (sq[0].equals("RegeneratedThisTurn")) { + return doXMath(c.getRegeneratedThisTurn(), expr, c, ctb); + } + + // Count$Converge + if (sq[0].contains("Converge")) { + SpellAbility castSA = c.getCastSA(); + return doXMath(castSA == null ? 0 : castSA.getPayingColors().countColors(), expr, c, ctb); + } + + // Count$wasCastFrom.. + if (sq[0].startsWith("wasCastFrom")) { + boolean zonesMatch = c.getCastFrom() == ZoneType.smartValueOf(sq[0].substring(11)); + return doXMath(calculateAmount(c, sq[zonesMatch ? 1 : 2], ctb), expr, c, ctb); + } + + // Count$Presence_.. + if (sq[0].startsWith("Presence")) { + final String type = sq[0].split("_")[1]; + boolean found = false; + if (c.getCastFrom() != null && c.getCastSA() != null) { + int revealed = AbilityUtils.calculateAmount(c, "Revealed$Valid " + type, c.getCastSA()); + int ctrl = AbilityUtils.calculateAmount(c, "Count$Valid " + type + ".inZoneBattlefield+YouCtrl", c.getCastSA()); + if (revealed + ctrl >= 1) { + found = true; + } + } + return doXMath(calculateAmount(c, sq[found ? 1 : 2], ctb), expr, c, ctb); + } + + if (sq[0].startsWith("Devoured")) { + final String validDevoured = sq[0].split(" ")[1]; + CardCollection cl = CardLists.getValidCards(c.getDevouredCards(), validDevoured.split(","), player, c, ctb); + return doXMath(cl.size(), expr, c, ctb); + } + + if (sq[0].contains("ChosenNumber")) { + Integer i = c.getChosenNumber(); + return doXMath(i == null ? 0 : i, expr, c, ctb); + } + + // Count$IfCastInOwnMainPhase.. // 7/10 + if (sq[0].contains("IfCastInOwnMainPhase")) { + final PhaseHandler cPhase = player.getGame().getPhaseHandler(); + final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.isPlayerTurn(player) && c.getCastFrom() != null; + return doXMath(Integer.parseInt(sq[isMyMain ? 1 : 2]), expr, c, ctb); + } + + // Count$AttachedTo + if (sq[0].startsWith("AttachedTo")) { + final String[] k = l[0].split(" "); + int sum = 0; + for (Card card : AbilityUtils.getDefinedCards(c, k[1], ctb)) { + // Hateful Eidolon: the script uses LKI so that the attached cards have to be defined + // This card needs the spellability ("Auras You control", you refers to the activating player) + // CardFactoryUtils.xCount doesn't have the sa parameter, SVar:X:TriggeredCard$Valid cannot handle this + sum += CardLists.getValidCardCount(card.getAttachedCards(), k[2], player, c, ctb); + } + return doXMath(sum, expr, c, ctb); + } + + // Count$CardManaCost + if (sq[0].contains("CardManaCost")) { + Card ce; + if (sq[0].contains("Equipped") && c.isEquipping()) { + ce = c.getEquipping(); + } + else if (sq[0].contains("Remembered")) { + ce = (Card) c.getFirstRemembered(); + } + else { + ce = c; + } + + return doXMath(ce == null ? 0 : ce.getCMC(), expr, c, ctb); + } + + if (sq[0].startsWith("RememberedSize")) { + return doXMath(c.getRememberedCount(), expr, c, ctb); + } + + if (sq[0].startsWith("RememberedNumber")) { + int num = 0; + for (final Object o : c.getRemembered()) { + if (o instanceof Integer) { + num += (Integer) o; + } + } + return doXMath(num, expr, c, ctb); + } + + if (sq[0].startsWith("RememberedWithSharedCardType")) { + int maxNum = 1; + for (final Object o : c.getRemembered()) { + if (o instanceof Card) { + int num = 1; + Card firstCard = (Card) o; + for (final Object p : c.getRemembered()) { + if (p instanceof Card) { + Card secondCard = (Card) p; + if (!firstCard.equals(secondCard) && firstCard.sharesCardTypeWith(secondCard)) { + num++; + } + } + } + if (num > maxNum) { + maxNum = num; + } + } + } + return doXMath(maxNum, expr, c, ctb); + } + + // Count$EnchantedControllerCreatures + if (sq[0].equals("EnchantedControllerCreatures")) { // maybe refactor into a Valid with ControlledBy + int v = 0; + if (c.getEnchantingCard() != null) { + v = CardLists.count(c.getEnchantingCard().getController().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); + } + return doXMath(v, expr, c, ctb); + } + + //////////////////////// + // player info + if (sq[0].equals("Hellbent")) { + return doXMath(calculateAmount(c, sq[player.hasHellbent() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Metalcraft")) { + return doXMath(calculateAmount(c, sq[player.hasMetalcraft() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Delirium")) { + return doXMath(calculateAmount(c, sq[player.hasDelirium() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("FatefulHour")) { + return doXMath(calculateAmount(c, sq[player.getLife() <= 5 ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Revolt")) { + return doXMath(calculateAmount(c, sq[player.hasRevolt() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Landfall")) { + return doXMath(calculateAmount(c, sq[player.hasLandfall() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Monarch")) { + return doXMath(calculateAmount(c, sq[player.isMonarch() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Blessing")) { + return doXMath(calculateAmount(c, sq[player.hasBlessing() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Threshold")) { + return doXMath(calculateAmount(c, sq[player.hasThreshold() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("ExtraTurn")) { + return doXMath(calculateAmount(c, sq[game.getPhaseHandler().getPlayerTurn().isExtraTurn() ? 1 : 2], ctb), expr, c, ctb); + } + if (sq[0].equals("Averna")) { + String str = "As you cascade, you may put a land card from among the exiled cards onto the " + + "battlefield tapped."; + return doXMath(player.getKeywords().getAmount(str), expr, c, ctb); + } + if (sq[0].equals("YourStartingLife")) { + return doXMath(player.getStartingLife(), expr, c, ctb); + } + + if (sq[0].equals("YourLifeTotal")) { + return doXMath(player.getLife(), expr, c, ctb); + } + if (sq[0].equals("OppGreatestLifeTotal")) { + return doXMath(player.getOpponentsGreatestLifeTotal(), expr, c, ctb); + } + + if (sq[0].equals("YouCycledThisTurn")) { + return doXMath(player.getCycledThisTurn(), expr, c, ctb); + } + + if (sq[0].equals("YouDrewThisTurn")) { + return doXMath(player.getNumDrawnThisTurn(), expr, c, ctb); + } + + if (sq[0].equals("YouSurveilThisTurn")) { + return doXMath(player.getSurveilThisTurn(), expr, c, ctb); + } + + if (sq[0].equals("YouCastThisGame")) { + return doXMath(player.getSpellsCastThisGame(), expr, c, ctb); + } + + if (sq[0].contains("CardControllerTypes")) { + return doXMath(getCardTypesFromList(player.getCardsIn(ZoneType.listValueOf(sq[1]))), expr, c, ctb); + } + + if (sq[0].startsWith("CommanderCastFromCommandZone")) { + // only used by Opal Palace, and it does add the trigger to the card + return doXMath(player.getCommanderCast(c), expr, c, ctb); + } + + if (l[0].startsWith("TotalCommanderCastFromCommandZone")) { + return doXMath(player.getTotalCommanderCast(), expr, c, ctb); + } + + if (sq[0].contains("LifeYouLostThisTurn")) { + return doXMath(player.getLifeLostThisTurn(), expr, c, ctb); + } + if (sq[0].contains("LifeYouGainedThisTurn")) { + return doXMath(player.getLifeGainedThisTurn(), expr, c, ctb); + } + if (sq[0].contains("LifeYourTeamGainedThisTurn")) { + return doXMath(player.getLifeGainedByTeamThisTurn(), expr, c, ctb); + } + if (sq[0].contains("LifeYouGainedTimesThisTurn")) { + return doXMath(player.getLifeGainedTimesThisTurn(), expr, c, ctb); + } + if (sq[0].contains("LifeOppsLostThisTurn")) { + return doXMath(player.getOpponentLostLifeThisTurn(), expr, c, ctb); + } + if (sq[0].equals("BloodthirstAmount")) { + return doXMath(player.getBloodthirstAmount(), expr, c, ctb); + } + if (sq[0].equals("YourLandsPlayed")) { + return doXMath(player.getLandsPlayedThisTurn(), expr, c, ctb); + } + + if (sq[0].startsWith("YourCounters")) { + // "YourCountersExperience" or "YourCountersPoison" + String counterType = sq[0].substring(12); + return doXMath(player.getCounters(CounterType.getType(counterType)), expr, c, ctb); + } + + if (sq[0].contains("YourPoisonCounters")) { + return doXMath(player.getPoisonCounters(), expr, c, ctb); + } + if (sq[0].contains("TotalOppPoisonCounters")) { + return doXMath(player.getOpponentsTotalPoisonCounters(), expr, c, ctb); + } + + if (sq[0].equals("YourDamageThisTurn")) { + return doXMath(player.getAssignedDamage(), expr, c, ctb); + } + if (sq[0].equals("TotalOppDamageThisTurn")) { + return doXMath(player.getOpponentsAssignedDamage(), expr, c, ctb); + } + if (sq[0].equals("MaxOppDamageThisTurn")) { + return doXMath(player.getMaxOpponentAssignedDamage(), expr, c, ctb); + } + + if (sq[0].startsWith("YourDamageSourcesThisTurn")) { + Iterable allSrc = player.getAssignedDamageSources(); + String restriction = sq[0].split(" ")[1]; + return doXMath(CardLists.getValidCardCount(allSrc, restriction, player, c, ctb), expr, c, ctb); + } + + if (sq[0].equals("YourTurns")) { + return doXMath(player.getTurn(), expr, c, ctb); + } + + if (sq[0].startsWith("OppTypesInGrave")) { + final PlayerCollection opponents = player.getOpponents(); + CardCollection oppCards = new CardCollection(); + oppCards.addAll(opponents.getCardsIn(ZoneType.Graveyard)); + return doXMath(getCardTypesFromList(oppCards), expr, c, ctb); + } + + // Count$TopOfLibraryCMC + if (sq[0].equals("TopOfLibraryCMC")) { + int cmc = player.getCardsIn(ZoneType.Library).isEmpty() ? 0 : + player.getCardsIn(ZoneType.Library).getFirst().getCMC(); + return doXMath(cmc, expr, c, ctb); + } + + if (sq[0].startsWith("ColorsCtrl")) { + final String restriction = l[0].substring(11); + final String[] rest = restriction.split(","); + final CardCollection list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb); + byte n = 0; + for (final Card card : list) { + n |= card.determineColor().getColor(); + } + return doXMath(ColorSet.fromMask(n).countColors(), expr, c, ctb); + } + + // Count$AttackersDeclared + if (sq[0].startsWith("AttackersDeclared")) { + return doXMath(player.getAttackersDeclaredThisTurn(), expr, c, ctb); + } + + // Count$CardAttackedThisTurn + if (sq[0].startsWith("CreaturesAttackedThisTurn")) { + final String[] workingCopy = l[0].split(" ", 2); + final String validFilter = workingCopy[1]; + return doXMath(CardLists.getValidCardCount(player.getCreaturesAttackedThisTurn(), validFilter, player, c, ctb), expr, c, ctb); + } + + // Manapool + if (sq[0].startsWith("ManaPool")) { + final String color = l[0].split(":")[1]; + int v = 0; + if (color.equals("All")) { + v = player.getManaPool().totalMana(); + } else { + v = player.getManaPool().getAmountOfColor(ManaAtom.fromName(color)); + } + return doXMath(v, expr, c, ctb); + } + + // Count$Domain + if (sq[0].startsWith("Domain")) { + int n = 0; + Player neededPlayer = sq[0].equals("DomainActivePlayer") ? game.getPhaseHandler().getPlayerTurn() : player; + CardCollection someCards = CardLists.filter(neededPlayer.getCardsIn(ZoneType.Battlefield), Presets.LANDS); + for (String basic : MagicColor.Constant.BASIC_LANDS) { + if (!CardLists.getType(someCards, basic).isEmpty()) { + n++; + } + } + return doXMath(n, expr, c, ctb); + } + + //SacrificedThisTurn + if (sq[0].startsWith("SacrificedThisTurn")) { + CardCollectionView list = player.getSacrificedThisTurn(); + if (l[0].contains(" ")) { + String[] lparts = l[0].split(" ", 2); + String restrictions = TextUtil.fastReplace(l[0], TextUtil.addSuffix(lparts[0]," "), ""); + final String[] rest = restrictions.split(","); + list = CardLists.getValidCards(list, rest, player, c, ctb); + } + return doXMath(list.size(), expr, c, ctb); + } + + if (sq[0].contains("Party")) { + CardCollection adventurers = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), + "Creature.Cleric,Creature.Rogue,Creature.Warrior,Creature.Wizard", player, c, ctb); + + Set partyTypes = Sets.newHashSet("Cleric", "Rogue", "Warrior", "Wizard"); + int partySize = 0; + + HashMap chosenParty = new HashMap<>(); + List wildcard = Lists.newArrayList(); + HashMap> multityped = new HashMap<>(); + + // Figure out how to count each class separately. + for (Card card : adventurers) { + Set creatureTypes = card.getType().getCreatureTypes(); + boolean anyType = creatureTypes.contains(CardType.AllCreatureTypes); + creatureTypes.retainAll(partyTypes); + + if (anyType || creatureTypes.size() == 4) { + wildcard.add(card); + + if (wildcard.size() >= 4) { + break; + } + continue; + } else if (creatureTypes.size() == 1) { + String type = (String)(creatureTypes.toArray()[0]); + + if (!chosenParty.containsKey(type)) { + chosenParty.put(type, card); + } + } else { + multityped.put(card, creatureTypes); + } + } + + partySize = Math.min(chosenParty.size() + wildcard.size(), 4); + + if (partySize < 4) { + partyTypes.removeAll(chosenParty.keySet()); + + // Here I'm left with just the party types that I haven't selected. + for(Card multi : multityped.keySet()) { + Set types = multityped.get(multi); + types.retainAll(partyTypes); + + for(String type : types) { + chosenParty.put(type, multi); + partyTypes.remove(type); + break; + } + } + } + + partySize = Math.min(chosenParty.size() + wildcard.size(), 4); + + return doXMath(partySize, expr, c, ctb); + } + + // TODO make AI part to understand Sunburst better so this isn't needed + if (sq[0].startsWith("UniqueManaColorsProduced")) { + boolean untappedOnly = sq[1].contains("ByUntappedSources"); + int uniqueColors = 0; + CardCollectionView otb = player.getCardsIn(ZoneType.Battlefield); + outer: for (byte color : MagicColor.WUBRG) { + for (Card card : otb) { + if (!card.isTapped() || !untappedOnly) { + for (SpellAbility ma : card.getManaAbilities()) { + if (ma.canProduce(MagicColor.toShortString(color))) { + uniqueColors++; + continue outer; + } + } + } + } + } + return doXMath(uniqueColors, expr, c, ctb); + } + + // TODO change into checking SpellAbility + if (sq[0].contains("xColorPaid")) { + String[] attrs = sq[0].split(" "); + StringBuilder colors = new StringBuilder(); + for (int i = 1; i < attrs.length; i++) { + colors.append(attrs[i]); + } + return doXMath(c.getXManaCostPaidCount(colors.toString()), expr, c, ctb); + } + + // Count$UrzaLands.. + if (sq[0].startsWith("UrzaLands")) { + return doXMath(AbilityUtils.calculateAmount(c, sq[player.hasUrzaLands() ? 1 : 2], ctb), expr, c, ctb); + } + + ///////////////// + //game info + // Count$Morbid.. + if (sq[0].startsWith("Morbid")) { + final List res = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Battlefield, "Creature", c, ctb); + return doXMath(calculateAmount(c, sq[res.size() > 0 ? 1 : 2], ctb), expr, c, ctb); + } + + if (sq[0].startsWith("CreatureType")) { + String[] sqparts = l[0].split(" ", 2); + final String[] rest = sqparts[1].split(","); + + final CardCollectionView cardsInZones = sqparts[0].length() > 12 + ? game.getCardsIn(ZoneType.listValueOf(sqparts[0].substring(12))) + : game.getCardsIn(ZoneType.Battlefield); + + CardCollection cards = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); + final Set creatTypes = Sets.newHashSet(); + + for (Card card : cards) { + Iterables.addAll(creatTypes, card.getType().getCreatureTypes()); + } + // filter out fun types? + int n = creatTypes.contains(CardType.AllCreatureTypes) ? CardType.getAllCreatureTypes().size() : creatTypes.size(); + return doXMath(n, expr, c, ctb); + } + + // Count$Chroma. + if (sq[0].startsWith("Chroma")) { + ZoneType sourceZone = sq[0].contains("ChromaInGrave") ? ZoneType.Graveyard : ZoneType.Battlefield; + final CardCollectionView cards; + if (sq[0].contains("ChromaSource")) { // Runs Chroma for passed in Source card + cards = new CardCollection(c); + } + else { + cards = player.getCardsIn(sourceZone); + } + + int colorOcurrencices = 0; + byte colorCode = ManaAtom.fromName(sq[1]); + for (Card c0 : cards) { + for (ManaCostShard sh : c0.getManaCost()){ + if (sh.isColor(colorCode)) + colorOcurrencices++; + } + } + return doXMath(colorOcurrencices, expr, c, ctb); + } + + if (l[0].contains("ExactManaCost")) { + String[] sqparts = l[0].split(" ", 2); + final String[] rest = sqparts[1].split(","); + + final CardCollectionView cardsInZones = sqparts[0].length() > 13 + ? game.getCardsIn(ZoneType.listValueOf(sqparts[0].substring(13))) + : game.getCardsIn(ZoneType.Battlefield); + + CardCollection cards = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); + final Set manaCost = Sets.newHashSet(); + + for (Card card : cards) { + manaCost.add(card.getManaCost().getShortString()); + } + + return doXMath(manaCost.size(), expr, c, ctb); + } + + if (sq[0].equals("StormCount")) { + return doXMath(game.getStack().getSpellsCastThisTurn().size() - 1, expr, c, ctb); + } + + if (sq[0].startsWith("RolledThisTurn")) { + return game.getPhaseHandler().getPlanarDiceRolledthisTurn(); + } + + if (sq[0].contains("CardTypes")) { + return doXMath(getCardTypesFromList(game.getCardsIn(ZoneType.smartValueOf(sq[1]))), expr, c, ctb); + } + + if (sq[0].equals("TotalTurns")) { + return doXMath(game.getPhaseHandler().getTurn(), expr, c, ctb); + } + + if (sq[0].equals("MaxDistinctOnStack")) { + return doXMath(game.getStack().getMaxDistinctSources(), expr, c, ctb); + } + + //Count$Random.. + if (sq[0].equals("Random")) { + int min = AbilityUtils.calculateAmount(c, sq[1], ctb); + int max = AbilityUtils.calculateAmount(c, sq[2], ctb); + + return MyRandom.getRandom().nextInt(1+max-min) + min; + } + + // Count$SumPower_valid + if (sq[0].startsWith("SumPower")) { + final String[] restrictions = l[0].split("_"); + final String[] rest = restrictions[1].split(","); + CardCollection filteredCards = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb); + return doXMath(Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetNetPower), expr, c, ctb); + } + + // Count$SumCMC_valid + if (sq[0].startsWith("SumCMC")) { + ZoneType zone = ZoneType.Battlefield; + //graveyard support for Inferno Project (may need other zones or multi-zone in future) + if (sq[0].contains("Graveyard")) + zone = ZoneType.Graveyard; + final String[] restrictions = l[0].split("_"); + final String[] rest = restrictions[1].split(","); + CardCollectionView cardsonbattlefield = game.getCardsIn(zone); + CardCollection filteredCards = CardLists.getValidCards(cardsonbattlefield, rest, player, c, ctb); + return Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetCmc); + } + + // Count$TotalCounters._ + if (sq[0].startsWith("TotalCounters")) { + final String[] restrictions = l[0].split("_"); + final CounterType cType = CounterType.getType(restrictions[1]); + final String[] validFilter = restrictions[2].split(","); + CardCollectionView validCards = game.getCardsIn(ZoneType.Battlefield); + validCards = CardLists.getValidCards(validCards, validFilter, player, c, ctb); + int cCount = 0; + for (final Card card : validCards) { + cCount += card.getCounters(cType); + } + return doXMath(cCount, expr, c, ctb); + } + + // Count$ThisTurnCast + // Count$LastTurnCast + if (sq[0].startsWith("ThisTurnCast") || sq[0].startsWith("LastTurnCast")) { + + final String[] workingCopy = l[0].split("_"); + final String validFilter = workingCopy[1]; + + List res = Lists.newArrayList(); + if (workingCopy[0].contains("This")) { + res = CardUtil.getThisTurnCast(validFilter, c, ctb); + } else { + res = CardUtil.getLastTurnCast(validFilter, c, ctb); + } + + return doXMath(res.size(), expr, c, ctb); + } + + // Count$ThisTurnEntered [from ] + if (sq[0].startsWith("ThisTurnEntered")) { + final String[] workingCopy = l[0].split("_"); + + ZoneType destination = ZoneType.smartValueOf(workingCopy[1]); + final boolean hasFrom = workingCopy[2].equals("from"); + ZoneType origin = hasFrom ? ZoneType.smartValueOf(workingCopy[3]) : null; + String validFilter = workingCopy[hasFrom ? 4 : 2] ; + + final List res = CardUtil.getThisTurnEntered(destination, origin, validFilter, c, ctb); + if (origin == null) { // Remove cards on the battlefield that changed controller + res.removeAll(CardUtil.getThisTurnEntered(destination, destination, validFilter, c, ctb)); + } + return doXMath(res.size(), expr, c, ctb); + } + + // Count$LastTurnEntered [from ] + if (sq[0].startsWith("LastTurnEntered")) { + final String[] workingCopy = l[0].split("_"); + + ZoneType destination = ZoneType.smartValueOf(workingCopy[1]); + final boolean hasFrom = workingCopy[2].equals("from"); + ZoneType origin = hasFrom ? ZoneType.smartValueOf(workingCopy[3]) : null; + String validFilter = workingCopy[hasFrom ? 4 : 2] ; + + final List res = CardUtil.getLastTurnEntered(destination, origin, validFilter, c, ctb); + if (origin == null) { // Remove cards on the battlefield that changed controller + res.removeAll(CardUtil.getLastTurnEntered(destination, destination, validFilter, c, ctb)); + } + return doXMath(res.size(), expr, c, ctb); + } + + if (sq[0].startsWith("CountersAddedThisTurn")) { + final String[] parts = l[0].split(" "); + CounterType cType = CounterType.getType(parts[1]); + + return doXMath(game.getCounterAddedThisTurn(cType, parts[2], parts[3], c, player, ctb), expr, c, ctb); + } + + // count valid cards in any specified zone/s + if (sq[0].startsWith("Valid")) { + String[] lparts = l[0].split(" ", 2); + + final CardCollectionView cardsInZones = lparts[0].length() > 5 + ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5))) + : game.getCardsIn(ZoneType.Battlefield); + + return doXMath(CardLists.getValidCardCount(cardsInZones, lparts[1], player, c, ctb), expr, c, ctb); + } + + if (sq[0].startsWith("GreatestPower")) { + final String[] lparts = l[0].split("_", 2); + final String[] rest = lparts[1].split(","); + final CardCollectionView cardsInZones = lparts[0].length() > 13 + ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(13))) + : game.getCardsIn(ZoneType.Battlefield); + CardCollection list = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); + int highest = 0; + for (final Card crd : list) { + if (crd.getNetPower() > highest) { + highest = crd.getNetPower(); + } + } + return highest; + } + + if (sq[0].startsWith("GreatestToughness_")) { + final String restriction = l[0].substring(18); + final String[] rest = restriction.split(","); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb); + int highest = 0; + for (final Card crd : list) { + if (crd.getNetToughness() > highest) { + highest = crd.getNetToughness(); + } + } + return highest; + } + + if (sq[0].startsWith("HighestCMC_")) { + final String restriction = l[0].substring(11); + final String[] rest = restriction.split(","); + CardCollection list = CardLists.getValidCards(game.getCardsInGame(), rest, player, c, ctb); + int highest = 0; + for (final Card crd : list) { + // dont check for Split card anymore + if (crd.getCMC() > highest) { + highest = crd.getCMC(); + } + } + return highest; + } + + if (sq[0].startsWith("MostCardName")) { + String[] lparts = l[0].split(" ", 2); + final String[] rest = lparts[1].split(","); + + final CardCollectionView cardsInZones = lparts[0].length() > 12 + ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(12))) + : game.getCardsIn(ZoneType.Battlefield); + + CardCollection cards = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); + final Map map = Maps.newHashMap(); + for (final Card card : cards) { + // Remove Duplicated types + final String name = card.getName(); + Integer count = map.get(name); + map.put(name, count == null ? 1 : count + 1); + } + int max = 0; + for (final Entry entry : map.entrySet()) { + if (max < entry.getValue()) { + max = entry.getValue(); + } + } + return max; + } + + if (sq[0].startsWith("DifferentCardNames_")) { + final List crdname = Lists.newArrayList(); + final String restriction = l[0].substring(19); + final String[] rest = restriction.split(","); + CardCollection list = CardLists.getValidCards(game.getCardsInGame(), rest, player, c, ctb); + for (final Card card : list) { + String name = card.getName(); + // CR 201.2b Those objects have different names only if each of them has at least one name and no two objects in that group have a name in common + if (!crdname.contains(name) && !name.isEmpty()) { + crdname.add(name); + } + } + return doXMath(crdname.size(), expr, c, ctb); + } + + if (sq[0].startsWith("DifferentPower_")) { + final List powers = Lists.newArrayList(); + final String restriction = l[0].substring(15); + final String[] rest = restriction.split(","); + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb); + for (final Card card : list) { + Integer pow = card.getNetPower(); + if (!powers.contains(pow)) { + powers.add(pow); + } + } + return doXMath(powers.size(), expr, c, ctb); + } + + + if (sq[0].startsWith("MostProminentCreatureType")) { + String restriction = l[0].split(" ")[1]; + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, player, c, ctb); + return doXMath(CardFactoryUtil.getMostProminentCreatureTypeSize(list), expr, c, ctb); + } + + if (sq[0].startsWith("SecondMostProminentColor")) { + String restriction = l[0].split(" ")[1]; + CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, player, c, ctb); + int[] colorSize = CardFactoryUtil.SortColorsFromList(list); + return doXMath(colorSize[colorSize.length - 2], expr, c, ctb); + } + + if (sq[0].startsWith("ColorsCtrl")) { + final String restriction = l[0].substring(11); + final String[] rest = restriction.split(","); + final CardCollection list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), rest, player, c, ctb); + byte n = 0; + for (final Card card : list) { + n |= card.determineColor().getColor(); + } + return doXMath(ColorSet.fromMask(n).countColors(), expr, c, ctb); + } + + if (sq[0].startsWith("CreatureType")) { + String[] sqparts = l[0].split(" ", 2); + final String[] rest = sqparts[1].split(","); + + final CardCollectionView cardsInZones = sqparts[0].length() > 12 + ? game.getCardsIn(ZoneType.listValueOf(sqparts[0].substring(12))) + : game.getCardsIn(ZoneType.Battlefield); + + CardCollection cards = CardLists.getValidCards(cardsInZones, rest, player, c, ctb); + final Set creatTypes = Sets.newHashSet(); + + for (Card card : cards) { + Iterables.addAll(creatTypes, card.getType().getCreatureTypes()); + } + int n = creatTypes.contains(CardType.AllCreatureTypes) ? CardType.getAllCreatureTypes().size() : creatTypes.size(); + return doXMath(n, expr, c, ctb); + } + // Complex counting methods + CardCollectionView someCards = getCardListForXCount(c, player, sq, ctb); + + // 1/10 - Count$MaxCMCYouCtrl + if (sq[0].startsWith("MaxCMC")) { + int mmc = Aggregates.max(someCards, CardPredicates.Accessors.fnGetCmc); + return doXMath(mmc, expr, c, ctb); + } + + return doXMath(someCards.size(), expr, c, ctb); } public static final void applyManaColorConversion(ManaConversionMatrix matrix, final Map params) { @@ -2134,4 +3025,648 @@ public class AbilityUtils { sa.setDescription(sa.getDescription() + " (Splicing " + c + " onto it)"); sa.addSplicedCards(c); } + + public static int doXMath(final int num, final String operators, final Card c, CardTraitBase ctb) { + if (operators == null || operators.equals("none")) { + return num; + } + + final String[] s = operators.split("\\."); + int secondaryNum = 0; + + try { + if (s.length == 2) { + secondaryNum = Integer.parseInt(s[1]); + } + } catch (final Exception e) { + secondaryNum = AbilityUtils.calculateAmount(c, s[1], ctb); + } + + if (s[0].contains("Plus")) { + return num + secondaryNum; + } else if (s[0].contains("NMinus")) { + return secondaryNum - num; + } else if (s[0].contains("Minus")) { + return num - secondaryNum; + } else if (s[0].contains("Twice")) { + return num * 2; + } else if (s[0].contains("Thrice")) { + return num * 3; + } else if (s[0].contains("HalfUp")) { + return (int) (Math.ceil(num / 2.0)); + } else if (s[0].contains("HalfDown")) { + return (int) (Math.floor(num / 2.0)); + } else if (s[0].contains("ThirdUp")) { + return (int) (Math.ceil(num / 3.0)); + } else if (s[0].contains("ThirdDown")) { + return (int) (Math.floor(num / 3.0)); + } else if (s[0].contains("Negative")) { + return num * -1; + } else if (s[0].contains("Times")) { + return num * secondaryNum; + } else if (s[0].contains("DivideEvenlyDown")) { + if (secondaryNum == 0) { + return 0; + } else { + return num / secondaryNum; + } + } else if (s[0].contains("Mod")) { + return num % secondaryNum; + } else if (s[0].contains("Abs")) { + return Math.abs(num); + } else if (s[0].contains("LimitMax")) { + if (num < secondaryNum) { + return num; + } else { + return secondaryNum; + } + } else if (s[0].contains("LimitMin")) { + if (num > secondaryNum) { + return num; + } else { + return secondaryNum; + } + + } else { + return num; + } + } + + /** + *

+ * Parse player targeted X variables. + *

+ * + * @param players + * a {@link java.util.ArrayList} object. + * @param s + * a {@link java.lang.String} object. + * @param source + * a {@link forge.game.card.Card} object. + * @return a int. + */ + public static int playerXCount(final List players, final String s, final Card source, CardTraitBase ctb) { + if (players.size() == 0) { + return 0; + } + + final String[] l = s.split("/"); + final String m = CardFactoryUtil.extractOperators(s); + + int n = 0; + + if (l[0].startsWith("TotalCommanderCastFromCommandZone")) { + int totCast = 0; + for (Player p : players) { + totCast += p.getTotalCommanderCast(); + } + return doXMath(totCast, m, source, ctb); + } + + // methods for getting the highest/lowest playerXCount from a range of players + if (l[0].startsWith("Highest")) { + for (final Player player : players) { + final int current = playerXProperty(player, TextUtil.fastReplace(s, "Highest", ""), source, ctb); + if (current > n) { + n = current; + } + } + + return doXMath(n, m, source, ctb); + } + + if (l[0].startsWith("Lowest")) { + n = 99999; // if no players have fewer than 99999 valids, the game is frozen anyway + for (final Player player : players) { + final int current = playerXProperty(player, TextUtil.fastReplace(s, "Lowest", ""), source, ctb); + if (current < n) { + n = current; + } + } + return doXMath(n, m, source, ctb); + } + + if (l[0].startsWith("TiedForHighestLife")) { + int maxLife = Integer.MIN_VALUE; + for (final Player player : players) { + int highestTotal = playerXProperty(player, "LifeTotal", source, ctb); + if (highestTotal > maxLife) { + maxLife = highestTotal; + } + } + int numTied = 0; + for (final Player player : players) { + if (player.getLife() == maxLife) { + numTied++; + } + } + return doXMath(numTied, m, source, ctb); + } + + if (l[0].startsWith("TiedForLowestLife")) { + int minLife = Integer.MAX_VALUE; + for (final Player player : players) { + int lowestTotal = playerXProperty(player, "LifeTotal", source, ctb); + if (lowestTotal < minLife) { + minLife = lowestTotal; + } + } + int numTied = 0; + for (final Player player : players) { + if (player.getLife() == minLife) { + numTied++; + } + } + return doXMath(numTied, m, source, ctb); + } + + final String[] sq; + sq = l[0].split("\\."); + + // the number of players passed in + if (sq[0].equals("Amount")) { + return doXMath(players.size(), m, source, ctb); + } + + if (sq[0].startsWith("HasProperty")) { + int totPlayer = 0; + String property = sq[0].substring(11); + for (Player p : players) { + if (p.hasProperty(property, source.getController(), source, ctb)) { + totPlayer++; + } + } + return doXMath(totPlayer, m, source, ctb); + } + + if (sq[0].contains("DamageThisTurn")) { + int totDmg = 0; + for (Player p : players) { + totDmg += p.getAssignedDamage(); + } + return doXMath(totDmg, m, source, ctb); + } else if (sq[0].contains("LifeLostThisTurn")) { + int totDmg = 0; + for (Player p : players) { + totDmg += p.getLifeLostThisTurn(); + } + return doXMath(totDmg, m, source, ctb); + } + + if (players.size() > 0) { + int totCount = 0; + for (Player p : players) { + totCount += playerXProperty(p, s, source, ctb); + } + return totCount; + } + + return doXMath(n, m, source, ctb); + } + + public static int playerXProperty(final Player player, final String s, final Card source, CardTraitBase ctb) { + final String[] l = s.split("/"); + final String m = CardFactoryUtil.extractOperators(s); + + final Game game = player.getGame(); + + // count valid cards in any specified zone/s + if (l[0].startsWith("Valid") && !l[0].contains("Valid ")) { + String[] lparts = l[0].split(" ", 2); + final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); + String restrictions = TextUtil.fastReplace(l[0], TextUtil.addSuffix(lparts[0]," "), ""); + final String[] rest = restrictions.split(","); + CardCollection cards = CardLists.getValidCards(game.getCardsIn(vZone), rest, player, source, ctb); + return doXMath(cards.size(), m, source, ctb); + } + + // count valid cards on the battlefield + if (l[0].startsWith("Valid ")) { + final String restrictions = l[0].substring(6); + final String[] rest = restrictions.split(","); + CardCollection cardsonbattlefield = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, source, ctb); + return doXMath(cardsonbattlefield.size(), m, source, ctb); + } + + final String[] sq = l[0].split("\\."); + final String value = sq[0]; + + if (value.contains("CardsInHand")) { + return doXMath(player.getCardsIn(ZoneType.Hand).size(), m, source, ctb); + } + + if (value.contains("NumPowerSurgeLands")) { + return doXMath(player.getNumPowerSurgeLands(), m, source, ctb); + } + + if (value.contains("DomainPlayer")) { + int n = 0; + final CardCollectionView someCards = player.getCardsIn(ZoneType.Battlefield); + final List basic = MagicColor.Constant.BASIC_LANDS; + + for (int i = 0; i < basic.size(); i++) { + if (!CardLists.getType(someCards, basic.get(i)).isEmpty()) { + n++; + } + } + return doXMath(n, m, source, ctb); + } + + if (value.contains("CardsInLibrary")) { + return doXMath(player.getCardsIn(ZoneType.Library).size(), m, source, ctb); + } + + if (value.contains("CardsInGraveyard")) { + return doXMath(player.getCardsIn(ZoneType.Graveyard).size(), m, source, ctb); + } + if (value.contains("LandsInGraveyard")) { + return doXMath(CardLists.getType(player.getCardsIn(ZoneType.Graveyard), "Land").size(), m, source, ctb); + } + + if (value.contains("CreaturesInPlay")) { + return doXMath(player.getCreaturesInPlay().size(), m, source, ctb); + } + + if (value.contains("CardsInPlay")) { + return doXMath(player.getCardsIn(ZoneType.Battlefield).size(), m, source, ctb); + } + + if (value.contains("StartingLife")) { + return doXMath(player.getStartingLife(), m, source, ctb); + } + + if (value.contains("LifeTotal")) { + return doXMath(player.getLife(), m, source, ctb); + } + + if (value.contains("LifeLostThisTurn")) { + return doXMath(player.getLifeLostThisTurn(), m, source, ctb); + } + + if (value.contains("LifeLostLastTurn")) { + return doXMath(player.getLifeLostLastTurn(), m, source, ctb); + } + + if (value.contains("LifeGainedThisTurn")) { + return doXMath(player.getLifeGainedThisTurn(), m, source, ctb); + } + + if (value.contains("LifeGainedByTeamThisTurn")) { + return doXMath(player.getLifeGainedByTeamThisTurn(), m, source, ctb); + } + + if (value.contains("LifeStartedThisTurnWith")) { + return doXMath(player.getLifeStartedThisTurnWith(), m, source, ctb); + } + + if (value.contains("PoisonCounters")) { + return doXMath(player.getPoisonCounters(), m, source, ctb); + } + + if (value.contains("TopOfLibraryCMC")) { + return doXMath(Aggregates.sum(player.getCardsIn(ZoneType.Library, 1), CardPredicates.Accessors.fnGetCmc), m, source, ctb); + } + + if (value.contains("LandsPlayed")) { + return doXMath(player.getLandsPlayedThisTurn(), m, source, ctb); + } + + if (value.contains("CardsDrawn")) { + return doXMath(player.getNumDrawnThisTurn(), m, source, ctb); + } + + if (value.contains("CardsDiscardedThisTurn")) { + return doXMath(player.getNumDiscardedThisTurn(), m, source, ctb); + } + + if (value.contains("TokensCreatedThisTurn")) { + return doXMath(player.getNumTokensCreatedThisTurn(), m, source, ctb); + } + + if (value.contains("AttackersDeclared")) { + return doXMath(player.getAttackersDeclaredThisTurn(), m, source, ctb); + } + + if (value.contains("DamageToOppsThisTurn")) { + int oppDmg = 0; + for (Player opp : player.getOpponents()) { + oppDmg += opp.getAssignedDamage(); + } + return doXMath(oppDmg, m, source, ctb); + } + + if (value.contains("NonCombatDamageDealtThisTurn")) { + return doXMath(player.getAssignedDamage() - player.getAssignedCombatDamage(), m, source, ctb); + } + + if (value.equals("OpponentsAttackedThisTurn")) { + final PlayerCollection opps = game.getPlayersAttackedThisTurn().get(player); + return doXMath(opps == null ? 0 : opps.size(), m, source, ctb); + } + + return doXMath(0, m, source, ctb); + } + + /** + *

+ * Parse player targeted X variables. + *

+ * + * @param objects + * a {@link java.util.ArrayList} object. + * @param s + * a {@link java.lang.String} object. + * @param source + * a {@link forge.game.card.Card} object. + * @return a int. + */ + public static int objectXCount(final List objects, final String s, final Card source, CardTraitBase ctb) { + if (objects.isEmpty()) { + return 0; + } + + if (s.startsWith("Valid")) { + return handlePaid(Iterables.filter(objects, Card.class), s, source, ctb); + } + + int n = s.startsWith("Amount") ? objects.size() : 0; + return doXMath(n, CardFactoryUtil.extractOperators(s), source, ctb); + } + + + /** + *

+ * handlePaid. + *

+ * + * @param paidList + * a {@link forge.game.card.CardCollectionView} object. + * @param string + * a {@link java.lang.String} object. + * @param source + * a {@link forge.game.card.Card} object. + * @return a int. + */ + public static int handlePaid(final Iterable paidList, final String string, final Card source, CardTraitBase ctb) { + if (paidList == null) { + if (string.contains(".")) { + final String[] splitString = string.split("\\.", 2); + return doXMath(0, splitString[1], source, ctb); + } else { + return 0; + } + } + if (string.startsWith("Amount")) { + int size = Iterables.size(paidList); + if (string.contains(".")) { + final String[] splitString = string.split("\\.", 2); + return doXMath(size, splitString[1], source, ctb); + } else { + return size; + } + + } + + if (string.startsWith("DifferentCMC")) { + final Set diffCMC = new HashSet<>(); + for (final Card card : paidList) { + diffCMC.add(card.getCMC()); + } + return diffCMC.size(); + } + + if (string.startsWith("SumCMC")) { + int sumCMC = 0; + for(Card c : paidList) { + sumCMC += c.getCMC(); + } + return sumCMC; + } + + if (string.startsWith("Valid")) { + + final String[] splitString = string.split("/", 2); + String valid = splitString[0].substring(6); + final List list = CardLists.getValidCardsAsList(paidList, valid, source.getController(), source, ctb); + return doXMath(list.size(), splitString.length > 1 ? splitString[1] : null, source, ctb); + } + + String filteredString = string; + Iterable filteredList = paidList; + final String[] filter = filteredString.split("_"); + + if (string.startsWith("FilterControlledBy")) { + final String pString = filter[0].substring(18); + FCollectionView controllers = AbilityUtils.getDefinedPlayers(source, pString, ctb); + filteredList = CardLists.filterControlledByAsList(filteredList, controllers); + filteredString = TextUtil.fastReplace(filteredString, pString, ""); + filteredString = TextUtil.fastReplace(filteredString, "FilterControlledBy_", ""); + } + + int tot = 0; + for (final Card c : filteredList) { + tot += xCount(c, filteredString, ctb); + } + + return tot; + } + + + private static CardCollectionView getCardListForXCount(final Card c, final Player cc, final String[] sq, CardTraitBase ctb) { + final List opps = cc.getOpponents(); + CardCollection someCards = new CardCollection(); + final Game game = c.getGame(); + + // Generic Zone-based counting + // Count$QualityAndZones.Subquality + + // build a list of cards in each possible specified zone + + if (sq[0].contains("YouCtrl")) { + someCards.addAll(cc.getCardsIn(ZoneType.Battlefield)); + } + + if (sq[0].contains("InYourYard")) { + someCards.addAll(cc.getCardsIn(ZoneType.Graveyard)); + } + + if (sq[0].contains("InYourLibrary")) { + someCards.addAll(cc.getCardsIn(ZoneType.Library)); + } + + if (sq[0].contains("InYourHand")) { + someCards.addAll(cc.getCardsIn(ZoneType.Hand)); + } + + if (sq[0].contains("InYourSideboard")) { + someCards.addAll(cc.getCardsIn(ZoneType.Sideboard)); + } + + if (sq[0].contains("OppCtrl")) { + for (final Player p : opps) { + someCards.addAll(p.getZone(ZoneType.Battlefield).getCards()); + } + } + + if (sq[0].contains("InOppYard")) { + for (final Player p : opps) { + someCards.addAll(p.getCardsIn(ZoneType.Graveyard)); + } + } + + if (sq[0].contains("InOppHand")) { + for (final Player p : opps) { + someCards.addAll(p.getCardsIn(ZoneType.Hand)); + } + } + + if (sq[0].contains("InChosenHand")) { + if (c.getChosenPlayer() != null) { + someCards.addAll(c.getChosenPlayer().getCardsIn(ZoneType.Hand)); + } + } + + if (sq[0].contains("InRememberedHand")) { + if (c.getRemembered() != null) { + for (final Object o : c.getRemembered()) { + if (o instanceof Player) { + Player remPlayer = (Player) o; + someCards.addAll(remPlayer.getCardsIn(ZoneType.Hand)); + } + } + } + } + + if (sq[0].contains("InChosenYard")) { + if (c.getChosenPlayer() != null) { + someCards.addAll(c.getChosenPlayer().getCardsIn(ZoneType.Graveyard)); + } + } + + if (sq[0].contains("OnBattlefield")) { + someCards.addAll(game.getCardsIn(ZoneType.Battlefield)); + } + + if (sq[0].contains("InAllYards")) { + someCards.addAll(game.getCardsIn(ZoneType.Graveyard)); + } + + if (sq[0].contains("SpellsOnStack")) { + someCards.addAll(game.getCardsIn(ZoneType.Stack)); + } + + if (sq[0].contains("InAllHands")) { + someCards.addAll(game.getCardsIn(ZoneType.Hand)); + } + + // Count$InTargetedHand (targeted player's cards in hand) + if (sq[0].contains("InTargetedHand")) { + for (Player tgtP : AbilityUtils.getDefinedPlayers(c, "TargetedPlayer", ctb)) { + someCards.addAll(tgtP.getCardsIn(ZoneType.Hand)); + } + } + + // Count$InTargetedHand (targeted player's cards in hand) + if (sq[0].contains("InTargetedLibrary")) { + for (Player tgtP : AbilityUtils.getDefinedPlayers(c, "TargetedPlayer", ctb)) { + someCards.addAll(tgtP.getCardsIn(ZoneType.Library)); + } + } + + // Count$InTargetedHand (targeted player's cards in hand) + if (sq[0].contains("InEnchantedHand")) { + GameEntity o = c.getEntityAttachedTo(); + Player controller = null; + if (o instanceof Card) { + controller = ((Card) o).getController(); + } + else { + controller = (Player) o; + } + if (controller != null) { + someCards.addAll(controller.getCardsIn(ZoneType.Hand)); + } + } + if (sq[0].contains("InEnchantedYard")) { + GameEntity o = c.getEntityAttachedTo(); + Player controller = null; + if (o instanceof Card) { + controller = ((Card) o).getController(); + } + else { + controller = (Player) o; + } + if (controller != null) { + someCards.addAll(controller.getCardsIn(ZoneType.Graveyard)); + } + } + + // filter lists based on the specified quality + + // "Clerics you control" - Count$TypeYouCtrl.Cleric + if (sq[0].contains("Type")) { + someCards = CardLists.filter(someCards, CardPredicates.isType(sq[1])); + } + + // "Named in all graveyards" - Count$NamedAllYards. + + if (sq[0].contains("Named")) { + if (sq[1].equals("CARDNAME")) { + sq[1] = c.getName(); + } + someCards = CardLists.filter(someCards, CardPredicates.nameEquals(sq[1])); + } + + // Refined qualities + + // "Untapped Lands" - Count$UntappedTypeYouCtrl.Land + // if (sq[0].contains("Untapped")) { someCards = CardLists.filter(someCards, Presets.UNTAPPED); } + + // if (sq[0].contains("Tapped")) { someCards = CardLists.filter(someCards, Presets.TAPPED); } + +// String sq0 = sq[0].toLowerCase(); +// for (String color : MagicColor.Constant.ONLY_COLORS) { +// if (sq0.contains(color)) +// someCards = someCards.filter(CardListFilter.WHITE); +// } + // "White Creatures" - Count$WhiteTypeYouCtrl.Creature + // if (sq[0].contains("White")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.WHITE)); + // if (sq[0].contains("Blue")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.BLUE)); + // if (sq[0].contains("Black")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.BLACK)); + // if (sq[0].contains("Red")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.RED)); + // if (sq[0].contains("Green")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.GREEN)); + + if (sq[0].contains("Multicolor")) { + someCards = CardLists.filter(someCards, new Predicate() { + @Override + public boolean apply(final Card c) { + return CardUtil.getColors(c).isMulticolor(); + } + }); + } + + if (sq[0].contains("Monocolor")) { + someCards = CardLists.filter(someCards, new Predicate() { + @Override + public boolean apply(final Card c) { + return CardUtil.getColors(c).isMonoColor(); + } + }); + } + return someCards; + } + + public static int getNumberOfTypes(final Card card) { + EnumSet types = EnumSet.noneOf(CardType.CoreType.class); + Iterables.addAll(types, card.getType().getCoreTypes()); + return types.size(); + } + + public static int getCardTypesFromList(final CardCollectionView list) { + EnumSet types = EnumSet.noneOf(CardType.CoreType.class); + for (Card c1 : list) { + Iterables.addAll(types, c1.getType().getCoreTypes()); + } + return types.size(); + } } diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index e540e28f6b1..c528e15ce83 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -97,6 +97,7 @@ public enum ApiType { LookAt (LookAtEffect.class), LoseLife (LifeLoseEffect.class), LosesGame (GameLossEffect.class), + MakeCard (MakeCardEffect.class), Mana (ManaEffect.class), ManaReflected (ManaReflectedEffect.class), Manifest (ManifestEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index 02dbfeaa0f9..f41a8bf9390 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -21,9 +21,10 @@ import forge.game.GameObject; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; +import forge.game.card.CardUtil; import forge.game.card.CardZoneTable; import forge.game.combat.Combat; +import forge.game.phase.PhaseType; import forge.game.player.Player; import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; @@ -55,7 +56,7 @@ public abstract class SpellAbilityEffect { public abstract void resolve(SpellAbility sa); protected String getStackDescription(final SpellAbility sa) { - // Unless overriden, let the spell description also be the stack description + // Unless overridden, let the spell description also be the stack description return sa.getDescription(); } @@ -123,7 +124,7 @@ public abstract class SpellAbilityEffect { if (sa.hasParam("Announce")) { String svar = sa.getParam("Announce"); - int amount = CardFactoryUtil.xCount(sa.getHostCard(), sa.getSVar(svar)); + int amount = AbilityUtils.calculateAmount(sa.getHostCard(), svar, sa); sb.append(" "); sb.append(TextUtil.enclosedParen(TextUtil.concatNoSpace(svar,"=",String.valueOf(amount)))); } else{ @@ -198,7 +199,7 @@ public abstract class SpellAbilityEffect { // Players protected final static PlayerCollection getTargetPlayers(final SpellAbility sa) { return getPlayers(false, "Defined", sa); } protected final static PlayerCollection getTargetPlayers(final SpellAbility sa, final String definedParam) { return getPlayers(false, definedParam, sa); } - protected final static PlayerCollection getDefinedPlayersOrTargeted(final SpellAbility sa ) { return getPlayers(true, "Defined", sa); } + protected final static PlayerCollection getDefinedPlayersOrTargeted(final SpellAbility sa) { return getPlayers(true, "Defined", sa); } protected final static PlayerCollection getDefinedPlayersOrTargeted(final SpellAbility sa, final String definedParam) { return getPlayers(true, definedParam, sa); } private static PlayerCollection getPlayers(final boolean definedFirst, final String definedParam, final SpellAbility sa) { @@ -218,7 +219,6 @@ public abstract class SpellAbilityEffect { : AbilityUtils.getDefinedSpellAbilities(sa.getHostCard(), sa.getParam(definedParam), sa); } - // Targets of card or player type protected final static List getTargetEntities(final SpellAbility sa) { return getEntities(false, "Defined", sa); } protected final static List getTargetEntities(final SpellAbility sa, final String definedParam) { return getEntities(false, definedParam, sa); } @@ -297,7 +297,7 @@ public abstract class SpellAbilityEffect { } delTrig.append("| TriggerDescription$ ").append(desc); - final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), sa.getHostCard(), intrinsic); + final Trigger trig = TriggerHandler.parseTrigger(delTrig.toString(), CardUtil.getLKICopy(sa.getHostCard()), intrinsic); for (final Card c : crds) { trig.addRemembered(c); @@ -576,6 +576,8 @@ public abstract class SpellAbilityEffect { GameEntity defender = null; FCollection defs = null; + // important to update defenders here, maybe some PW got removed + combat.initConstraints(); if ("True".equalsIgnoreCase(attacking)) { defs = (FCollection) combat.getDefenders(); } else if (sa.hasParam("ChoosePlayerOrPlaneswalker")) { @@ -697,4 +699,52 @@ public abstract class SpellAbilityEffect { } } } + + protected static void addUntilCommand(final SpellAbility sa, GameCommand until) { + Card host = sa.getHostCard(); + final Game game = host.getGame(); + final String duration = sa.getParam("Duration"); + // in case host was LKI + if (host.isLKI()) { + host = game.getCardState(host); + } + + if ("UntilEndOfCombat".equals(duration)) { + game.getEndOfCombat().addUntil(until); + } else if ("UntilYourNextUpkeep".equals(duration)) { + game.getUpkeep().addUntil(sa.getActivatingPlayer(), until); + } else if ("UntilTheEndOfYourNextUpkeep".equals(duration)) { + if (game.getPhaseHandler().is(PhaseType.UPKEEP)) { + game.getUpkeep().registerUntilEnd(host.getController(), until); + } else { + game.getUpkeep().addUntilEnd(host.getController(), until); + } + } else if ("UntilTheEndOfYourNextTurn".equals(duration)) { + if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { + game.getEndOfTurn().registerUntilEnd(sa.getActivatingPlayer(), until); + } else { + game.getEndOfTurn().addUntilEnd(sa.getActivatingPlayer(), until); + } + } else if (duration != null && duration.startsWith("UntilAPlayerCastSpell")) { + game.getStack().addCastCommand(duration.split(" ")[1], until); + } else if ("UntilHostLeavesPlay".equals(duration)) { + host.addLeavesPlayCommand(until); + } else if ("UntilHostLeavesPlayOrEOT".equals(duration)) { + host.addLeavesPlayCommand(until); + game.getEndOfTurn().addUntil(until); + } else if ("UntilLoseControlOfHost".equals(duration)) { + host.addLeavesPlayCommand(until); + host.addChangeControllerCommand(until); + } else if ("UntilYourNextTurn".equals(duration)) { + game.getCleanup().addUntil(sa.getActivatingPlayer(), until); + } else if ("UntilUntaps".equals(duration)) { + host.addUntapCommand(until); + } else if ("UntilUnattached".equals(duration)) { + sa.getHostCard().addUnattachCommand(until); + } else if ("UntilFacedown".equals(duration)) { + sa.getHostCard().addFacedownCommand(until); + }else { + game.getEndOfTurn().addUntil(until); + } + } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java index c18f9aed31a..46dd4b005f3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AddTurnEffect.java @@ -16,13 +16,11 @@ public class AddTurnEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { - final StringBuilder sb = new StringBuilder(); final int numTurns = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumTurns"), sa); List tgtPlayers = getTargetPlayers(sa); - for (final Player player : tgtPlayers) { sb.append(player).append(" "); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index ef111a521c4..10bb5c57ba9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -43,7 +43,7 @@ public class AnimateAllEffect extends AnimateEffectBase { // Every Animate event needs a unique time stamp final long timestamp = game.getNextTimestamp(); - final boolean permanent = sa.hasParam("Permanent"); + final boolean permanent = "Permanent".equals(sa.getParam("Duration")); final CardType types = new CardType(true); if (sa.hasParam("Types")) { @@ -158,13 +158,7 @@ public class AnimateAllEffect extends AnimateEffectBase { }; if (!permanent) { - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(unanimate); - } else if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(host.getController(), unanimate); - } else { - game.getEndOfTurn().addUntil(unanimate); - } + addUntilCommand(sa, unanimate); } } } // animateAllResolve diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java index 507875df874..2bb8cf9c569 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffect.java @@ -29,8 +29,8 @@ public class AnimateEffect extends AnimateEffectBase { String animateImprinted = null; //if host is not on the battlefield don't apply - if ((sa.hasParam("UntilHostLeavesPlay") || sa.hasParam("UntilLoseControlOfHost")) - && !sa.getHostCard().isInPlay()) { + if (("UntilHostLeavesPlay".equals(sa.getParam("Duration")) || "UntilLoseControlOfHost".equals(sa.getParam("Duration"))) + && !source.isInPlay()) { return; } @@ -216,7 +216,7 @@ public class AnimateEffect extends AnimateEffectBase { toughness = AbilityUtils.calculateAmount(host, sa.getParam("Toughness"), sa); } - final boolean permanent = sa.hasParam("Permanent"); + final boolean permanent = "Permanent".equals(sa.getParam("Duration")); final List types = Lists.newArrayList(); if (sa.hasParam("Types")) { types.addAll(Arrays.asList(sa.getParam("Types").split(","))); @@ -296,15 +296,16 @@ public class AnimateEffect extends AnimateEffectBase { // sb.append(abilities) // sb.append(triggers) if (!permanent) { - if (sa.hasParam("UntilEndOfCombat")) { + final String duration = sa.getParam("Duration"); + if ("UntilEndOfCombat".equals(duration)) { sb.append(" until end of combat."); - } else if (sa.hasParam("UntilHostLeavesPlay")) { + } else if ("UntilHostLeavesPlay".equals(duration)) { sb.append(" until ").append(host).append(" leaves the battlefield."); - } else if (sa.hasParam("UntilYourNextUpkeep")) { + } else if ("UntilYourNextUpkeep".equals(duration)) { sb.append(" until your next upkeep."); - } else if (sa.hasParam("UntilYourNextTurn")) { + } else if ("UntilYourNextTurn".equals(duration)) { sb.append(" until your next turn."); - } else if (sa.hasParam("UntilControllerNextUntap")) { + } else if ("UntilControllerNextUntap".equals(duration)) { sb.append(" until its controller's next untap step."); } else { sb.append(" until end of turn."); @@ -313,7 +314,6 @@ public class AnimateEffect extends AnimateEffectBase { sb.append("."); } - return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java index 8d05c06e04b..17e96421e05 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java @@ -32,7 +32,6 @@ import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.event.GameEventCardStatsChanged; import forge.game.keyword.Keyword; -import forge.game.phase.PhaseType; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.spellability.AbilityStatic; @@ -111,6 +110,10 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { removeEnchantmentTypes = true; } + if (sa.hasParam("RememberAnimated")) { + source.addRemembered(c); + } + if ((power != null) || (toughness != null)) { c.addNewPT(power, toughness, timestamp); } @@ -214,30 +217,11 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { addedStaticAbilities, removeAll, false, removeLandTypes, timestamp); } - if (!sa.hasParam("Permanent")) { - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(unanimate); - } else if (sa.hasParam("UntilHostLeavesPlay")) { - source.addLeavesPlayCommand(unanimate); - } else if (sa.hasParam("UntilLoseControlOfHost")) { - sa.getHostCard().addLeavesPlayCommand(unanimate); - sa.getHostCard().addChangeControllerCommand(unanimate); - } else if (sa.hasParam("UntilYourNextUpkeep")) { - game.getUpkeep().addUntil(source.getController(), unanimate); - } else if (sa.hasParam("UntilTheEndOfYourNextUpkeep")) { - if (game.getPhaseHandler().is(PhaseType.UPKEEP)) { - game.getUpkeep().registerUntilEnd(source.getController(), unanimate); - } else { - game.getUpkeep().addUntilEnd(source.getController(), unanimate); - } - } else if (sa.hasParam("UntilControllerNextUntap")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { + if ("UntilControllerNextUntap".equals(sa.getParam("Duration"))) { game.getUntap().addUntil(c.getController(), unanimate); - } else if (sa.hasParam("UntilAPlayerCastSpell")) { - game.getStack().addCastCommand(sa.getParam("UntilAPlayerCastSpell"), unanimate); - } else if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(source.getController(), unanimate); } else { - game.getEndOfTurn().addUntil(unanimate); + addUntilCommand(sa, unanimate); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java index 1f392ec35c4..cdbe031da9e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AssignGroupEffect.java @@ -44,7 +44,7 @@ public class AssignGroupEffect extends SpellAbilityEffect { Player chooser = sa.getActivatingPlayer(); if (sa.hasParam("Chooser")) { final String choose = sa.getParam("Chooser"); - chooser = AbilityUtils.getDefinedPlayers(sa.getHostCard(), choose, sa).get(0); + chooser = AbilityUtils.getDefinedPlayers(host, choose, sa).get(0); } Multimap result = ArrayListMultimap.create(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java index e0e1af7b139..ea4b08ec562 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BlockEffect.java @@ -29,7 +29,7 @@ public class BlockEffect extends SpellAbilityEffect { List attackers = new ArrayList<>(); if (sa.hasParam("DefinedAttacker")) { - for (final Card attacker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa)) { + for (final Card attacker : AbilityUtils.getDefinedCards(host, sa.getParam("DefinedAttacker"), sa)) { if (combat.isAttacking(attacker)) attackers.add(attacker); } @@ -37,7 +37,7 @@ public class BlockEffect extends SpellAbilityEffect { List blockers = new ArrayList<>(); if (sa.hasParam("DefinedBlocker")) { - for (final Card blocker : AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedBlocker"), sa)) { + for (final Card blocker : AbilityUtils.getDefinedCards(host, sa.getParam("DefinedBlocker"), sa)) { if (blocker.isCreature() && blocker.isInZone(ZoneType.Battlefield)) blockers.add(blocker); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CamouflageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CamouflageEffect.java index 481941f2f32..c8528f91eff 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CamouflageEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CamouflageEffect.java @@ -31,9 +31,7 @@ public class CamouflageEffect extends SpellAbilityEffect { } } - if (attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.") && - blockers.size() < defender.getCreaturesInPlay().size() || - blockers.size() < CombatUtil.needsBlockers(attacker)) { + if (blockers.size() < CombatUtil.getMinNumBlockersForAttacker(attacker, defender)) { // If not enough remaining creatures to block, don't add them as blocker continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index 563498100b8..e625c7ab55b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -78,21 +78,17 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { TargetChoices newTargetBlock = oldTargetBlock.clone(); // gets the divied value from old target Integer div = oldTargetBlock.getDividedValue(oldTarget); - newTargetBlock.remove(oldTarget); - replaceIn.updateTarget(newTargetBlock, sa.getHostCard()); // 3. test if updated choices would be correct. GameObject newTarget = Iterables.getFirst(getDefinedCardsOrTargeted(sa, "DefinedMagnet"), null); if (replaceIn.getSpellAbility(true).canTarget(newTarget)) { + newTargetBlock.remove(oldTarget); newTargetBlock.add(newTarget); if (div != null) { newTargetBlock.addDividedAllocation(newTarget, div); } replaceIn.updateTarget(newTargetBlock, sa.getHostCard()); } - else { - replaceIn.updateTarget(oldTargetBlock, sa.getHostCard()); - } } else { while(changingTgtSI != null) { @@ -103,6 +99,14 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { int div = changingTgtSA.getTotalDividedValue(); changingTgtSA.resetTargets(); List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true); + if (sa.hasParam("RandomTargetRestriction")) { + candidates.removeIf(new java.util.function.Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); + } GameEntity choice = Aggregates.random(candidates); changingTgtSA.getTargets().add(choice); if (changingTgtSA.isDividedAsYouChoose()) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java index 9b8d9e50336..8ae831f43a4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTextEffect.java @@ -26,7 +26,7 @@ public class ChangeTextEffect extends SpellAbilityEffect { final Card source = sa.getHostCard(); final Game game = source.getGame(); final Long timestamp = Long.valueOf(game.getNextTimestamp()); - final boolean permanent = sa.hasParam("Permanent"); + final boolean permanent = "Permanent".equals(sa.getParam("Duration")); final String changedColorWordOriginal, changedColorWordNew; if (sa.hasParam("ChangeColorWord")) { @@ -151,7 +151,7 @@ public class ChangeTextEffect extends SpellAbilityEffect { changedTypeWordNew = null; } - final boolean permanent = sa.hasParam("Permanent"); + final boolean permanent = "Permanent".equals(sa.getParam("Duration")); final StringBuilder sb = new StringBuilder(); sb.append("Change the text of "); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java index a0fd83484ec..b53383ed315 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneAllEffect.java @@ -42,8 +42,10 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { + final Card source = sa.getHostCard(); + //if host is not on the battlefield don't apply - if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) { + if ("UntilHostLeavesPlay".equals(sa.getParam("Duration")) && !source.isInPlay()) { return; } @@ -53,7 +55,6 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { CardCollection cards; List tgtPlayers = getTargetPlayers(sa); final Game game = sa.getActivatingPlayer().getGame(); - final Card source = sa.getHostCard(); if ((!sa.usesTargeting() && !sa.hasParam("Defined")) || sa.hasParam("UseAllOriginZones")) { cards = new CardCollection(game.getCardsIn(origin)); @@ -122,7 +123,7 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { } if (sa.hasParam("ForgetOtherRemembered")) { - sa.getHostCard().clearRemembered(); + source.clearRemembered(); } final String remember = sa.getParam("RememberChanged"); @@ -203,9 +204,6 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { if (sa.hasParam("ExileFaceDown")) { movedCard.turnFaceDown(true); } - if (sa.hasParam("Tapped")) { - movedCard.setTapped(true); - } } if (remember != null) { @@ -270,8 +268,8 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect { triggerList.triggerChangesZoneAll(game, sa); - if (sa.hasParam("UntilHostLeavesPlay")) { - source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source)); + if (sa.hasParam("Duration")) { + addUntilCommand(sa, untilHostLeavesPlayCommand(triggerList, source)); } // if Shuffle parameter exists, and any amount of cards were owned by 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 97d09682bfb..7d2d07e1985 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 @@ -57,17 +57,9 @@ import forge.util.collect.FCollectionView; public class ChangeZoneEffect extends SpellAbilityEffect { - private boolean isHidden(SpellAbility sa) { - boolean hidden = sa.hasParam("Hidden"); - if (!hidden && sa.hasParam("Origin")) { - hidden = ZoneType.isHidden(sa.getParam("Origin")); - } - return hidden; - } - @Override protected String getStackDescription(SpellAbility sa) { - if (isHidden(sa)) { + if (sa.isHidden()) { return changeHiddenOriginStackDescription(sa); } return changeKnownOriginStackDescription(sa); @@ -97,13 +89,13 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // Player whose cards will change zones List fetchers = null; if (sa.hasParam("DefinedPlayer")) { - fetchers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa); + fetchers = AbilityUtils.getDefinedPlayers(host, sa.getParam("DefinedPlayer"), sa); } if (fetchers == null && sa.hasParam("ValidTgts") && sa.usesTargeting()) { fetchers = Lists.newArrayList(sa.getTargets().getTargetPlayers()); } if (fetchers == null) { - fetchers = Lists.newArrayList(sa.getHostCard().getController()); + fetchers = Lists.newArrayList(host.getController()); } final String fetcherNames = Lang.joinHomogenous(fetchers, Player.Accessors.FN_GET_NAME); @@ -111,7 +103,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // Player who chooses the cards to move List choosers = Lists.newArrayList(); if (sa.hasParam("Chooser")) { - choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa); + choosers = AbilityUtils.getDefinedPlayers(host, sa.getParam("Chooser"), sa); } if (choosers.isEmpty()) { choosers.add(sa.getActivatingPlayer()); @@ -420,11 +412,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { //if host is not on the battlefield don't apply - if (sa.hasParam("UntilHostLeavesPlay") && !sa.getHostCard().isInPlay()) { + if ("UntilHostLeavesPlay".equals(sa.getParam("Duration")) && !sa.getHostCard().isInPlay()) { return; } - if (isHidden(sa) && !sa.hasParam("Ninjutsu")) { + if (sa.isHidden() && !sa.hasParam("Ninjutsu")) { changeHiddenOriginResolve(sa); } else { //else if (isKnown(origin) || sa.containsKey("Ninjutsu")) { @@ -502,7 +494,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { Player chooser = player; if (sa.hasParam("Chooser")) { - chooser = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa).get(0); + chooser = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("Chooser"), sa).get(0); } for (final Card tgtC : tgtCards) { @@ -510,7 +502,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { // gameCard is LKI in that case, the card is not in game anymore // or the timestamp did change // this should check Self too - if (gameCard == null || !tgtC.equalsWithTimestamp(gameCard)) { + if (gameCard == null || !tgtC.equalsWithTimestamp(gameCard) || gameCard.isPhasedOut()) { continue; } if (sa.usesTargeting() && !gameCard.canBeTargetedBy(sa)) { @@ -636,8 +628,7 @@ public class ChangeZoneEffect extends SpellAbilityEffect { hostCard.removeRemembered(gameCard); } - // Auras without Candidates stay in their current - // location + // Auras without Candidates stay in their current location if (gameCard.isAura()) { final SpellAbility saAura = gameCard.getFirstAttachSpell(); if (saAura != null) { @@ -679,12 +670,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect { game.getCombat().getBandOfAttacker(movedCard).setBlocked(false); combatChanged = true; } - if (sa.hasParam("Tapped") || sa.hasParam("Ninjutsu")) { - movedCard.setTapped(true); - } - if (sa.hasParam("Untapped")) { - movedCard.setTapped(false); - } movedCard.setTimestamp(ts); } else { // might set before card is moved only for nontoken @@ -812,12 +797,11 @@ public class ChangeZoneEffect extends SpellAbilityEffect { triggerList.triggerChangesZoneAll(game, sa); counterTable.triggerCountersPutAll(game); - if (sa.hasParam("AtEOT") && !triggerList.isEmpty()) { registerDelayedTrigger(sa, sa.getParam("AtEOT"), triggerList.allCards()); } - if (sa.hasParam("UntilHostLeavesPlay")) { - hostCard.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, hostCard)); + if ("UntilHostLeavesPlay".equals(sa.getParam("Duration"))) { + addUntilCommand(sa, untilHostLeavesPlayCommand(triggerList, hostCard)); } // for things like Gaea's Blessing @@ -1292,11 +1276,6 @@ public class ChangeZoneEffect extends SpellAbilityEffect { setFaceDownState(c, sa); } movedCard = game.getAction().moveToPlay(c, c.getController(), sa, moveParams); - if (sa.hasParam("Tapped")) { - movedCard.setTapped(true); - } else if (sa.hasParam("Untapped")) { - c.setTapped(false); - } movedCard.setTimestamp(ts); } @@ -1402,8 +1381,8 @@ public class ChangeZoneEffect extends SpellAbilityEffect { } triggerList.triggerChangesZoneAll(game, sa); - if (sa.hasParam("UntilHostLeavesPlay")) { - source.addLeavesPlayCommand(untilHostLeavesPlayCommand(triggerList, source)); + if ("UntilHostLeavesPlay".equals(sa.getParam("Duration"))) { + addUntilCommand(sa, untilHostLeavesPlayCommand(triggerList, source)); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java index 53f1b4f61d3..2ab519612f0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChoosePlayerEffect.java @@ -35,7 +35,7 @@ public class ChoosePlayerEffect extends SpellAbilityEffect { final TargetRestrictions tgt = sa.getTargetRestrictions(); final FCollectionView choices = sa.hasParam("Choices") ? AbilityUtils.getDefinedPlayers( - sa.getHostCard(), sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayersInTurnOrder(); + card, sa.getParam("Choices"), sa) : sa.getActivatingPlayer().getGame().getPlayersInTurnOrder(); final String choiceDesc = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChoosePlayer"); final boolean random = sa.hasParam("Random"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java index 2f7ceac1850..c066116aea1 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseSourceEffect.java @@ -5,11 +5,11 @@ import java.util.List; import org.apache.commons.lang3.StringUtils; import forge.game.Game; +import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -84,7 +84,6 @@ public class ChooseSourceEffect extends SpellAbilityEffect { if (sa.hasParam("Choices")) { permanentSources = CardLists.getValidCards(permanentSources, sa.getParam("Choices"), host.getController(), host, sa); - stackSources = CardLists.getValidCards(stackSources, sa.getParam("Choices"), host.getController(), host, sa); referencedSources = CardLists.getValidCards(referencedSources, sa.getParam("Choices"), host.getController(), host, sa); commandZoneSources = CardLists.getValidCards(commandZoneSources, sa.getParam("Choices"), host.getController(), host, sa); @@ -127,7 +126,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { } final String numericAmount = sa.getParamOrDefault("Amount", "1"); - final int validAmount = StringUtils.isNumeric(numericAmount) ? Integer.parseInt(numericAmount) : CardFactoryUtil.xCount(host, host.getSVar(numericAmount)); + final int validAmount = StringUtils.isNumeric(numericAmount) ? Integer.parseInt(numericAmount) : AbilityUtils.calculateAmount(host, numericAmount, sa); for (final Player p : tgtPlayers) { final CardCollection chosen = new CardCollection(); @@ -137,7 +136,7 @@ public class ChooseSourceEffect extends SpellAbilityEffect { Card o = null; do { o = p.getController().chooseSingleEntityForEffect(sourcesToChooseFrom, sa, choiceTitle, null); - } while (o == null); + } while (o == null || o.getName().startsWith("--")); chosen.add(o); sourcesToChooseFrom.remove(o); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java index dd745912379..460a5af7b32 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ClashEffect.java @@ -51,10 +51,11 @@ public class ClashEffect extends SpellAbilityEffect { final Map runParams = AbilityKey.newMap(); runParams.put(AbilityKey.Player, player); runParams.put(AbilityKey.Won, player.equals(winner) ? "True" : "False"); - sa.getHostCard().getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); - runParams.put(AbilityKey.Player, opponent); - runParams.put(AbilityKey.Won, opponent.equals(winner) ? "True" : "False"); - sa.getHostCard().getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); + source.getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams, false); + final Map runParams2 = AbilityKey.newMap(); + runParams2.put(AbilityKey.Player, opponent); + runParams2.put(AbilityKey.Won, opponent.equals(winner) ? "True" : "False"); + source.getGame().getTriggerHandler().runTrigger(TriggerType.Clashed, runParams2, false); } /** diff --git a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java index 194c66cfeb6..5d4ff084e57 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CloneEffect.java @@ -3,7 +3,6 @@ package forge.game.ability.effects; import java.util.Arrays; import java.util.List; -import com.google.common.base.Predicates; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -143,6 +142,12 @@ public class CloneEffect extends SpellAbilityEffect { tgtCard.updateStateForView(); + // when clone is itself, cleanup from old abilities + if (host.equals(tgtCard)) { + tgtCard.clearImprintedCards(); + tgtCard.clearRemembered(); + } + // check if clone is now an Aura that needs to be attached if (tgtCard.isAura() && !tgtCard.isInZone(ZoneType.Battlefield)) { AttachEffect.attachAuraOnIndirectEnterBattlefield(tgtCard); @@ -150,7 +155,7 @@ public class CloneEffect extends SpellAbilityEffect { if (sa.hasParam("Duration")) { final Card cloneCard = tgtCard; - // if clone is temporary, target needs old values back after + // if clone is temporary, target needs old values back after (keep Death-Mask Duplicant working) final Iterable clonedImprinted = new CardCollection(tgtCard.getImprintedCards()); final Iterable clonedRemembered = new FCollection<>(tgtCard.getRemembered()); @@ -164,31 +169,19 @@ public class CloneEffect extends SpellAbilityEffect { cloneCard.clearImprintedCards(); cloneCard.clearRemembered(); // restore original Remembered and Imprinted, ignore cards from players who lost - cloneCard.addImprintedCards(Iterables.filter(clonedImprinted, Predicates.not(CardPredicates.inZone(ZoneType.None)))); + cloneCard.addImprintedCards(Iterables.filter(clonedImprinted, CardPredicates.ownerLives())); cloneCard.addRemembered(Iterables.filter(clonedRemembered, Player.class)); - cloneCard.addRemembered(Iterables.filter(Iterables.filter(clonedRemembered, Card.class), CardPredicates.ownerLives())); + cloneCard.addRemembered(Iterables.filter(Iterables.filter(clonedRemembered, Card.class), CardPredicates.ownerLives())); cloneCard.updateStateForView(); game.fireEvent(new GameEventCardStatsChanged(cloneCard)); } } }; - final String duration = sa.getParam("Duration"); - if (duration.equals("UntilEndOfTurn")) { - game.getEndOfTurn().addUntil(unclone); - } - else if (duration.equals("UntilYourNextTurn")) { - game.getCleanup().addUntil(host.getController(), unclone); - } - else if (duration.equals("UntilUnattached")) { - sa.getHostCard().addUnattachCommand(unclone); - } - else if (duration.equals("UntilFacedown")) { - sa.getHostCard().addFacedownCommand(unclone); - } + addUntilCommand(sa, unclone); } - //Clear Remembered and Imprint lists + // now we can also cleanup in case target was another card tgtCard.clearRemembered(); tgtCard.clearImprintedCards(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java index 0a155df9bf1..05c4098b789 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlExchangeEffect.java @@ -99,8 +99,8 @@ public class ControlExchangeEffect extends SpellAbilityEffect { object2.setController(player1, tStamp); object1.setController(player2, tStamp); if (sa.hasParam("RememberExchanged")) { - sa.getHostCard().addRemembered(object1); - sa.getHostCard().addRemembered(object2); + host.addRemembered(object1); + host.addRemembered(object2); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java index ff69ba7784f..691b149d6d6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ControlGainEffect.java @@ -24,7 +24,7 @@ public class ControlGainEffect extends SpellAbilityEffect { protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final List newController = getTargetPlayers(sa, "NewController"); + final List newController = getDefinedPlayersOrTargeted(sa, "NewController"); if (newController.isEmpty()) { newController.add(sa.getActivatingPlayer()); } @@ -108,8 +108,8 @@ public class ControlGainEffect extends SpellAbilityEffect { continue; } - if (!tgtC.equals(sa.getHostCard()) && !sa.getHostCard().getGainControlTargets().contains(tgtC)) { - sa.getHostCard().addGainControlTarget(tgtC); + if (!tgtC.equals(source) && !source.getGainControlTargets().contains(tgtC)) { + source.addGainControlTarget(tgtC); } long tStamp = game.getNextTimestamp(); @@ -139,24 +139,24 @@ public class ControlGainEffect extends SpellAbilityEffect { game.fireEvent(new GameEventCardStatsChanged(tgtC)); } - if (remember && !sa.getHostCard().isRemembered(tgtC)) { - sa.getHostCard().addRemembered(tgtC); + if (remember && !source.isRemembered(tgtC)) { + source.addRemembered(tgtC); } - if (forget && sa.getHostCard().isRemembered(tgtC)) { - sa.getHostCard().removeRemembered(tgtC); + if (forget && source.isRemembered(tgtC)) { + source.removeRemembered(tgtC); } if (lose != null) { final GameCommand loseControl = getLoseControlCommand(tgtC, tStamp, bTapOnLose, source); - if (lose.contains("LeavesPlay") && sa.getHostCard() != tgtC) { // Only return control if host and target are different cards - sa.getHostCard().addLeavesPlayCommand(loseControl); + if (lose.contains("LeavesPlay") && source != tgtC) { // Only return control if host and target are different cards + source.addLeavesPlayCommand(loseControl); } if (lose.contains("Untap")) { - sa.getHostCard().addUntapCommand(loseControl); + source.addUntapCommand(loseControl); } if (lose.contains("LoseControl")) { - sa.getHostCard().addChangeControllerCommand(loseControl); + source.addChangeControllerCommand(loseControl); } if (lose.contains("EOT")) { game.getEndOfTurn().addUntil(loseControl); @@ -169,7 +169,7 @@ public class ControlGainEffect extends SpellAbilityEffect { if (lose.contains("StaticCommandCheck")) { String leftVar = sa.getSVar(sa.getParam("StaticCommandCheckSVar")); String rightVar = sa.getParam("StaticCommandSVarCompare"); - sa.getHostCard().addStaticCommandList(new Object[]{leftVar, rightVar, tgtC, loseControl}); + source.addStaticCommandList(new Object[]{leftVar, rightVar, tgtC, loseControl}); } if (lose.contains("UntilTheEndOfYourNextTurn")) { if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 73aa44a4cf0..ea4cf2586e5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -3,6 +3,7 @@ package forge.game.ability.effects; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -21,6 +22,7 @@ import forge.game.player.Player; import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; +import forge.util.Aggregates; import forge.util.CardTranslation; import forge.util.Localizer; @@ -162,6 +164,19 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { if (sa.hasParam("MayChooseTarget")) { copy.setMayChooseNewTargets(true); } + if (sa.hasParam("RandomTarget")){ + List candidates = copy.getTargetRestrictions().getAllCandidates(chosenSA, true); + if (sa.hasParam("RandomTargetRestriction")) { + candidates.removeIf(new Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); + } + GameEntity choice = Aggregates.random(candidates); + resetFirstTargetOnCopy(copy, choice, chosenSA); + } // extra case for Epic to remove the keyword and the last part of the SpellAbility if (sa.hasParam("Epic")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java index fa35617f424..fe8fd590385 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java @@ -41,7 +41,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Player activator = sa.getActivatingPlayer(); final String type = sa.getParam("CounterType"); - final int counterAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("CounterNum"), sa); + final int counterAmount = AbilityUtils.calculateAmount(host, sa.getParam("CounterNum"), sa); final String valid = sa.getParam("ValidCards"); final ZoneType zone = sa.hasParam("ValidZone") ? ZoneType.smartValueOf(sa.getParam("ValidZone")) : ZoneType.Battlefield; final boolean etbcounter = sa.hasParam("ETB"); @@ -52,7 +52,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect { } CardCollectionView cards = game.getCardsIn(zone); - cards = CardLists.getValidCards(cards, valid, host.getController(), sa.getHostCard(), sa); + cards = CardLists.getValidCards(cards, valid, host.getController(), host, sa); if (sa.usesTargeting()) { final Player pl = sa.getTargets().getFirstTargetedPlayer(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 0a4ac612f04..f5b35b965d9 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -155,16 +155,16 @@ public class CountersPutEffect extends SpellAbilityEffect { } Player chooser = activator; if (sa.hasParam("Chooser")) { - List choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa); + List choosers = AbilityUtils.getDefinedPlayers(card, sa.getParam("Chooser"), sa); if (choosers.isEmpty()) { return; } chooser = choosers.get(0); } - int n = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParamOrDefault("ChoiceAmount", + int n = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("ChoiceAmount", "1"), sa); - int m = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParamOrDefault("MinChoiceAmount", + int m = AbilityUtils.calculateAmount(card, sa.getParamOrDefault("MinChoiceAmount", sa.getParamOrDefault("ChoiceAmount", "1")), sa); // no choices allowed @@ -405,10 +405,10 @@ public class CountersPutEffect extends SpellAbilityEffect { Player placer = activator; if (sa.hasParam("Placer")) { final String pstr = sa.getParam("Placer"); - placer = AbilityUtils.getDefinedPlayers(sa.getHostCard(), pstr, sa).get(0); + placer = AbilityUtils.getDefinedPlayers(card, pstr, sa).get(0); } - int counterAmount = AbilityUtils.calculateAmount(sa.getHostCard(), amount, sa); + int counterAmount = AbilityUtils.calculateAmount(card, amount, sa); GameEntityCounterTable table = new GameEntityCounterTable(); @@ -422,7 +422,7 @@ public class CountersPutEffect extends SpellAbilityEffect { List keywords = Arrays.asList(sa.getParam("SharedKeywords").split(" & ")); List zones = ZoneType.listValueOf(sa.getParam("SharedKeywordsZone")); String[] restrictions = sa.hasParam("SharedRestrictions") ? sa.getParam("SharedRestrictions").split(",") : new String[]{"Card"}; - keywords = CardFactoryUtil.sharedKeywords(keywords, restrictions, zones, sa.getHostCard()); + keywords = CardFactoryUtil.sharedKeywords(keywords, restrictions, zones, card); for (String k : keywords) { resolvePerType(sa, placer, CounterType.getType(k), counterAmount, table); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java index 2557a6ff31b..239d59f47d7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersRemoveEffect.java @@ -82,7 +82,7 @@ public class CountersRemoveEffect extends SpellAbilityEffect { int cntToRemove = 0; if (!num.equals("All") && !num.equals("Any")) { - cntToRemove = AbilityUtils.calculateAmount(sa.getHostCard(), num, sa); + cntToRemove = AbilityUtils.calculateAmount(card, num, sa); } if (sa.hasParam("Optional")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java index feab590d460..9d2cb2c41e4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageAllEffect.java @@ -52,14 +52,14 @@ public class DamageAllEffect extends DamageBaseEffect { */ @Override public void resolve(SpellAbility sa) { - final List definedSources = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DamageSource"), sa); + final Card source = sa.getHostCard(); + final List definedSources = AbilityUtils.getDefinedCards(source, sa.getParam("DamageSource"), sa); final Card card = definedSources.get(0); final Card sourceLKI = card.getGame().getChangeZoneLKIInfo(card); - final Card source = sa.getHostCard(); final Game game = sa.getActivatingPlayer().getGame(); final String damage = sa.getParam("NumDmg"); - final int dmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); + final int dmg = AbilityUtils.calculateAmount(source, damage, sa); final boolean rememberCard = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedCreature"); final boolean rememberPlayer = sa.hasParam("RememberDamaged") || sa.hasParam("RememberDamagedPlayer"); @@ -89,26 +89,31 @@ public class DamageAllEffect extends DamageBaseEffect { boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); - GameEntityCounterTable counterTable = new GameEntityCounterTable(); + GameEntityCounterTable counterTable = sa.getCounterTable(); if (damageMap == null) { // make a new damage map damageMap = new CardDamageMap(); preventMap = new CardDamageMap(); + counterTable = new GameEntityCounterTable(); usedDamageMap = false; } for (final Card c : list) { - c.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, c, dmg); } if (!players.equals("")) { final List playerList = AbilityUtils.getDefinedPlayers(card, players, sa); for (final Player p : playerList) { - p.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, p, dmg); } } + if (!usedDamageMap) { + game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); + } + // do Remember there if (rememberCard || rememberPlayer) { for (GameEntity e : damageMap.row(sourceLKI).keySet()) { @@ -120,16 +125,6 @@ public class DamageAllEffect extends DamageBaseEffect { } } - if (!usedDamageMap) { - preventMap.triggerPreventDamage(false); - damageMap.triggerDamageDoneOnce(false, game, sa); - - preventMap.clear(); - damageMap.clear(); - } - - counterTable.triggerCountersPutAll(game); - replaceDying(sa); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java index b8a4a379273..8485f02f2d7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageDealEffect.java @@ -145,7 +145,6 @@ public class DamageDealEffect extends DamageBaseEffect { final String damage = sa.getParam("NumDmg"); int dmg = AbilityUtils.calculateAmount(hostCard, damage, sa); - final boolean noPrevention = sa.hasParam("NoPrevention"); final boolean removeDamage = sa.hasParam("Remove"); final boolean divideOnResolution = sa.hasParam("DividerOnResolution"); @@ -172,17 +171,19 @@ public class DamageDealEffect extends DamageBaseEffect { boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); - GameEntityCounterTable counterTable = new GameEntityCounterTable(); + GameEntityCounterTable counterTable = sa.getCounterTable(); if (damageMap == null) { // make a new damage map damageMap = new CardDamageMap(); preventMap = new CardDamageMap(); + counterTable = new GameEntityCounterTable(); usedDamageMap = false; } if (sa.hasParam("DamageMap")) { sa.setDamageMap(damageMap); sa.setPreventMap(preventMap); + sa.setCounterTable(counterTable); usedDamageMap = true; } @@ -208,19 +209,12 @@ public class DamageDealEffect extends DamageBaseEffect { Player assigningPlayer = players.get(0); Map map = assigningPlayer.getController().assignCombatDamage(sourceLKI, assigneeCards, dmg, null, true); for (Entry dt : map.entrySet()) { - dt.getKey().addDamage(dt.getValue(), sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, dt.getKey(), dt.getValue()); } if (!usedDamageMap) { - preventMap.triggerPreventDamage(false); - // non combat damage cause lifegain there - damageMap.triggerDamageDoneOnce(false, game, sa); - - preventMap.clear(); - damageMap.clear(); + game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } - - counterTable.triggerCountersPutAll(game); replaceDying(sa); return; } @@ -244,18 +238,18 @@ public class DamageDealEffect extends DamageBaseEffect { continue; } if (!sa.usesTargeting() || gc.canBeTargetedBy(sa)) { - internalDamageDeal(sa, sourceLKI, gc, dmg, damageMap, preventMap, counterTable); + internalDamageDeal(sa, sourceLKI, gc, dmg, damageMap); } } else if (o instanceof Player) { final Player p = (Player) o; if (!sa.usesTargeting() || p.canBeTargetedBy(sa)) { - p.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, p, dmg); } } } for (final Card unTgtC : untargetedCards) { if (unTgtC.isInPlay()) { - internalDamageDeal(sa, sourceLKI, unTgtC, dmg, damageMap, preventMap, counterTable); + internalDamageDeal(sa, sourceLKI, unTgtC, dmg, damageMap); } } @@ -264,21 +258,14 @@ public class DamageDealEffect extends DamageBaseEffect { } } if (!usedDamageMap) { - preventMap.triggerPreventDamage(false); - // non combat damage cause lifegain there - damageMap.triggerDamageDoneOnce(false, game, sa); - - preventMap.clear(); - damageMap.clear(); + game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } - counterTable.triggerCountersPutAll(game); replaceDying(sa); } - protected void internalDamageDeal(SpellAbility sa, Card sourceLKI, Card c, int dmg, CardDamageMap damageMap, CardDamageMap preventMap, GameEntityCounterTable counterTable) { + protected void internalDamageDeal(SpellAbility sa, Card sourceLKI, Card c, int dmg, CardDamageMap damageMap) { final Card hostCard = sa.getHostCard(); final Player activationPlayer = sa.getActivatingPlayer(); - final boolean noPrevention = sa.hasParam("NoPrevention"); if (sa.hasParam("Remove")) { c.setDamage(0); @@ -293,17 +280,17 @@ public class DamageDealEffect extends DamageBaseEffect { } int dmgToTarget = Math.min(lethal, dmg); - c.addDamage(dmgToTarget, sourceLKI, false, noPrevention, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, c, dmgToTarget); List list = Lists.newArrayList(); list.addAll(AbilityUtils.getDefinedCards(hostCard, sa.getParam("ExcessDamage"), sa)); list.addAll(AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("ExcessDamage"), sa)); if (!list.isEmpty()) { - list.get(0).addDamage(dmg - dmgToTarget, sourceLKI, false, noPrevention, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, list.get(0), dmg - dmgToTarget); } } else { - c.addDamage(dmg, sourceLKI, false, noPrevention, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, c, dmg); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java index 4dd49bb9c1b..1871bea5b8e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageEachEffect.java @@ -8,7 +8,6 @@ import forge.game.GameObject; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardDamageMap; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -76,12 +75,13 @@ public class DamageEachEffect extends DamageBaseEffect { boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); - GameEntityCounterTable counterTable = new GameEntityCounterTable(); + GameEntityCounterTable counterTable = sa.getCounterTable(); if (damageMap == null) { // make a new damage map damageMap = new CardDamageMap(); preventMap = new CardDamageMap(); + counterTable = new GameEntityCounterTable(); usedDamageMap = false; } @@ -90,19 +90,19 @@ public class DamageEachEffect extends DamageBaseEffect { final Card sourceLKI = game.getChangeZoneLKIInfo(source); // TODO shouldn't that be using Num or something first? - final int dmg = CardFactoryUtil.xCount(source, sa.getSVar("X")); + final int dmg = AbilityUtils.calculateAmount(source, "X", sa); // System.out.println(source+" deals "+dmg+" damage to "+o.toString()); if (o instanceof Card) { final Card c = (Card) o; if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { - c.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, c, dmg); } } else if (o instanceof Player) { final Player p = (Player) o; if (!targeted || p.canBeTargetedBy(sa)) { - p.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, p, dmg); } } } @@ -113,21 +113,19 @@ public class DamageEachEffect extends DamageBaseEffect { for (final Card source : sources) { final Card sourceLKI = game.getChangeZoneLKIInfo(source); - final int dmg = CardFactoryUtil.xCount(source, card.getSVar("X")); - // System.out.println(source+" deals "+dmg+" damage to "+source); - source.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + final int dmg = AbilityUtils.calculateAmount(source, "X", sa); + damageMap.put(sourceLKI, source, dmg); } } if (sa.getParam("DefinedCards").equals("Remembered")) { for (final Card source : sources) { - final int dmg = CardFactoryUtil.xCount(source, card.getSVar("X")); + final int dmg = AbilityUtils.calculateAmount(source, "X", sa); final Card sourceLKI = source.getGame().getChangeZoneLKIInfo(source); for (final Object o : sa.getHostCard().getRemembered()) { if (o instanceof Card) { Card rememberedcard = (Card) o; - // System.out.println(source + " deals " + dmg + " damage to " + rememberedcard); - rememberedcard.addDamage(dmg, sourceLKI, damageMap, preventMap, counterTable, sa); + damageMap.put(sourceLKI, rememberedcard, dmg); } } } @@ -135,15 +133,9 @@ public class DamageEachEffect extends DamageBaseEffect { } if (!usedDamageMap) { - preventMap.triggerPreventDamage(false); - damageMap.triggerDamageDoneOnce(false, game, sa); - - preventMap.clear(); - damageMap.clear(); + game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } - counterTable.triggerCountersPutAll(game); - replaceDying(sa); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java index e7bb3ae0fc4..91e904ac804 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventAllEffect.java @@ -2,19 +2,18 @@ package forge.game.ability.effects; import forge.game.Game; import forge.game.ability.AbilityUtils; -import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -public class DamagePreventAllEffect extends SpellAbilityEffect { +public class DamagePreventAllEffect extends DamagePreventEffectBase { @Override public void resolve(SpellAbility sa) { final Card source = sa.getHostCard(); final Game game = sa.getActivatingPlayer().getGame(); - final int numDam = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa); + final int numDam = AbilityUtils.calculateAmount(source, sa.getParam("Amount"), sa); String players = ""; @@ -26,14 +25,14 @@ public class DamagePreventAllEffect extends SpellAbilityEffect { CardCollectionView list = game.getCardsIn(ZoneType.Battlefield); list = AbilityUtils.filterListByType(list, sa.getParam("ValidCards"), sa); for (final Card c : list) { - c.addPreventNextDamage(numDam); + addPreventNextDamage(sa, c, numDam); } } if (!players.equals("")) { for (final Player p : game.getPlayers()) { if (p.isValid(players, source.getController(), source, sa)) { - p.addPreventNextDamage(numDam); + addPreventNextDamage(sa, p, numDam); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java index 54e0395a34e..173d1318758 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffect.java @@ -1,20 +1,16 @@ package forge.game.ability.effects; -import java.util.ArrayList; import java.util.List; -import java.util.Map; -import java.util.TreeMap; import forge.game.GameObject; import forge.game.ability.AbilityUtils; -import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardUtil; import forge.game.player.Player; import forge.game.spellability.SpellAbility; -public class DamagePreventEffect extends SpellAbilityEffect { +public class DamagePreventEffect extends DamagePreventEffectBase { @Override protected String getStackDescription(SpellAbility sa) { @@ -73,69 +69,25 @@ public class DamagePreventEffect extends SpellAbilityEffect { final CardCollection untargetedCards = CardUtil.getRadiance(sa); final boolean targeted = (sa.usesTargeting()); - final boolean preventionWithEffect = sa.hasParam("PreventionSubAbility"); for (final GameObject o : tgts) { numDam = (sa.usesTargeting() && sa.isDividedAsYouChoose()) ? sa.getDividedValue(o) : numDam; if (o instanceof Card) { final Card c = (Card) o; if (c.isInPlay() && (!targeted || c.canBeTargetedBy(sa))) { - if (preventionWithEffect) { - Map effectMap = new TreeMap<>(); - effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); - effectMap.put("ShieldAmount", String.valueOf(numDam)); - if (sa.hasParam("ShieldEffectTarget")) { - String effTgtString = ""; - List effTgts = new ArrayList<>(); - effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); - for (final Object effTgt : effTgts) { - if (effTgt instanceof Card) { - effTgtString = String.valueOf(((Card) effTgt).getId()); - effectMap.put("ShieldEffectTarget", "CardUID_" + effTgtString); - } else if (effTgt instanceof Player) { - effTgtString = ((Player) effTgt).getName(); - effectMap.put("ShieldEffectTarget", "PlayerNamed_" + effTgtString); - } - } - } - c.addPreventNextDamageWithEffect(host, effectMap); - } else { - c.addPreventNextDamage(numDam); - } + addPreventNextDamage(sa, o, numDam); } - } else if (o instanceof Player) { final Player p = (Player) o; if (!targeted || p.canBeTargetedBy(sa)) { - if (preventionWithEffect) { - Map effectMap = new TreeMap<>(); - effectMap.put("EffectString", sa.getSVar(sa.getParam("PreventionSubAbility"))); - effectMap.put("ShieldAmount", String.valueOf(numDam)); - if (sa.hasParam("ShieldEffectTarget")) { - String effTgtString = ""; - List effTgts = new ArrayList<>(); - effTgts = AbilityUtils.getDefinedObjects(host, sa.getParam("ShieldEffectTarget"), sa); - for (final Object effTgt : effTgts) { - if (effTgt instanceof Card) { - effTgtString = String.valueOf(((Card) effTgt).getId()); - effectMap.put("ShieldEffectTarget", "CardUID_" + effTgtString); - } else if (effTgt instanceof Player) { - effTgtString = ((Player) effTgt).getName(); - effectMap.put("ShieldEffectTarget", "PlayerNamed_" + effTgtString); - } - } - } - p.addPreventNextDamageWithEffect(host, effectMap); - } else { - p.addPreventNextDamage(numDam); - } + addPreventNextDamage(sa, o, numDam); } } } for (final Card c : untargetedCards) { if (c.isInPlay()) { - c.addPreventNextDamage(numDam); + addPreventNextDamage(sa, c, numDam); } } } // preventDamageResolve diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffectBase.java new file mode 100644 index 00000000000..16ea826b9bf --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/DamagePreventEffectBase.java @@ -0,0 +1,79 @@ +package forge.game.ability.effects; + +import java.util.List; + +import forge.GameCommand; +import forge.game.Game; +import forge.game.GameObject; +import forge.game.ability.AbilityFactory; +import forge.game.ability.AbilityUtils; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.player.Player; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; +import forge.game.spellability.AbilitySub; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; +import forge.util.TextUtil; + +public abstract class DamagePreventEffectBase extends SpellAbilityEffect { + public static void addPreventNextDamage(SpellAbility sa, GameObject o, int numDam) { + final Card hostCard = sa.getHostCard(); + final Game game = hostCard.getGame(); + final Player player = hostCard.getController(); + final String name = hostCard.getName() + "'s Effect"; + final String image = hostCard.getImageKey(); + StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | ValidTarget$ "); + sb.append((o instanceof Card ? "Card.IsRemembered" : "Player.IsRemembered")); + sb.append(" | PreventionEffect$ NextN | Description$ Prevent the next ").append(numDam).append(" damage."); + String effect = "DB$ ReplaceDamage | Amount$ ShieldAmount"; + + final Card eff = createEffect(sa, player, name, image); + eff.setSVar("ShieldAmount", "Number$" + numDam); + eff.setSVar("PreventedDamage", "Number$0"); + eff.addRemembered(o); + + SpellAbility replaceDamage = AbilityFactory.getAbility(effect, eff); + if (sa.hasParam("PreventionSubAbility")) { + String subAbString = sa.getSVar(sa.getParam("PreventionSubAbility")); + if (sa.hasParam("ShieldEffectTarget")) { + List effTgts = AbilityUtils.getDefinedObjects(hostCard, sa.getParam("ShieldEffectTarget"), sa); + String effTgtString = ""; + for (final GameObject effTgt : effTgts) { + if (effTgt instanceof Card) { + effTgtString = "CardUID_" + String.valueOf(((Card) effTgt).getId()); + } else if (effTgt instanceof Player) { + effTgtString = "PlayerNamed_" + ((Player) effTgt).getName(); + } + } + subAbString = TextUtil.fastReplace(subAbString, "ShieldEffectTarget", effTgtString); + } + AbilitySub subSA = (AbilitySub) AbilityFactory.getAbility(subAbString, eff); + replaceDamage.setSubAbility(subSA); + // Add SpellDescription of PreventionSubAbility to effect description + sb.append(" ").append(subSA.getParam("SpellDescription")); + } + + String repeffstr = sb.toString(); + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); + re.setOverridingAbility(replaceDamage); + eff.addReplacementEffect(re); + if (o instanceof Card) { + addForgetOnMovedTrigger(eff, "Battlefield"); + } + eff.updateStateForView(); + + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff, sa); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + + game.getEndOfTurn().addUntil(new GameCommand() { + @Override + public void run() { + game.getAction().exile(eff, null); + } + }); + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java index a9d7c35a677..4ecb1cbd2a4 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DamageResolveEffect.java @@ -1,5 +1,6 @@ package forge.game.ability.effects; +import forge.game.GameEntityCounterTable; import forge.game.ability.SpellAbilityEffect; import forge.game.card.CardDamageMap; import forge.game.spellability.SpellAbility; @@ -18,16 +19,9 @@ public class DamageResolveEffect extends SpellAbilityEffect { public void resolve(SpellAbility sa) { CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); - - if (preventMap != null) { - preventMap.triggerPreventDamage(false); - preventMap.clear(); - } - // non combat damage cause lifegain there - if (damageMap != null) { - damageMap.triggerDamageDoneOnce(false, sa.getHostCard().getGame(), sa); - damageMap.clear(); - } + GameEntityCounterTable counterTable = sa.getCounterTable(); + + sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } /* (non-Javadoc) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java index 1c200511f52..7bd5f8854da 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DebuffEffect.java @@ -49,7 +49,7 @@ public class DebuffEffect extends SpellAbilityEffect { * sb.append(" "); } */ sb.append(kws); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { sb.append(" until end of turn"); } sb.append("."); @@ -139,7 +139,7 @@ public class DebuffEffect extends SpellAbilityEffect { removedKW.addAll(kws); tgtC.addChangedCardKeywords(addedKW, removedKW, false, false, timestamp); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { final GameCommand until = new GameCommand() { private static final long serialVersionUID = 5387486776282932314L; @@ -154,14 +154,4 @@ public class DebuffEffect extends SpellAbilityEffect { } // debuffResolve - private static void addUntilCommand(final SpellAbility sa, GameCommand until) { - final Card host = sa.getHostCard(); - final Game game = host.getGame(); - if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(sa.getActivatingPlayer(), until); - } else { - game.getEndOfTurn().addUntil(until); - } - } - } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 6aa5b66de65..467fd6d72af 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -87,6 +87,20 @@ public class DigEffect extends SpellAbilityEffect { final boolean mayBeSkipped = sa.hasParam("PromptToSkipOptionalAbility"); final String optionalAbilityPrompt = sa.hasParam("OptionalAbilityPrompt") ? sa.getParam("OptionalAbilityPrompt") : ""; + boolean remZone1 = false; + boolean remZone2 = false; + if (sa.hasParam("RememberChanged")) { + remZone1 = true; + } + if (sa.hasParam("RememberMovedToZone")) { + if (sa.getParam("RememberMovedToZone").contains("1")) { + remZone1 = true; + } + if (sa.getParam("RememberMovedToZone").contains("2")) { + remZone2 = true; + } + } + boolean changeAll = false; boolean allButOne = false; @@ -124,8 +138,8 @@ public class DigEffect extends SpellAbilityEffect { if (!top.isEmpty()) { DelayedReveal delayedReveal = null; boolean hasRevealed = true; - if (sa.hasParam("Reveal")) { - game.getAction().reveal(top, p, false); + if (sa.hasParam("Reveal") && "True".equalsIgnoreCase(sa.getParam("Reveal"))) { + game.getAction().reveal(top, p, false); } else if (sa.hasParam("RevealOptional")) { String question = TextUtil.concatWithSpace(Localizer.getInstance().getMessage("lblReveal") + ":", TextUtil.addSuffix(Lang.joinHomogenous(top),"?")); @@ -170,7 +184,7 @@ public class DigEffect extends SpellAbilityEffect { } } if (sa.hasParam("Choser")) { - final FCollectionView choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Choser"), sa); + final FCollectionView choosers = AbilityUtils.getDefinedPlayers(host, sa.getParam("Choser"), sa); if (!choosers.isEmpty()) { chooser = player.getController().chooseSingleEntityForEffect(choosers, null, sa, Localizer.getInstance().getMessage("lblChooser") + ":", false, p, null); } @@ -207,8 +221,8 @@ public class DigEffect extends SpellAbilityEffect { // Optional abilities that use a dialog box to prompt the user to skip the ability (e.g. Explorer's Scope, Quest for Ula's Temple) if (optional && mayBeSkipped && !valid.isEmpty()) { - String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + sa.getHostCard() + "?\n\n(" + sa.getDescription() + ")"; - if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(sa.getHostCard().getName())))) { + String prompt = !optionalAbilityPrompt.isEmpty() ? optionalAbilityPrompt : Localizer.getInstance().getMessage("lblWouldYouLikeProceedWithOptionalAbility") + " " + host + "?\n\n(" + sa.getDescription() + ")"; + if (!p.getController().confirmAction(sa, null, TextUtil.fastReplace(prompt, "CARDNAME", CardTranslation.getTranslatedName(host.getName())))) { return; } } @@ -341,7 +355,7 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("ForgetOtherRemembered")) { host.clearRemembered(); } - if (sa.hasParam("RememberChanged")) { + if (remZone1) { host.addRemembered(c); } rest.remove(c); @@ -376,6 +390,9 @@ public class DigEffect extends SpellAbilityEffect { if (m != null && !origin.equals(m.getZone().getZoneType())) { table.put(origin, m.getZone().getZoneType(), m); } + if (remZone2) { + host.addRemembered(m); + } } } else { @@ -395,6 +412,9 @@ public class DigEffect extends SpellAbilityEffect { } c.setExiledWith(effectHost); c.setExiledBy(effectHost.getController()); + if (remZone2) { + host.addRemembered(c); + } } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java index a06854fbe46..d59984d04e8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigMultipleEffect.java @@ -26,7 +26,6 @@ public class DigMultipleEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Player player = sa.getActivatingPlayer(); final Game game = player.getGame(); - Player chooser = player; int numToDig = AbilityUtils.calculateAmount(host, sa.getParam("DigNum"), sa); final ZoneType srcZone = sa.hasParam("SourceZone") ? ZoneType.smartValueOf(sa.getParam("SourceZone")) : ZoneType.Library; @@ -40,13 +39,13 @@ public class DigMultipleEffect extends SpellAbilityEffect { boolean chooseOptional = sa.hasParam("Optional"); CardZoneTable table = new CardZoneTable(); - for (final Player p : getTargetPlayers(sa)) { - if (sa.usesTargeting() && !p.canBeTargetedBy(sa)) { + for (final Player chooser : getDefinedPlayersOrTargeted(sa)) { + if (sa.usesTargeting() && !chooser.canBeTargetedBy(sa)) { continue; } final CardCollection top = new CardCollection(); final CardCollection rest = new CardCollection(); - final PlayerZone sourceZone = p.getZone(srcZone); + final PlayerZone sourceZone = chooser.getZone(srcZone); numToDig = Math.min(numToDig, sourceZone.size()); for (int i = 0; i < numToDig; i++) { @@ -60,10 +59,10 @@ public class DigMultipleEffect extends SpellAbilityEffect { rest.addAll(top); if (sa.hasParam("Reveal")) { - game.getAction().reveal(top, p, false); + game.getAction().reveal(top, chooser, false); } else { // reveal cards first - game.getAction().revealTo(top, player); + game.getAction().revealTo(top, chooser); } Map validMap = Maps.newHashMap(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java index 1df70724937..44a1097eb3e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/EffectEffect.java @@ -283,7 +283,7 @@ public class EffectEffect extends SpellAbilityEffect { else if (duration.equals("UntilHostLeavesPlay")) { hostCard.addLeavesPlayCommand(endEffect); } - else if (duration.equals("HostLeavesOrEOT")) { + else if (duration.equals("UntilHostLeavesPlayOrEOT")) { game.getEndOfTurn().addUntil(endEffect); hostCard.addLeavesPlayCommand(endEffect); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java index 6cda89e1cfb..0570993af24 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FightEffect.java @@ -146,12 +146,13 @@ public class FightEffect extends DamageBaseEffect { boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); CardDamageMap preventMap = sa.getPreventMap(); - GameEntityCounterTable counterTable = new GameEntityCounterTable(); + GameEntityCounterTable counterTable = sa.getCounterTable(); if (damageMap == null) { // make a new damage map damageMap = new CardDamageMap(); preventMap = new CardDamageMap(); + counterTable = new GameEntityCounterTable(); usedDamageMap = false; } @@ -163,22 +164,17 @@ public class FightEffect extends DamageBaseEffect { final int dmg1 = fightToughness ? fighterA.getNetToughness() : fighterA.getNetPower(); if (fighterA.equals(fighterB)) { - fighterA.addDamage(dmg1 * 2, fighterA, damageMap, preventMap, counterTable, sa); + damageMap.put(fighterA, fighterA, dmg1 * 2); } else { final int dmg2 = fightToughness ? fighterB.getNetToughness() : fighterB.getNetPower(); - fighterB.addDamage(dmg1, fighterA, damageMap, preventMap, counterTable, sa); - fighterA.addDamage(dmg2, fighterB, damageMap, preventMap, counterTable, sa); + damageMap.put(fighterA, fighterB, dmg1); + damageMap.put(fighterB, fighterA, dmg2); } if (!usedDamageMap) { - preventMap.triggerPreventDamage(false); - damageMap.triggerDamageDoneOnce(false, fighterA.getGame(), sa); - - preventMap.clear(); - damageMap.clear(); + sa.getHostCard().getGame().getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } - counterTable.triggerCountersPutAll(sa.getHostCard().getGame()); replaceDying(sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java index 1d37fc3c82b..ba450a6295f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FlipCoinEffect.java @@ -62,8 +62,12 @@ public class FlipCoinEffect extends SpellAbilityEffect { final boolean noCall = sa.hasParam("NoCall"); String varName = sa.hasParam("SaveNumFlipsToSVar") ? sa.getParam("SaveNumFlipsToSVar") : "X"; boolean victory = false; + int amount = 1; + if (sa.hasParam("Amount")) { + amount = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa); + } - if (!noCall) { + if ((!noCall) && (amount == 1)) { flipMultiplier = getFilpMultiplier(caller.get(0)); victory = flipCoinCall(caller.get(0), sa, flipMultiplier, varName); } @@ -77,11 +81,6 @@ public class FlipCoinEffect extends SpellAbilityEffect { int countHeads = 0; int countTails = 0; - int amount = 1; - if (sa.hasParam("Amount")) { - amount = AbilityUtils.calculateAmount(host, sa.getParam("Amount"), sa); - } - for(int i = 0; i < amount; ++i) { final boolean resultIsHeads = flipCoinNoCall(sa, flipper, flipMultiplier, varName); @@ -113,6 +112,43 @@ public class FlipCoinEffect extends SpellAbilityEffect { AbilityUtils.resolve(sub); } } + } else if (amount > 1){ + flipMultiplier = getFilpMultiplier(flipper); + + int countWins = 0; + int countLosses = 0; + + for(int i = 0; i < amount; ++i) { + final boolean win = flipCoinCall(caller.get(0), sa, flipMultiplier, varName); + + if (win) { + countWins++; + } else { + countLosses++; + } + } + if (countWins > 0) { + SpellAbility sub = sa.getAdditionalAbility("WinSubAbility"); + if (sub != null) { + sub.setSVar("Wins", "Number$" + countWins); + AbilityUtils.resolve(sub); + } + } + if (countLosses > 0) { + SpellAbility sub = sa.getAdditionalAbility("LoseSubAbility"); + if (sub != null) { + sub.setSVar("Losses", "Number$" + countLosses); + AbilityUtils.resolve(sub); + } + } + if (sa.hasParam("RememberNumber")) { + String toRemember = sa.getParam("RememberNumber"); + if (toRemember.startsWith("Win")) { + host.addRemembered(countWins); + } else if (toRemember.startsWith("Loss")) { + host.addRemembered(countLosses); + } + } } else { if (victory) { if (sa.getParam("RememberWinner") != null) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/FogEffect.java b/forge-game/src/main/java/forge/game/ability/effects/FogEffect.java index f6d0b775e5d..a9b47f5140b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/FogEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/FogEffect.java @@ -1,7 +1,14 @@ package forge.game.ability.effects; +import forge.GameCommand; +import forge.game.Game; import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; import forge.game.spellability.SpellAbility; +import forge.game.trigger.TriggerType; +import forge.game.zone.ZoneType; public class FogEffect extends SpellAbilityEffect { @@ -13,7 +20,28 @@ public class FogEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { - // Expand Fog keyword here depending on what we need out of it. - sa.getActivatingPlayer().getGame().getPhaseHandler().setPreventCombatDamageThisTurn(); + final Card hostCard = sa.getHostCard(); + final Game game = hostCard.getGame(); + final String name = hostCard.getName() + "'s Effect"; + final String image = hostCard.getImageKey(); + StringBuilder sb = new StringBuilder("Event$ DamageDone | ActiveZones$ Command | IsCombat$ True"); + sb.append(" | Prevent$ True | Description$ Prevent all combat damage this turn."); + String repeffstr = sb.toString(); + + final Card eff = createEffect(sa, hostCard.getController(), name, image); + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, eff, true); + eff.addReplacementEffect(re); + eff.updateStateForView(); + + game.getTriggerHandler().suppressMode(TriggerType.ChangesZone); + game.getAction().moveTo(ZoneType.Command, eff, sa); + game.getTriggerHandler().clearSuppression(TriggerType.ChangesZone); + + game.getEndOfTurn().addUntil(new GameCommand() { + @Override + public void run() { + game.getAction().exile(eff, null); + } + }); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java index af20f6a67dc..fa30bbe8fe8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ImmediateTriggerEffect.java @@ -9,6 +9,7 @@ import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.card.CardUtil; +import forge.game.replacement.ReplacementType; import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.trigger.Trigger; @@ -57,7 +58,9 @@ public class ImmediateTriggerEffect extends SpellAbilityEffect { Card lki = CardUtil.getLKICopy(gameCard); lki.clearControllers(); lki.setOwner(sa.getActivatingPlayer()); - final Trigger immediateTrig = TriggerHandler.parseTrigger(mapParams, lki, sa.isIntrinsic(), null); + // if this trigger is part of ETBReplacement it shouldn't run with LKI from incomplete zone change (Wall of Stolen Identity) + final Card trigHost = sa.getRootAbility().getReplacementEffect() != null && sa.getRootAbility().getReplacementEffect().getMode().equals(ReplacementType.Moved) ? gameCard : lki; + final Trigger immediateTrig = TriggerHandler.parseTrigger(mapParams, trigHost, sa.isIntrinsic(), null); immediateTrig.setSpawningAbility(sa.copy(lki, sa.getActivatingPlayer(), true)); // Need to copy paid costs diff --git a/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java new file mode 100644 index 00000000000..7da3ab8f3a6 --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/MakeCardEffect.java @@ -0,0 +1,38 @@ +package forge.game.ability.effects; + +import forge.StaticData; +import forge.game.Game; +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardCollection; +import forge.game.player.Player; +import forge.game.spellability.SpellAbility; +import forge.game.zone.ZoneType; + +public class MakeCardEffect extends SpellAbilityEffect { + @Override + public void resolve(SpellAbility sa) { + final Player player = sa.getActivatingPlayer(); + final Game game = player.getGame(); + + final String name = sa.hasParam("Name") ? sa.getParam("Name") : sa.getHostCard().getName(); + final ZoneType zone = ZoneType.smartValueOf(sa.getParamOrDefault("Zone", "Library")); + int amount = sa.hasParam("Amount") ? Integer.parseInt(sa.getParam("Amount")) : 1; + + CardCollection cards = new CardCollection(); + + while (amount > 0) { + Card card = Card.fromPaperCard(StaticData.instance().getCommonCards().getUniqueByName(name), player); + if (!sa.hasParam("NotToken")) { card.setTokenCard(true); } + cards.add(card); + amount--; + } + + for (final Card c : cards) { + game.getAction().moveTo(zone, c, sa); + } + if (zone.equals(ZoneType.Library)) { + player.shuffle(sa); + } + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java index e63f3f8d6a7..73f1edd0db6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaEffect.java @@ -23,19 +23,20 @@ import forge.game.spellability.AbilityManaPart; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Localizer; +import io.sentry.Sentry; +import io.sentry.event.BreadcrumbBuilder; public class ManaEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); - AbilityManaPart abMana = sa.getManaPart(); + final List tgtPlayers = getTargetPlayers(sa); // Spells are not undoable - sa.setUndoable(sa.isAbility() && sa.isUndoable()); + sa.setUndoable(sa.isAbility() && sa.isUndoable() && tgtPlayers.size() < 2); - final List tgtPlayers = getTargetPlayers(sa); final boolean optional = sa.hasParam("Optional"); final Game game = sa.getActivatingPlayer().getGame(); @@ -166,7 +167,8 @@ public class ManaEffect extends SpellAbilityEffect { abMana.setExpressChoice(sb.toString()); } else if (type.startsWith("EachColorAmong")) { final String res = type.split("_")[1]; - final CardCollection list = CardLists.getValidCards(card.getGame().getCardsIn(ZoneType.Battlefield), + final ZoneType zone = type.startsWith("EachColorAmong_") ? ZoneType.Battlefield : ZoneType.smartValueOf(type.split("_")[0].substring(14)); + final CardCollection list = CardLists.getValidCards(card.getGame().getCardsIn(zone), res, sa.getActivatingPlayer(), card, sa); byte colors = 0; for (Card c : list) { @@ -199,13 +201,21 @@ public class ManaEffect extends SpellAbilityEffect { } abMana.setExpressChoice(sb.toString().trim()); } + } - if (abMana.getExpressChoice().isEmpty()) { - System.out.println("AbilityFactoryMana::manaResolve() - special mana effect is empty for " + sa.getHostCard().getName()); - } - } + String mana = GameActionUtil.generatedMana(sa); - abMana.produceMana(GameActionUtil.generatedMana(sa), p, sa); + // this can happen when mana is based on criteria that didn't match + if (mana.isEmpty()) { + String msg = "AbilityFactoryMana::manaResolve() - special mana effect is empty for"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(msg) + .withData("Card", card.getName()).withData("SA", sa.toString()).build() + ); + continue; + } + + abMana.produceMana(mana, p, sa); } // Only clear express choice after mana has been produced diff --git a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java index 0b82ce47491..15c77fdbec2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MustBlockEffect.java @@ -27,7 +27,7 @@ public class MustBlockEffect extends SpellAbilityEffect { List cards; if (sa.hasParam("DefinedAttacker")) { - cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa); + cards = AbilityUtils.getDefinedCards(host, sa.getParam("DefinedAttacker"), sa); } else { cards = Lists.newArrayList(host); } @@ -37,7 +37,7 @@ public class MustBlockEffect extends SpellAbilityEffect { Player chooser = activator; if (sa.hasParam("Chooser")) { final String choose = sa.getParam("Chooser"); - chooser = AbilityUtils.getDefinedPlayers(sa.getHostCard(), choose, sa).get(0); + chooser = AbilityUtils.getDefinedPlayers(host, choose, sa).get(0); } CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield); @@ -81,7 +81,7 @@ public class MustBlockEffect extends SpellAbilityEffect { String attacker = null; if (sa.hasParam("DefinedAttacker")) { - final List cards = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedAttacker"), sa); + final List cards = AbilityUtils.getDefinedCards(host, sa.getParam("DefinedAttacker"), sa); attacker = cards.get(0).toString(); } else { attacker = host.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java index cc4bc385c12..4c0f1995f72 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PhasesEffect.java @@ -72,7 +72,7 @@ public class PhasesEffect extends SpellAbilityEffect { for (final Card tgtC : tgtCards) { if (!tgtC.isPhasedOut()) { tgtC.phase(false); - if ( tgtC.isPhasedOut()) { + if (tgtC.isPhasedOut()) { tgtC.setWontPhaseInNormal(wontPhaseInNormal); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java index 2c8da3e2259..72043aa6839 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PlayEffect.java @@ -35,7 +35,6 @@ import forge.game.zone.Zone; import forge.game.zone.ZoneType; import forge.item.PaperCard; import forge.util.Aggregates; -import forge.util.CardTranslation; import forge.util.Lang; import forge.util.Localizer; @@ -178,35 +177,24 @@ public class PlayEffect extends SpellAbilityEffect { activator.addController(controlledByTimeStamp, controlledByPlayer); } - final CardCollection saidNoTo = new CardCollection(); - while (tgtCards.size() > saidNoTo.size() && saidNoTo.size() < amount && amount > 0) { + while (!tgtCards.isEmpty() && amount > 0) { activator.getController().tempShowCards(showCards); - Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblSelectCardToPlay"), null); + Card tgtCard = controller.getController().chooseSingleEntityForEffect(tgtCards, sa, Localizer.getInstance().getMessage("lblSelectCardToPlay"), optional, null); activator.getController().endTempShowCards(); if (tgtCard == null) { break; } - final boolean wasFaceDown; + boolean wasFaceDown = false; if (tgtCard.isFaceDown()) { tgtCard.forceTurnFaceUp(); wasFaceDown = true; - } else { - wasFaceDown = false; } if (sa.hasParam("ShowCardToActivator")) { game.getAction().revealTo(tgtCard, activator); } - if (optional && !controller.getController().confirmAction(sa, null, Localizer.getInstance().getMessage("lblDoYouWantPlayCard", CardTranslation.getTranslatedName(tgtCard.getName())))) { - if (wasFaceDown) { - tgtCard.turnFaceDownNoUpdate(); - } - saidNoTo.add(tgtCard); - continue; - } - if (!sa.hasParam("AllowRepeats")) { tgtCards.remove(tgtCard); } @@ -237,7 +225,7 @@ public class PlayEffect extends SpellAbilityEffect { source.addRemembered(tgtCard); } } else { - saidNoTo.add(tgtCard); + tgtCards.remove(tgtCard); } continue; } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java index 061c1a55190..b7fe68bce0f 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java @@ -63,7 +63,7 @@ public class PowerExchangeEffect extends SpellAbilityEffect { game.fireEvent(new GameEventCardStatsChanged(c1)); game.fireEvent(new GameEventCardStatsChanged(c2)); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { @@ -77,14 +77,8 @@ public class PowerExchangeEffect extends SpellAbilityEffect { game.fireEvent(new GameEventCardStatsChanged(c2)); } }; - - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else if (sa.hasParam("UntilHostLeavesPlay")) { - sa.getHostCard().addLeavesPlayCommand(untilEOT); - } else { - game.getEndOfTurn().addUntil(untilEOT); - } + + addUntilCommand(sa, untilEOT); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java index a92a7bd3dff..a16f62de435 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectAllEffect.java @@ -33,7 +33,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { if (tgtCards.size() > 0) { sb.append("Valid card gain protection"); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { sb.append(" until end of turn"); } sb.append("."); @@ -94,7 +94,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { if (tgtC.isInPlay()) { tgtC.addChangedCardKeywords(gainsKWList, null, false, false, timestamp, true); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove protection at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = -6573962672873853565L; @@ -106,11 +106,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { } } }; - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else { - game.getEndOfTurn().addUntil(untilEOT); - } + addUntilCommand(sa, untilEOT); } } } @@ -128,7 +124,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { player.addChangedKeywords(ImmutableList.of("Protection from " + gain), ImmutableList.of(), timestamp); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove protection at EOT final GameCommand revokeCommand = new GameCommand() { private static final long serialVersionUID = -6573962672873853565L; @@ -138,11 +134,7 @@ public class ProtectAllEffect extends SpellAbilityEffect { player.removeChangedKeywords(timestamp); } }; - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(revokeCommand); - } else { - game.getEndOfTurn().addUntil(revokeCommand); - } + addUntilCommand(sa, revokeCommand); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java index 631ecf9e533..6e70f7dc965 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ProtectEffect.java @@ -85,7 +85,7 @@ public class ProtectEffect extends SpellAbilityEffect { sb.append(gains.get(i)); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { sb.append(" until end of turn"); } @@ -147,7 +147,7 @@ public class ProtectEffect extends SpellAbilityEffect { tgtC.addChangedCardKeywords(gainsKWList, null, false, false, timestamp, true); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove protection at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = 7682700789217703789L; @@ -159,11 +159,7 @@ public class ProtectEffect extends SpellAbilityEffect { } } }; - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else { - game.getEndOfTurn().addUntil(untilEOT); - } + addUntilCommand(sa, untilEOT); } } @@ -175,7 +171,7 @@ public class ProtectEffect extends SpellAbilityEffect { unTgtC.addChangedCardKeywords(gainsKWList, null, false, false, timestamp, true); - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove protection at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = 7682700789217703789L; @@ -187,11 +183,7 @@ public class ProtectEffect extends SpellAbilityEffect { } } }; - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else { - game.getEndOfTurn().addUntil(untilEOT); - } + addUntilCommand(sa, untilEOT); } } } // protectResolve() diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index b612e223132..7e232159116 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -70,7 +70,7 @@ public class PumpAllEffect extends SpellAbilityEffect { sa.getHostCard().addRemembered(tgtC); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = 5415795460189457660L; @@ -88,23 +88,11 @@ public class PumpAllEffect extends SpellAbilityEffect { game.fireEvent(new GameEventCardStatsChanged(tgtC)); } }; - if (sa.hasParam("UntilUntaps")) { - sa.getHostCard().addUntapCommand(untilEOT); - } else if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(sa.getActivatingPlayer(), untilEOT); - } else if (sa.hasParam("UntilLoseControl")) { + if ("UntilLoseControlOfHost".equals(sa.getParam("Duration"))) { tgtC.addLeavesPlayCommand(untilEOT); tgtC.addChangeControllerCommand(untilEOT); - } else if (sa.hasParam("UntilTheEndOfYourNextTurn")) { - if (game.getPhaseHandler().isPlayerTurn(sa.getActivatingPlayer())) { - game.getEndOfTurn().registerUntilEnd(sa.getActivatingPlayer(), untilEOT); - } else { - game.getEndOfTurn().addUntilEnd(sa.getActivatingPlayer(), untilEOT); - } } else { - game.getEndOfTurn().addUntil(untilEOT); + addUntilCommand(sa, untilEOT); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index 079c6b43afa..ba98dfdccf3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -39,7 +39,7 @@ public class PumpEffect extends SpellAbilityEffect { final Game game = host.getGame(); //if host is not on the battlefield don't apply // Suspend should does Affect the Stack - if ((sa.hasParam("UntilLoseControlOfHost") || sa.hasParam("UntilHostLeavesPlay")) + if (("UntilHostLeavesPlay".equals(sa.getParam("Duration")) || "UntilLoseControlOfHost".equals(sa.getParam("Duration"))) && !(host.isInPlay() || host.isInZone(ZoneType.Stack))) { return; } @@ -83,7 +83,7 @@ public class PumpEffect extends SpellAbilityEffect { addLeaveBattlefieldReplacement(gameCard, sa, sa.getParam("LeaveBattlefield")); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = -42244224L; @@ -91,9 +91,8 @@ public class PumpEffect extends SpellAbilityEffect { @Override public void run() { gameCard.removePTBoost(timestamp, 0); - boolean updateText = false; - updateText = gameCard.removeCanBlockAny(timestamp) || updateText; - updateText = gameCard.removeCanBlockAdditional(timestamp) || updateText; + boolean updateText = gameCard.removeCanBlockAny(timestamp); + updateText |= gameCard.removeCanBlockAdditional(timestamp); if (keywords.size() > 0) { @@ -131,7 +130,7 @@ public class PumpEffect extends SpellAbilityEffect { p.addChangedKeywords(keywords, ImmutableList.of(), timestamp); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = -32453460L; @@ -145,31 +144,6 @@ public class PumpEffect extends SpellAbilityEffect { } } - private static void addUntilCommand(final SpellAbility sa, GameCommand untilEOT) { - final Card host = sa.getHostCard(); - final Game game = host.getGame(); - - if (sa.hasParam("UntilEndOfCombat")) { - game.getEndOfCombat().addUntil(untilEOT); - } else if (sa.hasParam("UntilYourNextUpkeep")) { - game.getUpkeep().addUntil(sa.getActivatingPlayer(), untilEOT); - } else if (sa.hasParam("UntilHostLeavesPlay")) { - host.addLeavesPlayCommand(untilEOT); - } else if (sa.hasParam("UntilHostLeavesPlayOrEOT")) { - host.addLeavesPlayCommand(untilEOT); - game.getEndOfTurn().addUntil(untilEOT); - } else if (sa.hasParam("UntilLoseControlOfHost")) { - host.addLeavesPlayCommand(untilEOT); - host.addChangeControllerCommand(untilEOT); - } else if (sa.hasParam("UntilYourNextTurn")) { - game.getCleanup().addUntil(sa.getActivatingPlayer(), untilEOT); - } else if (sa.hasParam("UntilUntaps")) { - host.addUntapCommand(untilEOT); - } else { - game.getEndOfTurn().addUntil(untilEOT); - } - } - /* * (non-Javadoc) * @see forge.game.ability.SpellAbilityEffect#getStackDescription(forge.game.spellability.SpellAbility) @@ -245,7 +219,7 @@ public class PumpEffect extends SpellAbilityEffect { sb.append(" each combat "); } - if (!sa.hasParam("Permanent")) { + if (!"Permanent".equals(sa.getParam("Duration"))) { sb.append("until end of turn."); } else { sb.append("."); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java index 0e28c7804a1..671139d0049 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RepeatEachEffect.java @@ -7,6 +7,7 @@ import com.google.common.collect.Lists; import forge.GameCommand; import forge.game.Game; +import forge.game.GameEntityCounterTable; import forge.game.GameObject; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; @@ -86,6 +87,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { if (sa.hasParam("DamageMap")) { sa.setDamageMap(new CardDamageMap()); sa.setPreventMap(new CardDamageMap()); + sa.setCounterTable(new GameEntityCounterTable()); } if (sa.hasParam("ChangeZoneTable")) { sa.setChangeZoneTable(new CardZoneTable()); @@ -166,11 +168,7 @@ public class RepeatEachEffect extends SpellAbilityEffect { } if(sa.hasParam("DamageMap")) { - sa.getPreventMap().triggerPreventDamage(false); - sa.setPreventMap(null); - // non combat damage cause lifegain there - sa.getDamageMap().triggerDamageDoneOnce(false, game, sa); - sa.setDamageMap(null); + game.getAction().dealDamage(false, sa.getDamageMap(), sa.getPreventMap(), sa.getCounterTable(), sa); } if (sa.hasParam("ChangeZoneTable")) { sa.getChangeZoneTable().triggerChangesZoneAll(game, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java index 51ba01cbbad..cb59a12eb10 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceDamageEffect.java @@ -5,16 +5,19 @@ import java.util.Map; import org.apache.commons.lang3.StringUtils; import forge.game.Game; -import forge.game.GameLogEntryType; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; import forge.game.replacement.ReplacementResult; -import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; -import forge.util.TextUtil; +/** + * This class handles two kinds of prevention effect: + * - Prevent next X damages. Those will use `Amount$ `, and the `` will have form `Number$ X`. + * That SVar will be updated after each prevention "shield" used up. + * - Prevent X damages. Those will use `Amount$ N` or `Amount$ `, where the `` will have form other than + * `Number$ X`. These "shields" are not used up so won't be updated. */ public class ReplaceDamageEffect extends SpellAbilityEffect { @Override @@ -27,30 +30,32 @@ public class ReplaceDamageEffect extends SpellAbilityEffect { return; } - final ReplacementType event = sa.getReplacementEffect().getMode(); - - String varValue = sa.getParamOrDefault("VarName", "1"); - @SuppressWarnings("unchecked") Map originalParams = (Map) sa.getReplacingObject(AbilityKey.OriginalParams); - Map params = AbilityKey.newMap(originalParams); - Integer dmg = (Integer) sa.getReplacingObject(AbilityKey.DamageAmount); + String varValue = sa.getParamOrDefault("Amount", "1"); int prevent = AbilityUtils.calculateAmount(card, varValue, sa); - // Currently it does reduce damage by amount, need second mode for Setting Damage - if (prevent > 0) { int n = Math.min(dmg, prevent); + // if the effect has divided shield, use that + if (originalParams.get(AbilityKey.DividedShieldAmount) != null) { + n = Math.min(n, (Integer)originalParams.get(AbilityKey.DividedShieldAmount)); + } dmg -= n; prevent -= n; - if (card.getType().hasStringType("Effect") && prevent <= 0) { - game.getAction().exile(card, null); - } else if (!StringUtils.isNumeric(varValue)) { - card.setSVar(varValue, "Number$" + prevent); + if (!StringUtils.isNumeric(varValue) && card.getSVar(varValue).startsWith("Number$")) { + if (card.getType().hasStringType("Effect") && prevent <= 0) { + game.getAction().exile(card, null); + } else { + card.setSVar(varValue, "Number$" + prevent); + card.updateAbilityTextForView(); + } } + // Set PreventedDamage SVar + card.setSVar("PreventedDamage", "Number$" + n); } // no damage for original target anymore @@ -58,32 +63,8 @@ public class ReplaceDamageEffect extends SpellAbilityEffect { originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Replaced); return; } - params.put(AbilityKey.DamageAmount, dmg); - - // need to log Updated events there, or the log is wrong order - String message = sa.getReplacementEffect().toString(); - if ( !StringUtils.isEmpty(message)) { - message = TextUtil.fastReplace(message, "CARDNAME", card.getName()); - game.getGameLog().add(GameLogEntryType.EFFECT_REPLACED, message); - } - - //try to call replacementHandler with new Params - ReplacementResult result = game.getReplacementHandler().run(event, params); - switch (result) { - case NotReplaced: - case Updated: { - for (Map.Entry e : params.entrySet()) { - originalParams.put(e.getKey(), e.getValue()); - } - // effect was updated - originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated); - break; - } - default: - // effect was replaced with something else - originalParams.put(AbilityKey.ReplacementResult, result); - break; - } + originalParams.put(AbilityKey.DamageAmount, dmg); + originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceEffect.java index e15dd8731f1..08acad9616e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceEffect.java @@ -65,6 +65,14 @@ public class ReplaceEffect extends SpellAbilityEffect { params.put(AbilityKey.EffectOnly, true); } + if (retype == ReplacementType.DamageDone) { + for (Map.Entry e : params.entrySet()) { + originalParams.put(e.getKey(), e.getValue()); + } + originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated); + return; + } + // need to log Updated events there, or the log is wrong order String message = sa.getReplacementEffect().toString(); if ( !StringUtils.isEmpty(message)) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java index 802e7076ed8..1f462099afe 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ReplaceSplitDamageEffect.java @@ -7,15 +7,12 @@ import org.apache.commons.lang3.StringUtils; import forge.game.Game; import forge.game.GameEntity; -import forge.game.GameEntityCounterTable; import forge.game.GameObject; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; -import forge.game.card.CardDamageMap; import forge.game.replacement.ReplacementResult; -import forge.game.replacement.ReplacementType; import forge.game.spellability.SpellAbility; public class ReplaceSplitDamageEffect extends SpellAbilityEffect { @@ -30,23 +27,21 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect { return; } - final ReplacementType event = sa.getReplacementEffect().getMode(); - String varValue = sa.getParamOrDefault("VarName", "1"); @SuppressWarnings("unchecked") Map originalParams = (Map) sa.getReplacingObject(AbilityKey.OriginalParams); - Map params = AbilityKey.newMap(originalParams); - Integer dmg = (Integer) sa.getReplacingObject(AbilityKey.DamageAmount); - - int prevent = AbilityUtils.calculateAmount(card, varValue, sa); - + List list = AbilityUtils.getDefinedObjects(card, sa.getParam("DamageTarget"), sa); if (prevent > 0 && list.size() > 0 && list.get(0) instanceof GameEntity) { int n = Math.min(dmg, prevent); + // if the effect has divided shield, use that + if (originalParams.get(AbilityKey.DividedShieldAmount) != null) { + n = Math.min(n, (Integer)originalParams.get(AbilityKey.DividedShieldAmount)); + } dmg -= n; prevent -= n; @@ -54,21 +49,12 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect { game.getAction().exile(card, null); } else if (!StringUtils.isNumeric(varValue)) { sa.setSVar(varValue, "Number$" + prevent); + card.updateAbilityTextForView(); } - - Card sourceLKI = (Card) sa.getReplacingObject(AbilityKey.Source); - CardDamageMap damageMap = (CardDamageMap) originalParams.get(AbilityKey.DamageMap); - CardDamageMap preventMap = (CardDamageMap) originalParams.get(AbilityKey.PreventMap); - GameEntityCounterTable counterTable = (GameEntityCounterTable) originalParams.get(AbilityKey.CounterTable); - SpellAbility cause = (SpellAbility) originalParams.get(AbilityKey.Cause); - - boolean isCombat = (Boolean) originalParams.get(AbilityKey.IsCombat); - boolean noPrevention = (Boolean) originalParams.get(AbilityKey.NoPreventDamage); - GameEntity obj = (GameEntity) list.get(0); - - obj.addDamage(n, sourceLKI, isCombat, noPrevention, damageMap, preventMap, counterTable, cause); + originalParams.put(AbilityKey.Affected, obj); + originalParams.put(AbilityKey.DamageAmount, n); } // no damage for original target anymore @@ -76,25 +62,7 @@ public class ReplaceSplitDamageEffect extends SpellAbilityEffect { originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Replaced); return; } - params.put(AbilityKey.DamageAmount, dmg); - - //try to call replacementHandler with new Params - ReplacementResult result = game.getReplacementHandler().run(event, params); - switch (result) { - case NotReplaced: - case Updated: { - for (Map.Entry e : params.entrySet()) { - originalParams.put(e.getKey(), e.getValue()); - } - // effect was updated - originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated); - break; - } - default: - // effect was replaced with something else - originalParams.put(AbilityKey.ReplacementResult, result); - break; - } + originalParams.put(AbilityKey.ReplacementResult, ReplacementResult.Updated); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java index becdd39955b..9a37000a753 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RestartGameEffect.java @@ -43,6 +43,8 @@ public class RestartGameEffect extends SpellAbilityEffect { // Avoid Psychic Surgery trigger in new game trigHandler.suppressMode(TriggerType.Shuffled); + game.getPhaseHandler().resetExtra(); + game.getStack().reset(); game.clearCounterAddedThisTurn(); game.resetPlayersAttackedOnNextTurn(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java index 733338ab552..4dea92f1a35 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/RevealEffect.java @@ -48,7 +48,7 @@ public class RevealEffect extends SpellAbilityEffect { } } else if (sa.hasParam("RevealDefined")) { - revealed.addAll(AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("RevealDefined"), sa)); + revealed.addAll(AbilityUtils.getDefinedCards(host, sa.getParam("RevealDefined"), sa)); } else { CardCollection valid = new CardCollection(cardsInHand); diff --git a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java index d13c3d09371..70128e6bc29 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SacrificeAllEffect.java @@ -47,7 +47,7 @@ public class SacrificeAllEffect extends SpellAbilityEffect { CardCollectionView list; if (sa.hasParam("Defined")) { - list = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("Defined"), sa); + list = AbilityUtils.getDefinedCards(card, sa.getParam("Defined"), sa); } else { list = game.getCardsIn(ZoneType.Battlefield); if (sa.hasParam("ValidCards")) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java index 82c37eaf6d9..4cfbc0bbe35 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SetInMotionEffect.java @@ -27,7 +27,7 @@ public class SetInMotionEffect extends SpellAbilityEffect { int repeats = 1; if (sa.hasParam("RepeatNum")) { - repeats = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("RepeatNum"), sa); + repeats = AbilityUtils.calculateAmount(source, sa.getParam("RepeatNum"), sa); } for (int i = 0; i < repeats; i++) { diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java index c6e6839f157..df9dcf07549 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipPhaseEffect.java @@ -110,11 +110,7 @@ public class SkipPhaseEffect extends SpellAbilityEffect { } }; - if (duration.equals("EndOfTurn") || isNextThisTurn) { - game.getEndOfTurn().addUntil(endEffect); - } else if (duration.equals("UntilTheEndOfYourNextTurn")) { - game.getEndOfTurn().addUntilEnd(player, endEffect); - } + addUntilCommand(sa, endEffect); } eff.addReplacementEffect(re); eff.updateStateForView(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java index 6de528ed805..0cb399042c8 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/SkipTurnEffect.java @@ -39,7 +39,7 @@ public class SkipTurnEffect extends SpellAbilityEffect { final Game game = hostCard.getGame(); final String name = hostCard.getName() + "'s Effect"; final String image = hostCard.getImageKey(); - final int numTurns = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumTurns"), sa); + final int numTurns = AbilityUtils.calculateAmount(hostCard, sa.getParam("NumTurns"), sa); String repeffstr = "Event$ BeginTurn | ActiveZones$ Command | ValidPlayer$ You " + "| Description$ Skip your next " + (numTurns > 1 ? Lang.getNumeral(numTurns) + " turns." : "turn."); String effect = "DB$ StoreSVar | SVar$ NumTurns | Type$ CountSVar | Expression$ NumTurns/Minus.1"; @@ -67,4 +67,3 @@ public class SkipTurnEffect extends SpellAbilityEffect { } } } - diff --git a/forge-game/src/main/java/forge/game/ability/effects/StoreSVarEffect.java b/forge-game/src/main/java/forge/game/ability/effects/StoreSVarEffect.java index 8d9a969f068..f0b27f5d712 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/StoreSVarEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/StoreSVarEffect.java @@ -4,7 +4,6 @@ import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; -import forge.game.card.CardFactoryUtil; import forge.game.spellability.SpellAbility; import forge.util.TextUtil; @@ -50,12 +49,12 @@ public class StoreSVarEffect extends SpellAbilityEffect { int exprMath = AbilityUtils.calculateAmount(source, exprMathVar, sa); expr = TextUtil.fastReplace(expr, exprMathVar, Integer.toString(exprMath)); } - value = CardFactoryUtil.xCount(source, "SVar$" + expr); + value = AbilityUtils.xCount(source, "SVar$" + expr, sa); } else if (type.equals("Targeted")) { - value = CardFactoryUtil.handlePaid(sa.findTargetedCards(), expr, source); + value = AbilityUtils.handlePaid(sa.findTargetedCards(), expr, source, sa); } else if (type.equals("Triggered")) { Card trigCard = (Card)sa.getTriggeringObject(AbilityKey.Card); - value = CardFactoryUtil.xCount(trigCard, expr); + value = AbilityUtils.xCount(trigCard, expr, sa); } else if (type.equals("Calculate")) { value = AbilityUtils.calculateAmount(source, expr, sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 27f5571ee18..5bd8ad4edef 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -68,19 +68,19 @@ public class TwoPilesEffect extends SpellAbilityEffect { Player separator = card.getController(); if (sa.hasParam("Separator")) { - separator = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Separator"), sa).get(0); + separator = AbilityUtils.getDefinedPlayers(card, sa.getParam("Separator"), sa).get(0); } Player chooser = tgtPlayers.get(0); if (sa.hasParam("Chooser")) { - chooser = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa).get(0); + chooser = AbilityUtils.getDefinedPlayers(card, sa.getParam("Chooser"), sa).get(0); } for (final Player p : tgtPlayers) { if ((tgt == null) || p.canBeTargetedBy(sa)) { CardCollectionView pool0; if (sa.hasParam("DefinedCards")) { - pool0 = AbilityUtils.getDefinedCards(sa.getHostCard(), sa.getParam("DefinedCards"), sa); + pool0 = AbilityUtils.getDefinedCards(card, sa.getParam("DefinedCards"), sa); } else { pool0 = p.getCardsIn(zone); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java index ec58540d227..2443f1aa9be 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/UntapEffect.java @@ -3,8 +3,10 @@ package forge.game.ability.effects; import forge.game.ability.AbilityUtils; import forge.game.ability.SpellAbilityEffect; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardLists; +import forge.game.card.CardUtil; import forge.game.card.CardPredicates.Presets; import forge.game.player.Player; import forge.game.spellability.SpellAbility; @@ -41,6 +43,7 @@ public class UntapEffect extends SpellAbilityEffect { } else if (sa.hasParam("UntapExactly")) { untapChoose(sa, true); } else { + final CardCollection untargetedCards = CardUtil.getRadiance(sa); for (final Card tgtC : getTargetCards(sa)) { if (sa.usesTargeting() && !tgtC.canBeTargetedBy(sa)) { continue; @@ -53,6 +56,15 @@ public class UntapEffect extends SpellAbilityEffect { tgtC.setTapped(false); } } + for (final Card tgtC : untargetedCards) { + if (tgtC.isInPlay()) { + tgtC.untap(); + } + if (sa.hasParam("ETB")) { + // do not fire triggers + tgtC.setTapped(false); + } + } } } diff --git a/forge-game/src/main/java/forge/game/card/ActivationTable.java b/forge-game/src/main/java/forge/game/card/ActivationTable.java index 26abcae086e..b292e5b2205 100644 --- a/forge-game/src/main/java/forge/game/card/ActivationTable.java +++ b/forge-game/src/main/java/forge/game/card/ActivationTable.java @@ -26,7 +26,7 @@ public class ActivationTable extends ForwardingTable st = Optional.fromNullable(root.getGrantorStatic()); - delegate().put(original, st, ObjectUtils.defaultIfNull(get(original, st), 0) + 1); + if (original != null) { + Optional st = Optional.fromNullable(root.getGrantorStatic()); + + delegate().put(original, st, ObjectUtils.defaultIfNull(get(original, st), 0) + 1); + } } public Integer get(SpellAbility sa) { 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 00342d79ea4..0c8cccc9be1 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -146,7 +146,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private ZoneType castFrom = null; private SpellAbility castSA = null; - private final CardDamageHistory damageHistory = new CardDamageHistory(); + private CardDamageHistory damageHistory = new CardDamageHistory(); // Hidden keywords won't be displayed on the card private final KeywordCollection hiddenExtrinsicKeyword = new KeywordCollection(); @@ -203,13 +203,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private final Set rememberedObjects = Sets.newLinkedHashSet(); private Map flipResult; - private Map receivedDamageFromThisTurn = Maps.newHashMap(); - private Map receivedDamageFromPlayerThisTurn = Maps.newHashMap(); + private Map receivedDamageFromThisTurn = Maps.newHashMap(); - private Map dealtDamageToThisTurn = Maps.newTreeMap(); - private Map dealtDamageToPlayerThisTurn = Maps.newTreeMap(); private final Map assignedDamageMap = Maps.newTreeMap(); - private boolean hasdealtDamagetoAny = false; private boolean isCommander = false; private boolean canMoveToCommandZone = false; @@ -222,6 +218,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private boolean tapped = false; private boolean sickness = true; // summoning sickness private boolean token = false; + private boolean tokenCard = false; private Card copiedPermanent = null; private boolean copiedSpell = false; @@ -271,7 +268,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private Map> newPT = Maps.newTreeMap(); private Map> newPTCharacterDefining = Maps.newTreeMap(); - // x=Static Avility id or 0, y=timestamp + // x=Static Ability id or 0, y=timestamp private Table> boostPT = TreeBasedTable.create(); private String oracleText = ""; @@ -613,6 +610,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } + // Need to remove mutated states, otherwise the changeToState() will fail + if (hasMergedCard()) { + removeMutatedStates(); + } CardCollectionView cards = hasMergedCard() ? getMergedCards() : new CardCollection(this); boolean retResult = false; for (final Card c : cards) { @@ -624,8 +625,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { boolean result = c.changeToState(c.backside ? CardStateName.Transformed : CardStateName.Original); retResult = retResult || result; } - if (retResult && hasMergedCard()) { - removeMutatedStates(); + if (hasMergedCard()) { rebuildMutatedStates(cause); } @@ -646,6 +646,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } + // Need to remove mutated states, otherwise the changeToState() will fail + if (hasMergedCard()) { + removeMutatedStates(); + } CardCollectionView cards = hasMergedCard() ? getMergedCards() : new CardCollection(this); boolean retResult = false; for (final Card c : cards) { @@ -656,8 +660,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { boolean result = c.changeToState(CardStateName.Flipped); retResult = retResult || result; } - if (retResult && hasMergedCard()) { - removeMutatedStates(); + if (hasMergedCard()) { rebuildMutatedStates(cause); game.getTriggerHandler().clearActiveTriggers(this, null); game.getTriggerHandler().registerActiveTrigger(this, false); @@ -2017,7 +2020,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbLong.append(keyword).append("\r\n"); } else if (keyword.startsWith("Strive") || keyword.startsWith("Escalate") || keyword.startsWith("ETBReplacement") - || keyword.startsWith("CantBeBlockedBy ") || keyword.startsWith("Affinity") || keyword.equals("CARDNAME enters the battlefield tapped.") || keyword.startsWith("UpkeepCost")) { @@ -2026,15 +2028,23 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Living Weapon") || keyword.equals("Myriad") || keyword.equals("Exploit") || keyword.equals("Changeling") || keyword.equals("Delve") || keyword.equals("Split second") || keyword.equals("Sunburst") - || keyword.equals("Suspend") // for the ones without amounnt + || keyword.equals("Suspend") // for the ones without amount || keyword.equals("Foretell") // for the ones without cost || keyword.equals("Hideaway") || keyword.equals("Ascend") + || keyword.equals("Trample over planeswalkers") || keyword.equals("Totem armor") || keyword.equals("Battle cry") || keyword.equals("Devoid") || keyword.equals("Riot")){ sbLong.append(keyword).append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Partner:")) { final String[] k = keyword.split(":"); sbLong.append("Partner with ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); + } else if (keyword.startsWith("Devour ")) { + final String[] k = keyword.split(":"); + final String[] s = (k[0]).split(" "); + final String t = s[1]; + sbLong.append(k[0]).append(" ").append(k[1]).append(" (As this enters the battlefield, you may "); + sbLong.append("sacrifice any number of ").append(t).append("s. This creature enters the "); + sbLong.append("battlefield with that many +1/+1 counters on it.)"); } else if (keyword.startsWith("Modular") || keyword.startsWith("Bloodthirst") || keyword.startsWith("Dredge") || keyword.startsWith("Fabricate") || keyword.startsWith("Soulshift") || keyword.startsWith("Bushido") || keyword.startsWith("Crew") || keyword.startsWith("Tribute") || keyword.startsWith("Absorb") @@ -2104,14 +2114,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } else if (keyword.startsWith("CantBeBlockedByAmount")) { sbLong.append(getName()).append(" can't be blocked "); sbLong.append(getTextForKwCantBeBlockedByAmount(keyword)); - } else if (keyword.startsWith("CantBlock")) { - sbLong.append(getName()).append(" can't block "); - if (keyword.contains("CardUID")) { - sbLong.append("CardID (").append(Integer.valueOf(keyword.split("CantBlockCardUID_")[1])).append(")"); - } else { - final String[] k = keyword.split(":"); - sbLong.append(k.length > 1 ? k[1] + ".\r\n" : ""); - } } else if (keyword.equals("Unblockable")) { sbLong.append(getName()).append(" can't be blocked.\r\n"); } else if (keyword.equals("AllNonLegendaryCreatureNames")) { @@ -2732,7 +2734,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } for (SpellAbility sa : getSpellAbilities()) { - if (!(sa instanceof SpellPermanent)) { + if (!(sa instanceof SpellPermanent) && !sa.isMorphUp()) { return false; } } @@ -2921,6 +2923,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars { view.updateToken(this); } + public final boolean isTokenCard() { + if (isInZone(ZoneType.Battlefield) && hasMergedCard()) { + return getTopMergedCard().tokenCard; + } + return tokenCard; + } + public final void setTokenCard(boolean tokenC) { + if (tokenCard = tokenC) { return; } + tokenCard = tokenC; + view.updateTokenCard(this); + } + public final Card getCopiedPermanent() { return copiedPermanent; } @@ -4529,7 +4543,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final boolean isShrine() { return getType().hasSubtype("Shrine"); } public final boolean isAttachment() { return isAura() || isEquipment() || isFortification(); } - public final boolean isHistoric() {return getType().isLegendary() || isArtifact() || getType().hasSubtype("Saga");} + public final boolean isHistoric() { return getType().isLegendary() || isArtifact() || getType().hasSubtype("Saga"); } public final boolean isScheme() { return getType().isScheme(); } public final boolean isPhenomenon() { return getType().isPhenomenon(); } @@ -4595,8 +4609,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { setDirectlyPhasedOut(direct); } - if (hasCardAttachments()) { - for (final Card eq : getAttachedCards()) { + // CR 702.25g + if (!getAllAttachedCards().isEmpty()) { + for (final Card eq : getAllAttachedCards()) { if (eq.isPhasedOut() == phasingIn) { eq.phase(fromUntapStep, false); } @@ -4613,7 +4628,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } private boolean switchPhaseState(final boolean fromUntapStep) { - if (phasedOut && hasKeyword("CARDNAME can't phase in.")) { return false; } @@ -4632,6 +4646,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { // If this is currently PhasedIn, it's about to phase out. // Run trigger before it does because triggers don't work with phased out objects getGame().getTriggerHandler().runTrigger(TriggerType.PhaseOut, runParams, false); + // when it doesn't exist the game will no longer see it as tapped + runUntapCommands(); + // TODO need to run UntilHostLeavesPlay commands but only when worded "for as long as" } setPhasedOut(!phasedOut); @@ -4645,6 +4662,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { getGame().getTriggerHandler().registerActiveTrigger(this, false); getGame().getTriggerHandler().runTrigger(TriggerType.PhaseIn, runParams, false); } + + game.updateLastStateForCard(this); return true; } @@ -4886,6 +4905,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final boolean sharesColorWith(final Card c1) { + if (isColorless() || c1.isColorless()) { + return false; + } boolean shares; shares = (isBlack() && c1.isBlack()); shares |= (isBlue() && c1.isBlue()); @@ -4960,30 +4982,23 @@ public class Card extends GameEntity implements Comparable, IHasSVars { usedToPayCost = b; } - // ///////////////////////// - // - // Damage code - // - // //////////////////////// + public CardDamageHistory getDamageHistory() { + return damageHistory; + } + public void setDamageHistory(CardDamageHistory history) { + damageHistory = history; + } - public final Map getReceivedDamageFromThisTurn() { + public final Map getReceivedDamageFromThisTurn() { return receivedDamageFromThisTurn; } - public final void setReceivedDamageFromThisTurn(final Map receivedDamageList) { + public final void setReceivedDamageFromThisTurn(final Map receivedDamageList) { receivedDamageFromThisTurn = Maps.newHashMap(receivedDamageList); } - public final Map getReceivedDamageFromPlayerThisTurn() { - return receivedDamageFromPlayerThisTurn; - } - - public final void setReceivedDamageFromPlayerThisTurn(final Map receivedDamageList) { - receivedDamageFromPlayerThisTurn = Maps.newHashMap(receivedDamageList); - } - public int getReceivedDamageByPlayerThisTurn(final Player p) { - if (receivedDamageFromPlayerThisTurn.containsKey(p)) { - return receivedDamageFromPlayerThisTurn.get(p); + if (receivedDamageFromThisTurn.containsKey(p)) { + return receivedDamageFromThisTurn.get(p); } return 0; } @@ -4998,64 +5013,28 @@ public class Card extends GameEntity implements Comparable, IHasSVars { Player p = c.getController(); if (p != null) { currentDamage = 0; - if (receivedDamageFromPlayerThisTurn.containsKey(p)) { - currentDamage = receivedDamageFromPlayerThisTurn.get(p); + if (receivedDamageFromThisTurn.containsKey(p)) { + currentDamage = receivedDamageFromThisTurn.get(p); } - receivedDamageFromPlayerThisTurn.put(p, damage+currentDamage); + receivedDamageFromThisTurn.put(p, damage+currentDamage); } } public final void resetReceivedDamageFromThisTurn() { receivedDamageFromThisTurn.clear(); - receivedDamageFromPlayerThisTurn.clear(); } - public final int getTotalDamageRecievedThisTurn() { + public final int getTotalDamageReceivedThisTurn() { int total = 0; - for (int damage : receivedDamageFromThisTurn.values()) { - total += damage; + for (Entry e : receivedDamageFromThisTurn.entrySet()) { + if (e.getKey() instanceof Player) { + total += e.getValue(); + } } return total; } - // TODO: Combine getDealtDamageToThisTurn with addDealtDamageToPlayerThisTurn using GameObject, Integer - public final Map getDealtDamageToThisTurn() { - return dealtDamageToThisTurn; - } - public final void setDealtDamageToThisTurn(final Map dealtDamageList) { - dealtDamageToThisTurn = dealtDamageList; - } - public final void addDealtDamageToThisTurn(final Card c, final int damage) { - int currentDamage = 0; - if (dealtDamageToThisTurn.containsKey(c)) { - currentDamage = dealtDamageToThisTurn.get(c); - } - dealtDamageToThisTurn.put(c, damage+currentDamage); - hasdealtDamagetoAny = true; - } - public final void resetDealtDamageToThisTurn() { - dealtDamageToThisTurn.clear(); - } - - public final Map getDealtDamageToPlayerThisTurn() { - return dealtDamageToPlayerThisTurn; - } - public final void setDealtDamageToPlayerThisTurn(final Map dealtDamageList) { - dealtDamageToPlayerThisTurn = dealtDamageList; - } - public final void addDealtDamageToPlayerThisTurn(final String player, final int damage) { - int currentDamage = 0; - if (dealtDamageToPlayerThisTurn.containsKey(player)) { - currentDamage = dealtDamageToPlayerThisTurn.get(player); - } - dealtDamageToPlayerThisTurn.put(player, damage+currentDamage); - hasdealtDamagetoAny = true; - } - public final void resetDealtDamageToPlayerThisTurn() { - dealtDamageToPlayerThisTurn.clear(); - } - public final boolean hasDealtDamageToOpponentThisTurn() { - for (final GameEntity e : getDamageHistory().getThisTurnDamaged()) { + for (final GameEntity e : getDamageHistory().getThisTurnDamaged().keySet()) { if (e instanceof Player) { final Player p = (Player) e; if (getController().isOpponentOf(p)) { @@ -5066,6 +5045,19 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return false; } + /** + * Gets the total damage done by card this turn (after prevention and redirects). + * + * @return the damage done to player p this turn + */ + public final int getTotalDamageDoneBy() { + int sum = 0; + for (final GameEntity e : getDamageHistory().getThisTurnDamaged().keySet()) { + sum += getDamageHistory().getThisTurnDamaged().get(e); + } + return sum; + } + // this is the amount of damage a creature needs to receive before it dies public final int getLethal() { if (hasKeyword("Lethal damage dealt to CARDNAME is determined by its power rather than its toughness.")) { @@ -5129,24 +5121,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return total; } - public final void addCombatDamage(final Map map, final CardDamageMap damageMap, final CardDamageMap preventMap, GameEntityCounterTable counterTable) { - for (final Entry entry : map.entrySet()) { - addCombatDamage(entry.getValue(), entry.getKey(), damageMap, preventMap, counterTable); - } - } - - /* - * (non-Javadoc) - * @see forge.game.GameEntity#addCombatDamageBase(int, forge.game.card.Card, forge.game.card.CardDamageMap, forge.game.GameEntityCounterTable) - */ - @Override - protected int addCombatDamageBase(final int damage, final Card source, CardDamageMap damageMap, GameEntityCounterTable counterTable) { - if (isInPlay()) { - return super.addCombatDamageBase(damage, source, damageMap, counterTable); - } - return 0; - } - public final boolean canDamagePrevented(final boolean isCombat) { CardCollection list = new CardCollection(getGame().getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)); list.add(this); @@ -5161,150 +5135,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return true; } - // This is used by the AI to forecast an effect (so it must not change the game state) - public final int staticDamagePrevention(final int damage, final int possiblePrevention, final Card source, final boolean isCombat) { - if (!source.canDamagePrevented(isCombat)) { - return damage; - } - - for (final Card ca : getGame().getCardsIn(ZoneType.Battlefield)) { - for (final ReplacementEffect re : ca.getReplacementEffects()) { - Map params = re.getMapParams(); - if (!re.getMode().equals(ReplacementType.DamageDone) || !params.containsKey("PreventionEffect")) { - continue; - } - if (params.containsKey("ValidSource") - && !source.isValid(params.get("ValidSource"), ca.getController(), ca, null)) { - continue; - } - if (params.containsKey("ValidTarget") - && !isValid(params.get("ValidTarget"), ca.getController(), ca, null)) { - continue; - } - if (params.containsKey("IsCombat")) { - if (params.get("IsCombat").equals("True")) { - if (!isCombat) { - continue; - } - } else { - if (isCombat) { - continue; - } - } - } - return 0; - } - } - return staticDamagePrevention(damage - possiblePrevention, source, isCombat, true); - } - - // This should be also usable by the AI to forecast an effect (so it must not change the game state) - @Override - public final int staticDamagePrevention(final int damageIn, final Card source, final boolean isCombat, final boolean isTest) { - if (damageIn <= 0) { - return 0; - } - - if (!source.canDamagePrevented(isCombat)) { - return damageIn; - } - - if (isCombat && getGame().getPhaseHandler().isPreventCombatDamageThisTurn()) { - return 0; - } - - int restDamage = damageIn; - - if (hasProtectionFromDamage(source)) { - return 0; - } - - // Prevent Damage static abilities - for (final Card ca : getGame().getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { - for (final StaticAbility stAb : ca.getStaticAbilities()) { - restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat, isTest); - } - } - return restDamage > 0 ? restDamage : 0; - } - - protected int preventShieldEffect(final int damage) { - if (damage <= 0) { - return 0; - } - - int restDamage = damage; - - boolean DEBUGShieldsWithEffects = false; - while (!getPreventNextDamageWithEffect().isEmpty() && restDamage != 0) { - Map> shieldMap = getPreventNextDamageWithEffect(); - CardCollectionView preventionEffectSources = new CardCollection(shieldMap.keySet()); - Card shieldSource = preventionEffectSources.get(0); - if (preventionEffectSources.size() > 1) { - Map choiceMap = Maps.newTreeMap(); - List choices = Lists.newArrayList(); - for (final Card key : preventionEffectSources) { - String effDesc = shieldMap.get(key).get("EffectString"); - int descIndex = effDesc.indexOf("SpellDescription"); - effDesc = effDesc.substring(descIndex + 18); - String shieldDescription = key.toString() + " - " + shieldMap.get(key).get("ShieldAmount") - + " shields - " + effDesc; - choices.add(shieldDescription); - choiceMap.put(shieldDescription, key); - } - shieldSource = getController().getController().chooseProtectionShield(this, choices, choiceMap); - } - if (DEBUGShieldsWithEffects) { - System.out.println("Prevention shield source: " + shieldSource); - } - - int shieldAmount = Integer.valueOf(shieldMap.get(shieldSource).get("ShieldAmount")); - int dmgToBePrevented = Math.min(restDamage, shieldAmount); - if (DEBUGShieldsWithEffects) { - System.out.println("Selected source initial shield amount: " + shieldAmount); - System.out.println("Incoming damage: " + restDamage); - System.out.println("Damage to be prevented: " + dmgToBePrevented); - } - - //Set up ability - SpellAbility shieldSA; - String effectAbString = shieldMap.get(shieldSource).get("EffectString"); - effectAbString = TextUtil.fastReplace(effectAbString, "PreventedDamage", Integer.toString(dmgToBePrevented)); - effectAbString = TextUtil.fastReplace(effectAbString, "ShieldEffectTarget", shieldMap.get(shieldSource).get("ShieldEffectTarget")); - if (DEBUGShieldsWithEffects) { - System.out.println("Final shield ability string: " + effectAbString); - } - shieldSA = AbilityFactory.getAbility(effectAbString, shieldSource); - if (shieldSA.usesTargeting()) { - System.err.println(shieldSource + " - Targeting for prevention shield's effect should be done with initial spell"); - } - - boolean apiIsEffect = (shieldSA.getApi() == ApiType.Effect); - CardCollectionView cardsInCommand = null; - if (apiIsEffect) { - cardsInCommand = getGame().getCardsIn(ZoneType.Command); - } - - getController().getController().playSpellAbilityNoStack(shieldSA, true); - if (apiIsEffect) { - CardCollection newCardsInCommand = (CardCollection)getGame().getCardsIn(ZoneType.Command); - newCardsInCommand.removeAll(cardsInCommand); - if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); - } - } - subtractPreventNextDamageWithEffect(shieldSource, restDamage); - restDamage = restDamage - dmgToBePrevented; - - if (DEBUGShieldsWithEffects) { - System.out.println("Remaining shields: " - + (shieldMap.containsKey(shieldSource) ? shieldMap.get(shieldSource).get("ShieldAmount") : "all shields used")); - System.out.println("Remaining damage: " + restDamage); - } - } - return restDamage; - } - // This is used by the AI to forecast an effect (so it must not change the game state) @Override public final int staticReplaceDamage(final int damage, final Card source, final boolean isCombat) { @@ -5383,20 +5213,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return restDamage; } - public final void addDamage(final Map sourcesMap, CardDamageMap damageMap, GameEntityCounterTable counterTable) { - for (final Entry entry : sourcesMap.entrySet()) { - // damage prevention is already checked! - addDamageAfterPrevention(entry.getValue(), entry.getKey(), true, damageMap, counterTable); - } - } - /** * This function handles damage after replacement and prevention effects are * applied. */ @Override - public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, CardDamageMap damageMap, GameEntityCounterTable counterTable) { - + public final int addDamageAfterPrevention(final int damageIn, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) { if (damageIn <= 0) { return 0; // Rule 119.8 } @@ -5414,7 +5236,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { getGame().getReplacementHandler().run(ReplacementType.DealtDamage, AbilityKey.mapFromAffected(this)); addReceivedDamageFromThisTurn(source, damageIn); - source.addDealtDamageToThisTurn(this, damageIn); + source.getDamageHistory().registerDamage(this, damageIn); + if (isCombat) { + source.getDamageHistory().registerCombatDamage(this, damageIn); + } // Run triggers Map runParams = AbilityKey.newMap(); @@ -5444,8 +5269,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { subtractCounter(CounterType.get(CounterEnumType.LOYALTY), damageIn); } if (isCreature()) { - final Game game = source.getGame(); - boolean wither = (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.alwaysWither) || source.hasKeyword(Keyword.WITHER) || source.hasKeyword(Keyword.INFECT)); @@ -5467,8 +5290,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { game.fireEvent(new GameEventCardDamaged(this, source, damageIn, damageType)); } - damageMap.put(source, this, damageIn); - if (excess > 0) { // Run triggers runParams = AbilityKey.newMap(); @@ -5685,7 +5506,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public final void setRandomFoil() { setFoil(CardEdition.getRandomFoil(getSetCode())); } - public final void setFoil(final int f) { currentState.setSVar("Foil", Integer.toString(f)); } @@ -5729,57 +5549,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return pairedWith != null; } - public Card getMeldedWith() { return meldedWith; } - - public void setMeldedWith(Card meldedWith) { this.meldedWith = meldedWith; } - - public final int getDamageDoneThisTurn() { - int sum = 0; - for (final Card c : dealtDamageToThisTurn.keySet()) { - sum += dealtDamageToThisTurn.get(c); - } - - return sum; - } - - public final int getDamageDoneToPlayerBy(final String player) { - int sum = 0; - for (final String p : dealtDamageToPlayerThisTurn.keySet()) { - if (p.equals(player)) { - sum += dealtDamageToPlayerThisTurn.get(p); - } - } - return sum; - } - - /** - * Gets the total damage done by card this turn (after prevention and redirects). - * - * @return the damage done to player p this turn - */ - public final int getTotalDamageDoneBy() { - int sum = 0; - for (final Card c : dealtDamageToThisTurn.keySet()) { - sum += dealtDamageToThisTurn.get(c); - } - for (final String p : dealtDamageToPlayerThisTurn.keySet()) { - sum += dealtDamageToPlayerThisTurn.get(p); - } - return sum; - } - - public boolean getHasdealtDamagetoAny() { - return hasdealtDamagetoAny; - } + public Card getMeldedWith() { return meldedWith; } + public void setMeldedWith(Card meldedWith) { this.meldedWith = meldedWith; } public boolean hasProtectionFrom(final Card source) { return hasProtectionFrom(source, false, false); } - public boolean hasProtectionFromDamage(final Card source) { - return hasProtectionFrom(source, false, true); - } - @Override public boolean hasProtectionFrom(final Card source, final boolean checkSBA) { return hasProtectionFrom(source, checkSBA, false); @@ -5998,11 +5774,11 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } public final boolean canBeDestroyed() { - return isInPlay() && (!hasKeyword(Keyword.INDESTRUCTIBLE) || (isCreature() && getNetToughness() <= 0)); + return isInPlay() && !isPhasedOut() && (!hasKeyword(Keyword.INDESTRUCTIBLE) || (isCreature() && getNetToughness() <= 0)); } public final boolean canBeSacrificed() { - return isInPlay() && !this.isPhasedOut() && !hasKeyword("CARDNAME can't be sacrificed."); + return isInPlay() && !isPhasedOut() && !hasKeyword("CARDNAME can't be sacrificed."); } @Override @@ -6165,10 +5941,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { this.castSA = castSA; } - public CardDamageHistory getDamageHistory() { - return damageHistory; - } - public Card getEffectSource() { if (effectSourceAbility != null) { return effectSourceAbility.getHostCard(); @@ -6202,22 +5974,16 @@ public class Card extends GameEntity implements Comparable, IHasSVars { public void onCleanupPhase(final Player turn) { setDamage(0); setHasBeenDealtDeathtouchDamage(false); - resetPreventNextDamage(); - resetPreventNextDamageWithEffect(); resetReceivedDamageFromThisTurn(); - resetDealtDamageToThisTurn(); - resetDealtDamageToPlayerThisTurn(); - getDamageHistory().newTurn(); setRegeneratedThisTurn(0); resetShield(); setBecameTargetThisTurn(false); clearMustAttackEntity(turn); clearMustBlockCards(); + getDamageHistory().newTurn(); getDamageHistory().setCreatureAttackedLastTurnOf(turn, getDamageHistory().getCreatureAttackedThisTurn()); getDamageHistory().setCreatureAttackedThisTurn(false); getDamageHistory().setCreatureAttacksThisTurn(0); - getDamageHistory().setCreatureBlockedThisTurn(false); - getDamageHistory().setCreatureGotBlockedThisTurn(false); clearBlockedByThisTurn(); clearBlockedThisTurn(); resetMayPlayTurn(); @@ -6473,6 +6239,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { final Collection toRemove = Lists.newArrayListWithCapacity(abilities.size()); for (final SpellAbility sa : abilities) { + Player oldController = sa.getActivatingPlayer(); sa.setActivatingPlayer(player); // fix things like retrace // check only if SA can't be cast normally @@ -6480,6 +6247,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { continue; } if ((removeUnplayable && !sa.canPlay()) || !sa.isPossible()) { + if (oldController != null) { + // in case the ability is on the stack this should not change + sa.setActivatingPlayer(oldController); + } toRemove.add(sa); } } diff --git a/forge-game/src/main/java/forge/game/card/CardDamageHistory.java b/forge-game/src/main/java/forge/game/card/CardDamageHistory.java index 1afbe5f1fe0..4ca660643c3 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageHistory.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageHistory.java @@ -2,8 +2,10 @@ package forge.game.card; import java.util.List; +import java.util.Map; import com.google.common.collect.Lists; +import com.google.common.collect.Maps; import forge.game.GameEntity; import forge.game.player.Player; @@ -17,9 +19,7 @@ public class CardDamageHistory { private boolean creatureAttackedThisTurn = false; private boolean creatureAttackedThisCombat = false; private boolean creatureBlockedThisCombat = false; - private boolean creatureBlockedThisTurn = false; private boolean creatureGotBlockedThisCombat = false; - private boolean creatureGotBlockedThisTurn = false; private int attacksThisTurn = 0; private final List creatureAttackedLastTurnOf = Lists.newArrayList(); @@ -27,10 +27,15 @@ public class CardDamageHistory { private final List NotBlockedSinceLastUpkeepOf = Lists.newArrayList(); private final List NotBeenBlockedSinceLastUpkeepOf = Lists.newArrayList(); - private final List damagedThisCombat = Lists.newArrayList(); - private final List damagedThisTurn = Lists.newArrayList(); - private final List damagedThisTurnInCombat = Lists.newArrayList(); - private final List damagedThisGame = Lists.newArrayList(); + private final Map damagedThisCombat = Maps.newHashMap(); + private final Map damagedThisTurn = Maps.newHashMap(); + private final Map damagedThisTurnInCombat = Maps.newHashMap(); + private final Map damagedThisGame = Maps.newHashMap(); + + public final boolean getHasdealtDamagetoAny() { + return !damagedThisGame.isEmpty(); + } + // used to see if an attacking creature with a triggering attack ability // triggered this phase: /** @@ -210,9 +215,6 @@ public class CardDamageHistory { */ public final void setCreatureBlockedThisCombat(final boolean b) { this.creatureBlockedThisCombat = b; - if (b) { - this.setCreatureBlockedThisTurn(true); - } } /** *

@@ -224,27 +226,6 @@ public class CardDamageHistory { public final boolean getCreatureBlockedThisCombat() { return this.creatureBlockedThisCombat; } - /** - *

- * Setter for the field creatureBlockedThisTurn. - *

- * - * @param b - * a boolean. - */ - public final void setCreatureBlockedThisTurn(final boolean b) { - this.creatureBlockedThisTurn = b; - } - /** - *

- * Getter for the field creatureBlockedThisTurn. - *

- * - * @return a boolean. - */ - public final boolean getCreatureBlockedThisTurn() { - return this.creatureBlockedThisTurn; - } /** *

* Setter for the field creatureGotBlockedThisCombat. @@ -255,9 +236,6 @@ public class CardDamageHistory { */ public final void setCreatureGotBlockedThisCombat(final boolean b) { this.creatureGotBlockedThisCombat = b; - if (b) { - this.setCreatureGotBlockedThisTurn(true); - } } /** *

@@ -269,50 +247,33 @@ public class CardDamageHistory { public final boolean getCreatureGotBlockedThisCombat() { return this.creatureGotBlockedThisCombat; } - /** - *

- * Setter for the field creatureGotBlockedThisTurn. - *

- * - * @param b - * a boolean. - */ - public final void setCreatureGotBlockedThisTurn(final boolean b) { - this.creatureGotBlockedThisTurn = b; - } - /** - *

- * Getter for the field creatureGotBlockedThisTurn. - *

- * - * @return a boolean. - */ - public final boolean getCreatureGotBlockedThisTurn() { - return this.creatureGotBlockedThisTurn; - } - public final List getThisCombatDamaged() { + public final Map getThisCombatDamaged() { return damagedThisCombat; } - public final List getThisTurnDamaged() { + public final Map getThisTurnDamaged() { return damagedThisTurn; } - public final List getThisTurnCombatDamaged() { + public final Map getThisTurnCombatDamaged() { return damagedThisTurnInCombat; } - public final List getThisGameDamaged() { + public final Map getThisGameDamaged() { return damagedThisGame; } /** * TODO: Write javadoc for this method. * @param player */ - public void registerCombatDamage(GameEntity entity) { - if (!damagedThisCombat.contains(entity)) { - damagedThisCombat.add(entity); + public void registerCombatDamage(GameEntity entity, int amount) { + int old = 0; + if (damagedThisCombat.containsKey(entity)) { + old = damagedThisCombat.get(entity); } - if (!damagedThisTurnInCombat.contains(entity)) { - damagedThisTurnInCombat.add(entity); + damagedThisCombat.put(entity, old + amount); + old = 0; + if (damagedThisTurnInCombat.containsKey(entity)) { + old = damagedThisTurnInCombat.get(entity); } + damagedThisTurnInCombat.put(entity, old + amount); } /** * TODO: Write javadoc for this method. @@ -331,13 +292,17 @@ public class CardDamageHistory { * TODO: Write javadoc for this method. * @param player */ - public void registerDamage(GameEntity entity) { - if (!damagedThisTurn.contains(entity)) { - damagedThisTurn.add(entity); + public void registerDamage(GameEntity entity, int amount) { + int old = 0; + if (damagedThisTurn.containsKey(entity)) { + old = damagedThisTurn.get(entity); } - if (!damagedThisGame.contains(entity)) { - damagedThisGame.add(entity); + damagedThisTurn.put(entity, old + amount); + old = 0; + if (damagedThisGame.containsKey(entity)) { + old = damagedThisGame.get(entity); } + damagedThisGame.put(entity, old + amount); } } diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 09f8a83d014..2783d5793ec 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -18,8 +18,6 @@ import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObjectPredicates; import forge.game.ability.AbilityKey; -import forge.game.keyword.Keyword; -import forge.game.spellability.SpellAbility; import forge.game.trigger.TriggerType; public class CardDamageMap extends ForwardingTable { @@ -50,7 +48,7 @@ public class CardDamageMap extends ForwardingTable { } } - public void triggerDamageDoneOnce(boolean isCombat, final Game game, final SpellAbility sa) { + public void triggerDamageDoneOnce(boolean isCombat, final Game game) { // Source -> Targets for (Map.Entry> e : rowMap().entrySet()) { final Card sourceLKI = e.getKey(); @@ -65,10 +63,6 @@ public class CardDamageMap extends ForwardingTable { runParams.put(AbilityKey.IsCombatDamage, isCombat); game.getTriggerHandler().runTrigger(TriggerType.DamageDealtOnce, runParams, false); - - if (sourceLKI.hasKeyword(Keyword.LIFELINK)) { - sourceLKI.getController().gainLife(sum, sourceLKI, sa); - } } } // Targets -> Source diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 16d8feeef76..b35d00512e4 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -220,7 +220,6 @@ public class CardFactory { return getCard(cp, owner, owner == null ? -1 : owner.getGame().nextCardId(), game); } public final static Card getCard(final IPaperCard cp, final Player owner, final int cardId, final Game game) { - //System.out.println(cardName); CardRules cardRules = cp.getRules(); final Card c = readCard(cardRules, cp, cardId, game); c.setRules(cardRules); @@ -853,8 +852,8 @@ public class CardFactory { final CardCloneStates result = new CardCloneStates(top, sa); result.put(state, ret); - // For transformed, melded or MDFC card, also copy the original state to avoid crash - if (state == CardStateName.Transformed || state == CardStateName.Meld || state == CardStateName.Modal) { + // For face down, flipped, transformed, melded or MDFC card, also copy the original state to avoid crash + if (state != CardStateName.Original) { final CardState ret1 = new CardState(card, CardStateName.Original); ret1.copyFrom(top.getState(CardStateName.Original, true), false); result.put(CardStateName.Original, ret1); 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 027c4e80dab..f1aaeaae705 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -19,17 +19,13 @@ package forge.game.card; import java.util.Arrays; import java.util.EnumSet; -import java.util.HashMap; -import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Map.Entry; import java.util.Set; import org.apache.commons.lang3.StringUtils; -import org.apache.commons.lang3.tuple.Pair; -import com.google.common.base.Function; import com.google.common.base.Predicate; import com.google.common.base.Predicates; import com.google.common.collect.ImmutableList; @@ -43,24 +39,18 @@ import forge.card.CardType; import forge.card.ColorSet; import forge.card.ICardFace; import forge.card.MagicColor; -import forge.card.mana.ManaAtom; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; -import forge.card.mana.ManaCostShard; import forge.game.Game; -import forge.game.GameEntity; import forge.game.GameEntityCounterTable; import forge.game.GameLogEntryType; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityUtils; import forge.game.ability.ApiType; -import forge.game.card.CardPredicates.Presets; import forge.game.cost.Cost; import forge.game.keyword.Keyword; import forge.game.keyword.KeywordInterface; -import forge.game.phase.PhaseHandler; import forge.game.player.Player; -import forge.game.player.PlayerCollection; import forge.game.replacement.ReplacementEffect; import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementLayer; @@ -76,11 +66,8 @@ import forge.game.staticability.StaticAbilityCantBeCast; import forge.game.trigger.Trigger; import forge.game.trigger.TriggerHandler; import forge.game.zone.ZoneType; -import forge.util.Aggregates; -import forge.util.Expressions; import forge.util.Lang; import forge.util.TextUtil; -import forge.util.collect.FCollectionView; import io.sentry.Sentry; import io.sentry.event.BreadcrumbBuilder; @@ -99,7 +86,7 @@ public class CardFactoryUtil { String abString = "AB$ Mana | Cost$ T | Produced$ " + strcolor + " | Secondary$ True | SpellDescription$ Add {" + strcolor + "}."; SpellAbility sa = AbilityFactory.getAbility(abString, state); - sa.setIntrinsic(true); // always intristic + sa.setIntrinsic(true); // always intrisic return sa; } @@ -247,26 +234,6 @@ public class CardFactoryUtil { return AbilityFactory.getAbility(ab, sourceCard); } - // does "target" have protection from "card"? - /** - *

- * hasProtectionFrom. - *

- * - * @param card - * a {@link forge.game.card.Card} object. - * @param target - * a {@link forge.game.card.Card} object. - * @return a boolean. - */ - public static boolean hasProtectionFrom(final Card card, final Card target) { - if (target == null) { - return false; - } - - return target.hasProtectionFrom(card); - } - /** *

* isCounterable. @@ -343,1566 +310,6 @@ public class CardFactoryUtil { return l.length > 1 ? l[1] : null; } - /** - *

- * Parse player targeted X variables. - *

- * - * @param objects - * a {@link java.util.ArrayList} object. - * @param s - * a {@link java.lang.String} object. - * @param source - * a {@link forge.game.card.Card} object. - * @return a int. - */ - public static int objectXCount(final List objects, final String s, final Card source) { - if (objects.isEmpty()) { - return 0; - } - - if (s.startsWith("Valid")) { - return CardFactoryUtil.handlePaid(Iterables.filter(objects, Card.class), s, source); - } - - int n = s.startsWith("Amount") ? objects.size() : 0; - return doXMath(n, extractOperators(s), source); - } - - /** - *

- * Parse player targeted X variables. - *

- * - * @param players - * a {@link java.util.ArrayList} object. - * @param s - * a {@link java.lang.String} object. - * @param source - * a {@link forge.game.card.Card} object. - * @return a int. - */ - public static int playerXCount(final List players, final String s, final Card source) { - if (players.size() == 0) { - return 0; - } - - final String[] l = s.split("/"); - final String m = extractOperators(s); - - int n = 0; - - if (l[0].startsWith("TotalCommanderCastFromCommandZone")) { - int totCast = 0; - for (Player p : players) { - totCast += p.getTotalCommanderCast(); - } - return doXMath(totCast, m, source); - } - - // methods for getting the highest/lowest playerXCount from a range of players - if (l[0].startsWith("Highest")) { - for (final Player player : players) { - final int current = playerXProperty(player, TextUtil.fastReplace(s, "Highest", ""), source); - if (current > n) { - n = current; - } - } - - return doXMath(n, m, source); - } - - if (l[0].startsWith("Lowest")) { - n = 99999; // if no players have fewer than 99999 valids, the game is frozen anyway - for (final Player player : players) { - final int current = playerXProperty(player, TextUtil.fastReplace(s, "Lowest", ""), source); - if (current < n) { - n = current; - } - } - return doXMath(n, m, source); - } - - if (l[0].startsWith("TiedForHighestLife")) { - int maxLife = Integer.MIN_VALUE; - for (final Player player : players) { - int highestTotal = playerXProperty(player, "LifeTotal", source); - if (highestTotal > maxLife) { - maxLife = highestTotal; - } - } - int numTied = 0; - for (final Player player : players) { - if (player.getLife() == maxLife) { - numTied++; - } - } - return doXMath(numTied, m, source); - } - - if (l[0].startsWith("TiedForLowestLife")) { - int minLife = Integer.MAX_VALUE; - for (final Player player : players) { - int lowestTotal = playerXProperty(player, "LifeTotal", source); - if (lowestTotal < minLife) { - minLife = lowestTotal; - } - } - int numTied = 0; - for (final Player player : players) { - if (player.getLife() == minLife) { - numTied++; - } - } - return doXMath(numTied, m, source); - } - - final String[] sq; - sq = l[0].split("\\."); - - // the number of players passed in - if (sq[0].equals("Amount")) { - return doXMath(players.size(), m, source); - } - - if (sq[0].startsWith("HasProperty")) { - int totPlayer = 0; - String property = sq[0].substring(11); - for (Player p : players) { - if (p.hasProperty(property, source.getController(), source, null)) { - totPlayer++; - } - } - return doXMath(totPlayer, m, source); - } - - if (sq[0].contains("DamageThisTurn")) { - int totDmg = 0; - for (Player p : players) { - totDmg += p.getAssignedDamage(); - } - return doXMath(totDmg, m, source); - } else if (sq[0].contains("LifeLostThisTurn")) { - int totDmg = 0; - for (Player p : players) { - totDmg += p.getLifeLostThisTurn(); - } - return doXMath(totDmg, m, source); - } - - if (players.size() > 0) { - int totCount = 0; - for (Player p : players) { - totCount += playerXProperty(p, s, source); - } - return totCount; - } - - return doXMath(n, m, source); - } - - public static int playerXProperty(final Player player, final String s, final Card source) { - final String[] l = s.split("/"); - final String m = extractOperators(s); - - final Game game = player.getGame(); - - // count valid cards in any specified zone/s - if (l[0].startsWith("Valid") && !l[0].contains("Valid ")) { - String[] lparts = l[0].split(" ", 2); - final List vZone = ZoneType.listValueOf(lparts[0].split("Valid")[1]); - String restrictions = TextUtil.fastReplace(l[0], TextUtil.addSuffix(lparts[0]," "), ""); - final String[] rest = restrictions.split(","); - CardCollection cards = CardLists.getValidCards(game.getCardsIn(vZone), rest, player, source, null); - return doXMath(cards.size(), m, source); - } - - // count valid cards on the battlefield - if (l[0].startsWith("Valid ")) { - final String restrictions = l[0].substring(6); - final String[] rest = restrictions.split(","); - CardCollection cardsonbattlefield = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), rest, player, source, null); - return doXMath(cardsonbattlefield.size(), m, source); - } - - final String[] sq = l[0].split("\\."); - final String value = sq[0]; - - if (value.contains("CardsInHand")) { - return doXMath(player.getCardsIn(ZoneType.Hand).size(), m, source); - } - - if (value.contains("NumPowerSurgeLands")) { - return doXMath(player.getNumPowerSurgeLands(), m, source); - } - - if (value.contains("DomainPlayer")) { - int n = 0; - final CardCollectionView someCards = player.getCardsIn(ZoneType.Battlefield); - final List basic = MagicColor.Constant.BASIC_LANDS; - - for (int i = 0; i < basic.size(); i++) { - if (!CardLists.getType(someCards, basic.get(i)).isEmpty()) { - n++; - } - } - return doXMath(n, m, source); - } - - if (value.contains("CardsInLibrary")) { - return doXMath(player.getCardsIn(ZoneType.Library).size(), m, source); - } - - if (value.contains("CardsInGraveyard")) { - return doXMath(player.getCardsIn(ZoneType.Graveyard).size(), m, source); - } - if (value.contains("LandsInGraveyard")) { - return doXMath(CardLists.getType(player.getCardsIn(ZoneType.Graveyard), "Land").size(), m, source); - } - - if (value.contains("CreaturesInPlay")) { - return doXMath(player.getCreaturesInPlay().size(), m, source); - } - - if (value.contains("CardsInPlay")) { - return doXMath(player.getCardsIn(ZoneType.Battlefield).size(), m, source); - } - - if (value.contains("StartingLife")) { - return doXMath(player.getStartingLife(), m, source); - } - - if (value.contains("LifeTotal")) { - return doXMath(player.getLife(), m, source); - } - - if (value.contains("LifeLostThisTurn")) { - return doXMath(player.getLifeLostThisTurn(), m, source); - } - - if (value.contains("LifeLostLastTurn")) { - return doXMath(player.getLifeLostLastTurn(), m, source); - } - - if (value.contains("LifeGainedThisTurn")) { - return doXMath(player.getLifeGainedThisTurn(), m, source); - } - - if (value.contains("LifeGainedByTeamThisTurn")) { - return doXMath(player.getLifeGainedByTeamThisTurn(), m, source); - } - - if (value.contains("LifeStartedThisTurnWith")) { - return doXMath(player.getLifeStartedThisTurnWith(), m, source); - } - - if (value.contains("PoisonCounters")) { - return doXMath(player.getPoisonCounters(), m, source); - } - - if (value.contains("TopOfLibraryCMC")) { - return doXMath(Aggregates.sum(player.getCardsIn(ZoneType.Library, 1), CardPredicates.Accessors.fnGetCmc), m, source); - } - - if (value.contains("LandsPlayed")) { - return doXMath(player.getLandsPlayedThisTurn(), m, source); - } - - if (value.contains("CardsDrawn")) { - return doXMath(player.getNumDrawnThisTurn(), m, source); - } - - if (value.contains("CardsDiscardedThisTurn")) { - return doXMath(player.getNumDiscardedThisTurn(), m, source); - } - - if (value.contains("TokensCreatedThisTurn")) { - return doXMath(player.getNumTokensCreatedThisTurn(), m, source); - } - - if (value.contains("AttackersDeclared")) { - return doXMath(player.getAttackersDeclaredThisTurn(), m, source); - } - - if (value.equals("DamageDoneToPlayerBy")) { - return doXMath(source.getDamageDoneToPlayerBy(player.getName()), m, source); - } - - if (value.contains("DamageToOppsThisTurn")) { - int oppDmg = 0; - for (Player opp : player.getOpponents()) { - oppDmg += opp.getAssignedDamage(); - } - return doXMath(oppDmg, m, source); - } - - if (value.contains("NonCombatDamageDealtThisTurn")) { - return doXMath(player.getAssignedDamage() - player.getAssignedCombatDamage(), m, source); - } - - if (value.equals("OpponentsAttackedThisTurn")) { - return doXMath(player.getAttackedOpponentsThisTurn().size(), m, source); - } - - return doXMath(0, m, source); - } - - /** - *

- * Parse non-mana X variables. - *

- * - * @param c - * a {@link forge.game.card.Card} object. - * @param expression - * a {@link java.lang.String} object. - * @return a int. - */ - public static int xCount(final Card c, final String expression) { - if (StringUtils.isBlank(expression) || c == null) { - return 0; - } - if (StringUtils.isNumeric(expression)) { - return Integer.parseInt(expression); - } - - final Player cc = c.getController(); - final Game game = c.getGame(); - final Player activePlayer = game.getPhaseHandler().getPlayerTurn(); - - final String[] l = expression.split("/"); - final String m = extractOperators(expression); - - // accept straight numbers - if (l[0].startsWith("Number$")) { - final String number = l[0].substring(7); - if (number.equals("ChosenNumber")) { - int x = c.getChosenNumber() == null ? 0 : c.getChosenNumber(); - return doXMath(x, m, c); - } - return doXMath(Integer.parseInt(number), m, c); - } - - if (l[0].startsWith("Count$")) { - l[0] = l[0].substring(6); - } - - if (l[0].startsWith("SVar$")) { - return doXMath(xCount(c, c.getSVar(l[0].substring(5))), m, c); - } - - if (l[0].startsWith("Controller$")) { - return playerXProperty(cc, l[0].substring(11), c); - } - - // Manapool - if (l[0].startsWith("ManaPool")) { - final String color = l[0].split(":")[1]; - if (color.equals("All")) { - return cc.getManaPool().totalMana(); - } - return cc.getManaPool().getAmountOfColor(ManaAtom.fromName(color)); - } - - // count valid cards in any specified zone/s - if (l[0].startsWith("Valid")) { - String[] lparts = l[0].split(" ", 2); - final String[] rest = lparts[1].split(","); - - final CardCollectionView cardsInZones = lparts[0].length() > 5 - ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(5))) - : game.getCardsIn(ZoneType.Battlefield); - - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c, null); - return doXMath(cards.size(), m, c); - } - - if (l[0].startsWith("ImprintedCardManaCost") && !c.getImprintedCards().isEmpty()) { - return c.getImprintedCards().get(0).getCMC(); - } - - if (l[0].startsWith("GreatestPower")) { - final String[] lparts = l[0].split("_", 2); - final String[] rest = lparts[1].split(","); - final CardCollectionView cardsInZones = lparts[0].length() > 13 - ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(13))) - : game.getCardsIn(ZoneType.Battlefield); - CardCollection list = CardLists.getValidCards(cardsInZones, rest, cc, c, null); - int highest = 0; - for (final Card crd : list) { - if (crd.getNetPower() > highest) { - highest = crd.getNetPower(); - } - } - return highest; - } - - if (l[0].startsWith("GreatestToughness_")) { - final String restriction = l[0].substring(18); - final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); - int highest = 0; - for (final Card crd : list) { - if (crd.getNetToughness() > highest) { - highest = crd.getNetToughness(); - } - } - return highest; - } - - if (l[0].startsWith("HighestCMC_")) { - final String restriction = l[0].substring(11); - final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c, null); - int highest = 0; - for (final Card crd : list) { - // dont check for Split card anymore - if (crd.getCMC() > highest) { - highest = crd.getCMC(); - } - } - return highest; - } - - if (l[0].startsWith("MostCardName")) { - String[] lparts = l[0].split(" ", 2); - final String[] rest = lparts[1].split(","); - - final CardCollectionView cardsInZones = lparts[0].length() > 12 - ? game.getCardsIn(ZoneType.listValueOf(lparts[0].substring(12))) - : game.getCardsIn(ZoneType.Battlefield); - - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c, null); - final Map map = Maps.newHashMap(); - for (final Card card : cards) { - // Remove Duplicated types - final String name = card.getName(); - Integer count = map.get(name); - map.put(name, count == null ? 1 : count + 1); - } - int max = 0; - for (final Entry entry : map.entrySet()) { - if (max < entry.getValue()) { - max = entry.getValue(); - } - } - return max; - } - - if (l[0].startsWith("DifferentCardNames_")) { - final List crdname = Lists.newArrayList(); - final String restriction = l[0].substring(19); - final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsInGame(), rest, cc, c, null); - for (final Card card : list) { - String name = card.getName(); - // CR 201.2b Those objects have different names only if each of them has at least one name and no two objects in that group have a name in common - if (!crdname.contains(name) && !name.isEmpty()) { - crdname.add(name); - } - } - return doXMath(crdname.size(), m, c); - } - - if (l[0].startsWith("DifferentPower_")) { - final List powers = Lists.newArrayList(); - final String restriction = l[0].substring(15); - final String[] rest = restriction.split(","); - CardCollection list = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); - for (final Card card : list) { - Integer pow = card.getNetPower(); - if (!powers.contains(pow)) { - powers.add(pow); - } - } - return doXMath(powers.size(), m, c); - } - - if (l[0].startsWith("RememberedSize")) { - return doXMath(c.getRememberedCount(), m, c); - } - - if (l[0].startsWith("RememberedNumber")) { - int num = 0; - for (final Object o : c.getRemembered()) { - if (o instanceof Integer) { - num += (Integer) o; - } - } - return doXMath(num, m, c); - } - - if (l[0].startsWith("RememberedWithSharedCardType")) { - int maxNum = 1; - for (final Object o : c.getRemembered()) { - if (o instanceof Card) { - int num = 1; - Card firstCard = (Card) o; - for (final Object p : c.getRemembered()) { - if (p instanceof Card) { - Card secondCard = (Card) p; - if (!firstCard.equals(secondCard) && firstCard.sharesCardTypeWith(secondCard)) { - num++; - } - } - } - if (num > maxNum) { - maxNum = num; - } - } - } - return doXMath(maxNum, 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); - } - - if (l[0].startsWith("TotalCommanderCastFromCommandZone")) { - return doXMath(cc.getTotalCommanderCast(), m, c); - } - - if (l[0].startsWith("MostProminentCreatureType")) { - String restriction = l[0].split(" ")[1]; - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c, null); - return doXMath(getMostProminentCreatureTypeSize(list), m, c); - } - - if (l[0].startsWith("SecondMostProminentColor")) { - String restriction = l[0].split(" ")[1]; - CardCollection list = CardLists.getValidCards(game.getCardsIn(ZoneType.Battlefield), restriction, cc, c, null); - int[] colorSize = SortColorsFromList(list); - return doXMath(colorSize[colorSize.length - 2], m, c); - } - - if (l[0].startsWith("RolledThisTurn")) { - return game.getPhaseHandler().getPlanarDiceRolledthisTurn(); - } - - //SacrificedThisTurn - if (l[0].startsWith("SacrificedThisTurn")) { - CardCollectionView list = cc.getSacrificedThisTurn(); - if (l[0].contains(" ")) { - String[] lparts = l[0].split(" ", 2); - String restrictions = TextUtil.fastReplace(l[0], TextUtil.addSuffix(lparts[0]," "), ""); - final String[] rest = restrictions.split(","); - list = CardLists.getValidCards(list, rest, cc, c, null); - } - return doXMath(list.size(), m, c); - } - - final String[] sq; - sq = l[0].split("\\."); - - if (sq[0].contains("xPaid")) { - return doXMath(c.getXManaCostPaid(), m, c); - } - - if (sq[0].contains("xColorPaid")) { - String[] attrs = sq[0].split(" "); - StringBuilder colors = new StringBuilder(); - for (int i = 1; i < attrs.length; i++) { - colors.append(attrs[i]); - } - return doXMath(c.getXManaCostPaidCount(colors.toString()), m, c); - } - - if (sq[0].equals("YouCycledThisTurn")) { - return doXMath(cc.getCycledThisTurn(), m, c); - } - - if (sq[0].equals("YouDrewThisTurn")) { - return doXMath(cc.getNumDrawnThisTurn(), m, c); - } - - if (sq[0].equals("YouSurveilThisTurn")) { - return doXMath(cc.getSurveilThisTurn(), m, c); - } - - if (sq[0].equals("YouCastThisGame")) { - return doXMath(cc.getSpellsCastThisGame(), m, c); - } - - if (sq[0].equals("StormCount")) { - return doXMath(game.getStack().getSpellsCastThisTurn().size() - 1, m, c); - } - if (sq[0].startsWith("DamageDoneByPlayerThisTurn")) { - int sum = 0; - for (Player p : AbilityUtils.getDefinedPlayers(c, sq[1], null)) { - sum += c.getReceivedDamageByPlayerThisTurn(p); - } - return doXMath(sum, m, c); - } - if (sq[0].equals("DamageDoneThisTurn")) { - return doXMath(c.getDamageDoneThisTurn(), m, c); - } - if (sq[0].equals("BloodthirstAmount")) { - return doXMath(cc.getBloodthirstAmount(), m, c); - } - if (sq[0].equals("RegeneratedThisTurn")) { - return doXMath(c.getRegeneratedThisTurn(), m, c); - } - - if (sq[0].contains("YourStartingLife")) { - return doXMath(cc.getStartingLife(), m, c); - } - - if (sq[0].contains("YourLifeTotal")) { - return doXMath(cc.getLife(), m, c); - } - if (sq[0].contains("OppGreatestLifeTotal")) { - return doXMath(cc.getOpponentsGreatestLifeTotal(), m, c); - } - if (sq[0].contains("OppsAtLifeTotal")) { - final int lifeTotal = xCount(c, sq[1]); - int number = 0; - for (final Player opp : cc.getOpponents()) { - if (opp.getLife() == lifeTotal) { - number++; - } - } - return doXMath(number, m, c); - } - - // Count$TargetedLifeTotal (targeted player's life total) - if (sq[0].contains("TargetedLifeTotal")) { - // This doesn't work in some circumstances, since the active SA isn't passed through - for (final SpellAbility sa : c.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) { - return doXMath(tgtP.getLife(), m, c); - } - } - } - } - - if (sq[0].contains("LifeYouLostThisTurn")) { - return doXMath(cc.getLifeLostThisTurn(), m, c); - } - if (sq[0].contains("LifeYouGainedThisTurn")) { - return doXMath(cc.getLifeGainedThisTurn(), m, c); - } - if (sq[0].contains("LifeYourTeamGainedThisTurn")) { - return doXMath(cc.getLifeGainedByTeamThisTurn(), m, c); - } - if (sq[0].contains("LifeYouGainedTimesThisTurn")) { - return doXMath(cc.getLifeGainedTimesThisTurn(), m, c); - } - if (sq[0].contains("LifeOppsLostThisTurn")) { - return doXMath(cc.getOpponentLostLifeThisTurn(), m, c); - } - if (sq[0].equals("TotalDamageDoneByThisTurn")) { - return doXMath(c.getTotalDamageDoneBy(), m, c); - } - if (sq[0].equals("TotalDamageReceivedThisTurn")) { - return doXMath(c.getTotalDamageRecievedThisTurn(), m, c); - } - - if (sq[0].startsWith("YourCounters")) { - // "YourCountersExperience" or "YourCountersPoison" - String counterType = sq[0].substring(12); - return doXMath(cc.getCounters(CounterType.getType(counterType)), m, c); - } - - if (sq[0].contains("YourPoisonCounters")) { - return doXMath(cc.getPoisonCounters(), m, c); - } - if (sq[0].contains("TotalOppPoisonCounters")) { - return doXMath(cc.getOpponentsTotalPoisonCounters(), m, c); - } - - if (sq[0].contains("YourDamageThisTurn")) { - return doXMath(cc.getAssignedDamage(), m, c); - } - if (sq[0].contains("TotalOppDamageThisTurn")) { - return doXMath(cc.getOpponentsAssignedDamage(), m, c); - } - if (sq[0].contains("MaxOppDamageThisTurn")) { - return doXMath(cc.getMaxOpponentAssignedDamage(), m, c); - } - - // Count$YourTypeDamageThisTurn Type - if (sq[0].contains("YourTypeDamageThisTurn")) { - return doXMath(cc.getAssignedDamage(sq[0].split(" ")[1]), m, c); - } - if (sq[0].contains("YourDamageSourcesThisTurn")) { - Iterable allSrc = cc.getAssignedDamageSources(); - String restriction = sq[0].split(" ")[1]; - CardCollection filtered = CardLists.getValidCards(allSrc, restriction, cc, c, null); - return doXMath(filtered.size(), m, c); - } - - if (sq[0].contains("YourLandsPlayed")) { - return doXMath(cc.getLandsPlayedThisTurn(), m, c); - } - - // Count$TopOfLibraryCMC - if (sq[0].contains("TopOfLibraryCMC")) { - int cmc = cc.getCardsIn(ZoneType.Library).isEmpty() ? 0 : - cc.getCardsIn(ZoneType.Library).getFirst().getCMC(); - return doXMath(cmc, m, c); - } - - // Count$EnchantedControllerCreatures - if (sq[0].contains("EnchantedControllerCreatures")) { - if (c.getEnchantingCard() != null) { - return CardLists.count(c.getEnchantingCard().getController().getCardsIn(ZoneType.Battlefield), CardPredicates.Presets.CREATURES); - } - return 0; - } - - // Count$Chroma. - if (sq[0].contains("Chroma")) { - ZoneType sourceZone = sq[0].contains("ChromaInGrave") ? ZoneType.Graveyard : ZoneType.Battlefield; - final CardCollectionView cards; - if (sq[0].contains("ChromaSource")) { // Runs Chroma for passed in Source card - cards = new CardCollection(c); - } - else { - cards = cc.getCardsIn(sourceZone); - } - - int colorOcurrencices = 0; - byte colorCode = ManaAtom.fromName(sq[1]); - for (Card c0 : cards) { - for (ManaCostShard sh : c0.getManaCost()){ - if ((sh.getColorMask() & colorCode) != 0) - colorOcurrencices++; - } - } - return doXMath(colorOcurrencices, m, c); - } - // Count$DevotionDual.. - // Count$Devotion. - if (sq[0].contains("Devotion")) { - int colorOcurrencices = 0; - String colorName = sq[1]; - if (colorName.contains("Chosen")) { - colorName = MagicColor.toShortString(c.getChosenColor()); - } - byte colorCode = ManaAtom.fromName(colorName); - if (sq[0].equals("DevotionDual")) { - colorCode |= ManaAtom.fromName(sq[2]); - } - for (Card c0 : cc.getCardsIn(ZoneType.Battlefield)) { - for (ManaCostShard sh : c0.getManaCost()) { - if ((sh.getColorMask() & colorCode) != 0) { - colorOcurrencices++; - } - } - colorOcurrencices += c0.getAmountOfKeyword("Your devotion to each color and each combination of colors is increased by one."); - } - return doXMath(colorOcurrencices, m, c); - } - - if (sq[0].contains("ColorsCtrl")) { - final String restriction = l[0].substring(11); - final String[] rest = restriction.split(","); - final CardCollection list = CardLists.getValidCards(cc.getCardsIn(ZoneType.Battlefield), rest, cc, c, null); - byte n = 0; - for (final Card card : list) { - n |= card.determineColor().getColor(); - } - return doXMath(ColorSet.fromMask(n).countColors(), m, c); - } - - if (sq[0].equals("ColorsColorIdentity")) { - return doXMath(c.getController().getCommanderColorID().countColors(), m, c); - } - - if (sq[0].contains("CreatureType")) { - String[] sqparts = l[0].split(" ", 2); - final String[] rest = sqparts[1].split(","); - - final CardCollectionView cardsInZones = sqparts[0].length() > 12 - ? game.getCardsIn(ZoneType.listValueOf(sqparts[0].substring(12))) - : game.getCardsIn(ZoneType.Battlefield); - - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c, null); - final Set creatTypes = Sets.newHashSet(); - - for (Card card : cards) { - Iterables.addAll(creatTypes, card.getType().getCreatureTypes()); - } - int n = creatTypes.contains(CardType.AllCreatureTypes) ? CardType.getAllCreatureTypes().size() : creatTypes.size(); - return doXMath(n, m, c); - } - - if (sq[0].contains("ExactManaCost")) { - String[] sqparts = l[0].split(" ", 2); - final String[] rest = sqparts[1].split(","); - - final CardCollectionView cardsInZones = sqparts[0].length() > 13 - ? game.getCardsIn(ZoneType.listValueOf(sqparts[0].substring(13))) - : game.getCardsIn(ZoneType.Battlefield); - - CardCollection cards = CardLists.getValidCards(cardsInZones, rest, cc, c, null); - final Set manaCost = Sets.newHashSet(); - - for (Card card : cards) { - manaCost.add(card.getManaCost().getShortString()); - } - - return doXMath(manaCost.size(), m, c); - } - - if (sq[0].contains("Hellbent")) { - return doXMath(Integer.parseInt(sq[cc.hasHellbent() ? 1 : 2]), m, c); - } - if (sq[0].contains("Metalcraft")) { - return doXMath(Integer.parseInt(sq[cc.hasMetalcraft() ? 1 : 2]), m, c); - } - if (sq[0].contains("Delirium")) { - return doXMath(Integer.parseInt(sq[cc.hasDelirium() ? 1 : 2]), m, c); - } - if (sq[0].contains("FatefulHour")) { - return doXMath(Integer.parseInt(sq[cc.getLife() <= 5 ? 1 : 2]), m, c); - } - if (sq[0].contains("Revolt")) { - return doXMath(Integer.parseInt(sq[cc.hasRevolt() ? 1 : 2]), m, c); - } - if (sq[0].contains("Landfall")) { - return doXMath(Integer.parseInt(sq[cc.hasLandfall() ? 1 : 2]), m, c); - } - if (sq[0].contains("Monarch")) { - return doXMath(Integer.parseInt(sq[cc.isMonarch() ? 1 : 2]), m, c); - } - if (sq[0].contains("Blessing")) { - return doXMath(Integer.parseInt(sq[cc.hasBlessing() ? 1 : 2]), m, c); - } - if (sq[0].contains("Threshold")) { - return doXMath(Integer.parseInt(sq[cc.hasThreshold() ? 1 : 2]), m, c); - } - if (sq[0].contains("Averna")) { - String str = "As you cascade, you may put a land card from among the exiled cards onto the " + - "battlefield tapped."; - return cc.getKeywords().getAmount(str); - } - if (sq[0].startsWith("Kicked")) { - return doXMath(Integer.parseInt(sq[c.getKickerMagnitude() > 0 ? 1 : 2]), m, c); - } - if (sq[0].startsWith("Escaped")) { - return doXMath(Integer.parseInt(sq[c.getCastSA() != null && c.getCastSA().isEscape() ? 1 : 2]), m, c); - } - if (sq[0].startsWith("AltCost")) { - return doXMath(Integer.parseInt(sq[c.isOptionalCostPaid(OptionalCost.AltCost) ? 1 : 2]), m, c); - } - - // Count$wasCastFrom.. - if (sq[0].startsWith("wasCastFrom")) { - boolean zonesMatch = c.getCastFrom() == ZoneType.smartValueOf(sq[0].substring(11)); - return doXMath(Integer.parseInt(sq[zonesMatch ? 1 : 2]), m, c); - } - - if (sq[0].startsWith("Devoured")) { - final String validDevoured = l[0].split(" ")[1]; - CardCollection cl = CardLists.getValidCards(c.getDevouredCards(), validDevoured.split(","), cc, c, null); - return doXMath(cl.size(), m, c); - } - - if (sq[0].contains("Party")) { - CardCollection adventurers = CardLists.getValidCards(cc.getCardsIn(ZoneType.Battlefield), - "Creature.Cleric,Creature.Rogue,Creature.Warrior,Creature.Wizard", cc, c, null); - - Set partyTypes = new HashSet<>(Arrays.asList(new String[]{"Cleric", "Rogue", "Warrior", "Wizard"})); - int partySize = 0; - - HashMap chosenParty = new HashMap<>(); - List wildcard = Lists.newArrayList(); - HashMap> multityped = new HashMap<>(); - - // Figure out how to count each class separately. - for (Card card : adventurers) { - Set creatureTypes = card.getType().getCreatureTypes(); - boolean anyType = creatureTypes.contains(CardType.AllCreatureTypes); - creatureTypes.retainAll(partyTypes); - - if (anyType || creatureTypes.size() == 4) { - wildcard.add(card); - - if (wildcard.size() >= 4) { - break; - } - continue; - } else if (creatureTypes.size() == 1) { - String type = (String)(creatureTypes.toArray()[0]); - - if (!chosenParty.containsKey(type)) { - chosenParty.put(type, card); - } - } else { - multityped.put(card, creatureTypes); - } - } - - partySize = Math.min(chosenParty.size() + wildcard.size(), 4); - - if (partySize < 4) { - partyTypes.removeAll(chosenParty.keySet()); - - // Here I'm left with just the party types that I haven't selected. - for(Card multi : multityped.keySet()) { - Set types = multityped.get(multi); - types.retainAll(partyTypes); - - for(String type : types) { - chosenParty.put(type, multi); - partyTypes.remove(type); - break; - } - } - } - - partySize = Math.min(chosenParty.size() + wildcard.size(), 4); - - return doXMath(partySize, m, c); - } - - if (sq[0].contains("CardPower")) { - return doXMath(c.getNetPower(), m, c); - } - if (sq[0].contains("CardToughness")) { - return doXMath(c.getNetToughness(), m, c); - } - if (sq[0].contains("CardSumPT")) { - return doXMath((c.getNetPower() + c.getNetToughness()), m, c); - } - - // Count$SumPower_valid - if (sq[0].contains("SumPower")) { - final String[] restrictions = l[0].split("_"); - final String[] rest = restrictions[1].split(","); - CardCollection filteredCards = CardLists.getValidCards(cc.getGame().getCardsIn(ZoneType.Battlefield), rest, cc, c, null); - return doXMath(Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetNetPower), m, c); - } - // Count$CardManaCost - if (sq[0].contains("CardManaCost")) { - Card ce; - if (sq[0].contains("Equipped") && c.isEquipping()) { - ce = c.getEquipping(); - } - else if (sq[0].contains("Remembered")) { - ce = (Card) c.getFirstRemembered(); - } - else { - ce = c; - } - - return doXMath(ce == null ? 0 : ce.getCMC(), m, c); - } - // Count$SumCMC_valid - if (sq[0].contains("SumCMC")) { - ZoneType zone = ZoneType.Battlefield; - //graveyard support for Inferno Project (may need other zones or multi-zone in future) - if (sq[0].contains("Graveyard")) - zone = ZoneType.Graveyard; - final String[] restrictions = l[0].split("_"); - final String[] rest = restrictions[1].split(","); - CardCollectionView cardsonbattlefield = game.getCardsIn(zone); - CardCollection filteredCards = CardLists.getValidCards(cardsonbattlefield, rest, cc, c, null); - return Aggregates.sum(filteredCards, CardPredicates.Accessors.fnGetCmc); - } - - if (sq[0].contains("CardNumColors")) { - return doXMath(CardUtil.getColors(c).countColors(), m, c); - } - if (sq[0].contains("CardNumAttacksThisTurn")) { - return doXMath(c.getDamageHistory().getCreatureAttacksThisTurn(), m, c); - } - if (sq[0].contains("ChosenNumber")) { - Integer i = c.getChosenNumber(); - return doXMath(i == null ? 0 : i, m, c); - } - if (sq[0].contains("CardCounters")) { - // CardCounters.ALL to be used for Kinsbaile Borderguard and anything that cares about all counters - int count = 0; - if (sq[1].equals("ALL")) { - for (Integer i : c.getCounters().values()) { - if (i != null && i > 0) { - count += i; - } - } - } - else { - count = c.getCounters(CounterType.getType(sq[1])); - } - return doXMath(count, m, c); - } - - // Count$TotalCounters._ - if (sq[0].contains("TotalCounters")) { - final String[] restrictions = l[0].split("_"); - final CounterType cType = CounterType.getType(restrictions[1]); - final String[] validFilter = restrictions[2].split(","); - CardCollectionView validCards = game.getCardsIn(ZoneType.Battlefield); - validCards = CardLists.getValidCards(validCards, validFilter, cc, c, null); - int cCount = 0; - for (final Card card : validCards) { - cCount += card.getCounters(cType); - } - return doXMath(cCount, m, c); - } - - if (sq[0].contains("CardControllerTypes")) { - return doXMath(getCardTypesFromList(cc.getCardsIn(ZoneType.listValueOf(sq[1]))), m, c); - } - - if (sq[0].contains("CardTypes")) { - return doXMath(getCardTypesFromList(game.getCardsIn(ZoneType.smartValueOf(sq[1]))), m, c); - } - - if (sq[0].contains("OppTypesInGrave")) { - final PlayerCollection opponents = cc.getOpponents(); - CardCollection oppCards = new CardCollection(); - oppCards.addAll(opponents.getCardsIn(ZoneType.Graveyard)); - return doXMath(getCardTypesFromList(oppCards), m, c); - } - - if (sq[0].contains("BushidoPoint")) { - return doXMath(c.getKeywordMagnitude(Keyword.BUSHIDO), m, c); - } - if (sq[0].contains("TimesKicked")) { - return doXMath(c.getKickerMagnitude(), m, c); - } - if (sq[0].contains("TimesPseudokicked")) { - return doXMath(c.getPseudoKickerMagnitude(), m, c); - } - if (sq[0].contains("TimesMutated")) { - return doXMath(c.getTimesMutated(), m, c); - } - - // Count$IfCastInOwnMainPhase.. // 7/10 - if (sq[0].contains("IfCastInOwnMainPhase")) { - final PhaseHandler cPhase = cc.getGame().getPhaseHandler(); - final boolean isMyMain = cPhase.getPhase().isMain() && cPhase.getPlayerTurn().equals(cc) && c.getCastFrom() != null; - return doXMath(Integer.parseInt(sq[isMyMain ? 1 : 2]), m, c); - } - - // Count$ThisTurnEntered [from ] - if (sq[0].contains("ThisTurnEntered")) { - final String[] workingCopy = l[0].split("_"); - - ZoneType destination = ZoneType.smartValueOf(workingCopy[1]); - final boolean hasFrom = workingCopy[2].equals("from"); - ZoneType origin = hasFrom ? ZoneType.smartValueOf(workingCopy[3]) : null; - String validFilter = workingCopy[hasFrom ? 4 : 2] ; - - final List res = CardUtil.getThisTurnEntered(destination, origin, validFilter, c); - if (origin == null) { // Remove cards on the battlefield that changed controller - res.removeAll(CardUtil.getThisTurnEntered(destination, destination, validFilter, c)); - } - return doXMath(res.size(), m, c); - } - - // Count$LastTurnEntered [from ] - if (sq[0].contains("LastTurnEntered")) { - final String[] workingCopy = l[0].split("_"); - - ZoneType destination = ZoneType.smartValueOf(workingCopy[1]); - final boolean hasFrom = workingCopy[2].equals("from"); - ZoneType origin = hasFrom ? ZoneType.smartValueOf(workingCopy[3]) : null; - String validFilter = workingCopy[hasFrom ? 4 : 2] ; - - final List res = CardUtil.getLastTurnEntered(destination, origin, validFilter, c); - if (origin == null) { // Remove cards on the battlefield that changed controller - res.removeAll(CardUtil.getLastTurnEntered(destination, destination, validFilter, c)); - } - return doXMath(res.size(), m, c); - } - - // Count$AttackersDeclared - if (sq[0].contains("AttackersDeclared")) { - return doXMath(cc.getAttackersDeclaredThisTurn(), m, c); - } - - // Count$CardAttackedThisTurn_ - if (sq[0].contains("CreaturesAttackedThisTurn")) { - final String[] workingCopy = l[0].split("_"); - final String validFilter = workingCopy[1]; - return doXMath(CardLists.getType(cc.getCreaturesAttackedThisTurn(), validFilter).size(), m, c); - } - - // Count$ThisTurnCast - // Count$LastTurnCast - if (sq[0].contains("ThisTurnCast") || sq[0].contains("LastTurnCast")) { - - final String[] workingCopy = l[0].split("_"); - final String validFilter = workingCopy[1]; - - List res = Lists.newArrayList(); - if (workingCopy[0].contains("This")) { - res = CardUtil.getThisTurnCast(validFilter, c); - } - else { - res = CardUtil.getLastTurnCast(validFilter, c); - } - - final int ret = doXMath(res.size(), m, c); - return ret; - } - - // Count$Morbid.. - if (sq[0].startsWith("Morbid")) { - final List res = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Battlefield, "Creature", c); - return doXMath(Integer.parseInt(sq[res.size() > 0 ? 1 : 2]), m, c); - } - - // Count$Madness.. - if (sq[0].startsWith("Madness")) { - String v = c.isMadness() ? sq[1] : sq[2]; - // TODO move this to AbilityUtils - return doXMath(StringUtils.isNumeric(v) ? Integer.parseInt(v) : xCount(c, c.getSVar(v)), m, c); - } - - // Count$Foretold.. - if (sq[0].startsWith("Foretold")) { - String v = c.isForetold() ? sq[1] : sq[2]; - // TODO move this to AbilityUtils - return doXMath(StringUtils.isNumeric(v) ? Integer.parseInt(v) : xCount(c, c.getSVar(v)), m, c); - } - - // Count$Presence_.. - if (sq[0].startsWith("Presence")) { - final String type = sq[0].split("_")[1]; - - if (c.getCastFrom() != null && c.getCastSA() != null) { - int revealed = AbilityUtils.calculateAmount(c, "Revealed$Valid " + type, c.getCastSA()); - int ctrl = AbilityUtils.calculateAmount(c, "Count$Valid " + type + ".inZoneBattlefield+YouCtrl", c.getCastSA()); - if (revealed + ctrl >= 1) { - return doXMath(StringUtils.isNumeric(sq[1]) ? Integer.parseInt(sq[1]) : xCount(c, c.getSVar(sq[1])), m, c); - } - } - return doXMath(StringUtils.isNumeric(sq[2]) ? Integer.parseInt(sq[2]) : xCount(c, c.getSVar(sq[2])), m, c); - } - - if (sq[0].startsWith("LastStateBattlefield")) { - final String[] k = l[0].split(" "); - CardCollection list = new CardCollection(game.getLastStateBattlefield()); - list = CardLists.getValidCards(list, k[1].split(","), cc, c, null); - return CardFactoryUtil.doXMath(list.size(), m, c); - } - - if (sq[0].startsWith("LastStateGraveyard")) { - final String[] k = l[0].split(" "); - CardCollection list = new CardCollection(game.getLastStateGraveyard()); - list = CardLists.getValidCards(list, k[1].split(","), cc, c, null); - return CardFactoryUtil.doXMath(list.size(), m, c); - } - - if (sq[0].equals("YourTurns")) { - return doXMath(cc.getTurn(), m, c); - } - - if (sq[0].equals("TotalTurns")) { - // Sorry for the Singleton use, replace this once this function has game passed into it - return doXMath(game.getPhaseHandler().getTurn(), m, c); - } - - if (sq[0].equals("MaxDistinctOnStack")) { - return game.getStack().getMaxDistinctSources(); - } - - //Count$Random.. - if (sq[0].equals("Random")) { - int min = StringUtils.isNumeric(sq[1]) ? Integer.parseInt(sq[1]) : xCount(c, c.getSVar(sq[1])); - int max = StringUtils.isNumeric(sq[2]) ? Integer.parseInt(sq[2]) : xCount(c, c.getSVar(sq[2])); - - return forge.util.MyRandom.getRandom().nextInt(1+max-min) + min; - } - - // Count$Domain - if (sq[0].startsWith("Domain")) { - int n = 0; - Player neededPlayer = sq[0].equals("DomainActivePlayer") ? activePlayer : cc; - CardCollection someCards = CardLists.filter(neededPlayer.getCardsIn(ZoneType.Battlefield), Presets.LANDS); - for (String basic : MagicColor.Constant.BASIC_LANDS) { - if (!CardLists.getType(someCards, basic).isEmpty()) { - n++; - } - } - return doXMath(n, m, c); - } - if (sq[0].startsWith("UniqueManaColorsProduced")) { - boolean untappedOnly = sq[1].contains("ByUntappedSources"); - int uniqueColors = 0; - CardCollectionView otb = cc.getCardsIn(ZoneType.Battlefield); - outer: for (byte color : MagicColor.WUBRG) { - for (Card card : otb) { - if (!card.isTapped() || !untappedOnly) { - for (SpellAbility ma : card.getManaAbilities()) { - if (ma.canProduce(MagicColor.toShortString(color))) { - uniqueColors++; - continue outer; - } - } - } - } - } - return doXMath(uniqueColors, m, c); - } - // Count$Converge - if (sq[0].contains("Converge")) { - SpellAbility castSA = c.getCastSA(); - return doXMath(castSA == null ? 0 : castSA.getPayingColors().countColors(), m, c); - } - - // Count$CardMulticolor.. - if (sq[0].contains("CardMulticolor")) { - final boolean isMulti = CardUtil.getColors(c).isMulticolor(); - return doXMath(Integer.parseInt(sq[isMulti ? 1 : 2]), m, c); - } - - // Complex counting methods - CardCollectionView someCards = getCardListForXCount(c, cc, sq); - - // 1/10 - Count$MaxCMCYouCtrl - if (sq[0].contains("MaxCMC")) { - int mmc = Aggregates.max(someCards, CardPredicates.Accessors.fnGetCmc); - return doXMath(mmc, m, c); - } - - return doXMath(someCards.size(), m, c); - } - - private static CardCollectionView getCardListForXCount(final Card c, final Player cc, final String[] sq) { - final List opps = cc.getOpponents(); - CardCollection someCards = new CardCollection(); - final Game game = c.getGame(); - - // Generic Zone-based counting - // Count$QualityAndZones.Subquality - - // build a list of cards in each possible specified zone - - if (sq[0].contains("YouCtrl")) { - someCards.addAll(cc.getCardsIn(ZoneType.Battlefield)); - } - - if (sq[0].contains("InYourYard")) { - someCards.addAll(cc.getCardsIn(ZoneType.Graveyard)); - } - - if (sq[0].contains("InYourLibrary")) { - someCards.addAll(cc.getCardsIn(ZoneType.Library)); - } - - if (sq[0].contains("InYourHand")) { - someCards.addAll(cc.getCardsIn(ZoneType.Hand)); - } - - if (sq[0].contains("InYourSideboard")) { - someCards.addAll(cc.getCardsIn(ZoneType.Sideboard)); - } - - if (sq[0].contains("OppCtrl")) { - for (final Player p : opps) { - someCards.addAll(p.getZone(ZoneType.Battlefield).getCards()); - } - } - - if (sq[0].contains("InOppYard")) { - for (final Player p : opps) { - someCards.addAll(p.getCardsIn(ZoneType.Graveyard)); - } - } - - if (sq[0].contains("InOppHand")) { - for (final Player p : opps) { - someCards.addAll(p.getCardsIn(ZoneType.Hand)); - } - } - - if (sq[0].contains("InChosenHand")) { - if (c.getChosenPlayer() != null) { - someCards.addAll(c.getChosenPlayer().getCardsIn(ZoneType.Hand)); - } - } - - if (sq[0].contains("InRememberedHand")) { - if (c.getRemembered() != null) { - for (final Object o : c.getRemembered()) { - if (o instanceof Player) { - Player remPlayer = (Player) o; - someCards.addAll(remPlayer.getCardsIn(ZoneType.Hand)); - } - } - } - } - - if (sq[0].contains("InChosenYard")) { - if (c.getChosenPlayer() != null) { - someCards.addAll(c.getChosenPlayer().getCardsIn(ZoneType.Graveyard)); - } - } - - if (sq[0].contains("OnBattlefield")) { - someCards.addAll(game.getCardsIn(ZoneType.Battlefield)); - } - - if (sq[0].contains("InAllYards")) { - someCards.addAll(game.getCardsIn(ZoneType.Graveyard)); - } - - if (sq[0].contains("SpellsOnStack")) { - someCards.addAll(game.getCardsIn(ZoneType.Stack)); - } - - if (sq[0].contains("InAllHands")) { - someCards.addAll(game.getCardsIn(ZoneType.Hand)); - } - - // Count$InTargetedHand (targeted player's cards in hand) - if (sq[0].contains("InTargetedHand")) { - for (final SpellAbility sa : c.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) { - someCards.addAll(tgtP.getCardsIn(ZoneType.Hand)); - } - } - } - } - - // Count$InTargetedHand (targeted player's cards in hand) - if (sq[0].contains("InTargetedLibrary")) { - for (final SpellAbility sa : c.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - for (final Player tgtP : saTargeting.getTargets().getTargetPlayers()) { - someCards.addAll(tgtP.getCardsIn(ZoneType.Library)); - } - } - } - } - - // Count$InTargetedHand (targeted player's cards in hand) - if (sq[0].contains("InEnchantedHand")) { - GameEntity o = c.getEntityAttachedTo(); - Player controller = null; - if (o instanceof Card) { - controller = ((Card) o).getController(); - } - else { - controller = (Player) o; - } - if (controller != null) { - someCards.addAll(controller.getCardsIn(ZoneType.Hand)); - } - } - if (sq[0].contains("InEnchantedYard")) { - GameEntity o = c.getEntityAttachedTo(); - Player controller = null; - if (o instanceof Card) { - controller = ((Card) o).getController(); - } - else { - controller = (Player) o; - } - if (controller != null) { - someCards.addAll(controller.getCardsIn(ZoneType.Graveyard)); - } - } - - // filter lists based on the specified quality - - // "Clerics you control" - Count$TypeYouCtrl.Cleric - if (sq[0].contains("Type")) { - someCards = CardLists.filter(someCards, CardPredicates.isType(sq[1])); - } - - // "Named in all graveyards" - Count$NamedAllYards. - - if (sq[0].contains("Named")) { - if (sq[1].equals("CARDNAME")) { - sq[1] = c.getName(); - } - someCards = CardLists.filter(someCards, CardPredicates.nameEquals(sq[1])); - } - - // Refined qualities - - // "Untapped Lands" - Count$UntappedTypeYouCtrl.Land - // if (sq[0].contains("Untapped")) { someCards = CardLists.filter(someCards, Presets.UNTAPPED); } - - // if (sq[0].contains("Tapped")) { someCards = CardLists.filter(someCards, Presets.TAPPED); } - -// String sq0 = sq[0].toLowerCase(); -// for (String color : MagicColor.Constant.ONLY_COLORS) { -// if (sq0.contains(color)) -// someCards = someCards.filter(CardListFilter.WHITE); -// } - // "White Creatures" - Count$WhiteTypeYouCtrl.Creature - // if (sq[0].contains("White")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.WHITE)); - // if (sq[0].contains("Blue")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.BLUE)); - // if (sq[0].contains("Black")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.BLACK)); - // if (sq[0].contains("Red")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.RED)); - // if (sq[0].contains("Green")) someCards = CardLists.filter(someCards, CardPredicates.isColor(MagicColor.GREEN)); - - if (sq[0].contains("Multicolor")) { - someCards = CardLists.filter(someCards, new Predicate() { - @Override - public boolean apply(final Card c) { - return CardUtil.getColors(c).isMulticolor(); - } - }); - } - - if (sq[0].contains("Monocolor")) { - someCards = CardLists.filter(someCards, new Predicate() { - @Override - public boolean apply(final Card c) { - return CardUtil.getColors(c).isMonoColor(); - } - }); - } - return someCards; - } - - public static int doXMath(final int num, final String operators, final Card c) { - if (operators == null || operators.equals("none")) { - return num; - } - - final String[] s = operators.split("\\."); - int secondaryNum = 0; - - try { - if (s.length == 2) { - secondaryNum = Integer.parseInt(s[1]); - } - } catch (final Exception e) { - secondaryNum = xCount(c, c.getSVar(s[1])); - } - - if (s[0].contains("Plus")) { - return num + secondaryNum; - } else if (s[0].contains("NMinus")) { - return secondaryNum - num; - } else if (s[0].contains("Minus")) { - return num - secondaryNum; - } else if (s[0].contains("Twice")) { - return num * 2; - } else if (s[0].contains("Thrice")) { - return num * 3; - } else if (s[0].contains("HalfUp")) { - return (int) (Math.ceil(num / 2.0)); - } else if (s[0].contains("HalfDown")) { - return (int) (Math.floor(num / 2.0)); - } else if (s[0].contains("ThirdUp")) { - return (int) (Math.ceil(num / 3.0)); - } else if (s[0].contains("ThirdDown")) { - return (int) (Math.floor(num / 3.0)); - } else if (s[0].contains("Negative")) { - return num * -1; - } else if (s[0].contains("Times")) { - return num * secondaryNum; - } else if (s[0].contains("DivideEvenlyDown")) { - if (secondaryNum == 0) { - return 0; - } else { - return num / secondaryNum; - } - } else if (s[0].contains("Mod")) { - return num % secondaryNum; - } else if (s[0].contains("Abs")) { - return Math.abs(num); - } else if (s[0].contains("LimitMax")) { - if (num < secondaryNum) { - return num; - } else { - return secondaryNum; - } - } else if (s[0].contains("LimitMin")) { - if (num > secondaryNum) { - return num; - } else { - return secondaryNum; - } - - } else { - return num; - } - } - - /** - *

- * handlePaid. - *

- * - * @param paidList - * a {@link forge.game.card.CardCollectionView} object. - * @param string - * a {@link java.lang.String} object. - * @param source - * a {@link forge.game.card.Card} object. - * @return a int. - */ - public static int handlePaid(final Iterable paidList, final String string, final Card source) { - if (paidList == null) { - if (string.contains(".")) { - final String[] splitString = string.split("\\.", 2); - return doXMath(0, splitString[1], source); - } else { - return 0; - } - } - if (string.startsWith("Amount")) { - int size = Iterables.size(paidList); - if (string.contains(".")) { - final String[] splitString = string.split("\\.", 2); - return doXMath(size, splitString[1], source); - } else { - return size; - } - - } - - if (string.startsWith("DifferentCMC")) { - final Set diffCMC = new HashSet<>(); - for (final Card card : paidList) { - diffCMC.add(card.getCMC()); - } - return diffCMC.size(); - } - - if (string.startsWith("SumCMC")) { - int sumCMC = 0; - for(Card c : paidList) { - sumCMC += c.getCMC(); - } - return sumCMC; - } - - if (string.startsWith("Valid")) { - - final String[] splitString = string.split("/", 2); - String valid = splitString[0].substring(6); - final List list = CardLists.getValidCardsAsList(paidList, valid, source.getController(), source, null); - return doXMath(list.size(), splitString.length > 1 ? splitString[1] : null, source); - } - - String filteredString = string; - Iterable filteredList = paidList; - final String[] filter = filteredString.split("_"); - - if (string.startsWith("FilterControlledBy")) { - final String pString = filter[0].substring(18); - FCollectionView controllers = AbilityUtils.getDefinedPlayers(source, pString, null); - filteredList = CardLists.filterControlledByAsList(filteredList, controllers); - filteredString = TextUtil.fastReplace(filteredString, pString, ""); - filteredString = TextUtil.fastReplace(filteredString, "FilterControlledBy_", ""); - } - - int tot = 0; - for (final Card c : filteredList) { - tot += xCount(c, filteredString); - } - - return tot; - } - /** *

* isMostProminentColor. @@ -2228,6 +635,51 @@ public class CardFactoryUtil { return re; } + public static String getProtectionValid(final String kw, final boolean damage) { + String validSource = "Card."; // TODO extend for Emblem too + + if (kw.startsWith("Protection:")) { + final String[] kws = kw.split(":"); + String characteristic = kws[1]; + if (characteristic.startsWith("Player")) { + validSource += "ControlledBy " + characteristic; + } else { + if (damage && (characteristic.endsWith("White") || characteristic.endsWith("Blue") + || characteristic.endsWith("Black") || characteristic.endsWith("Red") + || characteristic.endsWith("Green") || characteristic.endsWith("Colorless") + || characteristic.endsWith("MonoColor") || characteristic.endsWith("MultiColor"))) { + characteristic += "Source"; + } + validSource = characteristic; + } + } else if (kw.startsWith("Protection from ")) { + String protectType = kw.substring("Protection from ".length()); + if (protectType.equals("white")) { + validSource += "White" + (damage ? "Source" : ""); + } else if (protectType.equals("blue")) { + validSource += "Blue" + (damage ? "Source" : ""); + } else if (protectType.equals("black")) { + validSource += "Black" + (damage ? "Source" : ""); + } else if (protectType.equals("red")) { + validSource += "Red" + (damage ? "Source" : ""); + } else if (protectType.equals("green")) { + validSource += "Green" + (damage ? "Source" : ""); + } else if (protectType.equals("colorless")) { + validSource += "Colorless" + (damage ? "Source" : ""); + } else if (protectType.equals("all colors")) { + validSource += "nonColorless" + (damage ? "Source" : ""); + } else if (protectType.equals("everything")) { + validSource = ""; + } else if (protectType.startsWith("opponent of ")) { + final String playerName = protectType.substring("opponent of ".length()); + validSource += "ControlledBy Player.OpponentOf PlayerNamed_" + playerName; + } else { + validSource = CardType.getSingularType(protectType); + } + } + return validSource; + } + public static ReplacementEffect makeEtbCounter(final String kw, final CardState card, final boolean intrinsic) { String parse = kw; @@ -3010,7 +1462,7 @@ public class CardFactoryUtil { final String effect = "DB$ ChangeZone | ValidTgts$ Player | TgtPrompt$ Select target player" + " | Origin$ Library | Destination$ Hand | ChangeType$ Card.named" + k[1] + - " | ChangeNum$ 1 | Hidden$ True | Chooser$ Targeted | Optional$ Targeted | AILogic$ Always"; + " | ChangeNum$ 1 | Hidden$ True | Chooser$ Targeted | Optional$ Targeted"; final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); trigger.setOverridingAbility(AbilityFactory.getAbility(effect, card)); @@ -3298,7 +1750,7 @@ public class CardFactoryUtil { if (card.isPermanent()) { final String abPump = "DB$ Pump | Defined$ Remembered | KW$ Haste | PumpZone$ Stack " - + "| ConditionDefined$ Remembered | ConditionPresent$ Creature | UntilLoseControlOfHost$ True"; + + "| ConditionDefined$ Remembered | ConditionPresent$ Creature | Duration$ UntilLoseControlOfHost"; final AbilitySub saPump = (AbilitySub)AbilityFactory.getAbility(abPump, card); String dbClean = "DB$ Cleanup | ClearRemembered$ True"; @@ -3422,7 +1874,24 @@ public class CardFactoryUtil { Card host = card.getCard(); String keyword = inst.getOriginal(); - if (keyword.equals("Aftermath") && card.getStateName().equals(CardStateName.RightSplit)) { + if (keyword.startsWith("Absorb")) { + final String[] k = keyword.split(":"); + final String n = k[1]; + + StringBuilder sb = new StringBuilder(); + sb.append("Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self"); + sb.append(" | PreventionEffect$ True | Secondary$ True | Description$ Absorb ").append(n); + sb.append(" (").append(inst.getReminderText()).append(")"); + String repeffstr = sb.toString(); + + String abString = "DB$ ReplaceDamage | Amount$ " + n; + SpellAbility replaceDamage = AbilityFactory.getAbility(abString, card); + replaceDamage.setIntrinsic(intrinsic); + + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, host, intrinsic, card); + re.setOverridingAbility(replaceDamage); + inst.addReplacement(re); + } else if (keyword.equals("Aftermath") && card.getStateName().equals(CardStateName.RightSplit)) { StringBuilder sb = new StringBuilder(); sb.append("Event$ Moved | ValidCard$ Card.Self | Origin$ Stack | ExcludeDestination$ Exile "); sb.append("| ValidStackSa$ Spell.Aftermath | Description$ Aftermath"); @@ -3569,16 +2038,23 @@ public class CardFactoryUtil { } else if (keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); final String magnitude = k[1]; + String valid = "Creature"; + final String[] s = k[0].split(" "); + if (s.length > 1) { + valid = s[1].substring(0, 1).toUpperCase() + s[1].substring(1); + final StringBuilder d = new StringBuilder(); + } - String sacrificeStr = "DB$ Sacrifice | Defined$ You | Amount$ DevourSacX | " - + "SacValid$ Creature.Other | SacMessage$ another creature (Devour "+ magnitude + ") | " - + "RememberSacrificed$ True | Optional$ True | Devour$ True"; + String sacrificeStr = "DB$ Sacrifice | Defined$ You | Amount$ DevourSacX | SacValid$ " + valid + + ".Other | SacMessage$ another " + valid.toLowerCase() + " (Devour " + magnitude + + ") | RememberSacrificed$ True | Optional$ True | Devour$ True"; String counterStr = "DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ DevourX"; String cleanupStr = "DB$ Cleanup | ClearRemembered$ True"; AbilitySub sacrificeSA = (AbilitySub) AbilityFactory.getAbility(sacrificeStr, card); - sacrificeSA.setSVar("DevourSacX", "Count$Valid Creature.YouCtrl+Other"); + String value = "Count$Valid " + valid + ".YouCtrl+Other"; + sacrificeSA.setSVar("DevourSacX", value); AbilitySub counterSA = (AbilitySub) AbilityFactory.getAbility(counterStr, card); counterSA.setSVar("DevourX", "SVar$DevourSize/Times." + magnitude); @@ -3761,7 +2237,7 @@ public class CardFactoryUtil { final String counter = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | ETB$ True | CounterNum$ 1" + " | SpellDescription$ Put a +1/+1 counter on it."; - final String haste = "DB$ Animate | Defined$ Self | Keywords$ Haste | Permanent$ True | SpellDescription$ Haste"; + final String haste = "DB$ Animate | Defined$ Self | Keywords$ Haste | Duration$ Permanent | SpellDescription$ Haste"; SpellAbility saChoose = AbilityFactory.getAbility(choose, card); @@ -3898,6 +2374,18 @@ public class CardFactoryUtil { inst.addReplacement(re); } } + else if (keyword.startsWith("Protection")) { + String validSource = getProtectionValid(keyword, true); + + String rep = "Event$ DamageDone | Prevent$ True | ActiveZones$ Battlefield | ValidTarget$ Card.Self"; + if (!validSource.isEmpty()) { + rep += " | ValidSource$ " + validSource; + } + rep += " | Secondary$ True | TiedToKeyword$ " + keyword + " | Description$ " + keyword; + + ReplacementEffect re = ReplacementHandler.parseReplacement(rep, host, intrinsic, card); + inst.addReplacement(re); + } else if (keyword.startsWith("If CARDNAME would be put into a graveyard " + "from anywhere, reveal CARDNAME and shuffle it into its owner's library instead.")) { @@ -4025,7 +2513,7 @@ public class CardFactoryUtil { final String awaken = "DB$ PutCounter | CounterType$ P1P1 | CounterNum$ "+ counters + " | " + "ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Awaken$ True"; final String animate = "DB$ Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$" - + " Creature,Elemental | Permanent$ True | Keywords$ Haste"; + + " Creature,Elemental | Duration$ Permanent | Keywords$ Haste"; final AbilitySub awakenSub = (AbilitySub) AbilityFactory.getAbility(awaken, card); final AbilitySub animateSub = (AbilitySub) AbilityFactory.getAbility(animate, card); @@ -4727,6 +3215,8 @@ public class CardFactoryUtil { String desc = type; if (type.equals("Basic")) { desc = "Basic land"; + } else if (type.equals("Land.Artifact")) { + desc = "Artifact land"; } sb.append(" Discard<1/CARDNAME> | ActivationZone$ Hand | PrecostDesc$ ").append(desc).append("cycling "); @@ -4748,20 +3238,20 @@ public class CardFactoryUtil { String effect = null; Map svars = Maps.newHashMap(); - if (keyword.startsWith("Absorb")) { - final String[] k = keyword.split(":"); - final String n = k[1]; - - StringBuilder sb = new StringBuilder(); - sb.append("Mode$ PreventDamage | Target$ Card.Self | Amount$ "); - sb.append(n).append("| Secondary$ True | Description$ Absorb ").append(n); - sb.append(" (").append(inst.getReminderText()).append(")"); - effect = sb.toString(); - } else if (keyword.startsWith("Affinity")) { + if (keyword.startsWith("Affinity")) { final String[] k = keyword.split(":"); final String t = k[1]; + String d = ""; + if (k.length > 2) { + final StringBuilder s = new StringBuilder(); + s.append(k[2]).append("s"); + d = s.toString(); + } String desc = "Artifact".equals(t) ? "artifacts" : CardType.getPluralType(t); + if (!d.isEmpty()) { + desc = d; + } StringBuilder sb = new StringBuilder(); sb.append("Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ AffinityX | EffectZone$ All"); sb.append("| Description$ Affinity for ").append(desc); @@ -4796,6 +3286,8 @@ public class CardFactoryUtil { svars.put("PlayEncoded", ab); } else if (keyword.startsWith("Dash")) { effect = "Mode$ Continuous | Affected$ Card.Self+dashed | AddKeyword$ Haste"; + } else if (keyword.equals("Defender")) { + effect = "Mode$ CantAttack | ValidCard$ Card.Self | DefenderKeyword$ True | Secondary$ True"; } else if (keyword.equals("Devoid")) { effect = "Mode$ Continuous | EffectZone$ All | Affected$ Card.Self" + " | CharacteristicDefining$ True | SetColor$ Colorless | Secondary$ True" + @@ -4816,6 +3308,12 @@ public class CardFactoryUtil { effect = "Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Secondary$ True" + " | Amount$ Escalate | Cost$ "+ manacost +" | EffectZone$ All" + " | Description$ " + sb.toString() + " (" + inst.getReminderText() + ")"; + } else if (keyword.equals("Fear")) { + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+nonBlack | Secondary$ True " + + " | Description$ Fear ( " + inst.getReminderText() + ")"; + } else if (keyword.equals("Flying")) { + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying+withoutReach | Secondary$ True " + + " | Description$ Flying ( " + inst.getReminderText() + ")"; } else if (keyword.startsWith("Hexproof")) { final StringBuilder sbDesc = new StringBuilder("Hexproof"); final StringBuilder sbValid = new StringBuilder(); @@ -4830,9 +3328,26 @@ public class CardFactoryUtil { effect = "Mode$ CantTarget | Hexproof$ True | ValidCard$ Card.Self | Secondary$ True" + sbValid.toString() + " | Activator$ Opponent | Description$ " + sbDesc.toString() + " (" + inst.getReminderText() + ")"; + } else if (keyword.equals("Horsemanship")) { + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutHorsemanship | Secondary$ True " + + " | Description$ Horsemanship ( " + inst.getReminderText() + ")"; + } else if (keyword.equals("Intimidate")) { + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+notSharesColorWith | Secondary$ True " + + " | Description$ Intimidate ( " + inst.getReminderText() + ")"; + } else if (keyword.startsWith("Protection")) { + String valid = getProtectionValid(keyword, false); + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self "; + if (!valid.isEmpty()) { + effect += "| ValidBlocker$ " + valid; + } + effect += " | Secondary$ True | Description$ Protection ( " + inst.getReminderText() + ")"; } else if (keyword.equals("Shroud")) { effect = "Mode$ CantTarget | Shroud$ True | ValidCard$ Card.Self | Secondary$ True" + " | Description$ Shroud (" + inst.getReminderText() + ")"; + } else if (keyword.equals("Skulk")) { + effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGTX | Secondary$ True " + + " | Description$ Skulk ( " + inst.getReminderText() + ")"; + svars.put("X", "Count$CardPower"); } else if (keyword.startsWith("Strive")) { final String[] k = keyword.split(":"); final String manacost = k[1]; @@ -4844,11 +3359,6 @@ public class CardFactoryUtil { } else if (keyword.equals("Undaunted")) { effect = "Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Secondary$ True" + "| Amount$ Undaunted | EffectZone$ All | Description$ Undaunted (" + inst.getReminderText() + ")"; - } else if (keyword.startsWith("CantBeBlockedBy ")) { - final String[] k = keyword.split(" ", 2); - - effect = "Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ " + k[1] - + " | Description$ CARDNAME can't be blocked " + getTextForKwCantBeBlockedByType(keyword); } else if (keyword.equals("MayFlashSac")) { effect = "Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | Secondary$ True | MayPlay$ True" + " | MayPlayNotSorcerySpeed$ True | MayPlayWithFlash$ True | MayPlayText$ Sacrifice at the next cleanup step" @@ -4910,122 +3420,6 @@ public class CardFactoryUtil { // ETBReplacementMove(sa.getHostCard(), null)); } - private static String getTextForKwCantBeBlockedByType(final String keyword) { - boolean negative = true; - final List subs = Lists.newArrayList(TextUtil.split(keyword.split(" ", 2)[1], ',')); - final List> subsAnd = Lists.newArrayList(); - final List orClauses = Lists.newArrayList(); - for (final String expession : subs) { - final List parts = Lists.newArrayList(expession.split("[.+]")); - for (int p = 0; p < parts.size(); p++) { - final String part = parts.get(p); - if (part.equalsIgnoreCase("creature")) { - parts.remove(p--); - continue; - } - // based on suppossition that each expression has at least 1 predicate except 'creature' - negative &= part.contains("non") || part.contains("without"); - } - subsAnd.add(parts); - } - - final boolean allNegative = negative; - final String byClause = allNegative ? "except by " : "by "; - - final Function, String> withToString = new Function, String>() { - @Override - public String apply(Pair inp) { - boolean useNon = inp.getKey() == allNegative; - return (useNon ? "*NO* " : "") + inp.getRight(); - } - }; - - for (final List andOperands : subsAnd) { - final List> prependedAdjectives = Lists.newArrayList(); - final List> postponedAdjectives = Lists.newArrayList(); - String creatures = null; - - for (String part : andOperands) { - boolean positive = true; - if (part.startsWith("non")) { - part = part.substring(3); - positive = false; - } - if (part.startsWith("with")) { - positive = !part.startsWith("without"); - postponedAdjectives.add(Pair.of(positive, part.substring(positive ? 4 : 7))); - } else if (part.startsWith("powerLEX")) {// Kraken of the Straits - postponedAdjectives.add(Pair.of(true, "power less than the number of islands you control")); - } else if (part.startsWith("power")) { - int kwLength = 5; - String opName = Expressions.operatorName(part.substring(kwLength, kwLength + 2)); - String operand = part.substring(kwLength + 2); - postponedAdjectives.add(Pair.of(true, "power" + opName + operand)); - } else if (part.startsWith("toughness")) { - int kwLength = 9; - String operand = part.substring(kwLength + 2); - String opName = ""; - if (part.startsWith("toughnessGE")) { - opName = " or greater"; - } else { - opName = "update CardFactoryUtil line 4773"; - } - postponedAdjectives.add(Pair.of(true, "toughness " + operand + opName)); - } else if (CardType.isACreatureType(part)) { - if (creatures != null && CardType.isACreatureType(creatures)) { // e.g. Kor Castigator - creatures = StringUtils.capitalize(Lang.getPlural(part)) + creatures; - } else { - creatures = StringUtils.capitalize(Lang.getPlural(part)) + (creatures == null ? "" : " or " + creatures); - } - // Kor Castigator and other similar creatures with composite subtype Eldrazi Scion in their text - creatures = TextUtil.fastReplace(creatures, "Scions or Eldrazis", "Eldrazi Scions"); - } else { - prependedAdjectives.add(Pair.of(positive, part.toLowerCase())); - } - } - - StringBuilder sbShort = new StringBuilder(); - if (allNegative) { - boolean isFirst = true; - for (Pair pre : prependedAdjectives) { - if (isFirst) isFirst = false; - else sbShort.append(" and/or "); - - boolean useNon = pre.getKey() == allNegative; - if (useNon) sbShort.append("non-"); - sbShort.append(pre.getValue()).append(" ").append(creatures == null ? "creatures" : creatures); - } - if (prependedAdjectives.isEmpty()) - sbShort.append(creatures == null ? "creatures" : creatures); - - if (!postponedAdjectives.isEmpty()) { - if (!prependedAdjectives.isEmpty()) { - sbShort.append(" and/or creatures"); - } - - sbShort.append(" with "); - sbShort.append(Lang.joinHomogenous(postponedAdjectives, withToString, allNegative ? "or" : "and")); - } - - } else { - for (Pair pre : prependedAdjectives) { - boolean useNon = pre.getKey() == allNegative; - if (useNon) sbShort.append("non-"); - sbShort.append(pre.getValue()).append(" "); - } - sbShort.append(creatures == null ? "creatures" : creatures); - - if (!postponedAdjectives.isEmpty()) { - sbShort.append(" with "); - sbShort.append(Lang.joinHomogenous(postponedAdjectives, withToString, allNegative ? "or" : "and")); - } - - } - orClauses.add(sbShort.toString()); - } - return byClause + StringUtils.join(orClauses, " or ") + "."; - } - public static void setupAdventureAbility(Card card) { if (card.getCurrentStateName() != CardStateName.Adventure) { return; diff --git a/forge-game/src/main/java/forge/game/card/CardLists.java b/forge-game/src/main/java/forge/game/card/CardLists.java index 4d1dc53fbe6..ca04608085e 100644 --- a/forge-game/src/main/java/forge/game/card/CardLists.java +++ b/forge-game/src/main/java/forge/game/card/CardLists.java @@ -232,8 +232,8 @@ public class CardLists { public static CardCollection getTargetableCards(Iterable cardList, SpellAbility source) { CardCollection result = CardLists.filter(cardList, CardPredicates.isTargetableBy(source)); - // Filter more cards that can only be detected along with other candiates - if (source.getTargets().isEmpty() && source.getMinTargets() >= 2) { + // Filter more cards that can only be detected along with other candidates + if (source.getTargets().isEmpty() && source.usesTargeting() && source.getMinTargets() >= 2) { CardCollection removeList = new CardCollection(); TargetRestrictions tr = source.getTargetRestrictions(); for (final Card card : cardList) { diff --git a/forge-game/src/main/java/forge/game/card/CardPredicates.java b/forge-game/src/main/java/forge/game/card/CardPredicates.java index 8db9d7bb215..ee03689e056 100644 --- a/forge-game/src/main/java/forge/game/card/CardPredicates.java +++ b/forge-game/src/main/java/forge/game/card/CardPredicates.java @@ -22,6 +22,7 @@ import java.util.Comparator; import com.google.common.base.Function; import com.google.common.base.Predicate; +import forge.card.CardStateName; import forge.game.CardTraitBase; import forge.game.combat.CombatUtil; import forge.game.keyword.Keyword; @@ -226,6 +227,15 @@ public final class CardPredicates { }; } + public static final Predicate restriction(final String restrictions, final Player sourceController, final Card source, final CardTraitBase spellAbility) { + return new Predicate() { + @Override + public boolean apply(final Card c) { + return (c != null) && c.isValid(restrictions, sourceController, source, spellAbility); + } + }; + } + public static final Predicate canBeSacrificedBy(final SpellAbility sa) { return new Predicate() { @Override @@ -607,7 +617,7 @@ public final class CardPredicates { public static final Predicate NON_TOKEN = new Predicate() { @Override public boolean apply(Card c) { - return !c.isToken(); + return !(c.isToken() || c.isTokenCard()); } }; /** @@ -616,7 +626,7 @@ public final class CardPredicates { public static final Predicate TOKEN = new Predicate() { @Override public boolean apply(Card c) { - return c.isToken(); + return c.isToken() || c.isTokenCard(); } }; /** @@ -653,7 +663,7 @@ public final class CardPredicates { public static final Predicate LANDS = new Predicate() { @Override public boolean apply(Card c) { - return c.isLand(); + return c.isLand() || (!c.isInZone(ZoneType.Battlefield) && c.isModal() && c.getState(CardStateName.Modal).getType().isLand()); } }; /** diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index db50cf08a93..a6b61a78995 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -47,6 +47,11 @@ public class CardProperty { final Card lki = game.getChangeZoneLKIInfo(card); final Player controller = lki.getController(); + // CR 702.25b if card is phased out it will not count unless specifically asked for + if (card.isPhasedOut() && !property.contains("phasedOut")) { + return false; + } + // by name can also have color names, so needs to happen before colors. if (property.startsWith("named")) { String name = TextUtil.fastReplace(property.substring(5), ";", ","); // for some legendary cards @@ -219,55 +224,22 @@ public class CardProperty { return false; } } else if (property.equals("TargetedPlayerCtrl")) { - boolean foundTargetingSA = false; - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - foundTargetingSA = true; - for (final Player p : saTargeting.getTargets().getTargetPlayers()) { - if (!controller.equals(p)) { - return false; - } - } - } - } - if (!foundTargetingSA) { - // FIXME: Something went wrong with detecting the SA that has a target, this can happen - // e.g. when activating a SA on a card from another player's hand (e.g. opponent's Chandra's Fury - // activated via Sen Triplets). Needs further investigation as to why this is happening, it might - // cause issues elsewhere too. - System.err.println("Warning: could not deduce a player target for TargetedPlayerCtrl for " + source + ", trying to locate it via CastSA..."); - SpellAbility castSA = source.getCastSA(); - while (castSA != null) { - if (!Iterables.isEmpty(castSA.getTargets().getTargetPlayers())) { - foundTargetingSA = true; - for (final Player p : castSA.getTargets().getTargetPlayers()) { - if (!controller.equals(p)) { - return false; - } - } - } - castSA = castSA.getSubAbility(); - } - if (!foundTargetingSA) { - System.err.println("Warning: checking targets in CastSA did not yield any results as well, TargetedPlayerCtrl check failed."); - } + if (!AbilityUtils.getDefinedPlayers(source, "TargetedPlayer", spellAbility).contains(controller)) { + return false; } } else if (property.equals("TargetedControllerCtrl")) { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", sa); - final List sas = AbilityUtils.getDefinedSpellAbilities(source, "Targeted", sa); - for (final Card c : cards) { - final Player p = c.getController(); - if (!controller.equals(p)) { - return false; - } + final CardCollectionView cards = AbilityUtils.getDefinedCards(source, "Targeted", spellAbility); + final List sas = AbilityUtils.getDefinedSpellAbilities(source, "Targeted", spellAbility); + for (final Card c : cards) { + final Player p = c.getController(); + if (!controller.equals(p)) { + return false; } - for (final SpellAbility s : sas) { - final Player p = s.getHostCard().getController(); - if (!controller.equals(p)) { - return false; - } + } + for (final SpellAbility s : sas) { + final Player p = s.getHostCard().getController(); + if (!controller.equals(p)) { + return false; } } } else if (property.startsWith("ActivePlayerCtrl")) { @@ -291,36 +263,8 @@ public class CardProperty { return false; } } else if (property.equals("TargetedPlayerOwn")) { - boolean foundTargetingSA = false; - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingPlayer(); - if (saTargeting != null) { - foundTargetingSA = true; - for (final Player p : saTargeting.getTargets().getTargetPlayers()) { - if (!card.getOwner().equals(p)) { - return false; - } - } - } - } - if (!foundTargetingSA) { - // FIXME: Something went wrong with detecting the SA that has a target, needs investigation - System.err.println("Warning: could not deduce a player target for TargetedPlayerOwn for " + source + ", trying to locate it via CastSA..."); - SpellAbility castSA = source.getCastSA(); - while (castSA != null) { - if (!Iterables.isEmpty(castSA.getTargets().getTargetPlayers())) { - foundTargetingSA = true; - for (final Player p : castSA.getTargets().getTargetPlayers()) { - if (!card.getOwner().equals(p)) { - return false; - } - } - } - castSA = castSA.getSubAbility(); - } - if (!foundTargetingSA) { - System.err.println("Warning: checking targets in CastSA did not yield any results as well, TargetedPlayerOwn check failed."); - } + if (!AbilityUtils.getDefinedPlayers(source, "TargetedPlayer", spellAbility).contains(card.getOwner())) { + return false; } } else if (property.startsWith("OwnedBy")) { final String valid = property.substring(8); @@ -475,14 +419,9 @@ public class CardProperty { } break; case "Targeted": - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingCard(); - if (saTargeting != null) { - for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.isEnchantedBy(c) && !card.equals(c.getEntityAttachedTo())) { - return false; - } - } + for (final Card c : AbilityUtils.getDefinedCards(source, "Targeted", spellAbility)) { + if (!card.isEnchantedBy(c) && !card.equals(c.getEntityAttachedTo())) { + return false; } } break; @@ -497,14 +436,9 @@ public class CardProperty { } } else if (property.startsWith("NotEnchantedBy")) { if (property.substring(14).equals("Targeted")) { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingCard(); - if (saTargeting != null) { - for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (card.isEnchantedBy(c)) { - return false; - } - } + for (final Card c : AbilityUtils.getDefinedCards(source, "Targeted", spellAbility)) { + if (card.isEnchantedBy(c)) { + return false; } } } else { @@ -528,14 +462,9 @@ public class CardProperty { } } else if (property.startsWith("CanBeEnchantedBy")) { if (property.substring(16).equals("Targeted")) { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingCard(); - if (saTargeting != null) { - for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.canBeAttached(c)) { - return false; - } - } + for (final Card c : AbilityUtils.getDefinedCards(source, "Targeted", spellAbility)) { + if (!card.canBeAttached(c)) { + return false; } } } else if (property.substring(16).equals("AllRemembered")) { @@ -554,14 +483,9 @@ public class CardProperty { } } else if (property.startsWith("EquippedBy")) { if (property.substring(10).equals("Targeted")) { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingCard(); - if (saTargeting != null) { - for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (!card.hasCardAttachment(c)) { - return false; - } - } + for (final Card c : AbilityUtils.getDefinedCards(source, "Targeted", spellAbility)) { + if (!card.hasCardAttachment(c)) { + return false; } } } else if (property.substring(10).equals("Enchanted")) { @@ -672,14 +596,8 @@ public class CardProperty { } } else { String prop = property.substring("DamagedBy".length()); - - boolean found = false; - for (Card d : card.getReceivedDamageFromThisTurn().keySet()) { - if (d.isValid(prop, sourceController, source, spellAbility)) { - found = true; - break; - } - } + final Iterable list = Iterables.filter(card.getReceivedDamageFromThisTurn().keySet(), Card.class); + boolean found = Iterables.any(list, CardPredicates.restriction(prop, sourceController, source, spellAbility)); if (!found) { for (Card d : AbilityUtils.getDefinedCards(source, prop, spellAbility)) { @@ -694,21 +612,9 @@ public class CardProperty { } } } else if (property.startsWith("Damaged")) { - if (!card.getDealtDamageToThisTurn().containsKey(source)) { + if (!card.getDamageHistory().getThisTurnDamaged().containsKey(source)) { return false; } - } else if (property.startsWith("IsTargetingSource")) { - for (final SpellAbility sa : card.getCurrentState().getNonManaAbilities()) { - final SpellAbility saTargeting = sa.getSATargetingCard(); - if (saTargeting != null) { - for (final Card c : saTargeting.getTargets().getTargetCards()) { - if (c.equals(source)) { - return true; - } - } - } - } - return false; } else if (property.startsWith("SharesCMCWith")) { if (property.equals("SharesCMCWith")) { if (!card.sharesCMCWith(source)) { @@ -720,15 +626,27 @@ public class CardProperty { return !CardLists.filter(list, CardPredicates.sharesCMCWith(card)).isEmpty(); } } else if (property.startsWith("SharesColorWith")) { + // if card is colorless, it can't share colors + if (card.isColorless()) { + return false; + } if (property.equals("SharesColorWith")) { if (!card.sharesColorWith(source)) { return false; } } else { + // Special case to prevent list from comparing with itself + if (property.startsWith("SharesColorWithOther")) { + final String restriction = property.split("SharesColorWithOther ")[1]; + CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); + list.remove(card); + return Iterables.any(list, CardPredicates.sharesColorWith(card)); + } + final String restriction = property.split("SharesColorWith ")[1]; if (restriction.startsWith("Remembered") || restriction.startsWith("Imprinted")) { CardCollection list = AbilityUtils.getDefinedCards(source, restriction, spellAbility); - return !CardLists.filter(list, CardPredicates.sharesColorWith(card)).isEmpty(); + return Iterables.any(list, CardPredicates.sharesColorWith(card)); } switch (restriction) { @@ -904,10 +822,10 @@ public class CardProperty { } else if (restriction.equals(ZoneType.Battlefield.toString())) { return Iterables.any(game.getCardsIn(ZoneType.Battlefield), CardPredicates.sharesNameWith(card)); } else if (restriction.equals("ThisTurnCast")) { - return Iterables.any(CardUtil.getThisTurnCast("Card", source), CardPredicates.sharesNameWith(card)); + return Iterables.any(CardUtil.getThisTurnCast("Card", source, spellAbility), CardPredicates.sharesNameWith(card)); } else if (restriction.equals("MovedToGrave")) { - for (final SpellAbility sa : source.getCurrentState().getNonManaAbilities()) { - final SpellAbility root = sa.getRootAbility(); + if (!(spellAbility instanceof SpellAbility)) { + final SpellAbility root = ((SpellAbility)spellAbility).getRootAbility(); if (root != null && (root.getPaidList("MovedToGrave") != null) && !root.getPaidList("MovedToGrave").isEmpty()) { final CardCollectionView cards = root.getPaidList("MovedToGrave"); @@ -998,7 +916,7 @@ public class CardProperty { } } } else if (property.startsWith("SecondSpellCastThisTurn")) { - final List cards = CardUtil.getThisTurnCast("Card", source); + final List cards = CardUtil.getThisTurnCast("Card", source, spellAbility); if (cards.size() < 2) { return false; } @@ -1006,7 +924,7 @@ public class CardProperty { return false; } } else if (property.equals("ThisTurnCast")) { - for (final Card c : CardUtil.getThisTurnCast("Card", source)) { + for (final Card c : CardUtil.getThisTurnCast("Card", source, spellAbility)) { if (card.equals(c)) { return true; } @@ -1055,7 +973,7 @@ public class CardProperty { return false; } - List cards = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Hand, "Card", source); + List cards = CardUtil.getThisTurnEntered(ZoneType.Graveyard, ZoneType.Hand, "Card", source, spellAbility); if (!cards.contains(card) && !card.getMadnessWithoutCast()) { return false; } @@ -1158,7 +1076,7 @@ public class CardProperty { return false; } } else if (property.startsWith("dealtDamageToYouThisTurn")) { - if (!card.getDamageHistory().getThisTurnDamaged().contains(sourceController)) { + if (!card.getDamageHistory().getThisTurnDamaged().containsKey(sourceController)) { return false; } } else if (property.startsWith("dealtDamageToOppThisTurn")) { @@ -1167,36 +1085,24 @@ public class CardProperty { } } else if (property.startsWith("dealtCombatDamageThisTurn ") || property.startsWith("notDealtCombatDamageThisTurn ")) { final String v = property.split(" ")[1]; - final List list = card.getDamageHistory().getThisTurnCombatDamaged(); - boolean found = false; - for (final GameEntity e : list) { - if (e.isValid(v, sourceController, source, spellAbility)) { - found = true; - break; - } - } + final Iterable list = Iterables.filter(card.getDamageHistory().getThisTurnCombatDamaged().keySet(), Card.class); + boolean found = Iterables.any(list, CardPredicates.restriction(v, sourceController, source, spellAbility)); if (found == property.startsWith("not")) { return false; } } else if (property.startsWith("dealtCombatDamageThisCombat ") || property.startsWith("notDealtCombatDamageThisCombat ")) { final String v = property.split(" ")[1]; - final List list = card.getDamageHistory().getThisCombatDamaged(); - boolean found = false; - for (final GameEntity e : list) { - if (e.isValid(v, sourceController, source, spellAbility)) { - found = true; - break; - } - } + final Iterable list = Iterables.filter(card.getDamageHistory().getThisCombatDamaged().keySet(), Card.class); + boolean found = Iterables.any(list, CardPredicates.restriction(v, sourceController, source, spellAbility)); if (found == property.startsWith("not")) { return false; } } else if (property.startsWith("controllerWasDealtCombatDamageByThisTurn")) { - if (!source.getDamageHistory().getThisTurnCombatDamaged().contains(controller)) { + if (!source.getDamageHistory().getThisTurnCombatDamaged().containsKey(controller)) { return false; } } else if (property.startsWith("controllerWasDealtDamageByThisTurn")) { - if (!source.getDamageHistory().getThisTurnDamaged().contains(controller)) { + if (!source.getDamageHistory().getThisTurnDamaged().containsKey(controller)) { return false; } } else if (property.startsWith("wasDealtDamageThisTurn")) { @@ -1208,7 +1114,7 @@ public class CardProperty { return false; } } else if (property.startsWith("dealtDamagetoAny")) { - return card.getHasdealtDamagetoAny(); + return card.getDamageHistory().getHasdealtDamagetoAny(); } else if (property.startsWith("attackedThisTurn")) { if (!card.getDamageHistory().getCreatureAttackedThisTurn()) { return false; @@ -1216,7 +1122,11 @@ public class CardProperty { } else if (property.startsWith("attackedLastTurn")) { return card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); } else if (property.startsWith("blockedThisTurn")) { - if (!card.getDamageHistory().getCreatureBlockedThisTurn()) { + if (card.getBlockedThisTurn().isEmpty()) { + return false; + } + } else if (property.startsWith("notBlockedThisTurn")) { + if (!card.getBlockedThisTurn().isEmpty()) { return false; } } else if (property.startsWith("notExertedThisTurn")) { @@ -1224,7 +1134,7 @@ public class CardProperty { return false; } } else if (property.startsWith("gotBlockedThisTurn")) { - if (!card.getDamageHistory().getCreatureGotBlockedThisTurn()) { + if (card.getBlockedByThisTurn().isEmpty()) { return false; } } else if (property.startsWith("notAttackedThisTurn")) { @@ -1233,10 +1143,7 @@ public class CardProperty { } } else if (property.startsWith("notAttackedLastTurn")) { return !card.getDamageHistory().getCreatureAttackedLastTurnOf(controller); - } else if (property.startsWith("notBlockedThisTurn")) { - if (card.getDamageHistory().getCreatureBlockedThisTurn()) { - return false; - } + } else if (property.startsWith("greatestPower")) { CardCollectionView cards = CardLists.filter(game.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); if (property.contains("ControlledBy")) { @@ -1358,11 +1265,11 @@ public class CardProperty { return false; } } else if (property.startsWith("token")) { - if (!card.isToken()) { + if (!card.isToken() && !card.isTokenCard()) { return false; } } else if (property.startsWith("nonToken")) { - if (card.isToken()) { + if (card.isToken() || card.isTokenCard()) { return false; } } else if (property.startsWith("copiedSpell")) { @@ -1457,6 +1364,12 @@ public class CardProperty { } } + else if (property.startsWith("ManaCost")) { + if (!card.getManaCost().getShortString().equals(property.substring(8))) { + return false; + } + } + // syntax example: countersGE9 P1P1 or countersLT12TIME (greater number // than 99 not supported) /* @@ -1796,7 +1709,7 @@ public class CardProperty { } else if (property.startsWith("set")) { final String setCode = property.substring(3, 6); final PaperCard setCard = StaticData.instance().getCommonCards().getCardFromEdition(card.getName(), CardDb.SetPreference.Earliest); - if (!setCard.getEdition().equals(setCode)) { + if (setCard != null && !setCard.getEdition().equals(setCode)) { return false; } } else if (property.startsWith("inZone")) { diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index 1a9ec8ce62f..f6181cdf596 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -32,6 +32,7 @@ import forge.card.CardStateName; import forge.card.CardType; import forge.card.ColorSet; import forge.card.MagicColor; +import forge.game.CardTraitBase; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; @@ -115,7 +116,7 @@ public final class CardUtil { * @param src a Card object * @return a CardCollection that matches the given criteria */ - public static List getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { + public static List getThisTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src, final CardTraitBase ctb) { List res = Lists.newArrayList(); final Game game = src.getGame(); if (to != ZoneType.Stack) { @@ -126,8 +127,7 @@ public final class CardUtil { else { res.addAll(game.getStackZone().getCardsAddedThisTurn(from)); } - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src, null); - return res; + return CardLists.getValidCardsAsList(res, valid, src.getController(), src, ctb); } /** @@ -139,7 +139,7 @@ public final class CardUtil { * @param src a Card object * @return a CardCollection that matches the given criteria */ - public static List getLastTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src) { + public static List getLastTurnEntered(final ZoneType to, final ZoneType from, final String valid, final Card src, final CardTraitBase ctb) { List res = Lists.newArrayList(); final Game game = src.getGame(); if (to != ZoneType.Stack) { @@ -150,16 +150,15 @@ public final class CardUtil { else { res.addAll(game.getStackZone().getCardsAddedLastTurn(from)); } - res = CardLists.getValidCardsAsList(res, valid, src.getController(), src, null); - return res; + return CardLists.getValidCardsAsList(res, valid, src.getController(), src, ctb); } - public static List getThisTurnCast(final String valid, final Card src) { - return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src, null); + public static List getThisTurnCast(final String valid, final Card src, final CardTraitBase ctb) { + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastThisTurn(), valid, src.getController(), src, ctb); } - public static List getLastTurnCast(final String valid, final Card src) { - return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src, null); + public static List getLastTurnCast(final String valid, final Card src, final CardTraitBase ctb) { + return CardLists.getValidCardsAsList(src.getGame().getStack().getSpellsCastLastTurn(), valid, src.getController(), src, ctb); } @@ -222,6 +221,8 @@ public final class CardUtil { newCopy.getCurrentState().copyFrom(in.getState(in.getFaceupCardStateName()), true); if (in.isFaceDown()) { + // prevent StackDescription from revealing face + newCopy.setName(in.toString()); newCopy.turnFaceDownNoUpdate(); } @@ -252,11 +253,16 @@ public final class CardUtil { newCopy.setCounters(Maps.newHashMap(in.getCounters())); newCopy.setColor(in.determineColor().getColor()); + newCopy.setPhasedOut(in.isPhasedOut()); + newCopy.setReceivedDamageFromThisTurn(in.getReceivedDamageFromThisTurn()); - newCopy.setReceivedDamageFromPlayerThisTurn(in.getReceivedDamageFromPlayerThisTurn()); - newCopy.setDealtDamageToThisTurn(in.getDealtDamageToThisTurn()); - newCopy.setDealtDamageToPlayerThisTurn(in.getDealtDamageToPlayerThisTurn()); - newCopy.getDamageHistory().setCreatureGotBlockedThisTurn(in.getDamageHistory().getCreatureGotBlockedThisTurn()); + newCopy.setDamageHistory(in.getDamageHistory()); + for (Card c : in.getBlockedThisTurn()) { + newCopy.addBlockedThisTurn(c); + } + for (Card c : in.getBlockedByThisTurn()) { + newCopy.addBlockedByThisTurn(c); + } newCopy.setAttachedCards(getLKICopyList(in.getAttachedCards(), cachedMap)); newCopy.setEntityAttachedTo(getLKICopy(in.getEntityAttachedTo(), cachedMap)); @@ -266,12 +272,8 @@ public final class CardUtil { for (final Card haunter : in.getHauntedBy()) { newCopy.addHauntedBy(haunter, false); } - for (final Object o : in.getRemembered()) { - newCopy.addRemembered(o); - } - for (final Card o : in.getImprintedCards()) { - newCopy.addImprintedCard(o); - } + newCopy.addRemembered(in.getRemembered()); + newCopy.addImprintedCards(in.getImprintedCards()); for(Table.Cell cl : in.getEtbCounters()) { newCopy.addEtbCounter(cl.getColumnKey(), cl.getValue(), cl.getRowKey()); @@ -322,15 +324,16 @@ public final class CardUtil { } public static CardCollection getRadiance(final SpellAbility sa) { - if (!sa.usesTargeting() || !sa.hasParam("Radiance")) { + SpellAbility targetSA = sa.getSATargetingCard(); + if (targetSA == null || !targetSA.usesTargeting() || !targetSA.hasParam("Radiance")) { return new CardCollection(); } - final Card source = sa.getHostCard(); + final Card source = targetSA.getHostCard(); final Game game = source.getGame(); final CardCollection res = new CardCollection(); - final String[] valid = sa.getParam("ValidTgts").split(","); - final CardCollectionView tgts = sa.getTargets().getTargetCards(); + final String[] valid = targetSA.getParam("ValidTgts").split(","); + final CardCollectionView tgts = targetSA.getTargets().getTargetCards(); byte combinedColor = 0; for (Card tgt : tgts) { @@ -346,7 +349,7 @@ public final class CardUtil { continue; } for(final Card c : game.getColoredCardsInPlay(MagicColor.toLongString(color))) { - if (!res.contains(c) && !tgts.contains(c) && c.isValid(valid, source.getController(), source, sa)) { + if (!res.contains(c) && !tgts.contains(c) && c.isValid(valid, source.getController(), source, targetSA)) { res.add(c); } } diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index aa0a182e7bd..2562e980e9f 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -233,6 +233,9 @@ public class CardView extends GameEntityView { set(TrackableProperty.Token, c.isToken()); } + public boolean isTokenCard() { return get(TrackableProperty.TokenCard); } + void updateTokenCard(Card c) { set(TrackableProperty.TokenCard, c.isTokenCard()); } + public boolean isCommander() { return get(TrackableProperty.IsCommander); } diff --git a/forge-game/src/main/java/forge/game/card/CounterEnumType.java b/forge-game/src/main/java/forge/game/card/CounterEnumType.java index e5096c9c6c9..dd097d4a44e 100644 --- a/forge-game/src/main/java/forge/game/card/CounterEnumType.java +++ b/forge-game/src/main/java/forge/game/card/CounterEnumType.java @@ -33,6 +33,8 @@ public enum CounterEnumType { LOYALTY("LOYAL", 198, 198, 198), + ACORN("ACORN", 139,69,19), + AEGIS("AEGIS", 207, 207, 207), AGE("AGE", 255, 137, 57), @@ -65,6 +67,8 @@ public enum CounterEnumType { CORPSE("CRPSE", 230, 186, 209), + CORRUPTION("CRPTN", 210, 121, 210), + CREDIT("CRDIT", 188, 197, 234), CRYSTAL("CRYST", 255, 85, 206), diff --git a/forge-game/src/main/java/forge/game/combat/Combat.java b/forge-game/src/main/java/forge/game/combat/Combat.java index 4a8e4409de8..aaddc15cd7b 100644 --- a/forge-game/src/main/java/forge/game/combat/Combat.java +++ b/forge-game/src/main/java/forge/game/combat/Combat.java @@ -73,13 +73,10 @@ public class Combat { private final Multimap attackedByBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); private final Multimap blockedBands = Multimaps.synchronizedMultimap(ArrayListMultimap.create()); - private final Map defendingDamageMap = Maps.newHashMap(); - private Map attackersOrderedForDamageAssignment = Maps.newHashMap(); private Map blockersOrderedForDamageAssignment = Maps.newHashMap(); private Map lkiCache = Maps.newHashMap(); - private CardDamageMap dealtDamageTo = new CardDamageMap(); - private boolean dividedToPlayer = false; + private CardDamageMap damageMap = new CardDamageMap(); // List holds creatures who have dealt 1st strike damage to disallow them deal damage on regular basis (unless they have double-strike KW) private CardCollection combatantsThatDealtFirstStrikeDamage = new CardCollection(); @@ -113,9 +110,6 @@ public class Combat { for (Entry entry : combat.blockedBands.entries()) { blockedBands.put(bandsMap.get(entry.getKey()), map.map(entry.getValue())); } - for (Entry entry : combat.defendingDamageMap.entrySet()) { - defendingDamageMap.put(map.map(entry.getKey()), entry.getValue()); - } for (Entry entry : combat.attackersOrderedForDamageAssignment.entrySet()) { attackersOrderedForDamageAssignment.put(map.map(entry.getKey()), map.mapCollection(entry.getValue())); @@ -124,8 +118,8 @@ public class Combat { blockersOrderedForDamageAssignment.put(map.map(entry.getKey()), map.mapCollection(entry.getValue())); } // Note: Doesn't currently set up lkiCache, since it's just a cache and not strictly needed... - for (Table.Cell entry : combat.dealtDamageTo.cellSet()) { - dealtDamageTo.put(map.map(entry.getRowKey()), map.map(entry.getColumnKey()), entry.getValue()); + for (Table.Cell entry : combat.damageMap.cellSet()) { + damageMap.put(map.map(entry.getRowKey()), map.map(entry.getColumnKey()), entry.getValue()); } attackConstraints = new AttackConstraints(this); @@ -170,7 +164,6 @@ public class Combat { attackableEntries.clear(); attackedByBands.clear(); blockedBands.clear(); - defendingDamageMap.clear(); attackersOrderedForDamageAssignment.clear(); blockersOrderedForDamageAssignment.clear(); lkiCache.clear(); @@ -289,7 +282,6 @@ public class Combat { public final Player getDefenderPlayerByAttacker(final Card c) { GameEntity defender = getDefenderByAttacker(c); - // System.out.println(c.toString() + " attacks " + defender.toString()); if (defender instanceof Player) { return (Player) defender; } @@ -729,6 +721,7 @@ public class Combat { Map map = assigningPlayer.getController().assignCombatDamage(blocker, attackers, damage, null, assigningPlayer != blocker.getController()); for (Entry dt : map.entrySet()) { dt.getKey().addAssignedDamage(dt.getValue(), blocker); + damageMap.put(blocker, dt.getKey(), dt.getValue()); } } } @@ -737,7 +730,6 @@ public class Combat { private final boolean assignAttackersDamage(boolean firstStrikeDamage) { // Assign damage by Attackers - defendingDamageMap.clear(); // this should really happen in deal damage CardCollection orderedBlockers = null; final CardCollection attackers = getAttackers(); boolean assignedDamage = false; @@ -785,20 +777,29 @@ public class Combat { } } assignedDamage = true; + GameEntity defender = getDefenderByAttacker(band); // If the Attacker is unblocked, or it's a trampler and has 0 blockers, deal damage to defender + if (defender instanceof Card && attacker.hasKeyword("Trample over planeswalkers")) { + if (orderedBlockers == null || orderedBlockers.isEmpty()) { + CardCollection cc = new CardCollection(); + cc.add((Card)defender); + orderedBlockers = cc; + } else { + orderedBlockers.add((Card) defender); + } + defender = getDefenderPlayerByAttacker(attacker); + } if (orderedBlockers == null || orderedBlockers.isEmpty()) { if (trampler || !band.isBlocked()) { // this is called after declare blockers, no worries 'bout nulls in isBlocked - addDefendingDamage(damageDealt, attacker); + damageMap.put(attacker, defender, damageDealt); } // No damage happens if blocked but no blockers left } else { - GameEntity defender = getDefenderByAttacker(band); Player assigningPlayer = getAttackingPlayer(); // Defensive Formation is very similar to Banding with Blockers // It allows the defending player to assign damage instead of the attacking player if (defender instanceof Card && divideCombatDamageAsChoose) { defender = getDefenderPlayerByAttacker(attacker); - dividedToPlayer = true; } if (defender instanceof Player && defender.hasKeyword("You assign combat damage of each creature attacking you.")) { assigningPlayer = (Player)defender; @@ -811,10 +812,15 @@ public class Combat { damageDealt, defender, divideCombatDamageAsChoose || getAttackingPlayer() != assigningPlayer); for (Entry dt : map.entrySet()) { if (dt.getKey() == null) { - if (dt.getValue() > 0) - addDefendingDamage(dt.getValue(), attacker); + if (dt.getValue() > 0) { + if (defender instanceof Card) { + ((Card) defender).addAssignedDamage(dt.getValue(), attacker); + } + damageMap.put(attacker, defender, dt.getValue()); + } } else { dt.getKey().addAssignedDamage(dt.getValue(), attacker); + damageMap.put(attacker, dt.getKey(), dt.getValue()); } } } // if !hasFirstStrike ... @@ -834,24 +840,6 @@ public class Combat { return !firstStrikeDamage && !combatantsThatDealtFirstStrikeDamage.contains(combatant); } - // Damage to whatever was protected there. - private final void addDefendingDamage(final int n, final Card source) { - final GameEntity ge = getDefenderByAttacker(source); - - if (ge instanceof Card && !dividedToPlayer) { - final Card planeswalker = (Card) ge; - planeswalker.addAssignedDamage(n, source); - return; - } - - if (!defendingDamageMap.containsKey(source)) { - defendingDamageMap.put(source, n); - } - else { - defendingDamageMap.put(source, defendingDamageMap.get(source) + n); - } - } - public final boolean assignCombatDamage(boolean firstStrikeDamage) { boolean assignedDamage = assignAttackersDamage(firstStrikeDamage); assignedDamage |= assignBlockersDamage(firstStrikeDamage); @@ -863,7 +851,7 @@ public class Combat { } public final CardDamageMap getDamageMap() { - return dealtDamageTo; + return damageMap; } public void dealAssignedDamage() { @@ -873,49 +861,7 @@ public class Combat { CardDamageMap preventMap = new CardDamageMap(); GameEntityCounterTable counterTable = new GameEntityCounterTable(); - // This function handles both Regular and First Strike combat assignment - for (final Entry entry : defendingDamageMap.entrySet()) { - GameEntity defender = getDefenderByAttacker(entry.getKey()); - if (dividedToPlayer) { - defender = getDefenderPlayerByAttacker(entry.getKey()); - } - if (defender instanceof Player) { // player - defender.addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); - } - else if (defender instanceof Card) { // planeswalker - ((Card) defender).getController().addCombatDamage(entry.getValue(), entry.getKey(), dealtDamageTo, preventMap, counterTable); - } - } - - // this can be much better below here... - - final CardCollection combatants = new CardCollection(); - combatants.addAll(getAttackers()); - combatants.addAll(getAllBlockers()); - combatants.addAll(getDefendingPlaneswalkers()); - combatants.addAll(getDefendersCreatures()); - - for (final Card c : combatants) { - // if no assigned damage to resolve, move to next - if (c.getTotalAssignedDamage() == 0) { - continue; - } - - c.addCombatDamage(c.getAssignedDamageMap(), dealtDamageTo, preventMap, counterTable); - c.clearAssignedDamage(); - } - - preventMap.triggerPreventDamage(true); - preventMap.clear(); - // This was deeper before, but that resulted in the stack entry acting like before. - - // Run the trigger to deal combat damage once - // LifeLink for Combat Damage at this place - dealtDamageTo.triggerDamageDoneOnce(true, game, null); - dealtDamageTo.clear(); - - counterTable.triggerCountersPutAll(game); - counterTable.clear(); + game.getAction().dealDamage(true, damageMap, preventMap, counterTable, null); // copy last state again for dying replacement effects game.copyLastState(); diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index adf74797230..1f21fe3606c 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -37,7 +37,6 @@ import forge.game.ability.AbilityKey; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.cost.Cost; @@ -241,7 +240,7 @@ public class CombatUtil { } // Quasi-goad logic for "Kardur, Doomscourge" etc. that isn't goad but behaves the same - if (defender.hasKeyword("Creatures your opponents control attack a player other than you if able.")) { + if (defender != null && defender.hasKeyword("Creatures your opponents control attack a player other than you if able.")) { for (GameEntity ge : getAllPossibleDefenders(attacker.getController())) { if (!defender.equals(ge) && ge instanceof Player) { if (canAttack(attacker, ge)) { @@ -252,22 +251,11 @@ public class CombatUtil { } // Keywords - final boolean canAttackWithDefender = attacker.hasKeyword("CARDNAME can attack as though it didn't have defender."); for (final KeywordInterface keyword : attacker.getKeywords()) { switch (keyword.getOriginal()) { case "CARDNAME can't attack.": case "CARDNAME can't attack or block.": return false; - case "CARDNAME can't attack if you cast a spell this turn.": - if (attacker.getController().getSpellsCastThisTurn() > 0) { - return false; - } - break; - case "Defender": - if (!canAttackWithDefender) { - return false; - } - break; } } @@ -381,10 +369,6 @@ public class CombatUtil { c.getDamageHistory().clearNotAttackedSinceLastUpkeepOf(); c.getController().addCreaturesAttackedThisTurn(c); c.getController().incrementAttackersDeclaredThisTurn(); - - if (combat.getDefenderByAttacker(c) != null && combat.getDefenderByAttacker(c) instanceof Player) { - c.getController().addAttackedOpponentThisTurn(combat.getDefenderPlayerByAttacker(c)); - } } // checkDeclareAttackers /** @@ -424,10 +408,10 @@ public class CombatUtil { return false; } if (combat == null) { - return CombatUtil.canBlock(blocker); + return canBlock(blocker); } - if (!CombatUtil.canBlockMoreCreatures(blocker, combat.getAttackersBlockedBy(blocker))) { + if (!canBlockMoreCreatures(blocker, combat.getAttackersBlockedBy(blocker))) { return false; } final Game game = blocker.getGame(); @@ -446,7 +430,7 @@ public class CombatUtil { return false; } - return CombatUtil.canBlock(blocker); + return canBlock(blocker); } // can the creature block at all? @@ -529,7 +513,7 @@ public class CombatUtil { return false; } } - return CombatUtil.canBeBlocked(attacker, defendingPlayer); + return canBeBlocked(attacker, defendingPlayer); } // can the attacker be blocked at all? @@ -607,6 +591,8 @@ public class CombatUtil { walkTypes.add("Land.Legendary"); } else if (keyword.equals("Nonbasic landwalk")) { walkTypes.add("Land.nonBasic"); + } else if (keyword.equals("Artifact landwalk")) { + walkTypes.add("Land.Artifact"); } else if (keyword.equals("Snow landwalk")) { walkTypes.add("Land.Snow"); } else if (keyword.endsWith("walk")) { @@ -654,7 +640,7 @@ public class CombatUtil { */ public static boolean canBlockAtLeastOne(final Card blocker, final Iterable attackers) { for (Card attacker : attackers) { - if (CombatUtil.canBlock(attacker, blocker)) { + if (canBlock(attacker, blocker)) { return true; } } @@ -673,7 +659,7 @@ public class CombatUtil { public static boolean canBeBlocked(final Card attacker, final List blockers, final Combat combat) { int blocks = 0; for (final Card blocker : blockers) { - if (CombatUtil.canBeBlocked(attacker, blocker.getController()) && CombatUtil.canBlock(attacker, blocker)) { + if (canBeBlocked(attacker, blocker.getController()) && canBlock(attacker, blocker)) { blocks++; } } @@ -688,7 +674,7 @@ public class CombatUtil { } for (final Card blocker : blockers) { - if (CombatUtil.canBeBlocked(attacker, blocker.getController()) && CombatUtil.canBlock(attacker, blocker)) { + if (canBeBlocked(attacker, blocker.getController()) && canBlock(attacker, blocker)) { potentialBlockers.add(blocker); } } @@ -705,27 +691,29 @@ public class CombatUtil { return minBlockerList; } - /** - *

- * needsMoreBlockers. - *

- * - * @param attacker - * a {@link forge.game.card.Card} object. - * @return a boolean. - */ - public static int needsBlockers(final Card attacker) { - - if (attacker == null) { - return 0; + // return all creatures that could help satisfy a blocking requirement without breaking another + // TODO according to 509.1c, this should really check if the maximum possible is already fulfilled + public static List findFreeBlockers(List defendersArmy, List attackers, Combat combat) { + final CardCollection freeBlockers = new CardCollection(); + for (Card blocker : defendersArmy) { + if (canBlock(blocker) && !mustBlockAnAttacker(blocker, combat, null)) { + CardCollection blockedAttackers = combat.getAttackersBlockedBy(blocker); + boolean blockChange = blockedAttackers.isEmpty(); + for (Card attacker : blockedAttackers) { + // check if we could unblock something + List blockersReduced = Lists.newArrayList(combat.getBlockers(attacker)); + blockersReduced.remove(blocker); + if (canBlockMoreCreatures(blocker, blockedAttackers) || canBeBlocked(attacker, blockersReduced, combat)) { + blockChange = true; + break; + } + } + if (blockChange) { + freeBlockers.add(blocker); + } + } } - // TODO: remove CantBeBlockedByAmount LT2 - if (attacker.hasKeyword("CantBeBlockedByAmount LT2") || attacker.hasKeyword(Keyword.MENACE)) { - return 2; - } else if (attacker.hasKeyword("CantBeBlockedByAmount LT3")) { - return 3; - } else - return 1; + return freeBlockers; } // Has the human player chosen all mandatory blocks? @@ -742,32 +730,44 @@ public class CombatUtil { final List defendersArmy = defending.getCreaturesInPlay(); final List attackers = combat.getAttackers(); final List blockers = CardLists.filterControlledBy(combat.getAllBlockers(), defending); + final List freeBlockers = findFreeBlockers(defendersArmy, attackers, combat); // if a creature does not block but should, return false for (final Card blocker : defendersArmy) { if (blocker.getMustBlockCards() != null) { - final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker); - for (Card cardToBeBlocked : blocker.getMustBlockCards()) { - if (!blockedSoFar.contains(cardToBeBlocked) && CombatUtil.canBlockMoreCreatures(blocker, blockedSoFar) - && combat.isAttacking(cardToBeBlocked) && CombatUtil.canBlock(cardToBeBlocked, blocker)) { - return TextUtil.concatWithSpace(blocker.toString(),"must still block", TextUtil.addSuffix(cardToBeBlocked.toString(),".")); - } - } + final CardCollectionView blockedSoFar = combat.getAttackersBlockedBy(blocker); + for (Card cardToBeBlocked : blocker.getMustBlockCards()) { + int additionalBlockers = getMinNumBlockersForAttacker(cardToBeBlocked, defending) -1; + int potentialBlockers = 0; + // if the attacker can only be blocked with multiple creatures check if that's possible + for (int i = 0; i < additionalBlockers; i++) { + for (Card freeBlocker: new CardCollection(freeBlockers)) { + if (freeBlocker != blocker && canBlock(cardToBeBlocked, freeBlocker)) { + freeBlockers.remove(freeBlocker); + potentialBlockers++; + } + } + } + if (potentialBlockers >= additionalBlockers && !blockedSoFar.contains(cardToBeBlocked) && canBlockMoreCreatures(blocker, blockedSoFar) + && combat.isAttacking(cardToBeBlocked) && canBlock(cardToBeBlocked, blocker)) { + return TextUtil.concatWithSpace(blocker.toString(),"must still block", TextUtil.addSuffix(cardToBeBlocked.toString(),".")); + } + } } // lure effects - if (!blockers.contains(blocker) && CombatUtil.mustBlockAnAttacker(blocker, combat)) { + if (!blockers.contains(blocker) && mustBlockAnAttacker(blocker, combat, freeBlockers)) { return TextUtil.concatWithSpace(blocker.toString(),"must block an attacker, but has not been assigned to block any."); } // "CARDNAME blocks each turn/combat if able." if (!blockers.contains(blocker) && (blocker.hasKeyword("CARDNAME blocks each turn if able.") || blocker.hasKeyword("CARDNAME blocks each combat if able."))) { for (final Card attacker : attackers) { - if (CombatUtil.canBlock(attacker, blocker, combat)) { + if (canBlock(attacker, blocker, combat)) { boolean must = true; if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") || attacker.hasKeyword(Keyword.MENACE)) { final List possibleBlockers = Lists.newArrayList(defendersArmy); possibleBlockers.remove(blocker); - if (!CombatUtil.canBeBlocked(attacker, possibleBlockers, combat)) { + if (!canBeBlocked(attacker, possibleBlockers, combat)) { must = false; } } @@ -825,12 +825,12 @@ public class CombatUtil { * a {@link forge.game.combat.Combat} object. * @return a boolean. */ - public static boolean mustBlockAnAttacker(final Card blocker, final Combat combat) { + public static boolean mustBlockAnAttacker(final Card blocker, final Combat combat, List freeBlockers) { if (blocker == null || combat == null) { return false; } - if (!CombatUtil.canBlock(blocker, combat)) { + if (!canBlock(blocker, combat)) { return false; } @@ -871,12 +871,12 @@ public class CombatUtil { final Player defender = blocker.getController(); for (final Card attacker : attackersWithLure) { - if (CombatUtil.canBeBlocked(attacker, combat, defender) && CombatUtil.canBlock(attacker, blocker)) { + if (canBeBlocked(attacker, combat, defender) && canBlock(attacker, blocker)) { boolean canBe = true; if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") || attacker.hasKeyword(Keyword.MENACE)) { final List blockers = combat.getDefenderPlayerByAttacker(attacker).getCreaturesInPlay(); blockers.remove(blocker); - if (!CombatUtil.canBeBlocked(attacker, blockers, combat)) { + if (!canBeBlocked(attacker, blockers, combat)) { canBe = false; } } @@ -888,13 +888,13 @@ public class CombatUtil { if (blocker.getMustBlockCards() != null) { for (final Card attacker : blocker.getMustBlockCards()) { - if (CombatUtil.canBeBlocked(attacker, combat, defender) && CombatUtil.canBlock(attacker, blocker) + if (canBeBlocked(attacker, combat, defender) && canBlock(attacker, blocker) && combat.isAttacking(attacker)) { boolean canBe = true; if (attacker.hasStartOfKeyword("CantBeBlockedByAmount LT") || attacker.hasKeyword(Keyword.MENACE)) { - final List blockers = combat.getDefenderPlayerByAttacker(attacker).getCreaturesInPlay(); + final List blockers = freeBlockers != null ? new CardCollection(freeBlockers) : combat.getDefenderPlayerByAttacker(attacker).getCreaturesInPlay(); blockers.remove(blocker); - if (!CombatUtil.canBeBlocked(attacker, blockers, combat)) { + if (!canBeBlocked(attacker, blockers, combat)) { canBe = false; } } @@ -929,7 +929,7 @@ public class CombatUtil { for (Card c : creatures) { for (Card a : attackers) { - if (CombatUtil.canBlock(a, c, combat)) { + if (canBlock(a, c, combat)) { return true; } } @@ -956,10 +956,10 @@ public class CombatUtil { return false; } - if (!CombatUtil.canBlock(blocker, combat)) { + if (!canBlock(blocker, combat)) { return false; } - if (!CombatUtil.canBeBlocked(attacker, combat, blocker.getController())) { + if (!canBeBlocked(attacker, combat, blocker.getController())) { return false; } if (combat != null && combat.isBlocking(blocker, attacker)) { // Can't block if already blocking the attacker @@ -996,11 +996,11 @@ public class CombatUtil { && !(attacker.hasKeyword("CARDNAME must be blocked by two or more creatures if able.") && combat.getBlockers(attacker).size() < 2) && !(blocker.getMustBlockCards() != null && blocker.getMustBlockCards().contains(attacker)) && !mustBeBlockedBy - && CombatUtil.mustBlockAnAttacker(blocker, combat)) { + && mustBlockAnAttacker(blocker, combat, null)) { return false; } - return CombatUtil.canBlock(attacker, blocker); + return canBlock(attacker, blocker); } // can the blocker block the attacker? @@ -1037,14 +1037,10 @@ public class CombatUtil { } final Game game = attacker.getGame(); - if (!CombatUtil.canBlock(blocker, nextTurn)) { + if (!canBlock(blocker, nextTurn)) { return false; } - if (!CombatUtil.canBeBlocked(attacker, blocker.getController())) { - return false; - } - - if (CardFactoryUtil.hasProtectionFrom(blocker, attacker)) { + if (!canBeBlocked(attacker, blocker.getController())) { return false; } @@ -1068,15 +1064,6 @@ public class CombatUtil { return false; } - if (attacker.hasKeyword("Creatures with power less than CARDNAME's power can't block it.") && attacker.getNetPower() > blocker.getNetPower()) { - return false; - } - - if ((attacker.hasKeyword("Creatures with power greater than CARDNAME's power can't block it.") || attacker.hasKeyword(Keyword.SKULK)) - && attacker.getNetPower() < blocker.getNetPower()) { - return false; - } - // CantBlockBy static abilities for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { for (final StaticAbility stAb : ca.getStaticAbilities()) { @@ -1086,62 +1073,14 @@ public class CombatUtil { } } - for (KeywordInterface inst : blocker.getKeywords()) { - String keyword = inst.getOriginal(); - if (keyword.startsWith("CantBlockCardUID")) { - final String[] k = keyword.split("_", 2); - if (attacker.getId() == Integer.parseInt(k[1])) { - return false; - } - } else if (keyword.startsWith("CantBlock")) { - final String[] parse0 = keyword.split(":"); - final String[] k = parse0[0].split(" ", 2); - final String[] restrictions = k[1].split(","); - if (attacker.isValid(restrictions, blocker.getController(), blocker, null)) { - return false; - } - } - } - - if (blocker.hasKeyword("CARDNAME can block only creatures with flying.") && !attacker.hasKeyword(Keyword.FLYING)) { - return false; - } - - if (attacker.hasKeyword(Keyword.FLYING) && !blocker.hasKeyword(Keyword.FLYING) && !blocker.hasKeyword(Keyword.REACH)) { - boolean stillblock = false; - for (KeywordInterface inst : blocker.getKeywords()) { - String k = inst.getOriginal(); - if (k.startsWith("IfReach")) { - String[] n = k.split(":"); - if (attacker.getType().hasCreatureType(n[1])) { - stillblock = true; - break; - } - } - } - if (!stillblock) { - return false; - } - } - - if (attacker.hasKeyword(Keyword.HORSEMANSHIP) && !blocker.hasKeyword(Keyword.HORSEMANSHIP)) { - return false; - } - - // color is hardcoded there - if (attacker.hasKeyword(Keyword.FEAR) && !blocker.isArtifact() && !blocker.isBlack()) { - return false; - } - - if (attacker.hasKeyword(Keyword.INTIMIDATE) && !blocker.isArtifact() && !blocker.sharesColorWith(attacker)) { - return false; - } - return true; } // canBlock() public static boolean canAttackerBeBlockedWithAmount(Card attacker, int amount, Combat combat) { - if( amount == 0 ) + return canAttackerBeBlockedWithAmount(attacker, amount, combat != null ? combat.getDefenderPlayerByAttacker(attacker) : null); + } + public static boolean canAttackerBeBlockedWithAmount(Card attacker, int amount, Player defender) { + if(amount == 0 ) return false; // no block List restrictions = Lists.newArrayList(); @@ -1160,19 +1099,7 @@ public class CombatUtil { if (Expressions.compare(amount, operator, operand) ) return false; } - if (combat != null && attacker.hasKeyword("CARDNAME can't be blocked " + - "unless all creatures defending player controls block it.")) { - Player defender = combat.getDefenderPlayerByAttacker(attacker); - if (defender == null) { - // TODO: a better fix is needed here (to prevent a hard NPE, e.g. when the AI attacks with Tromokratis). - System.out.println("Warning: defender was 'null' in CombatUtil::canAttackerBeBlockedWithAmount for the card " + attacker + ", attempting to deduce defender."); - defender = combat.getDefendingPlayers().getFirst(); - if (defender != null) { - return amount >= defender.getCreaturesInPlay().size(); - } - System.out.println("Warning: it was impossible to deduce the defending player in CombatUtil#canAttackerBeBlockedWithAmount, returning 'true' (safest default)."); - return true; - } + if (defender != null && attacker.hasKeyword("CARDNAME can't be blocked unless all creatures defending player controls block it.")) { return amount >= defender.getCreaturesInPlay().size(); } diff --git a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java index df2985274e8..88ad8460560 100644 --- a/forge-game/src/main/java/forge/game/cost/CostAdjustment.java +++ b/forge-game/src/main/java/forge/game/cost/CostAdjustment.java @@ -18,7 +18,6 @@ import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; @@ -123,7 +122,7 @@ public class CostAdjustment { if ("Escalate".equals(amount)) { SpellAbility sub = sa; while(sub != null) { - if (!sub.getSVar("CharmOrder").equals("")) { + if (sub.getDirectSVars().containsKey("CharmOrder")) { count++; } sub = sub.getSubAbility(); @@ -139,9 +138,9 @@ public class CostAdjustment { count = Integer.parseInt(amount); } else { if (st.hasParam("AffectedAmount")) { - count = CardFactoryUtil.xCount(card, hostCard.getSVar(amount)); + count = AbilityUtils.calculateAmount(card, amount, st); } else { - count = AbilityUtils.calculateAmount(hostCard, amount, sa); + count = AbilityUtils.calculateAmount(hostCard, amount, st); } } } @@ -380,7 +379,7 @@ public class CostAdjustment { int value; if ("AffectedX".equals(amount)) { - value = CardFactoryUtil.xCount(card, hostCard.getSVar(amount)); + value = AbilityUtils.calculateAmount(card, amount, staticAbility); } else if ("Undaunted".equals(amount)) { value = card.getController().getOpponents().size(); } else if (staticAbility.hasParam("Relative")) { @@ -429,13 +428,13 @@ public class CostAdjustment { final Card card = sa.getHostCard(); final Game game = hostCard.getGame(); - if (st.hasParam("ValidCard") && !st.matchesValid(card, st.getParam("ValidCard").split(","))) { + if (!st.matchesValidParam("ValidCard", card)) { return false; } - if (st.hasParam("ValidSpell") && !st.matchesValid(sa, st.getParam("ValidSpell").split(","))) { + if (!st.matchesValidParam("ValidSpell", sa)) { return false; } - if (st.hasParam("Activator") && !st.matchesValid(activator, st.getParam("Activator").split(","))) { + if (!st.matchesValidParam("Activator", activator)) { return false; } if (st.hasParam("NonActivatorTurn") && ((activator == null) @@ -455,7 +454,7 @@ public class CostAdjustment { } List list; if (st.hasParam("ValidCard")) { - list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard); + list = CardUtil.getThisTurnCast(st.getParam("ValidCard"), hostCard, st); } else { list = game.getStack().getSpellsCastThisTurn(); } diff --git a/forge-game/src/main/java/forge/game/cost/CostDamage.java b/forge-game/src/main/java/forge/game/cost/CostDamage.java index 198ac700ea8..fa2e229a9b0 100644 --- a/forge-game/src/main/java/forge/game/cost/CostDamage.java +++ b/forge-game/src/main/java/forge/game/cost/CostDamage.java @@ -71,15 +71,9 @@ public class CostDamage extends CostPart { CardDamageMap preventMap = new CardDamageMap(); GameEntityCounterTable table = new GameEntityCounterTable(); - payer.addDamage(decision.c, source, damageMap, preventMap, table, sa); + damageMap.put(source, payer, decision.c); + source.getGame().getAction().dealDamage(false, damageMap, preventMap, table, sa); - preventMap.triggerPreventDamage(false); - damageMap.triggerDamageDoneOnce(false, source.getGame(), sa); - table.triggerCountersPutAll(payer.getGame()); - - preventMap.clear(); - damageMap.clear(); - table.clear(); return decision.c > 0; } diff --git a/forge-game/src/main/java/forge/game/cost/CostPayLife.java b/forge-game/src/main/java/forge/game/cost/CostPayLife.java index 117fba983c3..7953ec78f7e 100644 --- a/forge-game/src/main/java/forge/game/cost/CostPayLife.java +++ b/forge-game/src/main/java/forge/game/cost/CostPayLife.java @@ -76,9 +76,13 @@ public class CostPayLife extends CostPart { Integer amount = this.convertAmount(); if (amount == null) { // try to calculate when it's defined. amount = AbilityUtils.calculateAmount(ability.getHostCard(), getAmount(), ability); + // CR 107.1b + if (getAmount().contains("/Half")) { + amount = Math.max(amount, 0); + } } - if ((amount != null) && !payer.canPayLife(amount)) { + if (amount != null && !payer.canPayLife(amount)) { return false; } diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 3f5bed4a1b9..d2b3dd41127 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -18,7 +18,7 @@ public enum Keyword { UNDEFINED("", SimpleKeyword.class, false, ""), ABSORB("Absorb", KeywordWithAmount.class, false, "If a source would deal damage to this creature, prevent %d of that damage."), ADAPT("Adapt", KeywordWithCostAndAmount.class, false, "If this creature has no +1/+1 counters on it, put {%2$d:+1/+1 counter} on it."), - AFFINITY("Affinity", KeywordWithType.class, false, "This spell costs you {1} less to cast for each %s you control."), + AFFINITY("Affinity", KeywordWithType.class, false, "This spell costs {1} less to cast for each %s you control."), AFFLICT("Afflict", KeywordWithAmount.class, false, "Whenever this creature becomes blocked, defending player loses %d life."), AFTERLIFE("Afterlife", KeywordWithAmount.class, false, "When this creature dies, create {%1$d:1/1 white and black Spirit creature token} with flying."), AFTERMATH("Aftermath", SimpleKeyword.class, false, "Cast this spell only from your graveyard. Then exile it."), @@ -59,7 +59,7 @@ public enum Keyword { EMERGE("Emerge", KeywordWithCost.class, false, "You may cast this spell by sacrificing a creature and paying the emerge cost reduced by that creature's mana value."), ENCHANT("Enchant", KeywordWithType.class, false, "Target a %s as you cast this. This card enters the battlefield attached to that %s."), ENCORE("Encore", KeywordWithCost.class, false, "%s, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery."), - ENTWINE("Entwine", KeywordWithCost.class, true, "You may choose all modes of this spell instead of just one. If you do, you pay an additional %s."), + ENTWINE("Entwine", KeywordWithCost.class, true, "Choose both if you pay the entwine cost."), EPIC("Epic", SimpleKeyword.class, true, "For the rest of the game, you can't cast spells. At the beginning of each of your upkeeps for the rest of the game, copy this spell except for its epic ability. If the spell has any targets, you may choose new targets for the copy."), EQUIP("Equip", Equip.class, false, "%s: Attach to target %s you control. Equip only as a sorcery."), ESCAPE("Escape", KeywordWithCost.class, false, "You may cast this card from your graveyard for its escape cost."), @@ -153,6 +153,7 @@ public enum Keyword { SUSPEND("Suspend", Suspend.class, false, "Rather than cast this card from your hand, you may pay %s and exile it with {%d:time counter} on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost."), TOTEM_ARMOR("Totem armor", SimpleKeyword.class, true, "If enchanted permanent would be destroyed, instead remove all damage marked on it and destroy this Aura."), TRAMPLE("Trample", SimpleKeyword.class, true, "This creature can deal excess combat damage to the player or planeswalker it's attacking."), + TRAMPLE_OVER_PLANESWALKERS("Trample over planeswalkers", SimpleKeyword.class, true, "This creature can deal excess combat damage to the controller of the planeswalker it’s attacking."), TRANSFIGURE("Transfigure", KeywordWithCost.class, false, "%s, Sacrifice this creature: Search your library for a creature card with the same mana value as this creature and put that card onto the battlefield, then shuffle. Transfigure only as a sorcery."), TRANSMUTE("Transmute", KeywordWithCost.class, false, "%s, Discard this card: Search your library for a card with the same mana value as this card, reveal it, and put it into your hand, then shuffle. Transmute only as a sorcery."), TRIBUTE("Tribute", KeywordWithAmount.class, false, "As this creature enters the battlefield, an opponent of your choice may put {%d:+1/+1 counter} on it."), diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java index 167cc20dce5..f6aa73dd3cf 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithCostAndType.java @@ -24,6 +24,8 @@ public class KeywordWithCostAndType extends KeywordInstance { type = details.toLowerCase(); } else if (details.contains(":")) { type = details.split(":")[0]; + if (this.toString().startsWith("Affinity")) { + type = details.split(":")[1]; + } } else { type = details; } 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 cfce8d2a891..9974a79bebf 100644 --- a/forge-game/src/main/java/forge/game/phase/PhaseHandler.java +++ b/forge-game/src/main/java/forge/game/phase/PhaseHandler.java @@ -92,7 +92,6 @@ public class PhaseHandler implements java.io.Serializable { private int nUpkeepsThisGame = 0; private int nCombatsThisTurn = 0; private int nMain2sThisTurn = 0; - private boolean bPreventCombatDamageThisTurn = false; private int planarDiceRolledthisTurn = 0; private transient Player playerTurn = null; @@ -162,6 +161,8 @@ public class PhaseHandler implements java.io.Serializable { boolean isTopsy = playerTurn.getAmountOfKeyword("The phases of your turn are reversed.") % 2 == 1; boolean turnEnded = false; + game.getStack().clearUndoStack(); //can't undo action from previous phase + if (bRepeatCleanup) { // for when Cleanup needs to repeat itself bRepeatCleanup = false; } @@ -184,6 +185,28 @@ public class PhaseHandler implements java.io.Serializable { setPhase(PhaseType.getNext(phase, isTopsy)); } + if (turnEnded) { + turn++; + extraPhases.clear(); + game.updateTurnForView(); + game.fireEvent(new GameEventTurnBegan(playerTurn, turn)); + + // Tokens starting game in play should suffer from Sum. Sickness + for (final Card c : playerTurn.getCardsIncludePhasingIn(ZoneType.Battlefield)) { + if (playerTurn.getTurn() > 0 || !c.isStartsGameInPlay()) { + c.setSickness(false); + } + } + playerTurn.incrementTurn(); + + game.getAction().resetActivationsPerTurn(); + + final List lands = CardLists.filter(playerTurn.getLandsInPlay(), Presets.UNTAPPED); + playerTurn.setNumPowerSurgeLands(lands.size()); + } + //update tokens + game.fireEvent(new GameEventTokenStateUpdate(playerTurn.getTokensInPlay())); + // Replacement effects final Map repRunParams = AbilityKey.mapFromAffected(playerTurn); repRunParams.put(AbilityKey.Phase, phase.nameForScripts); @@ -206,32 +229,7 @@ public class PhaseHandler implements java.io.Serializable { } } - game.getStack().clearUndoStack(); //can't undo action from previous phase - String phaseType = oldPhase == phase ? "Repeat" : phase == PhaseType.getNext(oldPhase, isTopsy) ? "" : "Additional"; - - if (turnEnded) { - turn++; - extraPhases.clear(); - game.updateTurnForView(); - game.fireEvent(new GameEventTurnBegan(playerTurn, turn)); - - // Tokens starting game in play should suffer from Sum. Sickness - for (final Card c : playerTurn.getCardsIncludePhasingIn(ZoneType.Battlefield)) { - if (playerTurn.getTurn() > 0 || !c.isStartsGameInPlay()) { - c.setSickness(false); - } - } - playerTurn.incrementTurn(); - - game.getAction().resetActivationsPerTurn(); - - final List lands = CardLists.filter(playerTurn.getLandsInPlay(), Presets.UNTAPPED); - playerTurn.setNumPowerSurgeLands(lands.size()); - } - //update tokens - game.fireEvent(new GameEventTokenStateUpdate(playerTurn.getTokensInPlay())); - game.fireEvent(new GameEventTurnPhase(playerTurn, phase, phaseType)); } @@ -477,7 +475,7 @@ public class PhaseHandler implements java.io.Serializable { boolean manaBurns = game.getRules().hasManaBurn() || (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.manaBurn)); if (manaBurns) { - p.loseLife(burn,true); + p.loseLife(burn, true); } } @@ -487,7 +485,7 @@ public class PhaseHandler implements java.io.Serializable { break; case UPKEEP: - for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + for (Card c : game.getCardsIncludePhasingIn(ZoneType.Battlefield)) { c.getDamageHistory().setNotAttackedSinceLastUpkeepOf(playerTurn); c.getDamageHistory().setNotBlockedSinceLastUpkeepOf(playerTurn); c.getDamageHistory().setNotBeenBlockedSinceLastUpkeepOf(playerTurn); @@ -521,7 +519,6 @@ public class PhaseHandler implements java.io.Serializable { break; case CLEANUP: - bPreventCombatDamageThisTurn = false; if (!bRepeatCleanup) { // only call onCleanupPhase when Cleanup is not repeated game.onCleanupPhase(); @@ -668,8 +665,7 @@ public class PhaseHandler implements java.io.Serializable { return; } - // Handles removing cards like Mogg Flunkies from combat if group block - // didn't occur + // Handles removing cards like Mogg Flunkies from combat if group block didn't occur for (Card blocker : CardLists.filterControlledBy(combat.getAllBlockers(), p)) { final List attackers = Lists.newArrayList(combat.getAttackersBlockedBy(blocker)); for (Card attacker : attackers) { @@ -835,8 +831,9 @@ public class PhaseHandler implements java.io.Serializable { return noCost || blocker.getController().getController().payManaOptional(blocker, blockCost, fakeSA, "Pay cost to declare " + blocker + " a blocker. ", ManaPaymentPurpose.DeclareBlocker); } - public final boolean isPreventCombatDamageThisTurn() { - return bPreventCombatDamageThisTurn; + public void resetExtra() { + extraPhases.clear(); + extraTurns.clear(); } private Player handleNextTurn() { @@ -848,6 +845,9 @@ public class PhaseHandler implements java.io.Serializable { game.getTriggerHandler().resetTurnTriggerState(); Player next = getNextActivePlayer(); + while (next.hasLost()) { + next = getNextActivePlayer(); + } game.getTriggerHandler().handlePlayerDefinedDelTriggers(next); @@ -1220,10 +1220,6 @@ public class PhaseHandler implements java.io.Serializable { onPhaseBegin(); } - public final void setPreventCombatDamageThisTurn() { - bPreventCombatDamageThisTurn = true; - } - public int getPlanarDiceRolledthisTurn() { return planarDiceRolledthisTurn; } diff --git a/forge-game/src/main/java/forge/game/phase/Untap.java b/forge-game/src/main/java/forge/game/phase/Untap.java index e5f2ffdc0e6..1fec36dc06b 100644 --- a/forge-game/src/main/java/forge/game/phase/Untap.java +++ b/forge-game/src/main/java/forge/game/phase/Untap.java @@ -71,6 +71,8 @@ public class Untap extends Phase { final Player turn = game.getPhaseHandler().getPlayerTurn(); Untap.doPhasing(turn); + + game.getAction().checkStaticAbilities(); doUntap(); } 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 161f38409bd..fd673898f49 100644 --- a/forge-game/src/main/java/forge/game/player/Player.java +++ b/forge-game/src/main/java/forge/game/player/Player.java @@ -31,7 +31,6 @@ import java.util.Map.Entry; import java.util.NavigableMap; import java.util.Set; import java.util.SortedSet; -import java.util.TreeMap; import java.util.concurrent.ConcurrentSkipListMap; import org.apache.commons.lang3.tuple.ImmutablePair; @@ -69,7 +68,6 @@ import forge.game.ability.effects.DetachedCardEffect; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; -import forge.game.card.CardDamageMap; import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; @@ -591,7 +589,7 @@ public class Player extends GameEntity implements Comparable { } public final boolean canPayLife(final int lifePayment) { - if (life < lifePayment) { + if (lifePayment > 0 && life < lifePayment) { return false; } return (lifePayment <= 0) || !hasKeyword("Your life total can't change."); @@ -637,12 +635,11 @@ public class Player extends GameEntity implements Comparable { // This function handles damage after replacement and prevention effects are applied @Override - public final int addDamageAfterPrevention(final int amount, final Card source, final boolean isCombat, CardDamageMap damageMap, GameEntityCounterTable counterTable) { + public final int addDamageAfterPrevention(final int amount, final Card source, final boolean isCombat, GameEntityCounterTable counterTable) { if (amount <= 0) { return 0; } //String additionalLog = ""; - source.addDealtDamageToPlayerThisTurn(getName(), amount); boolean infect = source.hasKeyword(Keyword.INFECT) || hasKeyword("All damage is dealt to you as though its source had infect."); @@ -682,7 +679,7 @@ public class Player extends GameEntity implements Comparable { int old = assignedDamage.containsKey(source) ? assignedDamage.get(source) : 0; assignedDamage.put(source, old + amount); - source.getDamageHistory().registerDamage(this); + source.getDamageHistory().registerDamage(this, amount); if (isCombat) { old = assignedCombatDamage.containsKey(source) ? assignedCombatDamage.get(source) : 0; @@ -690,6 +687,7 @@ public class Player extends GameEntity implements Comparable { for (final String type : source.getType().getCreatureTypes()) { source.getController().addProwlType(type); } + source.getDamageHistory().registerCombatDamage(this, amount); } // Run triggers @@ -704,45 +702,9 @@ public class Player extends GameEntity implements Comparable { game.fireEvent(new GameEventPlayerDamaged(this, source, amount, isCombat, infect)); - if (amount > 0) { - damageMap.put(source, this, amount); - } return amount; } - // This should be also usable by the AI to forecast an effect (so it must not change the game state) - @Override - public final int staticDamagePrevention(final int damage, final Card source, final boolean isCombat, final boolean isTest) { - if (damage <= 0) { - return 0; - } - if (!source.canDamagePrevented(isCombat)) { - return damage; - } - - if (isCombat && game.getPhaseHandler().isPreventCombatDamageThisTurn()) { - return 0; - } - - if (hasProtectionFromDamage(source)) { - return 0; - } - - int restDamage = damage; - - // Prevent Damage static abilities - for (final Card ca : game.getCardsIn(ZoneType.STATIC_ABILITIES_SOURCE_ZONES)) { - for (final StaticAbility stAb : ca.getStaticAbilities()) { - restDamage = stAb.applyAbility("PreventDamage", source, this, restDamage, isCombat, isTest); - } - } - - if (restDamage > 0) { - return restDamage; - } - return 0; - } - // This is usable by the AI to forecast an effect (so it must // not change the game state) // 2012/01/02: No longer used in calculating the finalized damage, but @@ -840,83 +802,6 @@ public class Player extends GameEntity implements Comparable { return restDamage; } - protected int preventShieldEffect(final int damage) { - if (damage <= 0) { - return 0; - } - - int restDamage = damage; - - boolean DEBUGShieldsWithEffects = false; - while (!getPreventNextDamageWithEffect().isEmpty() && restDamage != 0) { - Map> shieldMap = getPreventNextDamageWithEffect(); - CardCollection preventionEffectSources = new CardCollection(shieldMap.keySet()); - Card shieldSource = preventionEffectSources.get(0); - if (preventionEffectSources.size() > 1) { - Map choiceMap = new TreeMap<>(); - List choices = new ArrayList<>(); - for (final Card key : preventionEffectSources) { - String effDesc = shieldMap.get(key).get("EffectString"); - int descIndex = effDesc.indexOf("SpellDescription"); - effDesc = effDesc.substring(descIndex + 18); - String shieldDescription = key.toString() + " - " + shieldMap.get(shieldSource).get("ShieldAmount") - + " shields - " + effDesc; - choices.add(shieldDescription); - choiceMap.put(shieldDescription, key); - } - shieldSource = getController().chooseProtectionShield(this, choices, choiceMap); - } - if (DEBUGShieldsWithEffects) { - System.out.println("Prevention shield source: " + shieldSource); - } - - int shieldAmount = Integer.valueOf(shieldMap.get(shieldSource).get("ShieldAmount")); - int dmgToBePrevented = Math.min(restDamage, shieldAmount); - if (DEBUGShieldsWithEffects) { - System.out.println("Selected source initial shield amount: " + shieldAmount); - System.out.println("Incoming damage: " + restDamage); - System.out.println("Damage to be prevented: " + dmgToBePrevented); - } - - //Set up ability - SpellAbility shieldSA = null; - String effectAbString = shieldMap.get(shieldSource).get("EffectString"); - effectAbString = TextUtil.fastReplace(effectAbString, "PreventedDamage", Integer.toString(dmgToBePrevented)); - effectAbString = TextUtil.fastReplace(effectAbString, "ShieldEffectTarget", shieldMap.get(shieldSource).get("ShieldEffectTarget")); - if (DEBUGShieldsWithEffects) { - System.out.println("Final shield ability string: " + effectAbString); - } - shieldSA = AbilityFactory.getAbility(effectAbString, shieldSource); - if (shieldSA.usesTargeting()) { - System.err.println(shieldSource + " - Targeting for prevention shield's effect should be done with initial spell"); - } - - boolean apiIsEffect = (shieldSA.getApi() == ApiType.Effect); - CardCollectionView cardsInCommand = null; - if (apiIsEffect) { - cardsInCommand = getGame().getCardsIn(ZoneType.Command); - } - - getController().playSpellAbilityNoStack(shieldSA, true); - if (apiIsEffect) { - CardCollection newCardsInCommand = new CardCollection(getGame().getCardsIn(ZoneType.Command)); - newCardsInCommand.removeAll(cardsInCommand); - if (!newCardsInCommand.isEmpty()) { - newCardsInCommand.get(0).setSVar("PreventedDamage", "Number$" + dmgToBePrevented); - } - } - subtractPreventNextDamageWithEffect(shieldSource, restDamage); - restDamage = restDamage - dmgToBePrevented; - - if (DEBUGShieldsWithEffects) { - System.out.println("Remaining shields: " - + (shieldMap.containsKey(shieldSource) ? shieldMap.get(shieldSource).get("ShieldAmount") : "all shields used")); - System.out.println("Remaining damage: " + restDamage); - } - } - return restDamage; - } - public final void clearAssignedDamage() { assignedDamage.clear(); assignedCombatDamage.clear(); @@ -1278,9 +1163,8 @@ public class Player extends GameEntity implements Comparable { return !hasProtectionFrom(sa.getHostCard()); } - public boolean hasProtectionFromDamage(final Card source) { - return hasProtectionFrom(source, false, false); + return hasProtectionFrom(source, false, true); } @Override @@ -1358,7 +1242,6 @@ public class Player extends GameEntity implements Comparable { } public void surveil(int num, SpellAbility cause) { - final Map repParams = AbilityKey.mapFromAffected(this); repParams.put(AbilityKey.Source, cause); repParams.put(AbilityKey.SurveilNum, num); @@ -2073,10 +1956,6 @@ public class Player extends GameEntity implements Comparable { attackersDeclaredThisTurn = 0; } - public final PlayerCollection getAttackedOpponentsThisTurn() { return attackedOpponentsThisTurn; } - public final void addAttackedOpponentThisTurn(Player p) { attackedOpponentsThisTurn.add(p); } - public final void resetAttackedOpponentsThisTurn() { attackedOpponentsThisTurn.clear(); } - public final void altWinBySpellEffect(final String sourceName) { if (cantWin()) { System.out.println("Tried to win, but currently can't."); @@ -2597,8 +2476,6 @@ public class Player extends GameEntity implements Comparable { for (final PlayerZone pz : zones.values()) { pz.resetCardsAddedThisTurn(); } - resetPreventNextDamage(); - resetPreventNextDamageWithEffect(); resetNumDrawnThisTurn(); resetNumDiscardedThisTurn(); resetNumForetoldThisTurn(); @@ -2615,7 +2492,6 @@ public class Player extends GameEntity implements Comparable { resetSacrificedThisTurn(); clearAssignedDamage(); resetAttackersDeclaredThisTurn(); - resetAttackedOpponentsThisTurn(); setRevolt(false); resetProwl(); setSpellsCastLastTurn(getSpellsCastThisTurn()); @@ -2798,11 +2674,6 @@ public class Player extends GameEntity implements Comparable { //getZone(ZoneType.Command).add(c); } - //DBG - //System.out.println("CurrentPlanes: " + currentPlanes); - //System.out.println("ActivePlanes: " + game.getActivePlanes()); - //System.out.println("CommandPlanes: " + getZone(ZoneType.Command).getCards()); - game.setActivePlanes(currentPlanes); //Run PlaneswalkedTo triggers here. final Map runParams = AbilityKey.newMap(); @@ -2827,11 +2698,6 @@ public class Player extends GameEntity implements Comparable { game.getAction().moveTo(ZoneType.PlanarDeck, plane,-1, null); } currentPlanes.clear(); - - //DBG - //System.out.println("CurrentPlanes: " + currentPlanes); - //System.out.println("ActivePlanes: " + game.getActivePlanes()); - //System.out.println("CommandPlanes: " + getZone(ZoneType.Command).getCards()); } /** diff --git a/forge-game/src/main/java/forge/game/player/PlayerController.java b/forge-game/src/main/java/forge/game/player/PlayerController.java index dd110de1f9d..6a94b3e4ccb 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerController.java +++ b/forge-game/src/main/java/forge/game/player/PlayerController.java @@ -108,6 +108,7 @@ public abstract class PlayerController { public abstract List chooseCardsYouWonToAddToDeck(List losses); public abstract Map assignCombatDamage(Card attacker, CardCollectionView blockers, int damageDealt, GameEntity defender, boolean overrideOrder); + public abstract Map divideShield(Card effectSource, Map affected, int shieldAmount); public abstract Integer announceRequirements(SpellAbility ability, String announce); public abstract CardCollectionView choosePermanentsToSacrifice(SpellAbility sa, int min, int max, CardCollectionView validTargets, String message); @@ -180,7 +181,7 @@ public abstract class PlayerController { } public abstract Object vote(SpellAbility sa, String prompt, List options, ListMultimap votes, Player forPlayer); - public abstract boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question); + public abstract boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, GameEntity affected, String question); public abstract CardCollectionView getCardsToMulligan(Player firstPlayer); public abstract boolean mulliganKeepHand(Player player, int cardsToReturn); diff --git a/forge-game/src/main/java/forge/game/player/PlayerFactoryUtil.java b/forge-game/src/main/java/forge/game/player/PlayerFactoryUtil.java index 4eb3eeac0c7..a77b38a8afa 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/player/PlayerFactoryUtil.java @@ -1,7 +1,10 @@ package forge.game.player; import forge.game.card.Card; +import forge.game.card.CardFactoryUtil; import forge.game.keyword.KeywordInterface; +import forge.game.replacement.ReplacementEffect; +import forge.game.replacement.ReplacementHandler; import forge.game.staticability.StaticAbility; public class PlayerFactoryUtil { @@ -39,6 +42,24 @@ public class PlayerFactoryUtil { } public static void addReplacementEffect(final KeywordInterface inst, Player player) { + String keyword = inst.getOriginal(); + String effect = null; + + if (keyword.startsWith("Protection")) { + String validSource = CardFactoryUtil.getProtectionValid(keyword, true); + + effect = "Event$ DamageDone | Prevent$ True | ActiveZones$ Command | ValidTarget$ You"; + if (!validSource.isEmpty()) { + effect += " | ValidSource$ " + validSource; + } + effect += " | Secondary$ True | Description$ " + keyword; + } + + if (effect != null) { + final Card card = player.getKeywordCard(); + ReplacementEffect re = ReplacementHandler.parseReplacement(effect, card, false, card.getCurrentState()); + inst.addReplacement(re); + } } public static void addSpellAbility(final KeywordInterface inst, Player player) { diff --git a/forge-game/src/main/java/forge/game/player/PlayerProperty.java b/forge-game/src/main/java/forge/game/player/PlayerProperty.java index ade61abc594..f28ca0692d4 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerProperty.java +++ b/forge-game/src/main/java/forge/game/player/PlayerProperty.java @@ -96,7 +96,7 @@ public class PlayerProperty { final List cards = AbilityUtils.getDefinedCards(source, v, spellAbility); int found = 0; for (final Card card : cards) { - if (card.getDamageHistory().getThisCombatDamaged().contains(player)) { + if (card.getDamageHistory().getThisCombatDamaged().containsKey(player)) { found++; } } @@ -115,7 +115,7 @@ public class PlayerProperty { final List cards = AbilityUtils.getDefinedCards(source, v, spellAbility); int found = 0; for (final Card card : cards) { - if (card.getDamageHistory().getThisGameDamaged().contains(player)) { + if (card.getDamageHistory().getThisGameDamaged().containsKey(player)) { found++; } } @@ -134,7 +134,7 @@ public class PlayerProperty { final List cards = AbilityUtils.getDefinedCards(source, v, spellAbility); int found = 0; for (final Card card : cards) { - if (card.getDamageHistory().getThisTurnDamaged().contains(player)) { + if (card.getDamageHistory().getThisTurnDamaged().containsKey(player)) { found++; } } @@ -154,7 +154,7 @@ public class PlayerProperty { int found = 0; for (final Card card : cards) { - if (card.getDamageHistory().getThisTurnCombatDamaged().contains(player)) { + if (card.getDamageHistory().getThisTurnCombatDamaged().containsKey(player)) { found++; } } @@ -240,7 +240,7 @@ public class PlayerProperty { final String[] type = property.substring(8).split("_"); final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), type[0], sourceController, source, spellAbility); String comparator = type[1]; - int y = AbilityUtils.calculateAmount(source, comparator.substring(2), null); + int y = AbilityUtils.calculateAmount(source, comparator.substring(2), spellAbility); if (!Expressions.compare(list.size(), comparator, y)) { return false; } @@ -248,7 +248,7 @@ public class PlayerProperty { final String[] type = property.substring(10).split("_"); final CardCollectionView list = CardLists.getValidCards(player.getCardsIn(ZoneType.smartValueOf(type[0])), type[1], sourceController, source, spellAbility); String comparator = type[2]; - int y = AbilityUtils.calculateAmount(source, comparator.substring(2), null); + int y = AbilityUtils.calculateAmount(source, comparator.substring(2), spellAbility); if (!Expressions.compare(list.size(), comparator, y)) { return false; } @@ -266,7 +266,6 @@ public class PlayerProperty { final Player controller = "Active".equals(property.split("sThan")[1]) ? game.getPhaseHandler().getPlayerTurn() : sourceController; final CardCollectionView oppList = CardLists.filter(player.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); final CardCollectionView yourList = CardLists.filter(controller.getCardsIn(ZoneType.Battlefield), CardPredicates.isType(cardType)); - System.out.println(yourList.size()); if (oppList.size() < yourList.size() + amount) { return false; } @@ -382,6 +381,14 @@ public class PlayerProperty { if (!AbilityUtils.getDefinedPlayers(source, property, spellAbility).contains(player)) { return false; } + } else if (property.equals("castSpellThisTurn")) { + if (player.getSpellsCastThisTurn() > 0) { + return false; + } + } else if (property.equals("attackedWithCreaturesThisTurn")) { + if (player.getCreaturesAttackedThisTurn().isEmpty()) { + return false; + } } return true; } diff --git a/forge-game/src/main/java/forge/game/player/PlayerStatistics.java b/forge-game/src/main/java/forge/game/player/PlayerStatistics.java index e0dfb5979ad..70f867b9c44 100644 --- a/forge-game/src/main/java/forge/game/player/PlayerStatistics.java +++ b/forge-game/src/main/java/forge/game/player/PlayerStatistics.java @@ -32,7 +32,6 @@ public class PlayerStatistics { private int turnsPlayed = 0; - private PlayerOutcome outcome; /** diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java index c80166d297d..eccd844351d 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceDamage.java @@ -51,9 +51,6 @@ public class ReplaceDamage extends ReplacementEffect { public boolean canReplace(Map runParams) { final Game game = getHostCard().getGame(); - if (!(runParams.containsKey(AbilityKey.Prevention) == (hasParam("PreventionEffect") || hasParam("Prevent")))) { - return false; - } if (((Integer) runParams.get(AbilityKey.DamageAmount)) == 0) { // If no actual damage is dealt, there is nothing to replace return false; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java index 1ff2b0e961e..b4a658c579c 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceProduceMana.java @@ -38,6 +38,9 @@ public class ReplaceProduceMana extends ReplacementEffect { if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { return false; } + if (!matchesValidParam("ValidActivator", runParams.get(AbilityKey.Activator))) { + return false; + } if (!matchesValidParam("ValidAbility", runParams.get(AbilityKey.AbilityMana))) { return false; } @@ -58,7 +61,6 @@ public class ReplaceProduceMana extends ReplacementEffect { return true; } - public void setReplacingObjects(Map runParams, SpellAbility sa) { sa.setReplacingObject(AbilityKey.Mana, runParams.get(AbilityKey.Mana)); } diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java index ef6d5e1b0fc..115b8b0caa7 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementEffect.java @@ -21,11 +21,14 @@ import java.util.List; import java.util.Map; import java.util.Objects; +import org.apache.commons.lang3.StringUtils; + import forge.game.Game; import forge.game.TriggerReplacementBase; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.phase.PhaseType; import forge.game.spellability.SpellAbility; @@ -229,6 +232,30 @@ public abstract class ReplacementEffect extends TriggerReplacementBase { if (desc.contains("EFFECTSOURCE")) { desc = TextUtil.fastReplace(desc, "EFFECTSOURCE", getHostCard().getEffectSource().toString()); } + // Add remaining shield amount + if (mode == ReplacementType.DamageDone) { + SpellAbility repSA = getOverridingAbility(); + if (repSA != null && repSA.getApi() == ApiType.ReplaceDamage && repSA.hasParam("Amount")) { + String varValue = repSA.getParam("Amount"); + if (!StringUtils.isNumeric(varValue)) { + varValue = repSA.getSVar(varValue); + if (varValue.startsWith("Number$")) { + desc += " \nShields remain: " + varValue.substring(7); + } + } + } + if (repSA != null && repSA.getApi() == ApiType.ReplaceSplitDamage) { + String varValue = repSA.getParamOrDefault("VarName", "1"); + if (varValue.equals("1")) { + desc += " \nShields remain: 1"; + } else if (!StringUtils.isNumeric(varValue)) { + varValue = repSA.getSVar(varValue); + if (varValue.startsWith("Number$")) { + desc += " \nShields remain: " + varValue.substring(7); + } + } + } + } return desc; } else { return ""; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java index da7057c46e5..dc963073153 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplacementHandler.java @@ -17,7 +17,10 @@ */ package forge.game.replacement; +import java.util.ArrayList; import java.util.EnumSet; +import java.util.HashMap; +import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.Set; @@ -29,19 +32,25 @@ import com.google.common.collect.Sets; import forge.game.CardTraitBase; import forge.game.Game; +import forge.game.GameEntity; +import forge.game.GameEntityCounterTable; import forge.game.GameLogEntryType; import forge.game.IHasSVars; import forge.game.ability.AbilityFactory; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; +import forge.game.ability.ApiType; import forge.game.card.Card; import forge.game.card.CardCollection; +import forge.game.card.CardDamageMap; import forge.game.card.CardState; import forge.game.card.CardTraitChanges; import forge.game.card.CardUtil; import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordsChange; import forge.game.player.Player; +import forge.game.player.PlayerCollection; +import forge.game.spellability.AbilitySub; import forge.game.spellability.SpellAbility; import forge.game.zone.Zone; import forge.game.zone.ZoneType; @@ -55,6 +64,10 @@ public class ReplacementHandler { private final Game game; private Set hasRun = Sets.newHashSet(); + + // List of all replacement effect candidates for DamageDone event, in APNAP order + private final List>>> replaceDamageList = new ArrayList<>(); + /** * ReplacementHandler. * @param gameState @@ -340,14 +353,26 @@ public class ReplacementHandler { final String question = replacementEffect instanceof ReplaceDiscard ? Localizer.getInstance().getMessage("lblApplyCardReplacementEffectToCardConfirm", CardTranslation.getTranslatedName(cardForUi.getName()), runParams.get(AbilityKey.Card).toString(), effectDesc) : Localizer.getInstance().getMessage("lblApplyReplacementEffectOfCardConfirm", CardTranslation.getTranslatedName(cardForUi.getName()), effectDesc); - boolean confirmed = optDecider.getController().confirmReplacementEffect(replacementEffect, effectSA, question); + GameEntity affected = (GameEntity) runParams.get(AbilityKey.Affected); + boolean confirmed = optDecider.getController().confirmReplacementEffect(replacementEffect, effectSA, affected, question); if (!confirmed) { return ReplacementResult.NotReplaced; } } - if (mapParams.containsKey("Prevent")) { - if (mapParams.get("Prevent").equals("True")) { + boolean isPrevent = mapParams.containsKey("Prevent") && mapParams.get("Prevent").equals("True"); + if (isPrevent || mapParams.containsKey("PreventionEffect")) { + if (Boolean.TRUE.equals(runParams.get(AbilityKey.NoPreventDamage))) { + // If can't prevent damage, result is not replaced + // But still put "prevented" amount for buffered SA + if (mapParams.containsKey("AlwaysReplace")) { + runParams.put(AbilityKey.PreventedAmount, runParams.get(AbilityKey.DamageAmount)); + } else { + runParams.put(AbilityKey.PreventedAmount, 0); + } + return ReplacementResult.NotReplaced; + } + if (isPrevent) { return ReplacementResult.Prevented; // Nothing should replace the event. } } @@ -360,7 +385,17 @@ public class ReplacementHandler { Player player = host.getController(); - player.getController().playSpellAbilityNoStack(effectSA, true); + if (effectSA != null) { + ApiType apiType = effectSA.getApi(); + if (replacementEffect.getMode() != ReplacementType.DamageDone || + (apiType == ApiType.ReplaceDamage || apiType == ApiType.ReplaceSplitDamage || apiType == ApiType.ReplaceEffect)) { + player.getController().playSpellAbilityNoStack(effectSA, true); + } else { + // The SA if buffered, but replacement result should be set to Replaced + runParams.put(AbilityKey.ReplacementResult, ReplacementResult.Replaced); + } + } + // if the spellability is a replace effect then its some new logic // if ReplacementResult is set in run params use that instead if (runParams.containsKey(AbilityKey.ReplacementResult)) { @@ -370,6 +405,429 @@ public class ReplacementHandler { return ReplacementResult.Replaced; } + private void getPossibleReplaceDamageList(PlayerCollection players, final boolean isCombat, final CardDamageMap damageMap, final SpellAbility cause) { + for (Map.Entry> et : damageMap.columnMap().entrySet()) { + final GameEntity target = et.getKey(); + int playerIndex = (target instanceof Player ? players.indexOf(((Player) target)) : + players.indexOf(((Card) target).getController())); + Map>> replaceCandidateMap = replaceDamageList.get(playerIndex); + for (Map.Entry e : et.getValue().entrySet()) { + Card source = e.getKey(); + Integer damage = e.getValue(); + if (damage > 0) { + boolean prevention = source.canDamagePrevented(isCombat) && + (cause == null || !cause.hasParam("NoPrevention")); + final Map repParams = AbilityKey.mapFromAffected(target); + repParams.put(AbilityKey.DamageSource, source); + repParams.put(AbilityKey.DamageAmount, damage); + repParams.put(AbilityKey.IsCombat, isCombat); + repParams.put(AbilityKey.NoPreventDamage, !prevention); + if (cause != null) { + repParams.put(AbilityKey.Cause, cause); + } + + List reList = getReplacementList(ReplacementType.DamageDone, repParams, ReplacementLayer.Other); + for (ReplacementEffect re : reList) { + if (!replaceCandidateMap.containsKey(re)) { + replaceCandidateMap.put(re, new ArrayList<>()); + } + List> runParamList = replaceCandidateMap.get(re); + runParamList.add(repParams); + } + } + } + } + } + + private void runSingleReplaceDamageEffect(ReplacementEffect re, Map runParams, Map>> replaceCandidateMap, + Map>> executedDamageMap, Player decider, final CardDamageMap damageMap, final CardDamageMap preventMap) { + List> executedParamList = executedDamageMap.get(re); + ApiType apiType = re.getOverridingAbility() != null ? re.getOverridingAbility().getApi() : null; + Card source = (Card) runParams.get(AbilityKey.DamageSource); + GameEntity target = (GameEntity) runParams.get(AbilityKey.Affected); + int damage = (int) runParams.get(AbilityKey.DamageAmount); + Map mapParams = re.getMapParams(); + + ReplacementResult res = executeReplacement(runParams, re, decider, game); + GameEntity newTarget = (GameEntity) runParams.get(AbilityKey.Affected); + int newDamage = (int) runParams.get(AbilityKey.DamageAmount); + + // ReplaceSplitDamage will split the damage event into two event, so need to create run params for old event + // (original run params is changed for new event) + Map oldParams = null; + + if (res != ReplacementResult.NotReplaced) { + // Remove this event from other possible replacers + Iterator>>> itr = replaceCandidateMap.entrySet().iterator(); + while (itr.hasNext()) { + Map.Entry>> entry = itr.next(); + if (entry.getKey() == re) continue; + if (entry.getValue().contains(runParams)) { + entry.getValue().remove(runParams); + if (entry.getValue().isEmpty()) { + itr.remove(); + } + } + } + // Add updated event to possible replacers + if (res == ReplacementResult.Updated || apiType == ApiType.ReplaceSplitDamage) { + Map>> newReplaceCandidateMap = replaceCandidateMap; + if (!target.equals(newTarget)) { + PlayerCollection players = game.getPlayersInTurnOrder(); + int playerIndex = (newTarget instanceof Player ? players.indexOf(((Player) newTarget)) : + players.indexOf(((Card) newTarget).getController())); + newReplaceCandidateMap = replaceDamageList.get(playerIndex); + } + + List reList = getReplacementList(ReplacementType.DamageDone, runParams, ReplacementLayer.Other); + for (ReplacementEffect newRE : reList) { + // Skip if this has already been executed by given replacement effect + if (executedDamageMap.containsKey(newRE) && executedDamageMap.get(newRE).contains(runParams)) { + continue; + } + if (!newReplaceCandidateMap.containsKey(newRE)) { + newReplaceCandidateMap.put(newRE, new ArrayList<>()); + } + List> runParamList = newReplaceCandidateMap.get(newRE); + runParamList.add(runParams); + } + } + // Add old updated event too for ReplaceSplitDamage + if (apiType == ApiType.ReplaceSplitDamage && res == ReplacementResult.Updated) { + oldParams = AbilityKey.newMap(runParams); + oldParams.put(AbilityKey.Affected, target); + oldParams.put(AbilityKey.DamageAmount, damage - newDamage); + List reList = getReplacementList(ReplacementType.DamageDone, oldParams, ReplacementLayer.Other); + for (ReplacementEffect newRE : reList) { + if (!replaceCandidateMap.containsKey(newRE)) { + replaceCandidateMap.put(newRE, new ArrayList<>()); + } + List> runParamList = replaceCandidateMap.get(newRE); + runParamList.add(oldParams); + } + } + } + + @SuppressWarnings("unchecked") + Map resultMap = (Map) runParams.get(AbilityKey.ReplacementResultMap); + resultMap.put(re, res); + + // Update damage map and prevent map + switch (res) { + case NotReplaced: + break; + case Updated: + // check if this is still the affected card or player + if (target.equals(newTarget)) { + damageMap.put(source, target, newDamage - damage); + } else if (apiType == ApiType.ReplaceSplitDamage) { + damageMap.put(source, target, -newDamage); + } + if (!target.equals(newTarget)) { + if (apiType != ApiType.ReplaceSplitDamage) { + damageMap.remove(source, target); + } + damageMap.put(source, newTarget, newDamage); + } + if (apiType == ApiType.ReplaceDamage) { + preventMap.put(source, target, damage - newDamage); + // Record prevented amount + runParams.put(AbilityKey.PreventedAmount, damage - newDamage); + } + break; + default: + damageMap.remove(source, target); + if (apiType == ApiType.ReplaceDamage || + (mapParams.containsKey("Prevent") && mapParams.get("Prevent").equals("True")) || + mapParams.containsKey("PreventionEffect")) { + preventMap.put(source, target, damage); + // Record prevented amount + runParams.put(AbilityKey.PreventedAmount, damage); + } + if (apiType == ApiType.ReplaceSplitDamage) { + damageMap.put(source, newTarget, newDamage); + } + } + + // Put run params into executed param list so this replacement effect won't handle them again + // (For example, if the damage is redirected back) + executedParamList.add(runParams); + if (apiType == ApiType.ReplaceSplitDamage) { + executedParamList.add(oldParams); + } + + // Log the replacement effect + if (res != ReplacementResult.NotReplaced) { + String message = re.getDescription(); + if ( !StringUtils.isEmpty(message)) { + if (re.getHostCard() != null) { + message = TextUtil.fastReplace(message, "CARDNAME", re.getHostCard().getName()); + } + game.getGameLog().add(GameLogEntryType.EFFECT_REPLACED, message); + } + } + } + + private void executeReplaceDamageBufferedSA(Map>> executedDamageMap) { + for (Map.Entry>> entry : executedDamageMap.entrySet()) { + ReplacementEffect re = entry.getKey(); + if (re.getOverridingAbility() == null) { + continue; + } + SpellAbility bufferedSA = re.getOverridingAbility(); + ApiType apiType = bufferedSA.getApi(); + if (apiType == ApiType.ReplaceDamage || apiType == ApiType.ReplaceSplitDamage || apiType == ApiType.ReplaceEffect) { + bufferedSA = bufferedSA.getSubAbility(); + if (bufferedSA == null) { + continue; + } + } + + List> executedParamList = entry.getValue(); + if (executedParamList.isEmpty()) { + continue; + } + + Map mapParams = re.getMapParams(); + boolean isPrevention = (mapParams.containsKey("Prevent") && mapParams.get("Prevent").equals("True")) || mapParams.containsKey("PreventionEffect"); + boolean executePerSource = (mapParams.containsKey("ExecuteMode") && mapParams.get("ExecuteMode").equals("PerSource")); + boolean executePerTarget = (mapParams.containsKey("ExecuteMode") && mapParams.get("ExecuteMode").equals("PerTarget")); + + while (!executedParamList.isEmpty()) { + Map runParams = AbilityKey.newMap(); + List damageSourceList = new ArrayList<>(); + List affectedList = new ArrayList<>(); + int damageSum = 0; + + Iterator> itr = executedParamList.iterator(); + while (itr.hasNext()) { + Map executedParams = itr.next(); + + @SuppressWarnings("unchecked") + Map resultMap = (Map) executedParams.get(AbilityKey.ReplacementResultMap); + ReplacementResult res = resultMap.get(re); + if (res == ReplacementResult.NotReplaced && (!isPrevention || Boolean.FALSE.equals(executedParams.get(AbilityKey.NoPreventDamage)))) { + itr.remove(); + continue; + } + + Card source = (Card) executedParams.get(AbilityKey.DamageSource); + if (executePerSource && !damageSourceList.isEmpty() && !damageSourceList.contains(source)) { + continue; + } + + GameEntity target = (GameEntity) executedParams.get(AbilityKey.Affected); + if (executePerTarget && !affectedList.isEmpty() && !affectedList.contains(target)) { + continue; + } + + itr.remove(); + int damage = (int) executedParams.get(isPrevention ? AbilityKey.PreventedAmount : AbilityKey.DamageAmount); + if (!damageSourceList.contains(source)) { + damageSourceList.add(source); + } + if (!affectedList.contains(target)) { + affectedList.add(target); + } + damageSum += damage; + } + + if (damageSum > 0) { + runParams.put(AbilityKey.DamageSource, (damageSourceList.size() > 1 ? damageSourceList : damageSourceList.get(0))); + runParams.put(AbilityKey.Affected, (affectedList.size() > 1 ? affectedList : affectedList.get(0))); + runParams.put(AbilityKey.DamageAmount, damageSum); + + re.setReplacingObjects(runParams, re.getOverridingAbility()); + bufferedSA.setActivatingPlayer(re.getHostCard().getController()); + AbilityUtils.resolve(bufferedSA); + } + } + } + } + + public void runReplaceDamage(final boolean isCombat, final CardDamageMap damageMap, final CardDamageMap preventMap, + final GameEntityCounterTable counterTable, final SpellAbility cause) { + PlayerCollection players = game.getPlayersInTurnOrder(); + for (int i = 0; i < players.size(); i++) { + replaceDamageList.add(new HashMap<>()); + } + + // Map of all executed replacement effect for DamageDone event, including run params + Map>> executedDamageMap = new HashMap<>(); + + // First, gather all possible replacement effects + getPossibleReplaceDamageList(players, isCombat, damageMap, cause); + + // Next, handle replacement effects in APNAP order + // Handle "Prevented this way" and abilities like "Phantom Nomad", by buffer the replaced SA + // and only run them after all prevention and redirection effects are processed. + while (true) { + Player decider = null; + Map>> replaceCandidateMap = null; + for (int i = 0; i < players.size(); i++) { + if (replaceDamageList.get(i).isEmpty()) continue; + decider = players.get(i); + replaceCandidateMap = replaceDamageList.get(i); + break; + } + if (replaceCandidateMap == null) { + break; + } + + List possibleReplacers = new ArrayList<>(replaceCandidateMap.keySet()); + ReplacementEffect chosenRE = decider.getController().chooseSingleReplacementEffect(Localizer.getInstance().getMessage("lblChooseFirstApplyReplacementEffect"), possibleReplacers); + List> runParamList = replaceCandidateMap.get(chosenRE); + + if (!executedDamageMap.containsKey(chosenRE)) { + executedDamageMap.put(chosenRE, new ArrayList<>()); + } + + // Run all possible events for chosen replacement effect + chosenRE.setHasRun(true); + SpellAbility effectSA = chosenRE.getOverridingAbility(); + ApiType apiType = null; + SpellAbility bufferedSA = effectSA; + boolean needRestoreSubSA = false; + boolean needDivideShield = false; + boolean needChooseSource = false; + int shieldAmount = 0; + if (effectSA != null) { + apiType = effectSA.getApi(); + // Temporary remove sub ability from ReplaceDamage, ReplaceSplitDamage and ReplaceEffect API so they could be run later + if (apiType == ApiType.ReplaceDamage || apiType == ApiType.ReplaceSplitDamage || apiType == ApiType.ReplaceEffect) { + bufferedSA = effectSA.getSubAbility(); + if (bufferedSA != null) { + needRestoreSubSA = true; + effectSA.setSubAbility(null); + } + } + + // Determine if need to divide shield among affected entity and + // determine if the prevent next N damage shield is large enough to replace all damage + Map mapParams = chosenRE.getMapParams(); + if ((mapParams.containsKey("PreventionEffect") && mapParams.get("PreventionEffect").equals("NextN")) + || apiType == ApiType.ReplaceSplitDamage) { + if (apiType == ApiType.ReplaceDamage) { + shieldAmount = AbilityUtils.calculateAmount(effectSA.getHostCard(), effectSA.getParamOrDefault("Amount", "1"), effectSA); + } else if (apiType == ApiType.ReplaceSplitDamage) { + shieldAmount = AbilityUtils.calculateAmount(effectSA.getHostCard(), effectSA.getParamOrDefault("VarName", "1"), effectSA); + } + int damageAmount = 0; + boolean hasMultipleSource = false; + boolean hasMultipleTarget = false; + Card firstSource = null; + GameEntity firstTarget = null; + for (Map runParams : runParamList) { + // Only count damage that can be prevented + if (apiType == ApiType.ReplaceDamage && Boolean.TRUE.equals(runParams.get(AbilityKey.NoPreventDamage))) continue; + damageAmount += (int) runParams.get(AbilityKey.DamageAmount); + if (firstSource == null) { + firstSource = (Card) runParams.get(AbilityKey.DamageSource); + } else if (!firstSource.equals(runParams.get(AbilityKey.DamageSource))) { + hasMultipleSource = true; + } + if (firstTarget == null) { + firstTarget = (GameEntity) runParams.get(AbilityKey.Affected); + } else if (!firstTarget.equals(runParams.get(AbilityKey.Affected))) { + hasMultipleTarget = true; + } + } + if (damageAmount > shieldAmount && runParamList.size() > 1) { + if (hasMultipleSource) + needChooseSource = true; + if (effectSA.hasParam("DivideShield") && hasMultipleTarget) + needDivideShield = true; + } + } + } + + // Ask the decider to divide shield among affected damage target + Map shieldMap = null; + if (needDivideShield) { + Map affected = new HashMap<>(); + for (Map runParams : runParamList) { + GameEntity target = (GameEntity) runParams.get(AbilityKey.Affected); + Integer damage = (Integer) runParams.get(AbilityKey.DamageAmount); + if (!affected.containsKey(target)) { + affected.put(target, damage); + } else { + affected.put(target, damage + affected.get(target)); + } + } + shieldMap = decider.getController().divideShield(chosenRE.getHostCard(), affected, shieldAmount); + } + + // CR 615.7 + // If damage would be dealt to the shielded permanent or player by two or more applicable sources at the same time, + // the player or the controller of the permanent chooses which damage the shield prevents. + if (needChooseSource) { + CardCollection sourcesToChooseFrom = new CardCollection(); + for (Map runParams : runParamList) { + if (apiType == ApiType.ReplaceDamage && Boolean.TRUE.equals(runParams.get(AbilityKey.NoPreventDamage))) continue; + sourcesToChooseFrom.add((Card) runParams.get(AbilityKey.DamageSource)); + } + final String choiceTitle = Localizer.getInstance().getMessage("lblChooseSource") + " "; + while (shieldAmount > 0 && !sourcesToChooseFrom.isEmpty()) { + Card source = decider.getController().chooseSingleEntityForEffect(sourcesToChooseFrom, effectSA, choiceTitle, null); + sourcesToChooseFrom.remove(source); + Iterator> itr = runParamList.iterator(); + while (itr.hasNext()) { + Map runParams = itr.next(); + if (source.equals(runParams.get(AbilityKey.DamageSource))) { + itr.remove(); + if (shieldMap != null) { + GameEntity target = (GameEntity) runParams.get(AbilityKey.Affected); + if (shieldMap.containsKey(target) && shieldMap.get(target) > 0) { + Integer dividedShieldAmount = shieldMap.get(target); + runParams.put(AbilityKey.DividedShieldAmount, dividedShieldAmount); + shieldAmount -= (int) dividedShieldAmount; + } else { + continue; + } + } else { + shieldAmount -= (int) runParams.get(AbilityKey.DamageAmount); + } + if (!runParams.containsKey(AbilityKey.ReplacementResultMap)) { + Map resultMap = new HashMap<>(); + runParams.put(AbilityKey.ReplacementResultMap, resultMap); + } + runSingleReplaceDamageEffect(chosenRE, runParams, replaceCandidateMap, executedDamageMap, decider, damageMap, preventMap); + } + } + } + } else { + for (Map runParams : runParamList) { + if (shieldMap != null) { + GameEntity target = (GameEntity) runParams.get(AbilityKey.Affected); + if (shieldMap.containsKey(target) && shieldMap.get(target) > 0) { + Integer dividedShieldAmount = shieldMap.get(target); + runParams.put(AbilityKey.DividedShieldAmount, dividedShieldAmount); + } else { + continue; + } + } + if (!runParams.containsKey(AbilityKey.ReplacementResultMap)) { + Map resultMap = new HashMap<>(); + runParams.put(AbilityKey.ReplacementResultMap, resultMap); + } + runSingleReplaceDamageEffect(chosenRE, runParams, replaceCandidateMap, executedDamageMap, decider, damageMap, preventMap); + } + } + + // Restore temporary removed SA + if (needRestoreSubSA) { + effectSA.setSubAbility((AbilitySub)bufferedSA); + } + chosenRE.setHasRun(false); + replaceCandidateMap.remove(chosenRE); + } + + replaceDamageList.clear(); + + // Finally, run all buffered SA to finish the replacement processing + executeReplaceDamageBufferedSA(executedDamageMap); + } + /** * * Creates an instance of the proper replacement effect object based on raw @@ -431,9 +889,77 @@ public class ReplacementHandler { final Map repParams = AbilityKey.mapFromAffected(player); repParams.put(AbilityKey.Phase, phase); List list = getReplacementList(ReplacementType.BeginPhase, repParams, ReplacementLayer.Control); - if (!list.isEmpty()) { + if (list.isEmpty()) { return false; } return true; } + + /** + * Helper function to get total prevention shield amount (limited to "prevent next N damage effects") + * @param o Affected game entity object + * @return total shield amount + */ + public int getTotalPreventionShieldAmount(GameEntity o) { + final List list = Lists.newArrayList(); + game.forEachCardInGame(new Visitor() { + @Override + public boolean visit(Card c) { + for (final ReplacementEffect re : c.getReplacementEffects()) { + if (re.getMode() == ReplacementType.DamageDone + && re.getLayer() == ReplacementLayer.Other + && re.hasParam("PreventionEffect") + && re.zonesCheck(game.getZoneOf(c)) + && re.getOverridingAbility() != null + && re.getOverridingAbility().getApi() == ApiType.ReplaceDamage) { + list.add(re); + } + } + return true; + } + + }); + + int totalAmount = 0; + for (ReplacementEffect re : list) { + SpellAbility sa = re.getOverridingAbility(); + if (sa.hasParam("Amount")) { + String varValue = sa.getParam("Amount"); + if (StringUtils.isNumeric(varValue)) { + totalAmount += Integer.parseInt(varValue); + } else { + varValue = sa.getSVar(varValue); + if (varValue.startsWith("Number$")) { + totalAmount += Integer.parseInt(varValue.substring(7)); + } + } + } + } + return totalAmount; + } + + /** + * Helper function to check if combat damage is prevented this turn (fog effect) + * @return true if there is some resolved fog effect + */ + public final boolean isPreventCombatDamageThisTurn() { + final List list = Lists.newArrayList(); + game.forEachCardInGame(new Visitor() { + @Override + public boolean visit(Card c) { + for (final ReplacementEffect re : c.getReplacementEffects()) { + if (re.getMode() == ReplacementType.DamageDone + && re.getLayer() == ReplacementLayer.Other + && re.hasParam("Prevent") && re.getParam("Prevent").equals("True") + && re.hasParam("IsCombat") && re.getParam("IsCombat").equals("True") + && !re.hasParam("ValidSource") && !re.hasParam("ValidTarget") + && re.zonesCheck(game.getZoneOf(c))) { + list.add(re); + } + } + return true; + } + }); + return !list.isEmpty(); + } } diff --git a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java index 66b641b5f6c..664a417122b 100644 --- a/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java +++ b/forge-game/src/main/java/forge/game/spellability/AbilityManaPart.java @@ -500,6 +500,8 @@ public class AbilityManaPart implements java.io.Serializable { * @return a boolean. */ public final boolean canProduce(final String s, final SpellAbility sa) { + // TODO: need to handle replacement effects like 106.7 + // Any mana never means Colorless? if (isAnyMana() && !s.equals("C")) { return true; diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java index 126ee4656d0..da47da4ceba 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -45,6 +45,7 @@ import forge.game.ForgeScript; import forge.game.Game; import forge.game.GameActionUtil; import forge.game.GameEntity; +import forge.game.GameEntityCounterTable; import forge.game.GameObject; import forge.game.IHasSVars; import forge.game.IIdentifiable; @@ -186,6 +187,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit private CardDamageMap damageMap = null; private CardDamageMap preventMap = null; + private GameEntityCounterTable counterTable = null; private CardZoneTable changeZoneTable = null; public CardCollection getLastStateBattlefield() { @@ -1047,6 +1049,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit if (preventMap != null) { clone.preventMap = new CardDamageMap(preventMap); } + if (counterTable != null) { + clone.counterTable = new GameEntityCounterTable(counterTable); + } if (changeZoneTable != null) { clone.changeZoneTable = new CardZoneTable(); clone.changeZoneTable.putAll(changeZoneTable); @@ -2231,6 +2236,15 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return null; } + public GameEntityCounterTable getCounterTable() { + if (counterTable != null) { + return counterTable; + } else if (getParent() != null) { + return getParent().getCounterTable(); + } + return null; + } + public CardZoneTable getChangeZoneTable() { if (changeZoneTable != null) { return changeZoneTable; @@ -2246,6 +2260,9 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit public void setPreventMap(final CardDamageMap map) { preventMap = map; } + public void setCounterTable(final GameEntityCounterTable table) { + counterTable = table; + } public void setChangeZoneTable(final CardZoneTable table) { changeZoneTable = table; } @@ -2361,4 +2378,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit } rollbackEffects.clear(); } + + public boolean isHidden() { + boolean hidden = hasParam("Hidden"); + if (!hidden && hasParam("Origin")) { + hidden = ZoneType.isHidden(getParam("Origin")); + } + return hidden; + } } diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java index c52a7dca849..6439f786c3a 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityCondition.java @@ -244,7 +244,6 @@ public class SpellAbilityCondition extends SpellAbilityVariables { * @return a boolean. */ public final boolean areMet(final SpellAbility sa) { - Player activator = sa.getActivatingPlayer(); if (activator == null) { activator = sa.getHostCard().getController(); diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java index d6c25a23ff9..e9e04a53f37 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbilityRestriction.java @@ -30,7 +30,6 @@ import forge.game.GameType; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPlayOption; import forge.game.card.CardUtil; @@ -52,12 +51,10 @@ import forge.util.collect.FCollection; * @version $Id$ */ public class SpellAbilityRestriction extends SpellAbilityVariables { - // A class for handling SpellAbility Restrictions. These restrictions - // include: + // A class for handling SpellAbility Restrictions. These restrictions include: // Zone, Phase, OwnTurn, Speed (instant/sorcery), Amount per Turn, Player, // Threshold, Metalcraft, LevelRange, etc - // Each value will have a default, that can be overridden (mostly by - // AbilityFactory) + // Each value will have a default, that can be overridden (mostly by AbilityFactory) // The canPlay function will use these values to determine if the current // game state is ok with these restrictions @@ -247,7 +244,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { // NOTE: this assumes that it's always possible to cast cards from hand and you don't // need special permissions for that. If WotC ever prints a card that forbids casting // cards from hand, this may become relevant. - if (!o.grantsZonePermissions() && cardZone != null && !cardZone.is(ZoneType.Hand)) { + if (!o.grantsZonePermissions() && cardZone != null && (!cardZone.is(ZoneType.Hand) || activator != c.getOwner())) { final List opts = c.mayPlay(activator); boolean hasOtherGrantor = false; for (CardPlayOption opt : opts) { @@ -266,13 +263,13 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { } if (params.containsKey("Affected")) { - if (!cp.isValid(params.get("Affected").split(","), activator, o.getHost(), null)) { + if (!cp.isValid(params.get("Affected").split(","), activator, o.getHost(), o.getAbility())) { return false; } } if (params.containsKey("ValidSA")) { - if (!sa.isValid(params.get("ValidSA").split(","), activator, o.getHost(), null)) { + if (!sa.isValid(params.get("ValidSA").split(","), activator, o.getHost(), o.getAbility())) { return false; } } @@ -455,13 +452,7 @@ public class SpellAbilityRestriction extends SpellAbilityVariables { life = activator.getOpponentsSmallestLifeTotal(); } - int right = 1; - final String rightString = this.getLifeAmount().substring(2); - if (rightString.equals("X")) { - right = CardFactoryUtil.xCount(sa.getHostCard(), sa.getHostCard().getSVar("X")); - } else { - right = Integer.parseInt(this.getLifeAmount().substring(2)); - } + int right =AbilityUtils.calculateAmount(sa.getHostCard(), this.getLifeAmount().substring(2), sa); if (!Expressions.compare(life, this.getLifeAmount(), right)) { return false; diff --git a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java index 000d94c5d2e..fc6d7285222 100644 --- a/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java +++ b/forge-game/src/main/java/forge/game/spellability/TargetRestrictions.java @@ -20,6 +20,8 @@ package forge.game.spellability; import java.util.Arrays; import java.util.List; +import org.apache.commons.lang3.ObjectUtils; + import com.google.common.collect.Lists; import forge.card.CardType; @@ -302,7 +304,7 @@ public class TargetRestrictions { */ public final boolean isMinTargetsChosen(final Card c, final SpellAbility sa) { int min = getMinTargets(c, sa); - if (min == 0) { + if (min == 0 || (sa.isDividedAsYouChoose() && ObjectUtils.defaultIfNull(sa.getDividedValue(), 0) == 0)) { return true; } return min <= sa.getTargets().size(); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 16e43f05de7..41def75cf00 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -287,41 +287,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone return getParam("Mode").equals("Continuous") && layers.contains(layer) && !isSuppressed() && checkConditions() && (previousRun || getHostCard().getStaticAbilities().contains(this)); } - // apply the ability if it has the right mode - /** - * Apply ability. - * - * @param mode - * the mode - * @param source - * the source - * @param target - * the target - * @param in - * the in - * @param isCombat - * the b - * @return the int - */ - public final int applyAbility(final String mode, final Card source, final GameEntity target, final int in, - final boolean isCombat, final boolean isTest) { - - // don't apply the ability if it hasn't got the right mode - if (!getParam("Mode").equals(mode)) { - return in; - } - - if (this.isSuppressed() || !this.checkConditions()) { - return in; - } - - if (mode.equals("PreventDamage")) { - return StaticAbilityPreventDamage.applyPreventDamageAbility(this, source, target, in, isCombat, isTest); - } - - return in; - } - /** * Apply ability. * @@ -485,11 +450,6 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone return false; } - if (hasParam("PlayerAttackedWithCreatureThisTurn") - && player.getCreaturesAttackedThisTurn().isEmpty()) { - return false; - } - return true; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java index c55e03ff6ce..343a88240e6 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantAttackBlock.java @@ -23,7 +23,6 @@ import forge.game.GameEntity; import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollectionView; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardPredicates; import forge.game.cost.Cost; import forge.game.keyword.KeywordInterface; @@ -55,6 +54,12 @@ public class StaticAbilityCantAttackBlock { return false; } + if (stAb.hasParam("DefenderKeyword")) { + if (card.hasKeyword("CARDNAME can attack as though it didn't have defender.")) { + return false; + } + } + final Player defender = target instanceof Card ? ((Card) target).getController() : (Player) target; if (stAb.hasParam("UnlessDefenderControls")) { @@ -115,13 +120,27 @@ public class StaticAbilityCantAttackBlock { } } } - if (!stillblock) { - return true; + if (stillblock) { + return false; } + } else { + return false; } } } - return false; + // relative valid relative to each other + if (!stAb.matchesValidParam("ValidAttackerRelative", attacker, blocker)) { + return false; + } + if (!stAb.matchesValidParam("ValidBlockerRelative", blocker, attacker)) { + return false; + } + if (blocker != null) { + if (!stAb.matchesValidParam("ValidDefender", blocker.getController())) { + return false; + } + } + return true; } /** @@ -179,7 +198,7 @@ public class StaticAbilityCantAttackBlock { } String costString = stAb.getParam("Cost"); if (stAb.hasSVar(costString)) { - costString = Integer.toString(CardFactoryUtil.xCount(hostCard, stAb.getSVar(costString))); + costString = Integer.toString(AbilityUtils.calculateAmount(hostCard, costString, stAb)); } return new Cost(costString, true); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java index 964e3134506..9c84816a495 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityCantBeCast.java @@ -132,7 +132,7 @@ public class StaticAbilityCantBeCast { if (stAb.hasParam("NumLimitEachTurn") && activator != null) { int limit = Integer.parseInt(stAb.getParam("NumLimitEachTurn")); String valid = stAb.hasParam("ValidCard") ? stAb.getParam("ValidCard") : "Card"; - List thisTurnCast = CardUtil.getThisTurnCast(valid, card); + List thisTurnCast = CardUtil.getThisTurnCast(valid, card, stAb); if (CardLists.filterControlledBy(thisTurnCast, activator).size() < limit) { return false; } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index 2d435b4f920..75f26c24433 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -638,11 +638,11 @@ public final class StaticAbilityContinuous { if (layer == StaticAbilityLayer.SETPT) { if ((setPower != Integer.MAX_VALUE) || (setToughness != Integer.MAX_VALUE)) { // non CharacteristicDefining - if (setP.startsWith("AffectedX")) { - setPower = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, setP)); + if (setP.startsWith("Affected")) { + setPower = AbilityUtils.calculateAmount(affectedCard, setP, stAb, true); } - if (setT.startsWith("AffectedX")) { - setToughness = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, setT)); + if (setT.startsWith("Affected")) { + setToughness = AbilityUtils.calculateAmount(affectedCard, setT, stAb, true); } affectedCard.addNewPT(setPower, setToughness, hostCard.getTimestamp(), stAb.hasParam("CharacteristicDefining")); @@ -651,11 +651,11 @@ public final class StaticAbilityContinuous { // add P/T bonus if (layer == StaticAbilityLayer.MODIFYPT) { - if (addP.startsWith("AffectedX")) { - powerBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addP)); + if (addP.startsWith("Affected")) { + powerBonus = AbilityUtils.calculateAmount(affectedCard, addP, stAb, true); } - if (addT.startsWith("AffectedX")) { - toughnessBonus = CardFactoryUtil.xCount(affectedCard, AbilityUtils.getSVar(stAb, addT)); + if (addT.startsWith("Affected")) { + toughnessBonus = AbilityUtils.calculateAmount(affectedCard, addT, stAb, true); } affectedCard.addPTBoost(powerBonus, toughnessBonus, se.getTimestamp(), stAb.getId()); } @@ -732,7 +732,6 @@ public final class StaticAbilityContinuous { } if (layer == StaticAbilityLayer.ABILITIES) { - List addedAbilities = Lists.newArrayList(); List addedReplacementEffects = Lists.newArrayList(); List addedTrigger = Lists.newArrayList(); diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java deleted file mode 100644 index 2e44081dc16..00000000000 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityPreventDamage.java +++ /dev/null @@ -1,120 +0,0 @@ -/* - * Forge: Play Magic: the Gathering. - * Copyright (C) 2011 Forge Team - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ -package forge.game.staticability; - -import java.util.Map; - -import forge.game.GameEntity; -import forge.game.card.Card; -import forge.game.card.CardFactoryUtil; - -/** - * The Class StaticAbility_PreventDamage. - */ -public class StaticAbilityPreventDamage { - - /** - * TODO Write javadoc for this method. - * - * @param stAb - * a StaticAbility - * @param source - * the source - * @param target - * the target - * @param damage - * the damage - * @param isCombat - * the is combat - * @return the int - */ - public static int applyPreventDamageAbility(final StaticAbility stAb, final Card source, final GameEntity target, - final int damage, final boolean isCombat, final boolean isTest) { - final Map params = stAb.getMapParams(); - final Card hostCard = stAb.getHostCard(); - int restDamage = damage; - - if (params.containsKey("Source") && !stAb.matchesValid(source, params.get("Source").split(","))) { - return restDamage; - } - - if (params.containsKey("Target") && !stAb.matchesValid(target, params.get("Target").split(","))) { - return restDamage; - } - - if (params.containsKey("CombatDamage") && params.get("CombatDamage").equals("True") && !isCombat) { - return restDamage; - } - - if (params.containsKey("CombatDamage") && params.get("CombatDamage").equals("False") && isCombat) { - return restDamage; - } - - if (params.containsKey("MaxDamage") && (Integer.parseInt(params.get("MaxDamage")) < damage)) { - return restDamage; - } - - if (params.containsKey("SourceSharesColorWithTarget")) { - if (!(target instanceof Card) || source.equals(target)) { - return restDamage; - } - Card targetCard = (Card) target; - if (!source.sharesColorWith(targetCard)) { - return restDamage; - } - } - - if (params.containsKey("Optional")) { //Assume if param is present it should be optional - if (!isTest) { - final String logic = params.containsKey("AILogic") ? params.get("AILogic") : ""; - final String message = "Apply the effect of " + hostCard + "? (Affected: " + target + ")"; - boolean confirmed = hostCard.getController().getController().confirmStaticApplication(hostCard, target, logic, message); - - if (!confirmed) { - return restDamage; - } - } else { //test - if (!hostCard.getController().equals(target)) { - return restDamage; - } - } - } - - // no amount means all - if (!params.containsKey("Amount") || params.get("Amount").equals("All")) { - return 0; - } - - if (params.get("Amount").matches("[0-9][0-9]?")) { - restDamage = restDamage - Integer.parseInt(params.get("Amount")); - } else if (params.get("Amount").matches("HalfUp")) { - restDamage = restDamage - (int) (Math.ceil(restDamage / 2.0)); - } else if (params.get("Amount").matches("HalfDown")) { - restDamage = restDamage - (int) (Math.floor(restDamage / 2.0)); - } else { - restDamage = restDamage - CardFactoryUtil.xCount(hostCard, hostCard.getSVar(params.get("Amount"))); - } - - if (restDamage < 0) { - return 0; - } - - return restDamage; - } - -} diff --git a/forge-game/src/main/java/forge/game/trigger/Trigger.java b/forge-game/src/main/java/forge/game/trigger/Trigger.java index 537390ee31d..0ba078ab88d 100644 --- a/forge-game/src/main/java/forge/game/trigger/Trigger.java +++ b/forge-game/src/main/java/forge/game/trigger/Trigger.java @@ -340,7 +340,7 @@ public abstract class Trigger extends TriggerReplacementBase { } } - if ( !meetsCommonRequirements(this.mapParams)) + if (!meetsCommonRequirements(this.mapParams)) return false; return true; diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerAbilityTriggered.java b/forge-game/src/main/java/forge/game/trigger/TriggerAbilityTriggered.java index 4ac73391b5a..ebc6ed5c4b0 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerAbilityTriggered.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerAbilityTriggered.java @@ -25,6 +25,7 @@ import forge.game.card.CardZoneTable; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; import forge.util.Localizer; +import forge.util.TextUtil; import java.util.*; @@ -123,7 +124,7 @@ public class TriggerAbilityTriggered extends Trigger { destinations.add(dest.toString()); } } - newRunParams.put(AbilityKey.Destination, String.join(",", destinations)); + newRunParams.put(AbilityKey.Destination, TextUtil.join(destinations, ",")); newRunParams.put(AbilityKey.Cause, table.allCards()); } sa.setTriggeringObject(AbilityKey.TriggeredParams, newRunParams); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java index 73294ffc9c6..3c3d925496a 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZone.java @@ -30,7 +30,6 @@ import com.google.common.collect.Sets; import forge.game.ability.AbilityKey; import forge.game.ability.AbilityUtils; import forge.game.card.Card; -import forge.game.card.CardFactoryUtil; import forge.game.card.CardLists; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; @@ -139,7 +138,7 @@ public class TriggerChangesZone extends Trigger { final String comparator = condition.length < 2 ? "GE1" : condition[1]; final int referenceValue = AbilityUtils.calculateAmount(host, comparator.substring(2), this); final Card triggered = (Card) runParams.get(AbilityKey.Card); - final int actualValue = CardFactoryUtil.xCount(triggered, host.getSVar(condition[0])); + final int actualValue = AbilityUtils.calculateAmount(triggered, condition[0], this); if (!Expressions.compare(actualValue, comparator.substring(0, 2), referenceValue)) { return false; } @@ -161,7 +160,7 @@ public class TriggerChangesZone extends Trigger { // need to check the ChangeZone LKI copy for damage, otherwise it'll return 0 for a new object in the new zone Card lkiCard = card.getGame().getChangeZoneLKIInfo(card); - final boolean expr = Expressions.compare(lkiCard.getTotalDamageRecievedThisTurn(), cond, rightSide); + final boolean expr = Expressions.compare(lkiCard.getTotalDamageReceivedThisTurn(), cond, rightSide); if (!expr) { return false; } @@ -179,7 +178,7 @@ public class TriggerChangesZone extends Trigger { /* this trigger only activates for the nth spell you cast this turn */ if (hasParam("ConditionYouCastThisTurn")) { final String compare = getParam("ConditionYouCastThisTurn"); - List thisTurnCast = CardUtil.getThisTurnCast("Card", getHostCard()); + List thisTurnCast = CardUtil.getThisTurnCast("Card", getHostCard(), this); thisTurnCast = CardLists.filterControlledByAsList(thisTurnCast, getHostCard().getController()); // checks which card this spell was the castSA diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java index 7b14fd3fc67..09da20e4f60 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerChangesZoneAll.java @@ -4,11 +4,13 @@ import java.util.List; import java.util.Map; import forge.game.ability.AbilityKey; +import forge.game.ability.AbilityUtils; import forge.game.card.Card; import forge.game.card.CardCollection; import forge.game.card.CardZoneTable; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; +import forge.util.Expressions; import forge.util.Localizer; public class TriggerChangesZoneAll extends Trigger { @@ -23,6 +25,9 @@ public class TriggerChangesZoneAll extends Trigger { if (!matchesValidParam("ValidCause", runParams.get(AbilityKey.Cause))) { return false; + } else if (hasParam("ValidAmount")) { + int right = AbilityUtils.calculateAmount(hostCard, getParam("ValidAmount").substring(2), this); + if (!Expressions.compare(this.filterCards(table).size(), getParam("ValidAmount").substring(0, 2), right)) { return false; } } return !filterCards(table).isEmpty(); diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java index 3628d261a12..efdbb7d9d6d 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerHandler.java @@ -59,9 +59,6 @@ public class TriggerHandler { game = gameState; } - public final void cleanUpTemporaryTriggers() { - } - public final boolean hasDelayedTriggers() { return !delayedTriggers.isEmpty(); } @@ -237,6 +234,7 @@ public class TriggerHandler { if ( TriggerType.Exploited.equals(t.getMode()) || TriggerType.Sacrificed.equals(t.getMode()) || + TriggerType.Destroyed.equals(t.getMode()) || (TriggerType.ChangesZone.equals(t.getMode()) && "Battlefield".equals(t.getParam("Origin")))) { registerOneTrigger(t); } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java index 91837a96974..9ad3b9d8a61 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSacrificed.java @@ -80,11 +80,15 @@ public class TriggerSacrificed extends Trigger { // When cast with Emerge, the cost instance is there IndividualCostPaymentInstance currentPayment = (IndividualCostPaymentInstance) runParams.get(AbilityKey.IndividualCostPaymentInstance); - SpellAbility sa = currentPayment.getPayment().getAbility(); - if (sa != null && sa.getHostCard() != null) { - if (sa.isSpell() && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword)) { - withKeyword = true; + SpellAbility sa; + if (currentPayment != null) { + sa = currentPayment.getPayment().getAbility(); + + if (sa != null && sa.getHostCard() != null) { + if (sa.isSpell() && sa.getHostCard().hasStartOfUnHiddenKeyword(keyword)) { + withKeyword = true; + } } } diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java index 58b017c51f4..ca3b10d4a12 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerSpellAbilityCastOrCopy.java @@ -87,7 +87,6 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { } } - if (!matchesValidParam("ValidPlayer", runParams.get(AbilityKey.Player))) { return false; } @@ -109,7 +108,7 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { if (hasParam("ActivatorThisTurnCast")) { final String compare = getParam("ActivatorThisTurnCast"); final String valid = hasParam("ValidCard") ? getParam("ValidCard") : "Card"; - List thisTurnCast = CardUtil.getThisTurnCast(valid, getHostCard()); + List thisTurnCast = CardUtil.getThisTurnCast(valid, getHostCard(), this); thisTurnCast = CardLists.filterControlledBy(thisTurnCast, si.getSpellAbility(true).getActivatingPlayer()); int left = thisTurnCast.size(); int right = Integer.parseInt(compare.substring(2)); @@ -254,6 +253,14 @@ public class TriggerSpellAbilityCastOrCopy extends Trigger { } } + if (hasParam("NoColoredMana")) { + for (Mana m : spellAbility.getPayingMana()) { + if (!m.isColorless()) { + return false; + } + } + } + if (hasParam("SnowSpentForCardsColor")) { boolean found = false; for (Mana m : spellAbility.getPayingMana()) { diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 18db18e90c2..b430d36e39f 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -172,8 +172,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable { c.setTapped(false); } - // Do not add Tokens to other zones than the battlefield. + // Do not add Tokens to other zones than the battlefield. (unless it's a copy of a card 706.12) // But Effects/Emblems count as Tokens too, so allow Command too. - if (zoneType == ZoneType.Battlefield || !c.isToken()) { + if ((zoneType == ZoneType.Battlefield || !c.isToken()) || (zoneType == ZoneType.Stack && c.getCopiedPermanent() != null)) { c.setZone(this); if (index == null) { @@ -167,10 +167,7 @@ public class Zone implements java.io.Serializable, Iterable { cardList.clear(); } else { for (Card c : cardList) { - if (cardList.remove(c)) { - onChanged(); - game.fireEvent(new GameEventZone(zoneType, getPlayer(), EventValueChangeType.Removed, c)); - } + remove(c); } } } @@ -208,12 +205,10 @@ public class Zone implements java.io.Serializable, Iterable { } public final List getCardsAddedThisTurn(final ZoneType origin) { - //System.out.print("Request cards put into " + getZoneType() + " from " + origin + ".Amount: "); return getCardsAdded(cardsAddedThisTurn, origin); } public final List getCardsAddedLastTurn(final ZoneType origin) { - //System.out.print("Last turn - Request cards put into " + getZoneType() + " from " + origin + ".Amount: "); return getCardsAdded(cardsAddedLastTurn, origin); } diff --git a/forge-game/src/main/java/forge/trackable/TrackableProperty.java b/forge-game/src/main/java/forge/trackable/TrackableProperty.java index 86f11dde61a..ab5db9e2836 100644 --- a/forge-game/src/main/java/forge/trackable/TrackableProperty.java +++ b/forge-game/src/main/java/forge/trackable/TrackableProperty.java @@ -47,6 +47,7 @@ public enum TrackableProperty { Sickness(TrackableTypes.BooleanType), Tapped(TrackableTypes.BooleanType), Token(TrackableTypes.BooleanType), + TokenCard(TrackableTypes.BooleanType), IsCommander(TrackableTypes.BooleanType), CommanderAltType(TrackableTypes.StringType), Damage(TrackableTypes.IntegerType), diff --git a/forge-gui-android/AndroidManifest.xml b/forge-gui-android/AndroidManifest.xml index 1f2dc8ae144..f16e4002da3 100644 --- a/forge-gui-android/AndroidManifest.xml +++ b/forge-gui-android/AndroidManifest.xml @@ -2,7 +2,7 @@ + android:versionName="1.6.40" > gdx-backend-android 1.10.0 + + io.sentry + sentry-android + 1.7.30 + diff --git a/forge-gui-android/src/forge/app/Main.java b/forge-gui-android/src/forge/app/Main.java index af1ac25e21f..7a47506f544 100644 --- a/forge-gui-android/src/forge/app/Main.java +++ b/forge-gui-android/src/forge/app/Main.java @@ -53,6 +53,9 @@ import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; import forge.util.FileUtil; import forge.util.ThreadUtil; +import io.sentry.Sentry; +import io.sentry.android.AndroidSentryClientFactory; +import io.sentry.event.BreadcrumbBuilder; public class Main extends AndroidApplication { AndroidAdapter Gadapter; @@ -60,6 +63,10 @@ public class Main extends AndroidApplication { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); + Context ctx = this.getApplicationContext(); + String sentryDsn = "https://a0b8dbad9b8a49cfa51bf65d462e8dae:b3f27d7461224cb8836eb5c6050c666c@sentry.cardforge.org/2?buffer.enabled=false"; + //init Sentry + Sentry.init(sentryDsn, new AndroidSentryClientFactory(ctx)); //get total device RAM in mb ActivityManager actManager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); ActivityManager.MemoryInfo memInfo = new ActivityManager.MemoryInfo(); @@ -209,21 +216,28 @@ public class Main extends AndroidApplication { if (!Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())) { //fake init for error message //set current orientation + String message = getDeviceName()+"\n"+"Android "+AndroidRelease+"\n"+"RAM "+ totalRAM+"MB" +"\n"+"LibGDX "+ Version.VERSION+"\n"+"Can't access external storage"; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(message).build() + ); Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation); initialize(Forge.getApp(new AndroidClipboard(), adapter, "", false, true, totalRAM, isTabletDevice, AndroidAPI, AndroidRelease, getDeviceName())); - displayMessage(adapter, true, getDeviceName()+"\n"+"Android "+AndroidRelease+"\n"+"RAM "+ totalRAM+"MB" +"\n" - +"LibGDX "+ Version.VERSION+"\n"+"Can't access external storage"); + displayMessage(adapter, true, message); return; } - String obbforge = Environment.getExternalStorageDirectory() + "/obbforge"; //if obbforge file exists in Phone Storage, use app-specific Obb directory as path - String assetsDir = FileUtil.doesFileExist(obbforge) ? getContext().getObbDir()+"/Forge/" : Environment.getExternalStorageDirectory()+"/Forge/"; + String obbforge = Environment.getExternalStorageDirectory() + "/obbforge"; + //if obbforge file exists in Phone Storage, Forge uses app-specific Obb directory as path, Android 11+ is mandatory even without obbforge + String assetsDir = (FileUtil.doesFileExist(obbforge) || Build.VERSION.SDK_INT > 29) ? getContext().getObbDir()+"/Forge/" : Environment.getExternalStorageDirectory()+"/Forge/"; if (!FileUtil.ensureDirectoryExists(assetsDir)) { //fake init for error message //set current orientation + String message = getDeviceName()+"\n"+"Android "+AndroidRelease+"\n"+"RAM "+ totalRAM+"MB" +"\n"+"LibGDX "+ Version.VERSION+"\n"+"Can't access external storage\nPath: " + assetsDir; + Sentry.getContext().recordBreadcrumb( + new BreadcrumbBuilder().setMessage(message).build() + ); Main.this.setRequestedOrientation(Main.this.getResources().getConfiguration().orientation); initialize(Forge.getApp(new AndroidClipboard(), adapter, "", false, true, totalRAM, isTabletDevice, AndroidAPI, AndroidRelease, getDeviceName())); - displayMessage(adapter, true, getDeviceName()+"\n"+"Android "+AndroidRelease+"\n"+"RAM "+ totalRAM+"MB" +"\n" - +"LibGDX "+ Version.VERSION+"\n"+"Can't access external storage\nPath: " + assetsDir); + displayMessage(adapter, true, message); return; } boolean isPortrait; diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index f5d7c24b306..3d6259d64b3 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -178,6 +178,11 @@ mp3-wav 1.0.3 + + com.twelvemonkeys.imageio + imageio-jpeg + 3.7.0 + diff --git a/forge-gui-desktop/src/main/java/forge/ImageLoader.java b/forge-gui-desktop/src/main/java/forge/ImageLoader.java index 870be8f97e3..29f6d0b2839 100644 --- a/forge-gui-desktop/src/main/java/forge/ImageLoader.java +++ b/forge-gui-desktop/src/main/java/forge/ImageLoader.java @@ -1,17 +1,17 @@ package forge; -import java.awt.image.BufferedImage; -import java.io.File; -import java.io.IOException; - -import javax.imageio.ImageIO; - import com.google.common.cache.CacheLoader; import forge.gui.error.BugReporter; import forge.localinstance.properties.ForgePreferences; import forge.model.FModel; +import javax.imageio.ImageIO; + +import java.awt.image.BufferedImage; +import java.io.File; +import java.io.IOException; + final class ImageLoader extends CacheLoader { @Override public BufferedImage load(String key) { @@ -28,6 +28,7 @@ final class ImageLoader extends CacheLoader { return null; } try { + //it seems twelvemonkeys plugin handles the cmyk and other non standard colorspace jpeg automaticaly :) return ImageIO.read(file); } catch (IOException ex) { diff --git a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java index c47e40893ad..9c89dfec2c7 100644 --- a/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java +++ b/forge-gui-desktop/src/main/java/forge/itemmanager/views/ImageView.java @@ -46,7 +46,9 @@ import forge.itemmanager.ItemManager; import forge.itemmanager.ItemManagerConfig; import forge.itemmanager.ItemManagerModel; import forge.itemmanager.SItemManagerUtil; +import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; +import forge.localinstance.properties.ForgePreferences.FPref; import forge.localinstance.skin.FSkinProp; import forge.model.FModel; import forge.screens.deckeditor.CDeckEditorUI; @@ -796,6 +798,10 @@ public class ImageView extends ItemView { if (hoveredItem == item) { return false; } hoveredItem = item; if (item != null) { + final CDetailPicture cDetailPicture = itemManager.getCDetailPicture(); + if (cDetailPicture != null) { + cDetailPicture.displayAlt(item.alt); + } showHoveredItem(item.item); } return true; @@ -999,6 +1005,7 @@ public class ImageView extends ItemView { private final T item; private int index; private boolean selected; + private boolean alt; private ItemInfo(T item0) { item = item0; @@ -1115,6 +1122,7 @@ public class ImageView extends ItemView { if (pile.getTop() >= visibleBottom) { break; } + for (ItemInfo itemInfo : pile.items) { if (itemInfo.getBottom() < visibleTop) { continue; @@ -1122,6 +1130,28 @@ public class ImageView extends ItemView { if (itemInfo.getTop() >= visibleBottom) { break; } + + InventoryItem item = itemInfo.item; + itemInfo.alt = false; + if (!FModel.getPreferences().getPref(FPref.UI_SWITCH_STATES_DECKVIEW).equals(ForgeConstants.SWITCH_CARDSTATES_DECK_NEVER)) { + if ((hoveredItem == null || !hoveredItem.item.equals(item)) || (FModel.getPreferences().getPref(FPref.UI_SWITCH_STATES_DECKVIEW).equals(ForgeConstants.SWITCH_CARDSTATES_DECK_ALWAYS))) { + if (item instanceof PaperCard) { + if (ImageUtil.hasBackFacePicture(((PaperCard)item))) { + if (item.equals(lastAltCard)) { + itemInfo.alt = true; + lastAltCard = null; + } + else { + lastAltCard = item; + } + } + else { + lastAltCard = null; + } + } + } + } + if (itemInfo != hoveredItem) { //save hovered item for last drawItemImage(g2d, itemInfo); } @@ -1149,12 +1179,13 @@ public class ImageView extends ItemView { Rectangle bounds = itemInfo.getBounds(); final int itemWidth = bounds.width; final int selBorderSize = 1; - boolean deckSelectMode = itemInfo.item instanceof DeckProxy; + InventoryItem item = itemInfo.item; + boolean deckSelectMode = item instanceof DeckProxy; // Determine whether to render border from properties boolean noBorder = !isPreferenceEnabled(ForgePreferences.FPref.UI_RENDER_BLACK_BORDERS); - if (itemInfo.item instanceof IPaperCard) { - CardView cv = CardView.getCardForUi((IPaperCard) itemInfo.item); + if (item instanceof IPaperCard) { + CardView cv = CardView.getCardForUi((IPaperCard) item); // Amonkhet Invocations noBorder |= cv.getCurrentState().getSetCode().equalsIgnoreCase("MPS_AKH"); // Unstable basic lands @@ -1174,27 +1205,7 @@ public class ImageView extends ItemView { g.setColor(Color.black); g.fillRoundRect(bounds.x, bounds.y, bounds.width, bounds.height, cornerSize, cornerSize); - InventoryItem item = itemInfo.item; - - boolean tryAltState = false; - if (hoveredItem == null || hoveredItem.item != item) { - if (item instanceof PaperCard) { - if (ImageUtil.hasBackFacePicture(((PaperCard)item))) { - if (item.equals(lastAltCard)) { - tryAltState = true; - lastAltCard = null; - } - else { - lastAltCard = item; - } - } - else { - lastAltCard = null; - } - } - } - - BufferedImage img = ImageCache.getImage(item, bounds.width - 2 * borderSize, bounds.height - 2 * borderSize, tryAltState); + BufferedImage img = ImageCache.getImage(item, bounds.width - 2 * borderSize, bounds.height - 2 * borderSize, itemInfo.alt); if (img != null) { g.drawImage(img, null, bounds.x + borderSize, bounds.y + borderSize); diff --git a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java index 34391e0d5de..ff262bc676d 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java +++ b/forge-gui-desktop/src/main/java/forge/screens/deckeditor/controllers/CEditorConstructed.java @@ -314,18 +314,18 @@ public final class CEditorConstructed extends CDeckEditor { if (gameType == GameType.Oathbreaker) { PaperCard pc = cmb.getItemManager().getSelectedItem(); if (pc != null && pc.getRules().canBeSignatureSpell()) { - cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblassignaturespell")); + cmb.addMoveItems(localizer.getMessage("lblSetEdition"), localizer.getMessage("lblassignaturespell")); } else { - cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblasoathbreaker")); + cmb.addMoveItems(localizer.getMessage("lblSetEdition"), localizer.getMessage("lblasoathbreaker")); } } else { - cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblascommander")); + cmb.addMoveItems(localizer.getMessage("lblSetEdition"), localizer.getMessage("lblascommander")); } break; case Avatar: - cmb.addMoveItems(localizer.getMessage("lblSet2"), localizer.getMessage("lblasavatar")); + cmb.addMoveItems(localizer.getMessage("lblSetEdition"), localizer.getMessage("lblasavatar")); break; case Schemes: cmb.addMoveItems(localizer.getMessage("lblAdd"), localizer.getMessage("lbltoschemedeck")); diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java index b4dd359ade4..de6cb676fb8 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/quest/DialogChooseSets.java @@ -16,6 +16,7 @@ import javax.swing.JSeparator; import javax.swing.SwingConstants; import javax.swing.SwingUtilities; +import com.google.common.collect.Lists; import forge.card.CardEdition; import forge.game.GameFormat; import forge.gui.SOverlayUtils; @@ -42,32 +43,32 @@ public class DialogChooseSets { private Runnable okCallback; private final List choices = new ArrayList<>(); - private final FCheckBox cbWantReprints = new FCheckBox(Localizer.getInstance().getMessage("lblDisplayRecentSetRepints")); + private final FCheckBox cbWantReprints = new FCheckBox(Localizer.getInstance().getMessage("lblDisplayRecentSetReprints")); // lists are of set codes (e.g. "2ED") public DialogChooseSets(Collection preselectedSets, Collection unselectableSets, boolean showWantReprintsCheckbox) { // create a local copy of the editions list so we can sort it - List editions = new ArrayList<>(); - for (CardEdition ce : FModel.getMagicDb().getEditions()) { - editions.add(ce); - } + List editions = Lists.newArrayList(FModel.getMagicDb().getEditions()); Collections.sort(editions); Collections.reverse(editions); + List customEditions = Lists.newArrayList(FModel.getMagicDb().getCustomEditions()); + boolean customSetsExist = (customEditions.size() > 0); + if (customSetsExist){ + Collections.sort(customEditions); + Collections.reverse(customEditions); + } List coreSets = new ArrayList<>(); List expansionSets = new ArrayList<>(); List otherSets = new ArrayList<>(); for (CardEdition ce : editions) { - String code = ce.getCode(); FCheckBox box = new FCheckBox(TextUtil.concatWithSpace(ce.getName(), TextUtil.enclosedParen(code))); - box.setName(code); box.setSelected(null != preselectedSets && preselectedSets.contains(code)); box.setEnabled(null == unselectableSets || !unselectableSets.contains(code)); - switch (ce.getType()) { case CORE: coreSets.add(box); @@ -79,16 +80,29 @@ public class DialogChooseSets { otherSets.add(box); break; } + } + // CustomSet + List customSets = new ArrayList<>(); + if (customSetsExist) { + for (CardEdition ce : customEditions){ + String code = ce.getCode(); + FCheckBox box = new FCheckBox(TextUtil.concatWithSpace(ce.getName(), TextUtil.enclosedParen(code))); + box.setName(code); + box.setSelected(null != preselectedSets && preselectedSets.contains(code)); + box.setEnabled(null == unselectableSets || !unselectableSets.contains(code)); + customSets.add(box); + } } - - FPanel panel = new FPanel(new MigLayout("insets 10, gap 5, center, wrap 3")); + int wrapCol = !customSetsExist ? 3 : 4; + FPanel panel = new FPanel(new MigLayout(String.format("insets 10, gap 5, center, wrap %d", wrapCol))); panel.setOpaque(false); panel.setBackgroundTexture(FSkin.getIcon(FSkinProp.BG_TEXTURE)); FTextField coreField = new FTextField.Builder().text("0").maxLength(3).build(); FTextField expansionField = new FTextField.Builder().text("0").maxLength(3).build(); FTextField otherField = new FTextField.Builder().text("0").maxLength(3).build(); + FTextField customField = new FTextField.Builder().text("0").maxLength(3).build(); JPanel optionsPanel = new JPanel(new MigLayout("insets 10, gap 5, center, wrap 2")); optionsPanel.setVisible(false); @@ -99,13 +113,21 @@ public class DialogChooseSets { JPanel leftOptionsPanel = new JPanel(new MigLayout("insets 10, gap 5, center, wrap 2")); leftOptionsPanel.setOpaque(false); leftOptionsPanel.add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblSelectNumber") + ":").fontSize(14).fontStyle(Font.BOLD).build(), " span 2"); + leftOptionsPanel.add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblCore") + ":").build()); leftOptionsPanel.add(coreField, "w 40!"); + leftOptionsPanel.add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblExpansion") + ":").build()); leftOptionsPanel.add(expansionField, "w 40!"); + leftOptionsPanel.add(new FLabel.Builder().text("Other:").build()); leftOptionsPanel.add(otherField, "w 40!"); + if (customSetsExist){ + leftOptionsPanel.add(new FLabel.Builder().text("Custom Editions:").build()); + leftOptionsPanel.add(customField, "w 40!"); + } + JPanel rightOptionsPanel = new JPanel(new MigLayout("insets 10, gap 25 5, center, wrap 2")); rightOptionsPanel.setOpaque(false); rightOptionsPanel.add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblFormatRestrictions") +":").fontSize(14).fontStyle(Font.BOLD).build(), "span 2"); @@ -148,6 +170,9 @@ public class DialogChooseSets { int numberOfCoreSets = Integer.parseInt(coreField.getText()); int numberOfExpansionSets = Integer.parseInt(expansionField.getText()); int numberOfOtherSets = Integer.parseInt(otherField.getText()); + int numberOfCustomeSets = 0; + if (customSetsExist) + numberOfCustomeSets = Integer.parseInt(customField.getText()); for (FCheckBox coreSet : coreSets) { coreSet.setSelected(false); @@ -158,6 +183,11 @@ public class DialogChooseSets { for (FCheckBox otherSet : otherSets) { otherSet.setSelected(false); } + if (customSetsExist){ + for (FCheckBox customSet : customSets) { + customSet.setSelected(false); + } + } Predicate formatPredicate = null; for (GameFormat gameFormat : gameFormats) { @@ -201,6 +231,16 @@ public class DialogChooseSets { Collections.shuffle(filteredExpansionSets); Collections.shuffle(filteredOtherSets); + List filteredCustomSets = new ArrayList<>(); + if (customSetsExist){ + for (CardEdition edition : customEditions) { + if (formatPredicate != null && formatPredicate.test(edition)) { + filteredCustomSets.add(edition); + } + } + Collections.shuffle(filteredCustomSets); + } + for (int i = 0; i < numberOfCoreSets && i < filteredCoreSets.size(); i++) { String name = TextUtil.concatWithSpace(filteredCoreSets.get(i).getName(), TextUtil.enclosedParen(filteredCoreSets.get(i).getCode())); for (FCheckBox set : coreSets) { @@ -228,6 +268,18 @@ public class DialogChooseSets { } } + if (customSetsExist){ + for (int i = 0; i < numberOfCustomeSets && i < filteredCustomSets.size(); i++) { + String name = TextUtil.concatWithSpace(filteredCustomSets.get(i).getName(), + TextUtil.enclosedParen(filteredCustomSets.get(i).getCode())); + for (FCheckBox set : customSets) { + if (set.getText().equals(name)) { + set.setSelected(true); + } + } + } + } + panel.repaintSelf(); }); @@ -243,6 +295,11 @@ public class DialogChooseSets { for (FCheckBox otherSet : otherSets) { otherSet.setSelected(false); } + if (customSetsExist){ + for (FCheckBox cmSet : customSets) { + cmSet.setSelected(false); + } + } panel.repaintSelf(); }); @@ -275,9 +332,20 @@ public class DialogChooseSets { panel.add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblChooseSets")).fontSize(20).build(), "center, span, wrap, gaptop 10"); String constraints = "aligny top"; - panel.add(makeCheckBoxList(coreSets, Localizer.getInstance().getMessage("lblCoreSets"), true), constraints); - panel.add(makeCheckBoxList(expansionSets, Localizer.getInstance().getMessage("lblExpansions"), false), constraints); - panel.add(makeCheckBoxList(otherSets, Localizer.getInstance().getMessage("lblOtherSets"), false), constraints); + panel.add(makeCheckBoxList(coreSets, + Localizer.getInstance().getMessage("lblCoreSets"), true), + constraints); + panel.add(makeCheckBoxList(expansionSets, + Localizer.getInstance().getMessage("lblExpansions"), false), + constraints); + panel.add(makeCheckBoxList(otherSets, + Localizer.getInstance().getMessage("lblOtherSets"), false), + constraints); + if (customSetsExist){ + panel.add(makeCheckBoxList(customSets, + Localizer.getInstance().getMessage("lblCustomSets"), false), + constraints); + } panel.add(showOptionsButton, "center, w 230!, h 30!, gap 10 0 20 0, span 3, hidemode 3"); panel.add(optionsPanel, "center, w 100, span 3, growx, hidemode 3"); @@ -338,11 +406,10 @@ public class DialogChooseSets { } private JPanel makeCheckBoxList(List sets, String title, boolean focused) { - choices.addAll(sets); final FCheckBoxList cbl = new FCheckBoxList<>(false); cbl.setListData(sets.toArray(new FCheckBox[sets.size()])); - cbl.setVisibleRowCount(Math.min(20, sets.size())); + cbl.setVisibleRowCount(20); if (focused) { SwingUtilities.invokeLater(new Runnable() { diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java index 5db97522d48..08a3f485aee 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/CSubmenuPreferences.java @@ -257,6 +257,7 @@ public enum CSubmenuPreferences implements ICDoc { initializeStackAdditionsComboBox(); initializeLandPlayedComboBox(); initializeColorIdentityCombobox(); + initializeSwitchStatesCombobox(); initializeAutoYieldModeComboBox(); initializeCounterDisplayTypeComboBox(); initializeCounterDisplayLocationComboBox(); @@ -480,6 +481,15 @@ public enum CSubmenuPreferences implements ICDoc { panel.setComboBox(comboBox, selectedItem); } + private void initializeSwitchStatesCombobox() { + final String[] elems = {ForgeConstants.SWITCH_CARDSTATES_DECK_NEVER, ForgeConstants.SWITCH_CARDSTATES_DECK_HOVER, ForgeConstants.SWITCH_CARDSTATES_DECK_ALWAYS}; + final FPref userSetting = FPref.UI_SWITCH_STATES_DECKVIEW; + final FComboBoxPanel panel = this.view.getSwitchStates(); + final FComboBox comboBox = createComboBox(elems, userSetting); + final String selectedItem = this.prefs.getPref(userSetting); + panel.setComboBox(comboBox, selectedItem); + } + private void initializeAutoYieldModeComboBox() { final String[] elems = {ForgeConstants.AUTO_YIELD_PER_ABILITY, ForgeConstants.AUTO_YIELD_PER_CARD}; final FPref userSetting = FPref.UI_AUTO_YIELD_MODE; diff --git a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java index 250ffd4b4c3..88607bcf411 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java +++ b/forge-gui-desktop/src/main/java/forge/screens/home/settings/VSubmenuPreferences.java @@ -143,6 +143,7 @@ public enum VSubmenuPreferences implements IVSubmenu { private final FComboBoxPanel cbpGraveyardOrdering = new FComboBoxPanel<>(localizer.getMessage("cbpGraveyardOrdering")+":"); private final FComboBoxPanel cbpDefaultLanguage = new FComboBoxPanel<>(localizer.getMessage("cbpSelectLanguage")+":"); private final FComboBoxPanel cbpAutoUpdater = new FComboBoxPanel<>(localizer.getMessage("cbpAutoUpdater")+":"); + private final FComboBoxPanel cbpSwitchStates = new FComboBoxPanel<>(localizer.getMessage("cbpSwitchStates")+":"); /** * Constructor. @@ -384,6 +385,9 @@ public enum VSubmenuPreferences implements IVSubmenu { pnlPrefs.add(cbpDisplayCurrentCardColors, comboBoxConstraints); pnlPrefs.add(new NoteLabel(localizer.getMessage("nlDisplayCurrentCardColors")), descriptionConstraints); + pnlPrefs.add(cbpSwitchStates, comboBoxConstraints); + pnlPrefs.add(new NoteLabel(localizer.getMessage("nlSwitchStates")), descriptionConstraints); + // Sound options pnlPrefs.add(new SectionLabel(localizer.getMessage("SoundOptions")), sectionConstraints + ", gaptop 2%"); @@ -732,6 +736,10 @@ public enum VSubmenuPreferences implements IVSubmenu { return cbpDisplayCurrentCardColors; } + public FComboBoxPanel getSwitchStates() { + return cbpSwitchStates; + } + public FComboBoxPanel getCloseActionComboBoxPanel() { return cbpCloseAction; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java index 6af24207671..ea712979fd9 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/CMatchUI.java @@ -270,7 +270,7 @@ public final class CMatchUI * View deck list. */ public void viewDeckList() { - if (!isInGame()) { + if (!isInGame() || getCurrentPlayer() == null) { return; } final Deck deck = getGameView().getDeck(getCurrentPlayer()); @@ -760,7 +760,7 @@ public final class CMatchUI } } }; - + if (FThreads.isGuiThread()) { // run this now whether in EDT or not so that it doesn't clobber later stuff FThreads.invokeInEdtNowOrLater(focusRoutine); } else { @@ -1028,6 +1028,24 @@ public final class CMatchUI return result.get(); } + @Override + public Map assignGenericAmount(final CardView effectSource, final Map target, + final int amount, final boolean atLeastOne, final String amountLabel) { + if (amount <= 0) { + return Collections.emptyMap(); + } + + final AtomicReference> result = new AtomicReference<>(); + FThreads.invokeInEdtAndWait(new Runnable() { + @Override + public void run() { + final VAssignGenericAmount v = new VAssignGenericAmount(CMatchUI.this, effectSource, target, amount, atLeastOne, amountLabel); + result.set(v.getAssignedMap()); + }}); + return result.get(); + } + + @Override public void openView(final TrackableCollection myPlayers) { final GameView gameView = getGameView(); @@ -1273,28 +1291,28 @@ public final class CMatchUI String stackNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_STACK_EFFECT_NOTIFICATION_POLICY); boolean isAi = sa.getActivatingPlayer().isAI(); boolean isTrigger = sa.isTrigger(); - int stackIndex = event.stackIndex; - if(stackIndex == nextNotifiableStackIndex) { + int stackIndex = event.stackIndex; + if(stackIndex == nextNotifiableStackIndex) { if(ForgeConstants.STACK_EFFECT_NOTIFICATION_ALWAYS.equals(stackNotificationPolicy) || (ForgeConstants.STACK_EFFECT_NOTIFICATION_AI_AND_TRIGGERED.equals(stackNotificationPolicy) && (isAi || isTrigger))) { // We can go and show the modal SpellAbilityStackInstance si = event.si; - + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); JPanel mainPanel = new JPanel(migLayout); final Dimension parentSize = JOptionPane.getRootFrame().getSize(); Dimension maxSize = new Dimension(1400, parentSize.height - 100); mainPanel.setMaximumSize(maxSize); - mainPanel.setOpaque(false); + mainPanel.setOpaque(false); // Big Image addBigImageToStackModalPanel(mainPanel, si); - + // Text addTextToStackModalPanel(mainPanel,sa,si); - + // Small images int numSmallImages = 0; - + // If current effect is a triggered/activated ability of an enchantment card, I want to show the enchanted card GameEntityView enchantedEntityView = null; Card hostCard = sa.getHostCard(); @@ -1308,45 +1326,45 @@ public final class CMatchUI && !sa.getRootAbility().getPaidList("Sacrificed").isEmpty()) { // If the player activated its ability by sacrificing the enchantment, the enchantment has not anything attached anymore and the ex-enchanted card has to be searched in other ways.. for example, the green enchantment "Carapace" enchantedEntity = sa.getRootAbility().getPaidList("Sacrificed").get(0).getEnchantingCard(); - if(enchantedEntity != null) { - enchantedEntityView = enchantedEntity.getView(); + if(enchantedEntity != null) { + enchantedEntityView = enchantedEntity.getView(); numSmallImages++; } } } - + // If current effect is a triggered ability, I want to show the triggering card if present SpellAbility sourceSA = (SpellAbility) si.getTriggeringObject(AbilityKey.SourceSA); CardView sourceCardView = null; if(sourceSA != null) { sourceCardView = sourceSA.getHostCard().getView(); numSmallImages++; - } + } // I also want to show each type of targets (both cards and players) List targets = getTargets(si,new ArrayList()); numSmallImages = numSmallImages + targets.size(); - + // Now I know how many small images - on to render them if(enchantedEntityView != null) { - addSmallImageToStackModalPanel(enchantedEntityView,mainPanel,numSmallImages); + addSmallImageToStackModalPanel(enchantedEntityView,mainPanel,numSmallImages); } if(sourceCardView != null) { - addSmallImageToStackModalPanel(sourceCardView,mainPanel,numSmallImages); + addSmallImageToStackModalPanel(sourceCardView,mainPanel,numSmallImages); } for(GameEntityView gev : targets) { addSmallImageToStackModalPanel(gev, mainPanel, numSmallImages); - } - - FOptionPane.showOptionDialog(null, "Forge", null, mainPanel, ImmutableList.of(Localizer.getInstance().getMessage("lblOK"))); + } + + FOptionPane.showOptionDialog(null, "Forge", null, mainPanel, ImmutableList.of(Localizer.getInstance().getMessage("lblOK"))); // here the user closed the modal - time to update the next notifiable stack index - + } // In any case, I have to increase the counter nextNotifiableStackIndex++; - + } else { - + // Not yet time to show the modal - schedule the method again, and try again later Runnable tryAgainThread = new Runnable() { @Override @@ -1355,8 +1373,8 @@ public final class CMatchUI } }; GuiBase.getInterface().invokeInEdtLater(tryAgainThread); - - } + + } } private List getTargets(SpellAbilityStackInstance si, List result){ @@ -1380,22 +1398,22 @@ public final class CMatchUI return getTargets(si.getSubInstance(),result); } - + private void addBigImageToStackModalPanel(JPanel mainPanel, SpellAbilityStackInstance si) { StackItemView siv = si.getView(); int rotation = getRotation(si.getCardView()); - FImagePanel imagePanel = new FImagePanel(); - BufferedImage bufferedImage = FImageUtil.getImage(siv.getSourceCard().getCurrentState()); + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(siv.getSourceCard().getCurrentState()); imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); int imageWidth = 433; int imageHeight = 600; Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); imagePanel.setMinimumSize(imagePanelDimension); - - mainPanel.add(imagePanel, "cell 0 0, spany 3"); + + mainPanel.add(imagePanel, "cell 0 0, spany 3"); } - + private void addTextToStackModalPanel(JPanel mainPanel, SpellAbility sa, SpellAbilityStackInstance si) { String who = sa.getActivatingPlayer().getName(); String action = sa.isSpell() ? " cast " : sa.isTrigger() ? " triggered " : " activated "; @@ -1409,45 +1427,45 @@ public final class CMatchUI TargetChoices targets = si.getTargetChoices(); sb.append(targets); } - sb.append("."); + sb.append("."); String message1 = sb.toString(); - String message2 = si.getStackDescription(); + String message2 = si.getStackDescription(); String messageTotal = message1 + "\n\n" + message2; - + final FTextArea prompt1 = new FTextArea(messageTotal); prompt1.setFont(FSkin.getFont(21)); prompt1.setAutoSize(true); prompt1.setMinimumSize(new Dimension(475,200)); - mainPanel.add(prompt1, "cell 1 0, aligny top"); + mainPanel.add(prompt1, "cell 1 0, aligny top"); } - + private void addSmallImageToStackModalPanel(GameEntityView gameEntityView, JPanel mainPanel, int numTarget) { if(gameEntityView instanceof CardView) { CardView cardView = (CardView) gameEntityView; - int currRotation = getRotation(cardView); + int currRotation = getRotation(cardView); FImagePanel targetPanel = new FImagePanel(); - BufferedImage bufferedImage = FImageUtil.getImage(cardView.getCurrentState()); + BufferedImage bufferedImage = FImageUtil.getImage(cardView.getCurrentState()); targetPanel.setImage(bufferedImage, currRotation, AutoSizeImageMode.SOURCE); int imageWidth = 217; int imageHeight = 300; Dimension targetPanelDimension = new Dimension(imageWidth,imageHeight); targetPanel.setMinimumSize(targetPanelDimension); - mainPanel.add(targetPanel, "cell 1 1, split " + numTarget+ ", aligny bottom"); + mainPanel.add(targetPanel, "cell 1 1, split " + numTarget+ ", aligny bottom"); } else if(gameEntityView instanceof PlayerView) { PlayerView playerView = (PlayerView) gameEntityView; SkinImage playerAvatar = getPlayerAvatar(playerView, 0); final FLabel lblIcon = new FLabel.Builder().icon(playerAvatar).build(); Dimension dimension = playerAvatar.getSizeForPaint(JOptionPane.getRootFrame().getGraphics()); - mainPanel.add(lblIcon, "cell 1 1, split " + numTarget+ ", w " + dimension.getWidth() + ", h " + dimension.getHeight() + ", aligny bottom"); + mainPanel.add(lblIcon, "cell 1 1, split " + numTarget+ ", w " + dimension.getWidth() + ", h " + dimension.getHeight() + ", aligny bottom"); } - } - + } + private int getRotation(CardView cardView) { final int rotation; if (cardView.isSplitCard()) { String cardName = cardView.getName(); if (cardName.isEmpty()) { cardName = cardView.getAlternateState().getName(); } - + PaperCard pc = StaticData.instance().getCommonCards().getCard(cardName); boolean hasKeywordAftermath = pc != null && Card.getCardForUi(pc).hasKeyword(Keyword.AFTERMATH); @@ -1459,7 +1477,7 @@ public final class CMatchUI return rotation; } - + @Override public void notifyStackRemoval(GameEventSpellRemovedFromStack event) { // I always decrease the counter @@ -1474,49 +1492,49 @@ public final class CMatchUI createLandPopupPanel(land); } }; - GuiBase.getInterface().invokeInEdtAndWait(createPopupThread); + GuiBase.getInterface().invokeInEdtAndWait(createPopupThread); } private void createLandPopupPanel(Card land) { - + String landPlayedNotificationPolicy = FModel.getPreferences().getPref(FPref.UI_LAND_PLAYED_NOTIFICATION_POLICY); - Player cardController = land.getController(); - boolean isAi = cardController.isAI(); - if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) + Player cardController = land.getController(); + boolean isAi = cardController.isAI(); + if(ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS.equals(landPlayedNotificationPolicy) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI.equals(landPlayedNotificationPolicy) && (isAi)) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) || (ForgeConstants.LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS.equals(landPlayedNotificationPolicy) && !land.isBasicLand()) && (isAi)) { - String title = "Forge"; + String title = "Forge"; List options = ImmutableList.of(Localizer.getInstance().getMessage("lblOK")); - + MigLayout migLayout = new MigLayout("insets 15, left, gap 30, fill"); JPanel mainPanel = new JPanel(migLayout); final Dimension parentSize = JOptionPane.getRootFrame().getSize(); Dimension maxSize = new Dimension(1400, parentSize.height - 100); mainPanel.setMaximumSize(maxSize); - mainPanel.setOpaque(false); - + mainPanel.setOpaque(false); + int rotation = getRotation(land.getView()); - FImagePanel imagePanel = new FImagePanel(); - BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); + FImagePanel imagePanel = new FImagePanel(); + BufferedImage bufferedImage = FImageUtil.getImage(land.getCurrentState().getView()); imagePanel.setImage(bufferedImage, rotation, AutoSizeImageMode.SOURCE); int imageWidth = 433; int imageHeight = 600; Dimension imagePanelDimension = new Dimension(imageWidth,imageHeight); imagePanel.setMinimumSize(imagePanelDimension); - + mainPanel.add(imagePanel, "cell 0 0, spany 3"); - - String msg = cardController.toString() + " puts " + land.toString() + " into play into " + ZoneType.Battlefield.toString() + "."; - + + String msg = cardController.toString() + " puts " + land.toString() + " into play into " + ZoneType.Battlefield.toString() + "."; + final FTextArea prompt1 = new FTextArea(msg); prompt1.setFont(FSkin.getFont(21)); prompt1.setAutoSize(true); prompt1.setMinimumSize(new Dimension(475,200)); - mainPanel.add(prompt1, "cell 1 0, aligny top"); - - FOptionPane.showOptionDialog(null, title, null, mainPanel, options); - } + mainPanel.add(prompt1, "cell 1 0, aligny top"); + + FOptionPane.showOptionDialog(null, title, null, mainPanel, options); + } } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java index 6551d293db4..987d866d720 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignCombatDamage.java @@ -448,7 +448,9 @@ public class VAssignCombatDamage { } else { lethalDamage = Math.max(0, card.getLethalDamage()); - if (attackerHasDeathtouch) { + if (card.getCurrentState().getType().isPlaneswalker()) { + lethalDamage = Integer.valueOf(card.getCurrentState().getLoyalty()); + } else if (attackerHasDeathtouch) { lethalDamage = Math.min(lethalDamage, 1); } } diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java new file mode 100644 index 00000000000..b2ee1fd8784 --- /dev/null +++ b/forge-gui-desktop/src/main/java/forge/screens/match/VAssignGenericAmount.java @@ -0,0 +1,314 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2021 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.screens.match; + +import java.awt.Dialog.ModalityType; +import java.awt.Dimension; +import java.awt.event.ActionEvent; +import java.awt.event.ActionListener; +import java.awt.event.MouseAdapter; +import java.awt.event.MouseEvent; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import javax.swing.JLabel; +import javax.swing.JPanel; +import javax.swing.SwingConstants; +import javax.swing.SwingUtilities; +import javax.swing.border.Border; + +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.gui.SOverlayUtils; +import forge.toolbox.FButton; +import forge.toolbox.FLabel; +import forge.toolbox.FScrollPane; +import forge.toolbox.FSkin; +import forge.toolbox.FSkin.SkinnedPanel; +import forge.util.Localizer; +import forge.util.TextUtil; +import forge.view.FDialog; +import forge.view.arcane.CardPanel; +import net.miginfocom.swing.MigLayout; + +/** + * Assembles Swing components of assign damage dialog. + * + * This needs a JDialog to maintain a modal state. + * Without the modal state, the PhaseHandler automatically + * moves forward to phase Main2 without assigning damage. + * + *

(V at beginning of class name denotes a view class.) + */ +public class VAssignGenericAmount { + final Localizer localizer = Localizer.getInstance(); + private final CMatchUI matchUI; + + // Width and height of assign dialog + private final int wDlg = 700; + private final int hDlg = 500; + private final FDialog dlg = new FDialog(); + + // Amount storage + private final int totalAmountToAssign; + + private final String lblAmount; + private final JLabel lblTotalAmount; + // Label Buttons + private final FButton btnOK = new FButton(localizer.getMessage("lblOk")); + private final FButton btnReset = new FButton(localizer.getMessage("lblReset")); + + private static class AssignTarget { + public final GameEntityView entity; + public final JLabel label; + public final int max; + public int amount; + + public AssignTarget(final GameEntityView e, final JLabel lbl, int max0) { + entity = e; + label = lbl; + max = max0; + amount = 0; + } + } + + private final List targetsList = new ArrayList<>(); + private final Map targetsMap = new HashMap<>(); + + // Mouse actions + private final MouseAdapter mad = new MouseAdapter() { + @Override + public void mouseEntered(final MouseEvent evt) { + ((CardPanel) evt.getSource()).setBorder(new FSkin.LineSkinBorder(FSkin.getColor(FSkin.Colors.CLR_ACTIVE), 2)); + } + + @Override + public void mouseExited(final MouseEvent evt) { + ((CardPanel) evt.getSource()).setBorder((Border)null); + } + + @Override + public void mousePressed(final MouseEvent evt) { + CardView source = ((CardPanel) evt.getSource()).getCard(); // will be NULL for player + + boolean meta = evt.isControlDown(); + boolean isLMB = SwingUtilities.isLeftMouseButton(evt); + boolean isRMB = SwingUtilities.isRightMouseButton(evt); + + if ( isLMB || isRMB) + assignAmountTo(source, meta, isLMB); + } + }; + + public VAssignGenericAmount(final CMatchUI matchUI, final CardView effectSource, final Map targets, final int amount, final boolean atLeastOne, final String amountLabel) { + this.matchUI = matchUI; + dlg.setTitle(localizer.getMessage("lbLAssignAmountForEffect", amountLabel, effectSource.toString())); + + totalAmountToAssign = amount; + + lblAmount = amountLabel; + lblTotalAmount = new FLabel.Builder().text(localizer.getMessage("lblTotalAmountText", lblAmount)).build(); + + // Top-level UI stuff + final JPanel overlay = SOverlayUtils.genericOverlay(); + final SkinnedPanel pnlMain = new SkinnedPanel(); + pnlMain.setBackground(FSkin.getColor(FSkin.Colors.CLR_THEME2)); + + // Effect Source area + final CardPanel pnlSource = new CardPanel(matchUI, effectSource); + pnlSource.setOpaque(false); + pnlSource.setCardBounds(0, 0, 105, 150); + + final JPanel pnlInfo = new JPanel(new MigLayout("insets 0, gap 0, wrap")); + pnlInfo.setOpaque(false); + pnlInfo.add(lblTotalAmount, "gap 0 0 20px 5px"); + pnlInfo.add(new FLabel.Builder().text(localizer.getMessage("lblLClickAmountMessage", lblAmount)).build(), "gap 0 0 0 5px"); + pnlInfo.add(new FLabel.Builder().text(localizer.getMessage("lblRClickAmountMessage", lblAmount)).build(), "gap 0 0 0 5px"); + + // Targets area + final JPanel pnlTargets = new JPanel(); + pnlTargets.setOpaque(false); + int cols = targets.size(); + final String wrap = "wrap " + cols; + pnlTargets.setLayout(new MigLayout("insets 0, gap 0, ax center, " + wrap)); + + final FScrollPane scrTargets = new FScrollPane(pnlTargets, false); + + // Top row of cards... + for (final Map.Entry e : targets.entrySet()) { + int maxAmount = e.getValue() != null ? e.getValue() : amount; + final AssignTarget at = new AssignTarget(e.getKey(), new FLabel.Builder().text("0").fontSize(18).fontAlign(SwingConstants.CENTER).build(), maxAmount); + addPanelForTarget(pnlTargets, at); + } + + // ... bottom row of labels. + for (final AssignTarget l : targetsList) { + pnlTargets.add(l.label, "w 145px!, h 30px!, gap 5px 5px 0 5px"); + } + + btnOK.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent arg0) { finish(); } }); + btnReset.addActionListener(new ActionListener() { + @Override public void actionPerformed(ActionEvent arg0) { resetAssignedAmount(); initialAssignAmount(atLeastOne); } }); + + // Final UI layout + pnlMain.setLayout(new MigLayout("insets 0, gap 0, wrap 2, ax center")); + pnlMain.add(pnlSource, "w 125px!, h 160px!, gap 50px 0 0 15px"); + pnlMain.add(pnlInfo, "gap 20px 0 0 15px"); + pnlMain.add(scrTargets, "w 96%!, gap 2% 0 0 0, pushy, growy, ax center, span 2"); + + final JPanel pnlButtons = new JPanel(new MigLayout("insets 0, gap 0, ax center")); + pnlButtons.setOpaque(false); + pnlButtons.add(btnOK, "w 110px!, h 30px!, gap 0 10px 0 0"); + pnlButtons.add(btnReset, "w 110px!, h 30px!"); + + pnlMain.add(pnlButtons, "ax center, w 350px!, gap 10px 10px 10px 10px, span 2"); + overlay.add(pnlMain); + + pnlMain.getRootPane().setDefaultButton(btnOK); + + initialAssignAmount(atLeastOne); + SOverlayUtils.showOverlay(); + + dlg.setUndecorated(true); + dlg.setContentPane(pnlMain); + dlg.setSize(new Dimension(wDlg, hDlg)); + dlg.setLocation((overlay.getWidth() - wDlg) / 2, (overlay.getHeight() - hDlg) / 2); + dlg.setModalityType(ModalityType.APPLICATION_MODAL); + dlg.setVisible(true); + } + + private void addPanelForTarget(final JPanel pnlTargets, final AssignTarget at) { + CardView cv = null; + if (at.entity instanceof CardView) { + cv = (CardView)at.entity; + } else if (at.entity instanceof PlayerView) { + final PlayerView p = (PlayerView)at.entity; + cv = new CardView(-1, null, at.entity.toString(), p, matchUI.getAvatarImage(p.getLobbyPlayerName())); + } else { + return; + } + final CardPanel cp = new CardPanel(matchUI, cv); + cp.setCardBounds(0, 0, 105, 150); + cp.setOpaque(true); + pnlTargets.add(cp, "w 145px!, h 170px!, gap 5px 5px 3px 3px, ax center"); + cp.addMouseListener(mad); + targetsMap.put(cv, at); + targetsList.add(at); + } + + private void assignAmountTo(CardView source, final boolean meta, final boolean isAdding) { + AssignTarget at = targetsMap.get(source); + int assigned = at.amount; + int leftToAssign = Math.max(0, at.max - assigned); + int amountToAdd = isAdding ? 1 : -1; + int remainingAmount = Math.min(getRemainingAmount(), leftToAssign); + // Left click adds, right click substracts. + // Hold Ctrl to assign to maximum amount + if (meta) { + if (isAdding) { + amountToAdd = leftToAssign > 0 ? leftToAssign : 0; + } else { + amountToAdd = -assigned; + } + } + + if (amountToAdd > remainingAmount) { + amountToAdd = remainingAmount; + } + + if (0 == amountToAdd || amountToAdd + assigned < 0) { + return; + } + + addAssignedAmount(at, amountToAdd); + updateLabels(); + } + + private void initialAssignAmount(boolean atLeastOne) { + if (!atLeastOne) { + updateLabels(); + return; + } + + for(AssignTarget at : targetsList) { + addAssignedAmount(at, 1); + } + updateLabels(); + } + + private void resetAssignedAmount() { + for(AssignTarget at : targetsList) + at.amount = 0; + } + + private void addAssignedAmount(final AssignTarget at, int addedAmount) { + // If we don't have enough left or we're trying to unassign too much return + final int canAssign = getRemainingAmount(); + if (canAssign < addedAmount) { + addedAmount = canAssign; + } + + at.amount = Math.max(0, addedAmount + at.amount); + } + + private int getRemainingAmount() { + int spent = 0; + for(AssignTarget at : targetsList) { + spent += at.amount; + } + return totalAmountToAssign - spent; + } + + /** Updates labels and other UI elements.*/ + private void updateLabels() { + int amountLeft = totalAmountToAssign; + + for ( AssignTarget at : targetsList ) + { + amountLeft -= at.amount; + StringBuilder sb = new StringBuilder(); + sb.append(at.amount); + if (at.max - at.amount == 0) { + sb.append(" (").append(localizer.getMessage("lblMax")).append(")"); + } + at.label.setText(sb.toString()); + } + + lblTotalAmount.setText(TextUtil.concatNoSpace(localizer.getMessage("lblAvailableAmount", lblAmount), ": " , String.valueOf(amountLeft), " (of ", String.valueOf(totalAmountToAssign), ")")); + btnOK.setEnabled(amountLeft == 0); + } + + private void finish() { + if ( getRemainingAmount() > 0 ) + return; + + dlg.dispose(); + SOverlayUtils.hideOverlay(); + } + + public Map getAssignedMap() { + Map result = new HashMap<>(targetsList.size()); + for (AssignTarget at : targetsList) + result.put(at.entity, at.amount); + return result; + } +} diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetailPicture.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetailPicture.java index f2b82899bee..ac0ebd099cf 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetailPicture.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CDetailPicture.java @@ -39,11 +39,15 @@ public class CDetailPicture { return cPicture; } + public void displayAlt(final boolean showAlt) { + isDisplayAlt = showAlt; + } + public void showCard(final CardView c, final boolean showAlt) { currentView = c; - final boolean mayView = mayView(), mayFlip = mayView && mayFlip(); + final boolean mayFlip = mayView() && mayFlip(); isDisplayAlt = mayFlip && showAlt; - alwaysDisplayAlt = mayView && mayFlip && c.isFaceDown(); + alwaysDisplayAlt = mayFlip && c.isFaceDown(); update(); } @@ -65,7 +69,7 @@ public class CDetailPicture { c.getCurrentState().setFoilIndexOverride(1); } } - showCard(c, false); + showCard(c, isDisplayAlt); } else { currentView = null; isDisplayAlt = false; diff --git a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java index 706c27c971f..6c861591e46 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java +++ b/forge-gui-desktop/src/main/java/forge/screens/match/controllers/CField.java @@ -23,10 +23,12 @@ import java.awt.event.MouseListener; import com.google.common.base.Function; -import forge.Singletons; import forge.game.player.PlayerView; import forge.game.zone.ZoneType; +import forge.gamemodes.match.input.Input; +import forge.gamemodes.match.input.InputPayMana; import forge.gui.framework.ICDoc; +import forge.player.PlayerControllerHuman; import forge.screens.match.CMatchUI; import forge.screens.match.ZoneAction; import forge.screens.match.views.VField; @@ -70,10 +72,14 @@ public class CField implements ICDoc { final Function manaAction = new Function() { @Override public final Boolean apply(final Byte colorCode) { - if (CField.this.player.isLobbyPlayer(Singletons.getControl().getGuiPlayer())) { - final int oldMana = player.getMana(colorCode); - matchUI.getGameController().useMana(colorCode.byteValue()); - return Boolean.valueOf(oldMana != player.getMana(colorCode)); + if (matchUI.getGameController() instanceof PlayerControllerHuman) { + final PlayerControllerHuman controller = (PlayerControllerHuman) matchUI.getGameController(); + final Input ipm = controller.getInputQueue().getInput(); + if (ipm instanceof InputPayMana && ipm.getOwner().equals(player)) { + final int oldMana = player.getMana(colorCode); + controller.useMana(colorCode.byteValue()); + return Boolean.valueOf(oldMana != player.getMana(colorCode)); + } } return Boolean.FALSE; } diff --git a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardScript.java b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardScript.java index 8206ebc0add..90c8868dcba 100644 --- a/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardScript.java +++ b/forge-gui-desktop/src/main/java/forge/screens/workshop/views/VCardScript.java @@ -14,6 +14,7 @@ import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; import forge.gui.framework.IVDoc; import forge.screens.workshop.controllers.CCardScript; +import forge.toolbox.FScrollPane; import forge.toolbox.FTextPane; import forge.util.Localizer; import net.miginfocom.swing.MigLayout; @@ -32,6 +33,7 @@ public enum VCardScript implements IVDoc { private final DragTab tab = new DragTab(Localizer.getInstance().getMessage("lblCardScript")); private final FTextPane txtScript = new FTextPane(); + private final FScrollPane scrollScript; private final StyledDocument doc; private final Style error; @@ -41,6 +43,7 @@ public enum VCardScript implements IVDoc { txtScript.setFocusable(true); doc = new DefaultStyledDocument(); txtScript.setDocument(doc); + scrollScript = new FScrollPane(txtScript, true); error = doc.addStyle("error", null); error.addAttribute(StyleConstants.Background, Color.red); error.addAttribute(StyleConstants.Bold, Boolean.valueOf(true)); @@ -107,6 +110,6 @@ public enum VCardScript implements IVDoc { public void populate() { JPanel body = parentCell.getBody(); body.setLayout(new MigLayout("insets 1, gap 0, wrap")); - body.add(txtScript, "w 100%, h 100%"); + body.add(scrollScript, "w 100%, h 100%"); } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index 51974682e0c..7ec016eb0fe 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -2166,4 +2166,149 @@ public class GameSimulatorTest extends SimulationTestCase { assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); } + + public void testCantBePrevented() { + String polukranosCardName = "Polukranos, Unchained"; + String hydraCardName = "Phyrexian Hydra"; + String leylineCardName = "Leyline of Punishment"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + + Card polukranos = addCard(polukranosCardName, p); + polukranos.addCounter(CounterEnumType.P1P1, 6, p, false, null); + addCard(hydraCardName, p); + addCard(leylineCardName, p); + for (int i = 0; i < 2; ++i) { + addCard("Mountain", p); + } + Card pyroCard = addCardToZone("Pyroclasm", p, ZoneType.Hand); + SpellAbility pyroSA = pyroCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(pyroSA); + Game simGame = sim.getSimulatedGameState(); + Card simPolukranos = findCardWithName(simGame, polukranosCardName); + Card simHydra = findCardWithName(simGame, hydraCardName); + + assertTrue(simPolukranos.hasCounters()); + assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); + assertEquals(2, simPolukranos.getDamage()); + + assertFalse(simHydra.hasCounters()); + assertEquals(2, simHydra.getDamage()); + } + + public void testAlphaBrawl() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String nishobaName = "Phantom Nishoba"; + String capridorName = "Stormwild Capridor"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String bearName = "Runeclaw Bear"; + String alphaBrawlName = "Alpha Brawl"; + + // enough to cast Alpha Brawl + for (int i = 0; i < 8; ++i) { + addCard("Mountain", p2); + } + + Card nishoba = addCard(nishobaName, p1); + nishoba.addCounter(CounterEnumType.P1P1, 7, p1, false, null); + addCard(capridorName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); + indestructibility.attachToEntity(pridemate); + addCard(bearName, p1); + + Card alphaBrawl = addCardToZone(alphaBrawlName, p2, ZoneType.Hand); + SpellAbility alphaBrawlSA = alphaBrawl.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p2); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p2); + alphaBrawlSA.setTargetCard(nishoba); + sim.simulateSpellAbility(alphaBrawlSA); + Game simGame = sim.getSimulatedGameState(); + Card simNishoba = findCardWithName(simGame, nishobaName); + Card simCapridor = findCardWithName(simGame, capridorName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBear = findCardWithName(simGame, bearName); + + // bear is destroyed + assertNull(simBear); + + assertNotNull(simNishoba); + assertTrue(simNishoba.hasCounters()); + // Damage prevented and only 1 +1/+1 counter is removed + assertEquals(0, simNishoba.getDamage()); + assertTrue(simNishoba.hasCounters()); + assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); + assertEquals(6, simNishoba.getToughnessBonusFromCounters()); + assertEquals(6, simNishoba.getPowerBonusFromCounters()); + + assertNotNull(simCapridor); + // Damage prevented and that many +1/+1 counters are put + assertEquals(0, simCapridor.getDamage()); + assertTrue(simCapridor.hasCounters()); + assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); + assertEquals(7, simCapridor.getToughnessBonusFromCounters()); + assertEquals(7, simCapridor.getPowerBonusFromCounters()); + + assertNotNull(simPridemate); + assertEquals(7, simPridemate.getDamage()); + // Life gain only triggered once + assertTrue(simPridemate.hasCounters()); + assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor is prevented) + assertEquals(34, simGame.getPlayers().get(0).getLife()); + } + + public void testGlarecaster() { + String glarecasterName = "Glarecaster"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + Card glarecaster = addCard(glarecasterName, p); + // enough to activate Glarecaster and cast Inferno + for (int i = 0; i < 7; ++i) { + addCard("Plains", p); + addCard("Mountain", p); + } + Card infernoCard = addCardToZone("Inferno", p, ZoneType.Hand); + SpellAbility infernoSA = infernoCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); + assertNotNull(saGlarecaster); + saGlarecaster.getTargets().add(p2); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(saGlarecaster).value; + assertTrue(score > 0); + sim.simulateSpellAbility(infernoSA); + Game simGame = sim.getSimulatedGameState(); + Card simGlarecaster = findCardWithName(simGame, glarecasterName); + + assertNotNull(simGlarecaster); + assertEquals(0, simGlarecaster.getDamage()); + + // 6 * 3 = 18 damage are all dealt to p2 + assertEquals(20, simGame.getPlayers().get(0).getLife()); + assertEquals(2, simGame.getPlayers().get(1).getLife()); + } } diff --git a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java index ed0bbea56cd..f13bbf7c2ea 100644 --- a/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java +++ b/forge-gui-desktop/src/test/java/forge/gamesimulationtests/util/PlayerControllerForTests.java @@ -146,6 +146,12 @@ public class PlayerControllerForTests extends PlayerController { throw new IllegalStateException("Erring on the side of caution here..."); } + @Override + public Map divideShield(Card effectSource, Map affected, int shieldAmount) { + throw new IllegalStateException("Erring on the side of caution here..."); + } + + @Override public Integer announceRequirements(SpellAbility ability, String announce) { throw new IllegalStateException("Erring on the side of caution here..."); @@ -310,7 +316,7 @@ public class PlayerControllerForTests extends PlayerController { } @Override - public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, String question) { + public boolean confirmReplacementEffect(ReplacementEffect replacementEffect, SpellAbility effectSA, GameEntity affected, String question) { return true; } diff --git a/forge-gui-mobile-dev/src/forge/app/Main.java b/forge-gui-mobile-dev/src/forge/app/Main.java index 299f240bc42..7b84b004902 100644 --- a/forge-gui-mobile-dev/src/forge/app/Main.java +++ b/forge-gui-mobile-dev/src/forge/app/Main.java @@ -101,8 +101,10 @@ public class Main { Lwjgl3ApplicationConfiguration config = new Lwjgl3ApplicationConfiguration(); config.setResizable(false); config.setWindowedMode(desktopMode ? desktopScreenWidth : screenWidth, desktopMode ? desktopScreenHeight : screenHeight); - if (desktopMode && fullscreenFlag) + if (desktopMode && fullscreenFlag) { config.setFullscreenMode(Lwjgl3ApplicationConfiguration.getDisplayMode()); + config.setAutoIconify(true); //fix alt-tab when running fullscreen + } config.setTitle("Forge"); if (desktopMode) config.setHdpiMode(HdpiMode.Logical); diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 0a807ebfb43..a1b078b99ab 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -68,6 +68,7 @@ public class Forge implements ApplicationListener { private static boolean isloadingaMatch = false; public static boolean showFPS = false; public static boolean altPlayerLayout = false; + public static boolean altZoneTabs = false; public static String enableUIMask = "Crop"; public static boolean enablePreloadExtendedArt = false; public static boolean isTabletDevice = false; @@ -88,7 +89,7 @@ public class Forge implements ApplicationListener { if (GuiBase.getInterface() == null) { clipboard = clipboard0; deviceAdapter = deviceAdapter0; - GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); + GuiBase.setUsingAppDirectory(assetDir0.contains("forge.app")); //obb directory on android uses the package name as entrypoint GuiBase.setInterface(new GuiMobile(assetDir0)); GuiBase.enablePropertyConfig(value); isPortraitMode = androidOrientation; @@ -136,6 +137,7 @@ public class Forge implements ApplicationListener { textureFiltering = prefs.getPrefBoolean(FPref.UI_LIBGDX_TEXTURE_FILTERING); showFPS = prefs.getPrefBoolean(FPref.UI_SHOW_FPS); altPlayerLayout = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT); + altZoneTabs = prefs.getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS); enableUIMask = prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING); if (prefs.getPref(FPref.UI_ENABLE_BORDER_MASKING).equals("true")) //override old settings if not updated enableUIMask = "Full"; @@ -149,10 +151,11 @@ public class Forge implements ApplicationListener { if (autoCache) { //increase cacheSize for devices with RAM more than 5GB, default is 400. Some phones have more than 10GB RAM (Mi 10, OnePlus 8, S20, etc..) - if (totalDeviceRAM>5000) //devices with more than 10GB RAM will have 1000 Cache size, 700 Cache size for morethan 5GB RAM - cacheSize = totalDeviceRAM>10000 ? 1000: 700; + if (totalDeviceRAM>5000) //devices with more than 10GB RAM will have 800 Cache size, 600 Cache size for morethan 5GB RAM + cacheSize = totalDeviceRAM>10000 ? 800: 600; } - + //init cache + ImageCache.initCache(cacheSize); final Localizer localizer = Localizer.getInstance(); //load model on background thread (using progress bar to report progress) @@ -471,7 +474,9 @@ public class Forge implements ApplicationListener { } catch (Exception ex) { graphics.end(); - BugReporter.reportException(ex); + //check if sentry is enabled, if not it will call the gui interface but here we end the graphics so we only send it via sentry.. + if (BugReporter.isSentryEnabled()) + BugReporter.reportException(ex); } finally { if(dispose) ImageCache.disposeTexture(); @@ -523,7 +528,9 @@ public class Forge implements ApplicationListener { } catch (Exception ex) { graphics.end(); - BugReporter.reportException(ex); + //check if sentry is enabled, if not it will call the gui interface but here we end the graphics so we only send it via sentry.. + if (BugReporter.isSentryEnabled()) + BugReporter.reportException(ex); } if (showFPS) frameRate.render(); @@ -543,7 +550,9 @@ public class Forge implements ApplicationListener { } catch (Exception ex) { graphics.end(); - BugReporter.reportException(ex); + //check if sentry is enabled, if not it will call the gui interface but here we end the graphics so we only send it via sentry.. + if (BugReporter.isSentryEnabled()) + BugReporter.reportException(ex); } } diff --git a/forge-gui-mobile/src/forge/Graphics.java b/forge-gui-mobile/src/forge/Graphics.java index 63dc73fa840..baae7551b1b 100644 --- a/forge-gui-mobile/src/forge/Graphics.java +++ b/forge-gui-mobile/src/forge/Graphics.java @@ -672,9 +672,12 @@ public class Graphics { batch.draw(image, adjustX(x), adjustY(y, h), w, h); } public void drawImage(TextureRegion image, float x, float y, float w, float h) { - batch.draw(image, adjustX(x), adjustY(y, h), w, h); + if (image != null) + batch.draw(image, adjustX(x), adjustY(y, h), w, h); } public void drawImage(TextureRegion image, TextureRegion glowImageReference, float x, float y, float w, float h, Color glowColor, boolean selected) { + if (image == null || glowImageReference == null) + return; //1st image is the image on top of the shader, 2nd image is for the outline reference for the shader glow... // if the 1st image don't have transparency in the middle (only on the sides, top and bottom, use the 1st image as outline reference... if (!selected) { @@ -698,6 +701,8 @@ public class Graphics { } } public void drawDeckBox(FImage cardArt, float scale, TextureRegion image, TextureRegion glowImageReference, float x, float y, float w, float h, Color glowColor, boolean selected) { + if (image == null || glowImageReference == null) + return; float yBox = y-(h*0.25f); if (!selected) { cardArt.draw(this,x+((w-w*scale)/2), y+((h-h*scale)/3f), w*scale, h*scale/1.85f); @@ -788,6 +793,8 @@ public class Graphics { drawText(text, font, skinColor.getColor(), x, y, w, h, wrap, horzAlignment, centerVertically); } public void drawText(String text, FSkinFont font, Color color, float x, float y, float w, float h, boolean wrap, int horzAlignment, boolean centerVertically) { + if (text == null) + return; if (alphaComposite < 1) { color = FSkinColor.alphaColor(color, color.a * alphaComposite); } diff --git a/forge-gui-mobile/src/forge/assets/FSkin.java b/forge-gui-mobile/src/forge/assets/FSkin.java index 593c5a40a06..c45c1f2af6e 100644 --- a/forge-gui-mobile/src/forge/assets/FSkin.java +++ b/forge-gui-mobile/src/forge/assets/FSkin.java @@ -15,6 +15,7 @@ import forge.Forge; import forge.assets.FSkinImage.SourceFile; import forge.card.CardFaceSymbols; import forge.gui.FThreads; +import forge.gui.GuiBase; import forge.localinstance.properties.ForgeConstants; import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences.FPref; @@ -240,16 +241,24 @@ public class FSkin { //hdbuttons if (f11.exists()) { - Texture t = new Texture(f11, true); - t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); - textures.put(f11.path(), t); - Forge.hdbuttons = true; + if (GuiBase.isAndroid() && Forge.totalDeviceRAM <5000) { + Forge.hdbuttons = false; + } else { + Texture t = new Texture(f11, true); + t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); + textures.put(f11.path(), t); + Forge.hdbuttons = true; + } } else { Forge.hdbuttons = false; } //how to refresh buttons when a theme don't have hd buttons? if (f12.exists()) { - Texture t = new Texture(f12, true); - t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); - textures.put(f12.path(), t); - Forge.hdstart = true; + if (GuiBase.isAndroid() && Forge.totalDeviceRAM <5000) { + Forge.hdstart = false; + } else { + Texture t = new Texture(f12, true); + t.setFilter(Texture.TextureFilter.MipMapLinearLinear, Texture.TextureFilter.Linear); + textures.put(f12.path(), t); + Forge.hdstart = true; + } } else { Forge.hdstart = false; } //update colors for (final FSkinColor.Colors c : FSkinColor.Colors.values()) { @@ -258,7 +267,16 @@ public class FSkin { //load images for (FSkinImage image : FSkinImage.values()) { - image.load(textures, preferredIcons); + if (GuiBase.isAndroid()) { + if (Forge.totalDeviceRAM>5000) + image.load(textures, preferredIcons); + else if (image.toString().equals("HDMULTI")) + image.load(textures, preferredIcons); + else if (!image.toString().startsWith("HD")) + image.load(textures, preferredIcons); + } else { + image.load(textures, preferredIcons); + } } for (FSkinTexture texture : FSkinTexture.values()) { if (texture != FSkinTexture.BG_TEXTURE) { diff --git a/forge-gui-mobile/src/forge/assets/ImageCache.java b/forge-gui-mobile/src/forge/assets/ImageCache.java index 72c0ba5e794..2c2aaab1285 100644 --- a/forge-gui-mobile/src/forge/assets/ImageCache.java +++ b/forge-gui-mobile/src/forge/assets/ImageCache.java @@ -70,21 +70,25 @@ public class ImageCache { // short prefixes to save memory private static final Set missingIconKeys = new HashSet<>(); - private static final LoadingCache cache = CacheBuilder.newBuilder() - .maximumSize(Forge.cacheSize) - .expireAfterAccess(15, TimeUnit.MINUTES) - .removalListener(new RemovalListener() { - @Override - public void onRemoval(RemovalNotification removalNotification) { - if (removalNotification.wasEvicted()) { - if (removalNotification.getValue() != ImageCache.defaultImage) - removalNotification.getValue().dispose(); + private static LoadingCache cache; + public static void initCache(int capacity) { + cache = CacheBuilder.newBuilder() + .maximumSize(capacity) + .expireAfterAccess(15, TimeUnit.MINUTES) + .removalListener(new RemovalListener() { + @Override + public void onRemoval(RemovalNotification removalNotification) { + if (removalNotification.wasEvicted()) { + if (removalNotification.getValue() != ImageCache.defaultImage) + removalNotification.getValue().dispose(); - CardRenderer.clearcardArtCache(); + CardRenderer.clearcardArtCache(); + } } - } - }) - .build(new ImageLoader()); + }) + .build(new ImageLoader()); + System.out.println("Card Texture Cache Size: "+capacity); + } private static final LoadingCache otherCache = CacheBuilder.newBuilder().build(new OtherImageLoader()); public static final Texture defaultImage; public static FImage BlackBorder = FSkinImage.IMG_BORDER_BLACK; diff --git a/forge-gui-mobile/src/forge/card/CardRenderer.java b/forge-gui-mobile/src/forge/card/CardRenderer.java index d60d9d78328..47459ffea87 100644 --- a/forge-gui-mobile/src/forge/card/CardRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardRenderer.java @@ -481,10 +481,8 @@ public class CardRenderer { drawFoilEffect(g, card, x, y, w, h, false); } } else { - if (!Forge.enableUIMask.equals("Off")) //render this if mask is still loading - CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); - else //draw cards without textures as just a black rectangle - g.fillRect(Color.BLACK, x, y, w, h); + //if card has invalid or no texture due to sudden changes in ImageCache, draw CardImageRenderer instead and wait for it to refresh automatically + CardImageRenderer.drawCardImage(g, CardView.getCardForUi(pc), false, x, y, w, h, pos); } } public static void drawCard(Graphics g, CardView card, float x, float y, float w, float h, CardStackPosition pos, boolean rotate) { @@ -545,10 +543,8 @@ public class CardRenderer { } drawFoilEffect(g, card, x, y, w, h, false); } else { - if (!Forge.enableUIMask.equals("Off")) //render this if mask is still loading - CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); - else //draw cards without textures as just a black rectangle - g.fillRect(Color.BLACK, x, y, w, h); + //if card has invalid or no texture due to sudden changes in ImageCache, draw CardImageRenderer instead and wait for it to refresh automatically + CardImageRenderer.drawCardImage(g, card, false, x, y, w, h, pos); } } diff --git a/forge-gui-mobile/src/forge/deck/FDeckEditor.java b/forge-gui-mobile/src/forge/deck/FDeckEditor.java index f90f4105dc8..e6c671f068a 100644 --- a/forge-gui-mobile/src/forge/deck/FDeckEditor.java +++ b/forge-gui-mobile/src/forge/deck/FDeckEditor.java @@ -189,6 +189,7 @@ public class FDeckEditor extends TabPageScreen { private static DeckEditorPage[] getPages(EditorType editorType) { final Localizer localizer = Localizer.getInstance(); + boolean isLandscape = Forge.isLandscapeMode(); switch (editorType) { default: case Constructed: @@ -212,18 +213,28 @@ public class FDeckEditor extends TabPageScreen { case Commander: case TinyLeaders: case Brawl: - return new DeckEditorPage[] { + return isLandscape ? new DeckEditorPage[] { new CatalogPage(ItemManagerConfig.CARD_CATALOG), new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION), new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Sideboard) + } : new DeckEditorPage[] { + new CatalogPage(ItemManagerConfig.CARD_CATALOG), + new DeckSectionPage(DeckSection.Main), + new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION), + new DeckSectionPage(DeckSection.Sideboard) }; case Oathbreaker: - return new DeckEditorPage[] { + return isLandscape ? new DeckEditorPage[] { new CatalogPage(ItemManagerConfig.CARD_CATALOG), new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.OATHBREAKER_SECTION, localizer.getMessage("lblOathbreaker"), FSkinImage.COMMANDER), new DeckSectionPage(DeckSection.Main), new DeckSectionPage(DeckSection.Sideboard) + } : new DeckEditorPage[] { + new CatalogPage(ItemManagerConfig.CARD_CATALOG), + new DeckSectionPage(DeckSection.Main), + new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.OATHBREAKER_SECTION, localizer.getMessage("lblOathbreaker"), FSkinImage.COMMANDER), + new DeckSectionPage(DeckSection.Sideboard) }; case Archenemy: return new DeckEditorPage[] { @@ -242,16 +253,24 @@ public class FDeckEditor extends TabPageScreen { new DeckSectionPage(DeckSection.Sideboard, ItemManagerConfig.QUEST_DECK_EDITOR) }; case QuestCommander: - return new DeckEditorPage[] { + return isLandscape ? new DeckEditorPage[] { new CatalogPage(ItemManagerConfig.QUEST_EDITOR_POOL, localizer.getMessage("lblInventory"), FSkinImage.QUEST_BOX), new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION), new DeckSectionPage(DeckSection.Main, ItemManagerConfig.QUEST_DECK_EDITOR) + } : new DeckEditorPage[] { + new CatalogPage(ItemManagerConfig.QUEST_EDITOR_POOL, localizer.getMessage("lblInventory"), FSkinImage.QUEST_BOX), + new DeckSectionPage(DeckSection.Main, ItemManagerConfig.QUEST_DECK_EDITOR), + new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION) }; case PlanarConquest: - return new DeckEditorPage[] { + return isLandscape ? new DeckEditorPage[] { new CatalogPage(ItemManagerConfig.CONQUEST_COLLECTION, localizer.getMessage("lblCollection"), FSkinImage.SPELLBOOK), new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION), new DeckSectionPage(DeckSection.Main, ItemManagerConfig.CONQUEST_DECK_EDITOR, localizer.getMessage("lblDeck"), Forge.hdbuttons ? FSkinImage.HDLIBRARY : FSkinImage.DECKLIST) + } : new DeckEditorPage[] { + new CatalogPage(ItemManagerConfig.CONQUEST_COLLECTION, localizer.getMessage("lblCollection"), FSkinImage.SPELLBOOK), + new DeckSectionPage(DeckSection.Main, ItemManagerConfig.CONQUEST_DECK_EDITOR, localizer.getMessage("lblDeck"), Forge.hdbuttons ? FSkinImage.HDLIBRARY : FSkinImage.DECKLIST), + new DeckSectionPage(DeckSection.Commander, ItemManagerConfig.COMMANDER_SECTION) }; } } diff --git a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java index 44ad3f5d7b8..305ccd11b6e 100644 --- a/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java +++ b/forge-gui-mobile/src/forge/screens/home/NewGameMenu.java @@ -24,13 +24,13 @@ public class NewGameMenu extends FPopupMenu { final static Localizer localizer = Localizer.getInstance(); public enum NewGameScreen { - Constructed(localizer.getMessage("lblConstructed"), FSkinImage.MENU_CONSTRUCTED, ConstructedScreen.class), - BoosterDraft(localizer.getMessage("lblBoosterDraft"), FSkinImage.MENU_DRAFT, NewDraftScreen.class), - SealedDeck(localizer.getMessage("lblSealedDeck"), FSkinImage.MENU_SEALED, NewSealedScreen.class), - QuestMode(localizer.getMessage("lblQuestMode"), FSkinImage.QUEST_ZEP, NewQuestScreen.class), - PuzzleMode(localizer.getMessage("lblPuzzleMode"), FSkinImage.MENU_PUZZLE, PuzzleScreen.class), - PlanarConquest(localizer.getMessage("lblPlanarConquest"), FSkinImage.MENU_GALAXY, NewConquestScreen.class), - Gauntlet(localizer.getMessage("lblGauntlet"), FSkinImage.MENU_GAUNTLET, NewGauntletScreen.class); + Constructed(localizer.getMessageorUseDefault("lblConstructed", "Constructed"), FSkinImage.MENU_CONSTRUCTED, ConstructedScreen.class), + BoosterDraft(localizer.getMessageorUseDefault("lblBoosterDraft", "Booster Draft"), FSkinImage.MENU_DRAFT, NewDraftScreen.class), + SealedDeck(localizer.getMessageorUseDefault("lblSealedDeck", "Sealed Deck"), FSkinImage.MENU_SEALED, NewSealedScreen.class), + QuestMode(localizer.getMessageorUseDefault("lblQuestMode", "Quest Mode"), FSkinImage.QUEST_ZEP, NewQuestScreen.class), + PuzzleMode(localizer.getMessageorUseDefault("lblPuzzleMode", "Puzzle Mode"), FSkinImage.MENU_PUZZLE, PuzzleScreen.class), + PlanarConquest(localizer.getMessageorUseDefault("lblPlanarConquest", "Planar Conquest"), FSkinImage.MENU_GALAXY, NewConquestScreen.class), + Gauntlet(localizer.getMessageorUseDefault("lblGauntlet", "Gauntlet"), FSkinImage.MENU_GAUNTLET, NewGauntletScreen.class); private final FMenuItem item; private final Class screenClass; @@ -51,7 +51,7 @@ public class NewGameMenu extends FPopupMenu { if (screen == null) { //don't initialize screen until it's opened the first time try { screen = screenClass.newInstance(); - screen.setHeaderCaption(localizer.getMessage("lblNewGame") + " - " + item.getText()); + screen.setHeaderCaption(localizer.getMessageorUseDefault("lblNewGame", "New Game") + " - " + item.getText()); } catch (Exception e) { e.printStackTrace(); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchController.java b/forge-gui-mobile/src/forge/screens/match/MatchController.java index 1527975f80c..0ea00c3c30e 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchController.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchController.java @@ -49,6 +49,7 @@ import forge.model.FModel; import forge.player.PlayerZoneUpdate; import forge.player.PlayerZoneUpdates; import forge.screens.match.views.VAssignCombatDamage; +import forge.screens.match.views.VAssignGenericAmount; import forge.screens.match.views.VPhaseIndicator; import forge.screens.match.views.VPhaseIndicator.PhaseLabel; import forge.screens.match.views.VPlayerPanel; @@ -395,6 +396,18 @@ public class MatchController extends AbstractGuiGame { }.invokeAndWait(); } + @Override + public Map assignGenericAmount(final CardView effectSource, final Map targets, + final int amount, final boolean atLeastOne, final String amountLabel) { + return new WaitCallback>() { + @Override + public void run() { + final VAssignGenericAmount v = new VAssignGenericAmount(effectSource, targets, amount, atLeastOne, amountLabel, this); + v.show(); + } + }.invokeAndWait(); + } + @Override public void updateManaPool(final Iterable manaPoolUpdate) { for (final PlayerView p : manaPoolUpdate) { @@ -474,6 +487,11 @@ public class MatchController extends AbstractGuiGame { //view = null; } + public void resetPlayerPanels() { + if (view != null) + view.forceRevalidate(); + } + private static void actuateMatchPreferences() { final ForgePreferences prefs = FModel.getPreferences(); diff --git a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java index 5ccc95777e1..cb3ff5f9b66 100644 --- a/forge-gui-mobile/src/forge/screens/match/MatchScreen.java +++ b/forge-gui-mobile/src/forge/screens/match/MatchScreen.java @@ -535,6 +535,13 @@ public class MatchScreen extends FScreen { } } + public void forceRevalidate() { + for (VPlayerPanel playerPanel : getPlayerPanels().values()) { + playerPanel.revalidate(true); + + } + } + public void updateZones(final Iterable zonesToUpdate) { for (final PlayerZoneUpdate update : zonesToUpdate) { final PlayerView owner = update.getPlayer(); diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java index c9f5e70a492..484be21b842 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignCombatDamage.java @@ -461,8 +461,10 @@ public class VAssignCombatDamage extends FDialog { } else { lethalDamage = Math.max(0, source.getLethalDamage()); - if (attackerHasDeathtouch) { - lethalDamage = Math.min(lethalDamage, 1); + if (source.getCurrentState().getType().isPlaneswalker()) { + lethalDamage = Integer.valueOf(source.getCurrentState().getLoyalty()); + } else if (attackerHasDeathtouch) { + lethalDamage = Math.min(lethalDamage, 1); } } return lethalDamage; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAssignGenericAmount.java b/forge-gui-mobile/src/forge/screens/match/views/VAssignGenericAmount.java new file mode 100644 index 00000000000..1a17df91966 --- /dev/null +++ b/forge-gui-mobile/src/forge/screens/match/views/VAssignGenericAmount.java @@ -0,0 +1,348 @@ +/* + * Forge: Play Magic: the Gathering. + * Copyright (C) 2011 Forge Team + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ +package forge.screens.match.views; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; + +import com.badlogic.gdx.utils.Align; + +import forge.Forge; +import forge.Graphics; +import forge.assets.FImage; +import forge.assets.FSkinColor; +import forge.assets.FSkinColor.Colors; +import forge.assets.FSkinFont; +import forge.assets.FSkinImage; +import forge.card.CardZoom; +import forge.game.GameEntityView; +import forge.game.card.CardView; +import forge.game.player.PlayerView; +import forge.screens.match.MatchController; +import forge.toolbox.FCardPanel; +import forge.toolbox.FContainer; +import forge.toolbox.FDialog; +import forge.toolbox.FDisplayObject; +import forge.toolbox.FEvent; +import forge.toolbox.FEvent.FEventHandler; +import forge.toolbox.FLabel; +import forge.toolbox.FOptionPane; +import forge.toolbox.FScrollPane; +import forge.util.Callback; +import forge.util.CardTranslation; +import forge.util.Localizer; +import forge.util.TextUtil; +import forge.util.Utils; +import forge.util.WaitCallback; + +public class VAssignGenericAmount extends FDialog { + private static final float CARD_GAP_X = Utils.scale(10); + private static final float ADD_BTN_HEIGHT = Utils.AVG_FINGER_HEIGHT * 0.75f; + + private final Callback> callback; + private final int totalAmountToAssign; + + private final String lblAmount; + private final FLabel lblTotalAmount; + + private final EffectSourcePanel pnlSource; + private final TargetsPanel pnlTargets; + + private final List targetsList = new ArrayList<>(); + private final Map targetsMap = new HashMap<>(); + + /** Constructor. + * + * @param attacker0 {@link forge.game.card.Card} + * @param targets Map, map of GameEntity and its maximum assignable amount + * @param amount Total amount to be assigned + * @param atLeastOne Must assign at least one amount to each target + */ + public VAssignGenericAmount(final CardView effectSource, final Map targets, final int amount, final boolean atLeastOne, final String amountLabel, final WaitCallback> waitCallback) { + super(Localizer.getInstance().getMessage("lbLAssignAmountForEffect", amountLabel, CardTranslation.getTranslatedName(effectSource.getName())) , 2); + + callback = waitCallback; + totalAmountToAssign = amount; + + lblAmount = amountLabel; + lblTotalAmount = add(new FLabel.Builder().text(Localizer.getInstance().getMessage("lblTotalAmountText", lblAmount)).align(Align.center).build()); + + pnlSource = add(new EffectSourcePanel(effectSource)); + pnlTargets = add(new TargetsPanel(targets)); + + initButton(0, Localizer.getInstance().getMessage("lblOK"), new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + finish(); + } + }); + initButton(1, Localizer.getInstance().getMessage("lblReset"), new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + resetAssignedDamage(); + initialAssignAmount(atLeastOne); + } + }); + + initialAssignAmount(atLeastOne); + } + + @Override + protected float layoutAndGetHeight(float width, float maxHeight) { + float padding = FOptionPane.PADDING; + float w = width - 2 * padding; + + float x = padding; + float labelHeight = lblTotalAmount.getAutoSizeBounds().height; + float y = maxHeight - labelHeight + padding; + + float dtOffset = ADD_BTN_HEIGHT + targetsList.get(0).label.getAutoSizeBounds().height; + float cardPanelHeight = (y - dtOffset - labelHeight - 3 * padding) / 2; + float cardPanelWidth = cardPanelHeight / FCardPanel.ASPECT_RATIO; + + y = padding; + pnlSource.setBounds(x + (w - cardPanelWidth) / 2, y, cardPanelWidth, cardPanelHeight); + + y += cardPanelHeight + padding; + lblTotalAmount.setBounds(x, y, w, labelHeight); + + y += labelHeight + padding; + pnlTargets.setBounds(0, y, width, cardPanelHeight + dtOffset); + + return maxHeight; + } + + private class TargetsPanel extends FScrollPane { + private TargetsPanel(final Map targets) { + for (final Map.Entry e : targets.entrySet()) { + addDamageTarget(e.getKey(), e.getValue()); + } + } + + private void addDamageTarget(GameEntityView entity, int max) { + AssignTarget at = add(new AssignTarget(entity, max)); + targetsMap.put(entity, at); + targetsList.add(at); + } + + @Override + protected ScrollBounds layoutAndGetScrollBounds(float visibleWidth, float visibleHeight) { + float cardPanelHeight = visibleHeight - ADD_BTN_HEIGHT - targetsList.get(0).label.getAutoSizeBounds().height; + float width = cardPanelHeight / FCardPanel.ASPECT_RATIO; + float dx = width + CARD_GAP_X; + + float x = (visibleWidth - targetsList.size() * dx + CARD_GAP_X) / 2; + if (x < FOptionPane.PADDING) { + x = FOptionPane.PADDING; + } + + for (AssignTarget at : targetsList) { + at.setBounds(x, 0, width, visibleHeight); + x += dx; + } + return new ScrollBounds(x - CARD_GAP_X + FOptionPane.PADDING, visibleHeight); + } + } + + private class AssignTarget extends FContainer { + private final GameEntityView entity; + private final FDisplayObject obj; + private final FLabel label, btnSubtract, btnAdd; + private final int max; + private int amount; + + public AssignTarget(GameEntityView entity0, int max0) { + entity = entity0; + max = max0; + if (entity instanceof CardView) { + obj = add(new EffectSourcePanel((CardView)entity)); + } + else if (entity instanceof PlayerView) { + PlayerView player = (PlayerView)entity; + obj = add(new MiscTargetPanel(player.getName(), MatchController.getPlayerAvatar(player))); + } + else { + obj = add(new MiscTargetPanel(entity.toString(), FSkinImage.UNKNOWN)); + } + label = add(new FLabel.Builder().text("0").font(FSkinFont.get(18)).align(Align.center).build()); + btnSubtract = add(new FLabel.ButtonBuilder().icon(FSkinImage.MINUS).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + assignAmountTo(entity, false); + } + }).build()); + btnAdd = add(new FLabel.ButtonBuilder().icon(Forge.hdbuttons ? FSkinImage.HDPLUS : FSkinImage.PLUS).command(new FEventHandler() { + @Override + public void handleEvent(FEvent e) { + assignAmountTo(entity, true); + } + }).build()); + } + + @Override + protected void doLayout(float width, float height) { + float y = 0; + obj.setBounds(0, y, width, FCardPanel.ASPECT_RATIO * width); + y += obj.getHeight(); + + label.setBounds(0, y, width, label.getAutoSizeBounds().height); + y += label.getHeight(); + + float buttonSize = (width - FOptionPane.PADDING) / 2; + btnSubtract.setBounds(0, y, buttonSize, ADD_BTN_HEIGHT); + btnAdd.setBounds(width - buttonSize, y, buttonSize, ADD_BTN_HEIGHT); + } + } + + private static class EffectSourcePanel extends FCardPanel { + private EffectSourcePanel(CardView card) { + super(card); + } + + @Override + public boolean tap(float x, float y, int count) { + CardZoom.show(getCard()); + return true; + } + + @Override + public boolean longPress(float x, float y) { + CardZoom.show(getCard()); + return true; + } + + @Override + protected float getPadding() { + return 0; + } + } + + private static class MiscTargetPanel extends FDisplayObject { + private static final FSkinFont FONT = FSkinFont.get(18); + private static final FSkinColor FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); + private final String name; + private final FImage image; + + private MiscTargetPanel(String name0, FImage image0) { + name = name0; + image = image0; + } + + @Override + public void draw(Graphics g) { + float w = getWidth(); + float h = getHeight(); + g.drawImage(image, 0, 0, w, w); + g.drawText(name, FONT, FORE_COLOR, 0, w, w, h - w, false, Align.center, true); + } + } + + private void assignAmountTo(GameEntityView source, boolean isAdding) { + AssignTarget at = targetsMap.get(source); + int assigned = at.amount; + int leftToAssign = Math.max(0, at.max - assigned); + int amountToAdd = isAdding ? 1 : -1; + int remainingAmount = Math.min(getRemainingAmount(), leftToAssign); + + if (amountToAdd > remainingAmount) { + amountToAdd = remainingAmount; + } + + if (0 == amountToAdd || amountToAdd + assigned < 0) { + return; + } + + addAssignedAmount(at, amountToAdd); + updateLabels(); + } + + private void initialAssignAmount(boolean atLeastOne) { + if (!atLeastOne) { + updateLabels(); + return; + } + + for(AssignTarget at : targetsList) { + addAssignedAmount(at, 1); + } + updateLabels(); + } + + private void resetAssignedDamage() { + for (AssignTarget at : targetsList) { + at.amount = 0; + } + } + + private void addAssignedAmount(final AssignTarget at, int addedAmount) { + // If we don't have enough left or we're trying to unassign too much return + int canAssign = getRemainingAmount(); + if (canAssign < addedAmount) { + addedAmount = canAssign; + } + + at.amount = Math.max(0, addedAmount + at.amount); + } + + private int getRemainingAmount() { + int spent = 0; + for (AssignTarget at : targetsList) { + spent += at.amount; + } + return totalAmountToAssign - spent; + } + + /** Updates labels and other UI elements.*/ + private void updateLabels() { + int amountLeft = totalAmountToAssign; + + for (AssignTarget at : targetsList) { + amountLeft -= at.amount; + StringBuilder sb = new StringBuilder(); + sb.append(at.amount); + if (at.max - at.amount == 0) { + sb.append(" (").append(Localizer.getInstance().getMessage("lblMax")).append(")"); + } + at.label.setText(sb.toString()); + } + + lblTotalAmount.setText(TextUtil.concatNoSpace(Localizer.getInstance().getMessage("lblAvailableAmount", lblAmount) + ": ", + String.valueOf(amountLeft), " (of ", String.valueOf(totalAmountToAssign), ")")); + setButtonEnabled(0, amountLeft == 0); + } + + // Dumps damage onto cards. Damage must be stored first, because if it is + // assigned dynamically, the cards die off and further damage to them can't + // be modified. + private void finish() { + if (getRemainingAmount() > 0) { + return; + } + hide(); + callback.run(getAssignedMap()); + } + + public Map getAssignedMap() { + Map result = new HashMap<>(targetsList.size()); + for (AssignTarget at : targetsList) + result.put(at.entity, at.amount); + return result; + } +} diff --git a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java index 4c28fcd56c8..89aaecc5c91 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VAvatar.java @@ -70,7 +70,7 @@ public class VAvatar extends FDisplayObject { float h = getHeight(); g.drawImage(image, 0, 0, w, h); - if (Forge.altPlayerLayout && Forge.isLandscapeMode()) + if (Forge.altPlayerLayout && !Forge.altZoneTabs && Forge.isLandscapeMode()) return; //display XP in lower right corner of avatar diff --git a/forge-gui-mobile/src/forge/screens/match/views/VField.java b/forge-gui-mobile/src/forge/screens/match/views/VField.java index b1c20e3d80f..615afc93982 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VField.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VField.java @@ -15,6 +15,7 @@ public class VField extends FContainer { private final FieldRow row1, row2; private boolean flipped; private float commandZoneWidth; + private float fieldModifier; public VField(PlayerView player0) { player = player0; @@ -162,6 +163,10 @@ public class VField extends FContainer { commandZoneWidth = commandZoneWidth0; } + void setFieldModifier(float fieldModifierWidth) { + fieldModifier = fieldModifierWidth; + } + @Override public void clear() { row1.clear(); //clear rows instead of removing the rows @@ -180,8 +185,8 @@ public class VField extends FContainer { y1 = 0; y2 = cardSize; } - row1.setBounds(0, y1, width, cardSize); - row2.setBounds(0, y2, width - commandZoneWidth, cardSize); + row1.setBounds(0, y1, width-fieldModifier, cardSize); + row2.setBounds(0, y2, (width - commandZoneWidth)-fieldModifier, cardSize); } public class FieldRow extends VCardDisplayArea { diff --git a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java index b163fc6e91e..645f7598c83 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VPlayerPanel.java @@ -30,6 +30,7 @@ import forge.util.Utils; public class VPlayerPanel extends FContainer { private static final FSkinFont LIFE_FONT = FSkinFont.get(18); + private static final FSkinFont LIFE_FONT_ALT = FSkinFont.get(22); private static final FSkinFont INFO_FONT = FSkinFont.get(12); private static final FSkinFont INFO2_FONT = FSkinFont.get(14); private static final FSkinColor INFO_FORE_COLOR = FSkinColor.get(Colors.CLR_TEXT); @@ -116,6 +117,18 @@ public class VPlayerPanel extends FContainer { return null; } + private boolean isAltZoneDisplay(InfoTab tab) { + if (tab.getIcon() == FSkinImage.HDHAND || tab.getIcon() == FSkinImage.HAND) + return true; + if (tab.getIcon() == FSkinImage.HDGRAVEYARD || tab.getIcon() == FSkinImage.GRAVEYARD) + return true; + if (tab.getIcon() == FSkinImage.HDLIBRARY || tab.getIcon() == FSkinImage.LIBRARY) + return true; + if (tab.getIcon() == FSkinImage.HDEXILE || tab.getIcon() == FSkinImage.EXILE) + return true; + return false; + } + public void setSelectedZone(ZoneType zoneType) { setSelectedTab(zoneTabs.get(zoneType)); } @@ -281,33 +294,51 @@ public class VPlayerPanel extends FContainer { child.setTop(height - child.getBottom()); } } + + //this is used for landscape so set this to 0 + field.setFieldModifier(0); } private void doLandscapeLayout(float width, float height) { float x = 0; float y = 0; + float yAlt = 0; + float avatarWidth = Forge.altZoneTabs ? avatar.getWidth() : 0; avatar.setPosition(x, y); y += avatar.getHeight(); - lblLife.setBounds(x, Forge.altPlayerLayout ? 0 : y, avatar.getWidth(), Forge.altPlayerLayout ? INFO_FONT.getLineHeight() : LIFE_FONT.getLineHeight()); - if (Forge.altPlayerLayout) { + lblLife.setBounds(x, (Forge.altPlayerLayout && !Forge.altZoneTabs) ? 0 : y, avatar.getWidth(), (Forge.altPlayerLayout && !Forge.altZoneTabs) ? INFO_FONT.getLineHeight() : Forge.altZoneTabs ? LIFE_FONT_ALT.getLineHeight() : LIFE_FONT.getLineHeight()); + if (Forge.altPlayerLayout && !Forge.altZoneTabs) { if (adjustHeight > 2) y += INFO_FONT.getLineHeight()/2; } else y += lblLife.getHeight(); float infoTabWidth = avatar.getWidth(); - float infoTabHeight = (height - y) / tabs.size(); + int tabSize = !Forge.altZoneTabs ? tabs.size() : tabs.size() - 4; + float infoTabHeight = (height - y) / tabSize; + float infoTabHeightAlt = (height - yAlt) / 4; + for (InfoTab tab : tabs) { - tab.setBounds(x, y, infoTabWidth, infoTabHeight); - y += infoTabHeight; + if (!Forge.altZoneTabs) { + tab.setBounds(x, y, infoTabWidth, infoTabHeight); + y += infoTabHeight; + } else { + if (!isAltZoneDisplay(tab)) { + tab.setBounds(x, y, infoTabWidth, infoTabHeight); + y += infoTabHeight; + } else { + tab.setBounds(x+width-avatarWidth, yAlt, avatarWidth, infoTabHeightAlt); + yAlt += infoTabHeightAlt; + } + } } x = avatar.getRight(); phaseIndicator.resetFont(); phaseIndicator.setBounds(x, 0, avatar.getWidth() * 0.6f, height); x += phaseIndicator.getWidth(); - float fieldWidth = width - x; + float fieldWidth = width - x - avatarWidth; float displayAreaWidth = height / FCardPanel.ASPECT_RATIO; if (selectedTab != null) { fieldWidth -= displayAreaWidth; @@ -331,10 +362,15 @@ public class VPlayerPanel extends FContainer { field.setBounds(x, 0, fieldWidth, height); - x = width - displayAreaWidth; + x = width - displayAreaWidth-avatarWidth; for (InfoTab tab : tabs) { tab.displayArea.setBounds(x, 0, displayAreaWidth, height); } + + if (!Forge.altZoneTabs) + field.setFieldModifier(0); + else + field.setFieldModifier(avatarWidth); } @Override @@ -419,7 +455,7 @@ public class VPlayerPanel extends FContainer { public void draw(Graphics g) { adjustHeight = 1; float divider = Gdx.app.getGraphics().getHeight() > 900 ? 1.2f : 2f; - if(Forge.altPlayerLayout && Forge.isLandscapeMode()) { + if(Forge.altPlayerLayout && !Forge.altZoneTabs && Forge.isLandscapeMode()) { if (poisonCounters == 0 && energyCounters == 0 && experienceCounters == 0) { g.fillRect(Color.DARK_GRAY, 0, 0, INFO2_FONT.getBounds(lifeStr).width+1, INFO2_FONT.getBounds(lifeStr).height+1); g.drawText(lifeStr, INFO2_FONT, INFO_FORE_COLOR.getColor(), 0, 0, getWidth(), getHeight(), false, Align.left, false); @@ -453,7 +489,7 @@ public class VPlayerPanel extends FContainer { } } else { if (poisonCounters == 0 && energyCounters == 0) { - g.drawText(lifeStr, LIFE_FONT, INFO_FORE_COLOR, 0, 0, getWidth(), getHeight(), false, Align.center, true); + g.drawText(lifeStr, Forge.altZoneTabs ? LIFE_FONT_ALT : LIFE_FONT, INFO_FORE_COLOR, 0, 0, getWidth(), getHeight(), false, Align.center, true); } else { float halfHeight = getHeight() / 2; float textStart = halfHeight + Utils.scale(1); diff --git a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java index 4ba9c371c7d..b793bcd794d 100644 --- a/forge-gui-mobile/src/forge/screens/settings/FilesPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/FilesPage.java @@ -5,6 +5,7 @@ import java.util.List; import java.util.Map; import java.util.TreeMap; +import forge.gui.GuiBase; import org.apache.commons.lang3.StringUtils; import com.badlogic.gdx.utils.Align; @@ -133,26 +134,28 @@ public class FilesPage extends TabPage { ForgeProfileProperties.setDecksDir(newDir); } }; - lstItems.addItem(new StorageOption(localizer.getMessage("lblDataLocation"), ForgeProfileProperties.getUserDir()) { - @Override - protected void onDirectoryChanged(String newDir) { - ForgeProfileProperties.setUserDir(newDir); + if (!GuiBase.isUsingAppDirectory()) { + lstItems.addItem(new StorageOption(localizer.getMessage("lblDataLocation"), ForgeProfileProperties.getUserDir()) { + @Override + protected void onDirectoryChanged(String newDir) { + ForgeProfileProperties.setUserDir(newDir); - //ensure decks option is updated if needed - decksOption.updateDir(ForgeProfileProperties.getDecksDir()); - } - }, 1); - lstItems.addItem(new StorageOption(localizer.getMessage("lblImageCacheLocation"), ForgeProfileProperties.getCacheDir()) { - @Override - protected void onDirectoryChanged(String newDir) { - ForgeProfileProperties.setCacheDir(newDir); + //ensure decks option is updated if needed + decksOption.updateDir(ForgeProfileProperties.getDecksDir()); + } + }, 1); + lstItems.addItem(new StorageOption(localizer.getMessage("lblImageCacheLocation"), ForgeProfileProperties.getCacheDir()) { + @Override + protected void onDirectoryChanged(String newDir) { + ForgeProfileProperties.setCacheDir(newDir); - //ensure card pics option is updated if needed - cardPicsOption.updateDir(ForgeProfileProperties.getCardPicsDir()); - } - }, 1); - lstItems.addItem(cardPicsOption, 1); - lstItems.addItem(decksOption, 1); + //ensure card pics option is updated if needed + cardPicsOption.updateDir(ForgeProfileProperties.getCardPicsDir()); + } + }, 1); + lstItems.addItem(cardPicsOption, 1); + lstItems.addItem(decksOption, 1); + } } @Override diff --git a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java index aca80adfa27..d84ae32baf9 100644 --- a/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java +++ b/forge-gui-mobile/src/forge/screens/settings/SettingsPage.java @@ -27,6 +27,7 @@ import forge.screens.FScreen; import forge.screens.TabPageScreen; import forge.screens.TabPageScreen.TabPage; import forge.screens.home.HomeScreen; +import forge.screens.match.MatchController; import forge.sound.SoundSystem; import forge.toolbox.FCheckBox; import forge.toolbox.FGroupList; @@ -248,8 +249,22 @@ public class SettingsPage extends TabPage { super.select(); //update Forge.altPlayerLayout = FModel.getPreferences().getPrefBoolean(FPref.UI_ALT_PLAYERINFOLAYOUT); + if (MatchController.instance != null) + MatchController.instance.resetPlayerPanels(); } },1); + lstSettings.addItem(new BooleanSetting(FPref.UI_ALT_PLAYERZONETABS, + localizer.getMessage("lblAltZoneTabs"), + localizer.getMessage("nlAltZoneTabs")){ + @Override + public void select() { + super.select(); + //update + Forge.altZoneTabs = FModel.getPreferences().getPrefBoolean(FPref.UI_ALT_PLAYERZONETABS); + if (MatchController.instance != null) + MatchController.instance.resetPlayerPanels(); + } + },1); //Random Deck Generation lstSettings.addItem(new BooleanSetting(FPref.DECKGEN_NOSMALL, diff --git a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java index 5787180555e..47d8edfd6d4 100644 --- a/forge-gui-mobile/src/forge/toolbox/FChoiceList.java +++ b/forge-gui-mobile/src/forge/toolbox/FChoiceList.java @@ -4,6 +4,7 @@ import static forge.card.CardRenderer.MANA_SYMBOL_SIZE; import java.util.ArrayList; import java.util.Collections; +import java.util.EnumSet; import java.util.List; import com.badlogic.gdx.utils.Align; @@ -24,6 +25,7 @@ import forge.card.mana.ManaCostParser; import forge.game.card.CardView; import forge.game.card.IHasCardView; import forge.game.player.PlayerView; +import forge.game.zone.ZoneType; import forge.item.InventoryItem; import forge.item.PaperCard; import forge.itemmanager.AdvancedSearch.FilterOperator; @@ -386,6 +388,8 @@ public class FChoiceList extends FList implements ActivateHandler { } //simple check for cardview needed on some special renderer for cards private boolean showAlternate(CardView cardView, String value){ + if(cardView == null) + return false; boolean showAlt = false; if(cardView.hasAlternateState()){ if(cardView.hasBackSide()) @@ -515,7 +519,8 @@ public class FChoiceList extends FList implements ActivateHandler { @Override public void drawValue(Graphics g, T value, FSkinFont font, FSkinColor foreColor, boolean pressed, float x, float y, float w, float h) { - CardView cv = ((IHasCardView)value).getCardView(); + //should fix NPE ie Thief of Sanity, Gonti... etc + CardView cv = ((IHasCardView)value).getCardView().isFaceDown() && ((IHasCardView)value).getCardView().isInZone(EnumSet.of(ZoneType.Exile)) ? ((IHasCardView)value).getCardView().getBackup() : ((IHasCardView)value).getCardView(); boolean showAlternate = showAlternate(cv, value.toString()); CardRenderer.drawCardWithOverlays(g, cv, x, y, VStack.CARD_WIDTH, VStack.CARD_HEIGHT, CardStackPosition.Top, false, showAlternate, true); diff --git a/forge-gui-mobile/src/forge/toolbox/FContainer.java b/forge-gui-mobile/src/forge/toolbox/FContainer.java index 838a7414dba..bb0f248c431 100644 --- a/forge-gui-mobile/src/forge/toolbox/FContainer.java +++ b/forge-gui-mobile/src/forge/toolbox/FContainer.java @@ -101,6 +101,13 @@ public abstract class FContainer extends FDisplayObject { } public void revalidate() { + revalidate(false); + } + public void revalidate(boolean forced) { + if (forced) { + doLayout(getWidth(), getHeight()); + return; + } float w = getWidth(); float h = getHeight(); if (w == 0 || h == 0) { return; } //don't revalidate if size not set yet diff --git a/forge-gui/res/blockdata/blocks.txt b/forge-gui/res/blockdata/blocks.txt index d4635e51a4e..cdbf25e1ccc 100644 --- a/forge-gui/res/blockdata/blocks.txt +++ b/forge-gui/res/blockdata/blocks.txt @@ -96,3 +96,4 @@ Kaladesh Remastered, 3/6/KLR, KLR Kaldheim, 3/6/KHM, KHM Time Spiral Remastered, 3/6/KHM, TSR Strixhaven: School of Mages, 3/6/STX, STX +Modern Horizons 2, 3/6/MH2, MH2 diff --git a/forge-gui/res/cardsfolder/a/abominable_treefolk.txt b/forge-gui/res/cardsfolder/a/abominable_treefolk.txt index f06d2ff1e33..e53bff2710c 100644 --- a/forge-gui/res/cardsfolder/a/abominable_treefolk.txt +++ b/forge-gui/res/cardsfolder/a/abominable_treefolk.txt @@ -9,6 +9,6 @@ SVar:BuffedBy:Permanent.Snow SVar:NoZeroToughnessAI:True T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE Oracle:Trample\nAbominable Treefolk's power and toughness are each equal to the number of snow permanents you control.\nWhen Abominable Treefolk enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/abundant_harvest.txt b/forge-gui/res/cardsfolder/a/abundant_harvest.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/abundant_harvest.txt rename to forge-gui/res/cardsfolder/a/abundant_harvest.txt diff --git a/forge-gui/res/cardsfolder/upcoming/academic_dispute.txt b/forge-gui/res/cardsfolder/a/academic_dispute.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/academic_dispute.txt rename to forge-gui/res/cardsfolder/a/academic_dispute.txt diff --git a/forge-gui/res/cardsfolder/upcoming/academic_probation.txt b/forge-gui/res/cardsfolder/a/academic_probation.txt similarity index 82% rename from forge-gui/res/cardsfolder/upcoming/academic_probation.txt rename to forge-gui/res/cardsfolder/a/academic_probation.txt index adbbab038b0..6522bd58b40 100644 --- a/forge-gui/res/cardsfolder/upcoming/academic_probation.txt +++ b/forge-gui/res/cardsfolder/a/academic_probation.txt @@ -5,5 +5,5 @@ A:SP$ Charm | Cost$ 1 W | Choices$ DBNameCard,DBPump SVar:DBNameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SubAbility$ DBEffect | SpellDescription$ Choose a nonland card name. Until your next turn, your opponents can't cast spells with the chosen name. SVar:DBEffect:DB$ Effect | StaticAbilities$ CantCast | Duration$ UntilYourNextTurn SVar:CantCast:Mode$ CantBeCast | ValidCard$ Card.nonLand+NamedCard | Caster$ Opponent | EffectZone$ Command | Description$ Your opponents can't cast spells with the chosen name. -SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand | TgtPrompt$ Choose target nonland permanent | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | AILogic$ DetainNonLand | SpellDescription$ Choose target nonland permanent. Until your next turn, it can't attack or block, and its activated abilities can't be activated. +SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand | TgtPrompt$ Choose target nonland permanent | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | AILogic$ DetainNonLand | SpellDescription$ Choose target nonland permanent. Until your next turn, it can't attack or block, and its activated abilities can't be activated. Oracle:Choose one —\n• Choose a nonland card name. Opponents can't cast spells with the chosen name until your next turn.\n• Choose target nonland permanent. Until your next turn, it can't attack or block, and its activated abilities can't be activated. diff --git a/forge-gui/res/cardsfolder/upcoming/access_tunnel.txt b/forge-gui/res/cardsfolder/a/access_tunnel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/access_tunnel.txt rename to forge-gui/res/cardsfolder/a/access_tunnel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/accomplished_alchemist.txt b/forge-gui/res/cardsfolder/a/accomplished_alchemist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/accomplished_alchemist.txt rename to forge-gui/res/cardsfolder/a/accomplished_alchemist.txt diff --git a/forge-gui/res/cardsfolder/a/ach_hans_run.txt b/forge-gui/res/cardsfolder/a/ach_hans_run.txt index 1122f6a0138..3986fab4acf 100644 --- a/forge-gui/res/cardsfolder/a/ach_hans_run.txt +++ b/forge-gui/res/cardsfolder/a/ach_hans_run.txt @@ -4,6 +4,6 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigAch | TriggerDescription$ At the beginning of your upkeep, you may say "Ach! Hans, run! It's the ..." and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle your library. That creature gains haste. Exile it at the beginning of the next end step. SVar:TrigAch:DB$ NameCard | Defined$ You | ValidCards$ Card.Creature | ValidDesc$ creature | SubAbility$ DBSearch | SpellDescription$ You may say “Ach! Hans, run! It's the ..." and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle your library. That creature gains haste. Exile it at the beginning of the next end step. SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.NamedCard | RememberChanged$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Keywords$ Haste | Permanent$ True | AtEOT$ Exile | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Duration$ Permanent | AtEOT$ Exile | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:At the beginning of your upkeep, you may say "Ach! Hans, run! It's the . . ." and the name of a creature card. If you do, search your library for a card with that name, put it onto the battlefield, then shuffle. That creature gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt b/forge-gui/res/cardsfolder/a/adrix_and_nev_twincasters.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/adrix_and_nev_twincasters.txt rename to forge-gui/res/cardsfolder/a/adrix_and_nev_twincasters.txt diff --git a/forge-gui/res/cardsfolder/a/adverse_conditions.txt b/forge-gui/res/cardsfolder/a/adverse_conditions.txt index f1f3949be55..ddcf99382da 100644 --- a/forge-gui/res/cardsfolder/a/adverse_conditions.txt +++ b/forge-gui/res/cardsfolder/a/adverse_conditions.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Instant K:Devoid A:SP$ Tap | Cost$ 3 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBToken | SpellDescription$ Those creatures don't untap during their controller's next untap step. +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBToken | SpellDescription$ Those creatures don't untap during their controller's next untap step. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_eldrazi_scion_sac | TokenOwner$ You | LegacyImage$ c 1 1 eldrazi scion sac bfz | SpellDescription$ Create a 1/1 colorless Eldrazi Scion creature token. It has "Sacrifice this creature: Add {C}." DeckHints:Type$Eldrazi DeckHas:Ability$Mana.Colorless & Ability$Token diff --git a/forge-gui/res/cardsfolder/a/aegis_angel.txt b/forge-gui/res/cardsfolder/a/aegis_angel.txt index e0d2638a632..bc5fb41f116 100644 --- a/forge-gui/res/cardsfolder/a/aegis_angel.txt +++ b/forge-gui/res/cardsfolder/a/aegis_angel.txt @@ -4,7 +4,7 @@ Types:Creature Angel PT:5/5 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, another target permanent gains indestructible for as long as you control CARDNAME. -SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent | KW$ Indestructible | UntilLoseControlOfHost$ True +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.Other | TgtPrompt$ Select another target permanent | KW$ Indestructible | Duration$ UntilLoseControlOfHost SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/aegis_angel.jpg Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhen Aegis Angel enters the battlefield, another target permanent gains indestructible for as long as you control Aegis Angel. (Effects that say "destroy" don't destroy it. A creature with indestructible can't be destroyed by damage.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/aether_helix.txt b/forge-gui/res/cardsfolder/a/aether_helix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/aether_helix.txt rename to forge-gui/res/cardsfolder/a/aether_helix.txt diff --git a/forge-gui/res/cardsfolder/a/aethermages_touch.txt b/forge-gui/res/cardsfolder/a/aethermages_touch.txt index 19597d01fbd..10383b3b582 100644 --- a/forge-gui/res/cardsfolder/a/aethermages_touch.txt +++ b/forge-gui/res/cardsfolder/a/aethermages_touch.txt @@ -2,7 +2,7 @@ Name:Aethermage's Touch ManaCost:2 W U Types:Instant A:SP$ Dig | Cost$ 2 W U | DigNum$ 4 | Reveal$ True | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | DestinationZone$ Battlefield | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Reveal the top four cards of your library. You may put a creature card from among them onto the battlefield. It gains "At the beginning of your end step, return this creature to its owner's hand." Then put the rest of the cards revealed this way on the bottom of your library in any order. | StackDescription$ SpellDescription -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Permanent$ True | Triggers$ TrigAethermage | sVars$ BounceAethermage | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Duration$ Permanent | Triggers$ TrigAethermage | sVars$ BounceAethermage | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigAethermage:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ BounceAethermage | TriggerDescription$ At the beginning of your end step, return CARDNAME to its owner's hand. SVar:BounceAethermage:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Hand diff --git a/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt b/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt index aa522ff80b1..d8399db2319 100644 --- a/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt +++ b/forge-gui/res/cardsfolder/a/agadeems_awakening_agadeem_the_undercrypt.txt @@ -14,6 +14,6 @@ Name:Agadeem, the Undercrypt ManaCost:no cost Types:Land K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. Oracle:As Agadeem, the Undercrypt enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped.\n{T}: Add {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/ageless_guardian.txt b/forge-gui/res/cardsfolder/a/ageless_guardian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ageless_guardian.txt rename to forge-gui/res/cardsfolder/a/ageless_guardian.txt diff --git a/forge-gui/res/cardsfolder/a/ageless_sentinels.txt b/forge-gui/res/cardsfolder/a/ageless_sentinels.txt index 0a5f8bf39ed..18d54612f8a 100644 --- a/forge-gui/res/cardsfolder/a/ageless_sentinels.txt +++ b/forge-gui/res/cardsfolder/a/ageless_sentinels.txt @@ -5,6 +5,6 @@ PT:4/4 K:Flying K:Defender T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ Animate | TriggerDescription$ When CARDNAME blocks, it becomes a Bird Giant, and it loses defender. -SVar:Animate:DB$ Animate | Defined$ TriggeredBlocker | Types$ Bird,Giant | RemoveCreatureTypes$ True | RemoveKeywords$ Defender | Permanent$ True +SVar:Animate:DB$ Animate | Defined$ TriggeredBlocker | Types$ Bird,Giant | RemoveCreatureTypes$ True | RemoveKeywords$ Defender | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/ageless_sentinels.jpg Oracle:Defender (This creature can't attack.)\nFlying\nWhen Ageless Sentinels blocks, it becomes a Bird Giant, and it loses defender. (It's no longer a Wall. This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/a/air_bladder.txt b/forge-gui/res/cardsfolder/a/air_bladder.txt index 6865f68c6d0..0477e8ac4bc 100644 --- a/forge-gui/res/cardsfolder/a/air_bladder.txt +++ b/forge-gui/res/cardsfolder/a/air_bladder.txt @@ -3,6 +3,6 @@ ManaCost:U Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | AddHiddenKeyword$ CARDNAME can block only creatures with flying. | Description$ Enchanted creature has flying and can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/air_bladder.jpg +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.EnchantedBy | Description$ Enchanted creature can block only creatures with flying. Oracle:Enchant creature\nEnchanted creature has flying.\nEnchanted creature can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/a/aisling_leprechaun.txt b/forge-gui/res/cardsfolder/a/aisling_leprechaun.txt index dd4f67d4384..3620aa73862 100644 --- a/forge-gui/res/cardsfolder/a/aisling_leprechaun.txt +++ b/forge-gui/res/cardsfolder/a/aisling_leprechaun.txt @@ -4,7 +4,7 @@ Types:Creature Faerie PT:1/1 T:Mode$ AttackerBlockedByCreature | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigAnimateAttacker | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature becomes green. (This effect lasts indefinitely.) T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigAnimateBlocker | Secondary$ True | TriggerDescription$ Whenever CARDNAME blocks or becomes blocked by a creature, that creature becomes green. (This effect lasts indefinitely.) -SVar:TrigAnimateAttacker:DB$Animate | Defined$ TriggeredAttacker | Colors$ Green | OverwriteColors$ True | Permanent$ True -SVar:TrigAnimateBlocker:DB$Animate | Defined$ TriggeredBlocker | Colors$ Green | OverwriteColors$ True | Permanent$ True +SVar:TrigAnimateAttacker:DB$Animate | Defined$ TriggeredAttacker | Colors$ Green | OverwriteColors$ True | Duration$ Permanent +SVar:TrigAnimateBlocker:DB$Animate | Defined$ TriggeredBlocker | Colors$ Green | OverwriteColors$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/aisling_leprechaun.jpg Oracle:Whenever Aisling Leprechaun blocks or becomes blocked by a creature, that creature becomes green. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/a/ajani_steadfast.txt b/forge-gui/res/cardsfolder/a/ajani_steadfast.txt index 1d2d0d3bba8..1b405319049 100644 --- a/forge-gui/res/cardsfolder/a/ajani_steadfast.txt +++ b/forge-gui/res/cardsfolder/a/ajani_steadfast.txt @@ -7,6 +7,6 @@ A:AB$ PutCounterAll | Cost$ SubCounter<2/LOYALTY> | ValidCards$ Creature.YouCtrl SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Planeswalker.YouCtrl+Other | CounterType$ LOYALTY | CounterNum$ 1 A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Ajani Steadfast | Image$ emblem_ajani_steadfast | ReplacementEffects$ RPreventDamage | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage." SVar:RPreventDamage:Event$ DamageDone | ValidTarget$ You,Planeswalker.YouCtrl | ReplaceWith$ PreventDmg | PreventionEffect$ True | Description$ If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage. -SVar:PreventDmg:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/ajani_steadfast.jpg +SVar:PreventDmg:DB$ ReplaceDamage | Amount$ ShieldAmount +SVar:ShieldAmount:ReplaceCount$DamageAmount/Minus.1 Oracle:[+1]: Until end of turn, up to one target creature gets +1/+1 and gains first strike, vigilance, and lifelink.\n[−2]: Put a +1/+1 counter on each creature you control and a loyalty counter on each other planeswalker you control.\n[−7]: You get an emblem with "If a source would deal damage to you or a planeswalker you control, prevent all but 1 of that damage." diff --git a/forge-gui/res/cardsfolder/a/ajani_vengeant.txt b/forge-gui/res/cardsfolder/a/ajani_vengeant.txt index b8e9a30a205..ac4bf5f1873 100644 --- a/forge-gui/res/cardsfolder/a/ajani_vengeant.txt +++ b/forge-gui/res/cardsfolder/a/ajani_vengeant.txt @@ -2,7 +2,7 @@ Name:Ajani Vengeant ManaCost:2 R W Types:Legendary Planeswalker Ajani Loyalty:3 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | ValidTgts$ Permanent | Permanent$ True | IsCurse$ True | SpellDescription$ Target permanent doesn't untap during its controller's next untap step. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | ValidTgts$ Permanent | Duration$ Permanent | IsCurse$ True | SpellDescription$ Target permanent doesn't untap during its controller's next untap step. A:AB$ DealDamage | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 3 damage to any target and you gain 3 life. SVar:DBGainLife:DB$GainLife | LifeAmount$ 3 A:AB$ DestroyAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Land | SpellDescription$ Destroy all lands target player controls. diff --git a/forge-gui/res/cardsfolder/a/ajanis_aid.txt b/forge-gui/res/cardsfolder/a/ajanis_aid.txt index 4fd2876301e..afbb53f0358 100644 --- a/forge-gui/res/cardsfolder/a/ajanis_aid.txt +++ b/forge-gui/res/cardsfolder/a/ajanis_aid.txt @@ -3,9 +3,9 @@ ManaCost:2 G W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Hand | ChangeType$ Card.namedAjani; Valiant Protector | ChangeNum$ 1 | Optional$ True -A:AB$ ChooseCard | Cost$ Sac<1/CARDNAME> | Choices$ Creature | AILogic$ NeedsPrevention | SubAbility$ DBEffect | RememberChosen$ True | SpellDescription$ Prevent all combat damage a creature of your choice would deal this turn. +A:AB$ ChooseCard | Cost$ Sac<1/CARDNAME> | Choices$ Creature | Mandatory$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | RememberChosen$ True | SpellDescription$ Prevent all combat damage a creature of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | IsCombat$ True | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all combat damage a creature of your choice would deal this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | IsCombat$ True | ValidSource$ Card.IsRemembered | Prevent$ True | Description$ Prevent all combat damage a creature of your choice would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHints:Name$Ajani, Valiant Protector Oracle:When Ajani's Aid enters the battlefield, you may search your library and/or graveyard for a card named Ajani, Valiant Protector, reveal it, and put it into your hand. If you search your library this way, shuffle.\nSacrifice Ajani's Aid: Prevent all combat damage a creature of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/a/akroma_angel_of_wrath_avatar.txt b/forge-gui/res/cardsfolder/a/akroma_angel_of_wrath_avatar.txt index 34084f83682..9b6ea0d0be8 100644 --- a/forge-gui/res/cardsfolder/a/akroma_angel_of_wrath_avatar.txt +++ b/forge-gui/res/cardsfolder/a/akroma_angel_of_wrath_avatar.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Vanguard HandLifeModifier:+1/+7 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Command | ValidCard$ Creature.YouCtrl | Execute$ PumpRandom | TriggerDescription$ Whenever a creature enters the battlefield under your control, it gains two abilities chosen at random from flying, first strike, trample, haste, protection from black, protection from red, and vigilance. -SVar:PumpRandom:DB$ Pump | Defined$ TriggeredCard | Permanent$ True | KW$ Flying & First Strike & Trample & Haste & Protection from black & Protection from red & Vigilance | RandomKeyword$ True | RandomKWNum$ 2 +SVar:PumpRandom:DB$ Pump | Defined$ TriggeredCard | Duration$ Permanent | KW$ Flying & First Strike & Trample & Haste & Protection from black & Protection from red & Vigilance | RandomKeyword$ True | RandomKWNum$ 2 SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Akroma, Angel of Wrath Avatar.full.jpg Oracle:Hand +1, life +7\nWhenever a creature enters the battlefield under your control, it gains two abilities chosen at random from flying, first strike, trample, haste, protection from black, protection from red, and vigilance. diff --git a/forge-gui/res/cardsfolder/a/alchors_tomb.txt b/forge-gui/res/cardsfolder/a/alchors_tomb.txt index 8ad72006d8c..c53b60ba2c6 100644 --- a/forge-gui/res/cardsfolder/a/alchors_tomb.txt +++ b/forge-gui/res/cardsfolder/a/alchors_tomb.txt @@ -2,7 +2,7 @@ Name:Alchor's Tomb ManaCost:4 Types:Artifact A:AB$ ChooseColor | Cost$ 2 T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target permanent you control becomes the color of your choice. (This effect lasts indefinitely.) -SVar:Animate:DB$ Animate | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True +SVar:Animate:DB$ Animate | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Colors$ ChosenColor | OverwriteColors$ True | Duration$ Permanent AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alchors_tomb.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/alibou_ancient_witness.txt b/forge-gui/res/cardsfolder/a/alibou_ancient_witness.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/alibou_ancient_witness.txt rename to forge-gui/res/cardsfolder/a/alibou_ancient_witness.txt diff --git a/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt b/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt index 1e31c6328ff..8014d7a76cd 100644 --- a/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt +++ b/forge-gui/res/cardsfolder/a/aligned_hedron_network.txt @@ -2,7 +2,7 @@ Name:Aligned Hedron Network ManaCost:4 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile all creatures with power 5 or greater until CARDNAME leaves the battlefield. (Those creatures return under their owners' control.) -SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.powerGE5 | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.powerGE5 | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlayVar:Z GE1 SVar:Z:SVar$Z1/Minus.Z2 diff --git a/forge-gui/res/cardsfolder/a/alter_reality.txt b/forge-gui/res/cardsfolder/a/alter_reality.txt index a92c3837097..f571363f1b2 100644 --- a/forge-gui/res/cardsfolder/a/alter_reality.txt +++ b/forge-gui/res/cardsfolder/a/alter_reality.txt @@ -2,7 +2,7 @@ Name:Alter Reality ManaCost:1 U Types:Instant K:Flashback:1 U -A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Permanent$ True | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) +A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Duration$ Permanent | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alter_reality.jpg diff --git a/forge-gui/res/cardsfolder/a/aluren.txt b/forge-gui/res/cardsfolder/a/aluren.txt index 7962e60828c..0a6190d776f 100644 --- a/forge-gui/res/cardsfolder/a/aluren.txt +++ b/forge-gui/res/cardsfolder/a/aluren.txt @@ -1,7 +1,7 @@ Name:Aluren ManaCost:2 G G Types:Enchantment -S:Mode$ Continuous | Affected$ Creature.cmcLE3+nonToken | MayPlay$ True | MayPlayCardOwner$ True | MayPlayWithoutManaCost$ True | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ Any player may cast creature spells with mana value 3 or less without paying their mana costs and as though they had flash. +S:Mode$ Continuous | Affected$ Creature.cmcLE3+nonToken | MayPlay$ True | MayPlayCardOwner$ True | MayPlayWithoutManaCost$ True | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Any player may cast creature spells with mana value 3 or less without paying their mana costs and as though they had flash. SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/aluren.jpg diff --git a/forge-gui/res/cardsfolder/a/amplifire.txt b/forge-gui/res/cardsfolder/a/amplifire.txt index c0a3cc4187c..6cd91b17422 100644 --- a/forge-gui/res/cardsfolder/a/amplifire.txt +++ b/forge-gui/res/cardsfolder/a/amplifire.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:1/1 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDig | TriggerDescription$ At the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Until your next turn, CARDNAME's base power becomes twice that card's power and its toughness. Put the revealed cards on the bottom of your library in a random order. SVar:TrigDig:DB$ DigUntil | Reveal$ True | Valid$ Creature | ValidDescription$ creature card | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | ImprintRevealed$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | UntilYourNextTurn$ True | SubAbility$ DBMovetoLib +SVar:DBAnimate:DB$ Animate | Power$ X | Toughness$ Y | Duration$ UntilYourNextTurn | SubAbility$ DBMovetoLib SVar:DBMovetoLib:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered,Card.IsImprinted | Origin$ Exile | Destination$ Library | RandomOrder$ True | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Remembered$CardPower/Times.2 diff --git a/forge-gui/res/cardsfolder/a/amrou_kithkin.txt b/forge-gui/res/cardsfolder/a/amrou_kithkin.txt index de9c01fdabd..f15c49a5629 100644 --- a/forge-gui/res/cardsfolder/a/amrou_kithkin.txt +++ b/forge-gui/res/cardsfolder/a/amrou_kithkin.txt @@ -2,6 +2,5 @@ Name:Amrou Kithkin ManaCost:W W Types:Creature Kithkin PT:1/1 -K:CantBeBlockedBy Creature.powerGE3 -SVar:Picture:http://www.wizards.com/global/images/magic/general/amrou_kithkin.jpg -Oracle:Amrou Kithkin can't be blocked by creatures with power 3 or greater. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE3 | Description$ CARDNAME can't be blocked by creatures with power 3 or greater. +Oracle:Amrou Kithkin can't be blocked by creatures with power 3 or greater. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/amrou_seekers.txt b/forge-gui/res/cardsfolder/a/amrou_seekers.txt index 6b57ef0a439..644feb50b61 100644 --- a/forge-gui/res/cardsfolder/a/amrou_seekers.txt +++ b/forge-gui/res/cardsfolder/a/amrou_seekers.txt @@ -2,6 +2,5 @@ Name:Amrou Seekers ManaCost:2 W Types:Creature Kithkin Rebel PT:2/2 -K:CantBeBlockedBy Creature.nonArtifact+nonWhite -SVar:Picture:http://www.wizards.com/global/images/magic/general/amrou_seekers.jpg -Oracle:Amrou Seekers can't be blocked except by artifact creatures and/or white creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+nonWhite | Description$ CARDNAME can't be blocked except by artifact creatures and/or white creatures. +Oracle:Amrou Seekers can't be blocked except by artifact creatures and/or white creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/anavolver.txt b/forge-gui/res/cardsfolder/a/anavolver.txt index 222a902b199..032035d9f5d 100644 --- a/forge-gui/res/cardsfolder/a/anavolver.txt +++ b/forge-gui/res/cardsfolder/a/anavolver.txt @@ -6,9 +6,9 @@ K:Kicker:1 U:B K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverLaunch | SpellDescription$ If CARDNAME was kicked with its {1}{U} kicker, it enters the battlefield with two +1/+1 counters on it and with flying. -SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ True +SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Duration$ Permanent SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverResilience | SpellDescription$ If CARDNAME was kicked with its {B} kicker, it enters the battlefield with a +1/+1 counter on it and with "Pay 3 life: Regenerate CARDNAME." -SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Permanent$ True +SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Duration$ Permanent SVar:ABRegen:AB$Regenerate | Cost$ PayLife<3> | SpellDescription$ Regenerate CARDNAME. AI:RemoveDeck:Random DeckNeeds:Color$Blue|Black diff --git a/forge-gui/res/cardsfolder/a/angel_of_condemnation.txt b/forge-gui/res/cardsfolder/a/angel_of_condemnation.txt index 254971232f7..b6788bf7f7c 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_condemnation.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_condemnation.txt @@ -8,5 +8,5 @@ A:AB$ ChangeZone | Cost$ 2 W T | ValidTgts$ Creature.Other | Mandatory$ True | T SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | RememberObjects$ RememberedLKI | TriggerDescription$ Return exiled creature to the battlefield. | SubAbility$ DBCleanup SVar:TrigBounce:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -A:AB$ ChangeZone | Cost$ 2 W T Exert<1/CARDNAME> | Mandatory$ True | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | UntilHostLeavesPlay$ True | SpellDescription$ Exile another target creature until CARDNAME leaves the battlefield. (An exerted creature won't untap during your next untap step.) +A:AB$ ChangeZone | Cost$ 2 W T Exert<1/CARDNAME> | Mandatory$ True | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | Duration$ UntilHostLeavesPlay | SpellDescription$ Exile another target creature until CARDNAME leaves the battlefield. (An exerted creature won't untap during your next untap step.) Oracle:Flying, vigilance\n{2}{W}, {T}: Exile another target creature. Return that card to the battlefield under its owner's control at the beginning of the next end step.\n{2}{W}, {T}, Exert Angel of Condemnation: Exile another target creature until Angel of Condemnation leaves the battlefield. (An exerted creature won't untap during your next untap step.) diff --git a/forge-gui/res/cardsfolder/a/angel_of_sanctions.txt b/forge-gui/res/cardsfolder/a/angel_of_sanctions.txt index 36a287d0ae6..a41762f772a 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_sanctions.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_sanctions.txt @@ -4,7 +4,7 @@ Types:Creature Angel PT:3/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay K:Embalm:5 W SVar:PlayMain1:TRUE Oracle:Flying\nWhen Angel of Sanctions enters the battlefield, you may exile target nonland permanent an opponent controls until Angel of Sanctions leaves the battlefield.\nEmbalm {5}{W} ({5}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a white Zombie Angel with no mana cost. Embalm only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/angel_of_the_ruins.txt b/forge-gui/res/cardsfolder/a/angel_of_the_ruins.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/angel_of_the_ruins.txt rename to forge-gui/res/cardsfolder/a/angel_of_the_ruins.txt diff --git a/forge-gui/res/cardsfolder/a/angelic_arbiter.txt b/forge-gui/res/cardsfolder/a/angelic_arbiter.txt index 7f100bb604f..6d929e5c8ee 100644 --- a/forge-gui/res/cardsfolder/a/angelic_arbiter.txt +++ b/forge-gui/res/cardsfolder/a/angelic_arbiter.txt @@ -3,8 +3,7 @@ ManaCost:5 W W Types:Creature Angel PT:5/6 K:Flying -S:Mode$ Continuous | Affected$ Creature.OppCtrl | AddHiddenKeyword$ CARDNAME can't attack if you cast a spell this turn. | Description$ Each opponent who cast a spell this turn can't attack with creatures. -S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | PlayerAttackedWithCreatureThisTurn$ True | Description$ Each opponent who attacked with a creature this turn can't cast spells. +S:Mode$ CantAttack | ValidCard$ Creature.ControlledBy Opponent.castSpellThisTurn | Description$ Each opponent who cast a spell this turn can't attack with creatures. +S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent.attackedWithCreaturesThisTurn | Description$ Each opponent who attacked with a creature this turn can't cast spells. SVar:RemMultiplayer:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/angelic_arbiter.jpg Oracle:Flying\nEach opponent who cast a spell this turn can't attack with creatures.\nEach opponent who attacked with a creature this turn can't cast spells. diff --git a/forge-gui/res/cardsfolder/a/angrath_minotaur_pirate.txt b/forge-gui/res/cardsfolder/a/angrath_minotaur_pirate.txt index 7ff56f6fb75..0ca2a791754 100644 --- a/forge-gui/res/cardsfolder/a/angrath_minotaur_pirate.txt +++ b/forge-gui/res/cardsfolder/a/angrath_minotaur_pirate.txt @@ -9,5 +9,5 @@ A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Gr A:AB$ DestroyAll | Cost$ SubCounter<11/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Creature | ValidDescription$ all creatures targeted opponent controls | RememberAllObjects$ True | SubAbility$ DBDealDamage | SpellDescription$ Destroy all creatures target opponent controls. CARDNAME deals damage to that player equal to their total power. SVar:DBDealDamage:DB$ DealDamage | Defined$ Targeted | NumDmg$ X SVar:X:RememberedLKI$ CardPower -SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Zombie | Colors$ Black | Duration$ Permanent Oracle:[+2]: Angrath, Minotaur Pirate deals 1 damage to target opponent or planeswalker and each creature that player or that planeswalker's controller controls.\n[−3]: Return target Pirate card from your graveyard to the battlefield.\n[−11]: Destroy all creatures target opponent controls. Angrath, Minotaur Pirate deals damage to that player equal to their total power. diff --git a/forge-gui/res/cardsfolder/a/animate_dead.txt b/forge-gui/res/cardsfolder/a/animate_dead.txt index 7ddd3d42396..215c53917a6 100644 --- a/forge-gui/res/cardsfolder/a/animate_dead.txt +++ b/forge-gui/res/cardsfolder/a/animate_dead.txt @@ -5,7 +5,7 @@ K:Enchant creature card in a graveyard A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | TgtZone$ Graveyard | AILogic$ Reanimate T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Return enchanted creature card to the battlefield under your control and attach CARDNAME to it. SVar:TrigReanimate:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Enchanted | RememberChanged$ True | GainControl$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Permanent$ True | SubAbility$ DBAttach +SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Duration$ Permanent | SubAbility$ DBAttach SVar:DBAttach:DB$ Attach | Defined$ Remembered SVar:NewAttach:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When Animate Dead leaves the battlefield, that creature's controller sacrifices it. diff --git a/forge-gui/res/cardsfolder/a/animating_faerie_bring_to_life.txt b/forge-gui/res/cardsfolder/a/animating_faerie_bring_to_life.txt index b33f34e8395..e685fda8d95 100644 --- a/forge-gui/res/cardsfolder/a/animating_faerie_bring_to_life.txt +++ b/forge-gui/res/cardsfolder/a/animating_faerie_bring_to_life.txt @@ -11,7 +11,7 @@ ALTERNATE Name:Bring to Life ManaCost:2 U Types:Sorcery Adventure -A:SP$ Animate | Cost$ 2 U | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. +A:SP$ Animate | Cost$ 2 U | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Duration$ Permanent | SubAbility$ DBPutCounter | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 DeckHas:Ability$Counters Oracle:Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/apes_of_rath.txt b/forge-gui/res/cardsfolder/a/apes_of_rath.txt index 694b1c98bce..034fcd9ba9e 100644 --- a/forge-gui/res/cardsfolder/a/apes_of_rath.txt +++ b/forge-gui/res/cardsfolder/a/apes_of_rath.txt @@ -3,5 +3,5 @@ ManaCost:2 G G Types:Creature Ape PT:5/4 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | TriggerDescription$ Whenever CARDNAME attacks, it doesn't untap during its controller's next untap step. -SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:Whenever Apes of Rath attacks, it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt b/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt index 53962e4c0a7..2710ec09769 100644 --- a/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt +++ b/forge-gui/res/cardsfolder/a/apprentice_necromancer.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Creature Zombie Wizard PT:1/1 A:AB$ ChangeZone | Cost$ B T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | AITgts$ Card.cmcGE5 | TgtPrompt$ Select target creature in your graveyard | SubAbility$ DBPump | AILogic$ BeforeCombat | RememberChanged$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/apprentice_necromancer.jpg Oracle:{B}, {T}, Sacrifice Apprentice Necromancer: Return target creature card from your graveyard to the battlefield. That creature gains haste. At the beginning of the next end step, sacrifice it. diff --git a/forge-gui/res/cardsfolder/a/aquamorph_entity.txt b/forge-gui/res/cardsfolder/a/aquamorph_entity.txt index 1066ce8c07e..3671e63fc25 100644 --- a/forge-gui/res/cardsfolder/a/aquamorph_entity.txt +++ b/forge-gui/res/cardsfolder/a/aquamorph_entity.txt @@ -6,7 +6,7 @@ K:Morph:2 U R:Event$ TurnFaceUp | ValidCard$ Card.Self | ReplaceWith$ MorphChoice | ActiveZones$ Battlefield K:ETBReplacement:Other:MorphChoice SVar:MorphChoice:DB$ GenericChoice | Defined$ You | Choices$ BigTough,BigPower | SpellDescription$ As CARDNAME enters the battlefield or is turned face up, it becomes your choice of 5/1 or 1/5. -SVar:BigPower:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 5 | Toughness$ 1 | SpellDescription$ CARDNAME is 5/1 -SVar:BigTough:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 1 | Toughness$ 5 | SpellDescription$ CARDNAME is 1/5 +SVar:BigPower:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 5 | Toughness$ 1 | SpellDescription$ CARDNAME is 5/1 +SVar:BigTough:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 1 | Toughness$ 5 | SpellDescription$ CARDNAME is 1/5 SVar:Picture:http://www.wizards.com/global/images/magic/general/aquamorph_entity.jpg Oracle:As Aquamorph Entity enters the battlefield or is turned face up, it becomes your choice of 5/1 or 1/5.\nMorph {2}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/a/arbalest_elite.txt b/forge-gui/res/cardsfolder/a/arbalest_elite.txt index d186ba38890..32dffc3ad07 100644 --- a/forge-gui/res/cardsfolder/a/arbalest_elite.txt +++ b/forge-gui/res/cardsfolder/a/arbalest_elite.txt @@ -3,5 +3,5 @@ ManaCost:2 W W Types:Creature Human Archer PT:2/3 A:AB$ DealDamage | Cost$ 2 W T | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 3 | SubAbility$ DBStayTapped | SpellDescription$ CARDNAME deals 3 damage to target attacking or blocking creature. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{2}{W}, {T}: Arbalest Elite deals 3 damage to target attacking or blocking creature. Arbalest Elite doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/a/arbiter_of_the_ideal.txt b/forge-gui/res/cardsfolder/a/arbiter_of_the_ideal.txt index ea3ca5a586b..9fead1ba5cd 100644 --- a/forge-gui/res/cardsfolder/a/arbiter_of_the_ideal.txt +++ b/forge-gui/res/cardsfolder/a/arbiter_of_the_ideal.txt @@ -6,7 +6,7 @@ K:Flying T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigReveal | TriggerDescription$ Inspired — Whenever CARDNAME becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. That permanent is an enchantment in addition to its other types. SVar:TrigReveal:DB$ Dig | DigNum$ 1 | Reveal$ True | Optional$ True | ChangeValid$ Artifact,Creature,Land | DestinationZone$ Battlefield | DestinationZone2$ Library | LibraryPosition2$ 0 | RememberChanged$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ MANIFESTATION | CounterNum$ 1 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment | Permanent$ True | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/arbiter_of_the_ideal.jpg Oracle:Flying\nInspired — Whenever Arbiter of the Ideal becomes untapped, reveal the top card of your library. If it's an artifact, creature, or land card, you may put it onto the battlefield with a manifestation counter on it. That permanent is an enchantment in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/arcane_subtraction.txt b/forge-gui/res/cardsfolder/a/arcane_subtraction.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/arcane_subtraction.txt rename to forge-gui/res/cardsfolder/a/arcane_subtraction.txt diff --git a/forge-gui/res/cardsfolder/upcoming/archaeomancers_map.txt b/forge-gui/res/cardsfolder/a/archaeomancers_map.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archaeomancers_map.txt rename to forge-gui/res/cardsfolder/a/archaeomancers_map.txt diff --git a/forge-gui/res/cardsfolder/a/archipelagore.txt b/forge-gui/res/cardsfolder/a/archipelagore.txt index 94128ffda22..ca9f37b60d0 100755 --- a/forge-gui/res/cardsfolder/a/archipelagore.txt +++ b/forge-gui/res/cardsfolder/a/archipelagore.txt @@ -5,7 +5,7 @@ PT:7/7 K:Mutate:5 U T:Mode$ Mutates | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever this creature mutates, tap up to X target creatures, where X is the number of times this creature has mutated. Those creatures don't untap during their controller's next untap step. SVar:TrigTap:DB$ Tap | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select up to X target creatures to tap | ValidTgts$ Creature | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:X:Count$TimesMutated AI:RemoveDeck:Random Oracle:Mutate {5}{U} (If you cast this spell for its mutate cost, put it over or under target non-Human creature you own. They mutate into the creature on top plus all abilities from under it.)\nWhenever this creature mutates, tap up to X target creatures, where X is the number of times this creature has mutated. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/archmage_emeritus.txt b/forge-gui/res/cardsfolder/a/archmage_emeritus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archmage_emeritus.txt rename to forge-gui/res/cardsfolder/a/archmage_emeritus.txt diff --git a/forge-gui/res/cardsfolder/a/archon_of_the_triumvirate.txt b/forge-gui/res/cardsfolder/a/archon_of_the_triumvirate.txt index c7d9ccefd5f..34808eadfab 100644 --- a/forge-gui/res/cardsfolder/a/archon_of_the_triumvirate.txt +++ b/forge-gui/res/cardsfolder/a/archon_of_the_triumvirate.txt @@ -4,7 +4,7 @@ Types:Creature Archon PT:4/5 K:Flying T:Mode$ Attacks | TriggerZones$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ Whenever CARDNAME attacks, detain up to two target nonland permanents your opponents control. (Until your next turn, those permanents can't attack or block and their activated abilities can't be activated.) -SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent your opponent controls to detain. | UntilYourNextTurn$ True | AILogic$ DetainNonLand +SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent your opponent controls to detain. | Duration$ UntilYourNextTurn | AILogic$ DetainNonLand SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/archon_of_the_triumvirate.jpg Oracle:Flying\nWhenever Archon of the Triumvirate attacks, detain up to two target nonland permanents your opponents control. (Until your next turn, those permanents can't attack or block and their activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/upcoming/archway_commons.txt b/forge-gui/res/cardsfolder/a/archway_commons.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/archway_commons.txt rename to forge-gui/res/cardsfolder/a/archway_commons.txt diff --git a/forge-gui/res/cardsfolder/a/arcums_weathervane.txt b/forge-gui/res/cardsfolder/a/arcums_weathervane.txt index 4288ebdb79e..3e685d83040 100644 --- a/forge-gui/res/cardsfolder/a/arcums_weathervane.txt +++ b/forge-gui/res/cardsfolder/a/arcums_weathervane.txt @@ -1,8 +1,8 @@ Name:Arcum's Weathervane ManaCost:2 Types:Artifact -A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | RemoveTypes$ Snow | Permanent$ True | SpellDescription$ Target snow land is no longer snow. -A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.nonSnow | TgtPrompt$ Select target nonsnow land | Types$ Snow | Permanent$ True | SpellDescription$ Target nonsnow basic land becomes snow. +A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | RemoveTypes$ Snow | Duration$ Permanent | SpellDescription$ Target snow land is no longer snow. +A:AB$ Animate | Cost$ 2 T | ValidTgts$ Land.nonSnow | TgtPrompt$ Select target nonsnow land | Types$ Snow | Duration$ Permanent | SpellDescription$ Target nonsnow basic land becomes snow. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/arcums_weathervane.jpg Oracle:{2}, {T}: Target snow land is no longer snow.\n{2}, {T}: Target nonsnow basic land becomes snow. diff --git a/forge-gui/res/cardsfolder/upcoming/ardent_dustspeaker.txt b/forge-gui/res/cardsfolder/a/ardent_dustspeaker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ardent_dustspeaker.txt rename to forge-gui/res/cardsfolder/a/ardent_dustspeaker.txt diff --git a/forge-gui/res/cardsfolder/a/argothian_pixies.txt b/forge-gui/res/cardsfolder/a/argothian_pixies.txt index bac41c29fde..c12b4ed75b5 100644 --- a/forge-gui/res/cardsfolder/a/argothian_pixies.txt +++ b/forge-gui/res/cardsfolder/a/argothian_pixies.txt @@ -2,7 +2,6 @@ Name:Argothian Pixies ManaCost:1 G Types:Creature Faerie PT:2/1 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Artifact.Creature | Description$ CARDNAME can't be blocked by artifact creatures. R:Event$ DamageDone | Prevent$ True | ValidSource$ Artifact.Creature | ValidTarget$ Creature.Self | Description$ Prevent all damage that would be dealt to CARDNAME by artifact creatures. -K:CantBeBlockedBy Artifact.Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/argothian_pixies.jpg -Oracle:Argothian Pixies can't be blocked by artifact creatures.\nPrevent all damage that would be dealt to Argothian Pixies by artifact creatures. +Oracle:Argothian Pixies can't be blocked by artifact creatures.\nPrevent all damage that would be dealt to Argothian Pixies by artifact creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/arlinns_wolf.txt b/forge-gui/res/cardsfolder/a/arlinns_wolf.txt index 224860d7503..da7cdedc0ea 100644 --- a/forge-gui/res/cardsfolder/a/arlinns_wolf.txt +++ b/forge-gui/res/cardsfolder/a/arlinns_wolf.txt @@ -2,5 +2,5 @@ Name:Arlinn's Wolf ManaCost:2 G Types:Creature Wolf PT:3/2 -K:CantBeBlockedBy Creature.powerLE2 -Oracle:Arlinn's Wolf can't be blocked by creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +Oracle:Arlinn's Wolf can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/armament_of_nyx.txt b/forge-gui/res/cardsfolder/a/armament_of_nyx.txt index 981cebed744..d338fbae455 100644 --- a/forge-gui/res/cardsfolder/a/armament_of_nyx.txt +++ b/forge-gui/res/cardsfolder/a/armament_of_nyx.txt @@ -2,8 +2,7 @@ Name:Armament of Nyx ManaCost:2 W Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Curse | AITgts$ Creature.nonEnchantment+OppCtrl +A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Enchantment S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Enchantment | AddKeyword$ Double Strike | Description$ Enchanted creature has double strike as long as it's an enchantment. Otherwise, prevent all damage that would be dealt by enchanted creature. R:Event$ DamageDone | Prevent$ True | ValidSource$ Creature.EnchantedBy+nonEnchantment | Secondary$ True | Description$ Otherwise, prevent all damage that would be dealt by enchanted creature. -SVar:Picture:http://www.wizards.com/global/images/magic/general/armament_of_nyx.jpg Oracle:Enchant creature\nEnchanted creature has double strike as long as it's an enchantment. Otherwise, prevent all damage that would be dealt by enchanted creature. (A creature with double strike deals both first-strike and regular combat damage.) diff --git a/forge-gui/res/cardsfolder/a/armed_and_armored.txt b/forge-gui/res/cardsfolder/a/armed_and_armored.txt index 28c31627381..d49a2edaad3 100644 --- a/forge-gui/res/cardsfolder/a/armed_and_armored.txt +++ b/forge-gui/res/cardsfolder/a/armed_and_armored.txt @@ -2,7 +2,7 @@ Name:Armed and Armored ManaCost:1 W Types:Instant A:SP$ AnimateAll | Cost$ 1 W | Types$ Creature,Artifact | ValidCards$ Vehicle.YouCtrl | SubAbility$ ChooseDwarf | StackDescription$ Vehicles {p:You} controls become artifact creatures until end of turn. | SpellDescription$ Vehicles you control become artifact creatures until end of turn. Choose a Dwarf you control. Attach any number of Equipment you control to it. -SVar:ChooseDwarf:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Dwarf.YouCtrl | ChoiceTitle$ Choose a Dwarf you control | StackDescription$ {p:You} chooses a Dwarf they control and attaches any number of Equipment they control to it. | ImprintChosen$ True | SubAbility$ ChooseEquipment +SVar:ChooseDwarf:DB$ ChooseCard | Defined$ You | Mandatory$ True | Choices$ Dwarf.YouCtrl | ChoiceTitle$ Choose a Dwarf you control | StackDescription$ {p:You} chooses a Dwarf they control and attaches any number of Equipment they control to it. | ImprintChosen$ True | SubAbility$ ChooseEquipment SVar:ChooseEquipment:DB$ ChooseCard | Defined$ You | MinAmount$ 0 | Amount$ X | Choices$ Equipment.YouCtrl | StackDescription$ None | ChoiceTitle$ Choose any number of Equipment you control | ForgetChosen$ True | SubAbility$ DeployDwarf SVar:DeployDwarf:DB$ RepeatEach | RepeatSubAbility$ ArmDwarf | RepeatCards$ Card.ChosenCard | SubAbility$ DBCleanup SVar:ArmDwarf:DB$ Attach | Object$ Remembered | Defined$ Imprinted | StackDescription$ None diff --git a/forge-gui/res/cardsfolder/upcoming/arrogant_poet.txt b/forge-gui/res/cardsfolder/a/arrogant_poet.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/arrogant_poet.txt rename to forge-gui/res/cardsfolder/a/arrogant_poet.txt diff --git a/forge-gui/res/cardsfolder/a/artificial_evolution.txt b/forge-gui/res/cardsfolder/a/artificial_evolution.txt index ffe78a524ad..408f29aae01 100644 --- a/forge-gui/res/cardsfolder/a/artificial_evolution.txt +++ b/forge-gui/res/cardsfolder/a/artificial_evolution.txt @@ -1,6 +1,6 @@ Name:Artificial Evolution ManaCost:U Types:Instant -A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseCreatureType ChooseCreatureType | ForbiddenNewTypes$ Wall | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one creature type with another. The new creature type can't be Wall. (This effect lasts indefinitely.) +A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseCreatureType ChooseCreatureType | ForbiddenNewTypes$ Wall | Duration$ Permanent | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one creature type with another. The new creature type can't be Wall. (This effect lasts indefinitely.) SVar:Picture:http://www.wizards.com/global/images/magic/general/artificial_evolution.jpg Oracle:Change the text of target spell or permanent by replacing all instances of one creature type with another. The new creature type can't be Wall. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/a/as_foretold.txt b/forge-gui/res/cardsfolder/a/as_foretold.txt index aacfc669ad8..4e43d6ea3e2 100644 --- a/forge-gui/res/cardsfolder/a/as_foretold.txt +++ b/forge-gui/res/cardsfolder/a/as_foretold.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1 -S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with mana value X or less, where X is the number of time counters on CARDNAME. +S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with mana value X or less, where X is the number of time counters on CARDNAME. SVar:X:Count$CardCounters.TIME SVar:Picture:http://www.wizards.com/global/images/magic/general/as_foretold.jpg Oracle:At the beginning of your upkeep, put a time counter on As Foretold.\nOnce each turn, you may pay {0} rather than pay the mana cost for a spell you cast with mana value X or less, where X is the number of time counters on As Foretold. diff --git a/forge-gui/res/cardsfolder/a/ascendant_spirit.txt b/forge-gui/res/cardsfolder/a/ascendant_spirit.txt index 36046f892e3..4403b42dba4 100644 --- a/forge-gui/res/cardsfolder/a/ascendant_spirit.txt +++ b/forge-gui/res/cardsfolder/a/ascendant_spirit.txt @@ -2,11 +2,11 @@ Name:Ascendant Spirit ManaCost:U Types:Snow Creature Spirit PT:1/1 -A:AB$ Animate | Cost$ S S | Types$ Spirit,Warrior | Permanent$ True | Power$ 2 | Toughness$ 3 | StackDescription$ SpellDescription | SpellDescription$ CARDNAME becomes a Spirit Warrior with base power and toughness 2/3. +A:AB$ Animate | Cost$ S S | Types$ Spirit,Warrior | Duration$ Permanent | Power$ 2 | Toughness$ 3 | StackDescription$ SpellDescription | SpellDescription$ CARDNAME becomes a Spirit Warrior with base power and toughness 2/3. A:AB$ PutCounter | Cost$ S S S | ConditionPresent$ Card.Self+Warrior | CounterType$ Flying | CounterNum$ 1 | SubAbility$ TrigAnimate | StackDescription$ SpellDescription | SpellDescription$ If CARDNAME is a Warrior, put a flying counter on it and it becomes an Angel Spirit Warrior with base power and toughness 4/4. -SVar:TrigAnimate:DB$ Animate | ConditionPresent$ Card.Self+Warrior | Types$ Angel,Spirit,Warrior | Permanent$ True | Power$ 4 | Toughness$ 4 +SVar:TrigAnimate:DB$ Animate | ConditionPresent$ Card.Self+Warrior | Types$ Angel,Spirit,Warrior | Duration$ Permanent | Power$ 4 | Toughness$ 4 A:AB$ PutCounter | Cost$ S S S S | ConditionPresent$ Card.Self+Angel | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ AddTrigger | StackDescription$ SpellDescription | SpellDescription$ If CARDNAME is an Angel, put two +1/+1 counters on it and it gains "Whenever this creature deals combat damage to a player, draw a card." -SVar:AddTrigger:DB$ Animate | Defined$ Self | ConditionPresent$ Card.Self+Angel | Triggers$ DamageDraw | Permanent$ True +SVar:AddTrigger:DB$ Animate | Defined$ Self | ConditionPresent$ Card.Self+Angel | Triggers$ DamageDraw | Duration$ Permanent SVar:DamageDraw:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/a/ascending_aven.txt b/forge-gui/res/cardsfolder/a/ascending_aven.txt index 4c964853060..e8e039abb33 100644 --- a/forge-gui/res/cardsfolder/a/ascending_aven.txt +++ b/forge-gui/res/cardsfolder/a/ascending_aven.txt @@ -3,7 +3,6 @@ ManaCost:2 U U Types:Creature Bird Soldier PT:3/2 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. K:Morph:2 U -SVar:Picture:http://www.wizards.com/global/images/magic/general/ascending_aven.jpg Oracle:Flying\nAscending Aven can block only creatures with flying.\nMorph {2}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.) diff --git a/forge-gui/res/cardsfolder/a/ascent_of_the_worthy.txt b/forge-gui/res/cardsfolder/a/ascent_of_the_worthy.txt index 96bdf95869f..8b22230ffdc 100644 --- a/forge-gui/res/cardsfolder/a/ascent_of_the_worthy.txt +++ b/forge-gui/res/cardsfolder/a/ascent_of_the_worthy.txt @@ -2,10 +2,10 @@ Name:Ascent of the Worthy ManaCost:1 W B Types:Enchantment Saga K:Saga:3:DBChoose,DBChoose,DBChangeZone -SVar:DBChoose:DB$ ChooseCard | Choices$ Creature.YouCtrl | SubAbility$ DBEffect | SpellDescription$ Choose a creature you control. Until your next turn, all damage that would be dealt to creatures you control is dealt to that creature instead. +SVar:DBChoose:DB$ ChooseCard | Choices$ Creature.YouCtrl | Mandatory$ True | SubAbility$ DBEffect | SpellDescription$ Choose a creature you control. Until your next turn, all damage that would be dealt to creatures you control is dealt to that creature instead. SVar:DBEffect:DB$ Effect | ReplacementEffects$ DamageEvent | ExileOnMoved$ True | RememberObjects$ ChosenCard | Duration$ UntilYourNextTurn SVar:DamageEvent:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ Creature.YouCtrl | ReplaceWith$ GideonSac | DamageTarget$ Remembered | Description$ All damage that would be dealt this turn to creatures you control is dealt to the chosen creature instead (if it's still on the battlefield). -SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | WithCounters$ Flying_1 | AnimateSubAbility$ Animate | SpellDescription$ Return target creature card from your graveyard to the battlefield with a flying counter on it. SVar:GideonSac:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card -SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Angel,Warrior | Permanent$ True +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | WithCounters$ Flying_1 | AnimateSubAbility$ Animate | SpellDescription$ Return target creature card from your graveyard to the battlefield with a flying counter on it. +SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Angel,Warrior | Duration$ Permanent Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI, II — Choose a creature you control. Until your next turn, all damage that would be dealt to creatures you control is dealt to that creature instead.\nIII — Return target creature card from your graveyard to the battlefield with a flying counter on it. That creature is an Angel Warrior in addition to its other types. diff --git a/forge-gui/res/cardsfolder/a/ashiok_nightmare_weaver.txt b/forge-gui/res/cardsfolder/a/ashiok_nightmare_weaver.txt index 23b5e915e93..1a3beabd99e 100644 --- a/forge-gui/res/cardsfolder/a/ashiok_nightmare_weaver.txt +++ b/forge-gui/res/cardsfolder/a/ashiok_nightmare_weaver.txt @@ -5,7 +5,7 @@ Loyalty:3 A:AB$ Dig | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Opponent | DigNum$ 3 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SpellDescription$ Exile the top three cards of target opponent's library. A:AB$ ChooseCard | Cost$ SubCounter | Choices$ Creature.cmcEQX+IsRemembered+ExiledWithSource | ChoiceZone$ Exile | Planeswalker$ True | SubAbility$ DBChangeZone | AILogic$ Ashiok | SpellDescription$ Put a creature card with mana value X exiled with CARDNAME onto the battlefield under your control. That creature is a Nightmare in addition to its other types. SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Exile | Destination$ Battlefield | ChangeType$ Creature.cmcEQX+IsRemembered+ExiledWithSource | ChangeNum$ 1 | GainControl$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Nightmare | Permanent$ True | SubAbility$ DBCleanMinus +SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Nightmare | Duration$ Permanent | SubAbility$ DBCleanMinus SVar:DBCleanMinus:DB$ Cleanup | ForgetDefined$ ChosenCard | ClearChosenCard$ True SVar:X:Count$xPaid A:AB$ ChangeZoneAll | Cost$ SubCounter<10/LOYALTY> | ChangeType$ Card.OppCtrl | Origin$ Graveyard,Hand | Destination$ Exile | RememberChanged$ True | Planeswalker$ True | Ultimate$ True | SpellDescription$ Exile all cards from all opponents' hands and graveyards. diff --git a/forge-gui/res/cardsfolder/a/ashnods_transmogrant.txt b/forge-gui/res/cardsfolder/a/ashnods_transmogrant.txt index 295da7fba92..47faf4196bc 100644 --- a/forge-gui/res/cardsfolder/a/ashnods_transmogrant.txt +++ b/forge-gui/res/cardsfolder/a/ashnods_transmogrant.txt @@ -2,6 +2,6 @@ Name:Ashnod's Transmogrant ManaCost:1 Types:Artifact A:AB$ PutCounter | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature.nonArtifact | TgtPrompt$ Select target nonartifact creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBAnimate | SpellDescription$ Put a +1/+1 counter on target nonartifact creature. That creature becomes an artifact in addition to its other types. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Artifact | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Artifact | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/ashnods_transmogrant.jpg Oracle:{T}, Sacrifice Ashnod's Transmogrant: Put a +1/+1 counter on target nonartifact creature. That creature becomes an artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/a/audacious_infiltrator.txt b/forge-gui/res/cardsfolder/a/audacious_infiltrator.txt index eaa0147e5e9..8100c6a3cad 100644 --- a/forge-gui/res/cardsfolder/a/audacious_infiltrator.txt +++ b/forge-gui/res/cardsfolder/a/audacious_infiltrator.txt @@ -2,6 +2,5 @@ Name:Audacious Infiltrator ManaCost:1 W Types:Creature Dwarf Rogue PT:3/1 -K:CantBeBlockedBy Artifact.Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/audacious_infiltrator.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Artifact.Creature | Description$ CARDNAME can't be blocked by artifact creatures. Oracle:Audacious Infiltrator can't be blocked by artifact creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/audacious_reshapers.txt b/forge-gui/res/cardsfolder/a/audacious_reshapers.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/audacious_reshapers.txt rename to forge-gui/res/cardsfolder/a/audacious_reshapers.txt diff --git a/forge-gui/res/cardsfolder/upcoming/augmenter_pugilist_echoing_equation.txt b/forge-gui/res/cardsfolder/a/augmenter_pugilist_echoing_equation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/augmenter_pugilist_echoing_equation.txt rename to forge-gui/res/cardsfolder/a/augmenter_pugilist_echoing_equation.txt diff --git a/forge-gui/res/cardsfolder/a/aura_gnarlid.txt b/forge-gui/res/cardsfolder/a/aura_gnarlid.txt index 590430301a1..7cd132cabd8 100644 --- a/forge-gui/res/cardsfolder/a/aura_gnarlid.txt +++ b/forge-gui/res/cardsfolder/a/aura_gnarlid.txt @@ -2,9 +2,9 @@ Name:Aura Gnarlid ManaCost:2 G Types:Creature Beast PT:2/2 -K:Creatures with power less than CARDNAME's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTY | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:Y:Count$CardPower S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each Aura on the battlefield. SVar:X:Count$Valid Aura SVar:BuffedBy:Aura -SVar:Picture:http://www.wizards.com/global/images/magic/general/aura_gnarlid.jpg Oracle:Creatures with power less than Aura Gnarlid's power can't block it.\nAura Gnarlid gets +1/+1 for each Aura on the battlefield. diff --git a/forge-gui/res/cardsfolder/a/auriok_replica.txt b/forge-gui/res/cardsfolder/a/auriok_replica.txt index 60ad51fe39c..658e861257b 100644 --- a/forge-gui/res/cardsfolder/a/auriok_replica.txt +++ b/forge-gui/res/cardsfolder/a/auriok_replica.txt @@ -4,7 +4,6 @@ Types:Artifact Creature Cleric PT:2/2 A:AB$ ChooseSource | Cost$ W Sac<1/CARDNAME> | Choices$ Card | RememberChosen$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal to you this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ You | Prevent$ True | PreventionEffect$ True | Description$ Prevent all damage the chosen source would deal to you this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ You | Prevent$ True | Description$ Prevent all damage the chosen source would deal to you this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_replica.jpg Oracle:{W}, Sacrifice Auriok Replica: Prevent all damage a source of your choice would deal to you this turn. diff --git a/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt b/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt index 8cd3d8b6d5b..17735a261ee 100644 --- a/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt +++ b/forge-gui/res/cardsfolder/a/auriok_siege_sled.txt @@ -2,8 +2,8 @@ Name:Auriok Siege Sled ManaCost:6 Types:Artifact Creature Juggernaut PT:3/5 -A:AB$ Pump | Cost$ 1 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target artifact creature can't block CARDNAME this turn. A:AB$ MustBlock | Cost$ 1 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature to block this creature | SpellDescription$ Target artifact creature blocks CARDNAME this turn if able. +A:AB$ Effect | Cost$ 1 | ValidTgts$ Creature.Artifact | TgtPrompt$ Select target artifact creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target artifact creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/auriok_siege_sled.jpg Oracle:{1}: Target artifact creature blocks Auriok Siege Sled this turn if able.\n{1}: Target artifact creature can't block Auriok Siege Sled this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/author_of_shadows.txt b/forge-gui/res/cardsfolder/a/author_of_shadows.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/author_of_shadows.txt rename to forge-gui/res/cardsfolder/a/author_of_shadows.txt diff --git a/forge-gui/res/cardsfolder/a/autumn_willow.txt b/forge-gui/res/cardsfolder/a/autumn_willow.txt index b9df47db469..13682aabdb2 100644 --- a/forge-gui/res/cardsfolder/a/autumn_willow.txt +++ b/forge-gui/res/cardsfolder/a/autumn_willow.txt @@ -3,7 +3,6 @@ ManaCost:4 G G Types:Legendary Creature Avatar PT:4/4 K:Shroud -A:AB$ Pump | Cost$ G | ValidTgts$ Player | Defined$ Targeted | TgtPrompt$ Select target player to be able to target Autumn Willow | KW$ IgnoreShroud:Card.CardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ Until end of turn, {p:Targeted} can target CARDNAME as though it didn't have shroud. | SpellDescription$ Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. +A:AB$ Pump | Cost$ G | ValidTgts$ Player | Defined$ Targeted | TgtPrompt$ Select target player to be able to target Autumn Willow | KW$ IgnoreShroud:Card.CardUIDSource | DefinedKW$ CardUIDSource | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ Until end of turn, {p:Targeted} can target CARDNAME as though it didn't have shroud. | SpellDescription$ Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/autumn_willow.jpg Oracle:Shroud (This creature can't be the target of spells or abilities.)\n{G}: Until end of turn, Autumn Willow can be the target of spells and abilities controlled by target player as though it didn't have shroud. diff --git a/forge-gui/res/cardsfolder/a/avacynian_missionaries_lunarch_inquisitors.txt b/forge-gui/res/cardsfolder/a/avacynian_missionaries_lunarch_inquisitors.txt index 1beff86d697..51a8f816138 100644 --- a/forge-gui/res/cardsfolder/a/avacynian_missionaries_lunarch_inquisitors.txt +++ b/forge-gui/res/cardsfolder/a/avacynian_missionaries_lunarch_inquisitors.txt @@ -17,5 +17,5 @@ Colors:white Types:Creature Human Cleric PT:4/4 T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When this creature transforms into CARDNAME, you may exile another target creature until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | Duration$ UntilHostLeavesPlay Oracle:When this creature transforms into Lunarch Inquisitors, you may exile another target creature until Lunarch Inquisitors leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/a/awakener_druid.txt b/forge-gui/res/cardsfolder/a/awakener_druid.txt index 22b8ae39925..626c4a61572 100644 --- a/forge-gui/res/cardsfolder/a/awakener_druid.txt +++ b/forge-gui/res/cardsfolder/a/awakener_druid.txt @@ -3,6 +3,6 @@ ManaCost:2 G Types:Creature Human Druid PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as CARDNAME is on the battlefield. It's still a land. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Types$ Creature,Treefolk | Power$ 4 | Toughness$ 5 | Colors$ Green | UntilHostLeavesPlay$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Types$ Creature,Treefolk | Power$ 4 | Toughness$ 5 | Colors$ Green | Duration$ UntilHostLeavesPlay SVar:Picture:http://www.wizards.com/global/images/magic/general/awakener_druid.jpg Oracle:When Awakener Druid enters the battlefield, target Forest becomes a 4/5 green Treefolk creature for as long as Awakener Druid remains on the battlefield. It's still a land. diff --git a/forge-gui/res/cardsfolder/a/awakening_of_vitu_ghazi.txt b/forge-gui/res/cardsfolder/a/awakening_of_vitu_ghazi.txt index a0c01cf2b84..00c9fa1f6a2 100644 --- a/forge-gui/res/cardsfolder/a/awakening_of_vitu_ghazi.txt +++ b/forge-gui/res/cardsfolder/a/awakening_of_vitu_ghazi.txt @@ -2,6 +2,6 @@ Name:Awakening of Vitu-Ghazi ManaCost:3 G G Types:Instant A:SP$ PutCounter | Cost$ 3 G G | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 9 | SubAbility$ DBAnimate | SpellDescription$ Put nine +1/+1 counters on target land you control. It becomes a legendary 0/0 Elemental creature with haste named Vitu-Ghazi. It's still a land. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Legendary,Creature,Elemental | Keywords$ Haste | Name$ Vitu-Ghazi | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Legendary,Creature,Elemental | Keywords$ Haste | Name$ Vitu-Ghazi | Duration$ Permanent DeckHas:Ability$Counters Oracle:Put nine +1/+1 counters on target land you control. It becomes a legendary 0/0 Elemental creature with haste named Vitu-Ghazi. It's still a land. diff --git a/forge-gui/res/cardsfolder/a/azorius_arrester.txt b/forge-gui/res/cardsfolder/a/azorius_arrester.txt index 682961656c1..bf36c626967 100644 --- a/forge-gui/res/cardsfolder/a/azorius_arrester.txt +++ b/forge-gui/res/cardsfolder/a/azorius_arrester.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Human Soldier PT:2/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) -SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/azorius_arrester.jpg Oracle:When Azorius Arrester enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt index 87cca6176bd..3c510ac9249 100644 --- a/forge-gui/res/cardsfolder/a/azorius_justiciar.txt +++ b/forge-gui/res/cardsfolder/a/azorius_justiciar.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Human Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) -SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | AILogic$ DetainNonLand +SVar:Detain:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | AILogic$ DetainNonLand SVar:PlayMain1:TRUE Oracle:When Azorius Justiciar enters the battlefield, detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/a/azors_elocutors.txt b/forge-gui/res/cardsfolder/a/azors_elocutors.txt index bebbf501851..852b6471dee 100644 --- a/forge-gui/res/cardsfolder/a/azors_elocutors.txt +++ b/forge-gui/res/cardsfolder/a/azors_elocutors.txt @@ -8,5 +8,5 @@ SVar:WinGame:DB$ WinsGame | Defined$ You | ConditionCheckSVar$ TalkedEnough | Co SVar:TalkedEnough:Count$CardCounters.FILIBUSTER T:Mode$ DamageDone | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ RemoveCounter | TriggerDescription$ Whenever a source deals damage to you, remove a filibuster counter from CARDNAME. SVar:RemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ FILIBUSTER | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/azors_elocutors.jpg +SVar:AIEvaluationModifier:30 Oracle:At the beginning of your upkeep, put a filibuster counter on Azor's Elocutors. Then if Azor's Elocutors has five or more filibuster counters on it, you win the game.\nWhenever a source deals damage to you, remove a filibuster counter from Azor's Elocutors. diff --git a/forge-gui/res/cardsfolder/a/azra_oddsmaker.txt b/forge-gui/res/cardsfolder/a/azra_oddsmaker.txt index 7571c95bcbf..3ddf51713bc 100644 --- a/forge-gui/res/cardsfolder/a/azra_oddsmaker.txt +++ b/forge-gui/res/cardsfolder/a/azra_oddsmaker.txt @@ -2,7 +2,7 @@ Name:Azra Oddsmaker ManaCost:1 R B Types:Creature Azra Warrior T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ ChooseCreature | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, you may discard a card. If you do, choose a creature. Whenever that creature deals combat damage to a player this turn, you draw two cards. -SVar:ChooseCreature:AB$ ChooseCard | Cost$ Discard<1/Card> | Choices$ Creature | ChoiceTitle$ Choose a creature | SubAbility$ DBEffect +SVar:ChooseCreature:AB$ ChooseCard | Cost$ Discard<1/Card> | Mandatory$ True | Choices$ Creature | ChoiceTitle$ Choose a creature | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | Name$ Azra Oddsmaker Effect | Triggers$ TrigDamage SVar:TrigDamage:Mode$ DamageDone | ValidSource$ Card.ChosenCard | ValidTarget$ Player | Execute$ TrigDraw | CombatDamage$ True | TriggerDescription$ Whenever that creature deals combat damage to a player this turn, you draw two cards. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt b/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt index b36005eeb8d..0213804f09a 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_frostwaker.txt @@ -2,7 +2,7 @@ Name:Balduvian Frostwaker ManaCost:2 U Types:Creature Human Wizard PT:1/1 -A:AB$ Animate | Cost$ U T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Colors$ Blue | Keywords$ Flying | Permanent$ True | AILogic$ EOT | SpellDescription$ Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. +A:AB$ Animate | Cost$ U T | ValidTgts$ Land.Snow | TgtPrompt$ Select target snow land | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Colors$ Blue | Keywords$ Flying | Duration$ Permanent | AILogic$ EOT | SpellDescription$ Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_frostwaker.jpg Oracle:{U}, {T}: Target snow land becomes a 2/2 blue Elemental creature with flying. It's still a land. diff --git a/forge-gui/res/cardsfolder/b/balduvian_shaman.txt b/forge-gui/res/cardsfolder/b/balduvian_shaman.txt index bb2d4eaa2af..f7aa081afe5 100644 --- a/forge-gui/res/cardsfolder/b/balduvian_shaman.txt +++ b/forge-gui/res/cardsfolder/b/balduvian_shaman.txt @@ -2,8 +2,8 @@ Name:Balduvian Shaman ManaCost:U Types:Creature Human Cleric Shaman PT:1/1 -A:AB$ ChangeText | Cost$ T | ValidTgts$ Enchantment.YouCtrl+White+withoutCumulative upkeep | TgtPrompt$ Choose target white enchantment you control that doesn't have cumulative upkeep | ChangeColorWord$ Choose Choose | Permanent$ True | SubAbility$ DBCumUpkeep | SpellDescription$ Change the text of target white enchantment you control that doesn't have cumulative upkeep by replacing all instances of one color word with another. (For example, you may change "black creatures can't attack" to "blue creatures can't attack.") That enchantment gains "Cumulative upkeep 1." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) -SVar:DBCumUpkeep:DB$ Pump | Defined$ ParentTarget | KW$ Cumulative upkeep:1 | Permanent$ True +A:AB$ ChangeText | Cost$ T | ValidTgts$ Enchantment.YouCtrl+White+withoutCumulative upkeep | TgtPrompt$ Choose target white enchantment you control that doesn't have cumulative upkeep | ChangeColorWord$ Choose Choose | Duration$ Permanent | SubAbility$ DBCumUpkeep | SpellDescription$ Change the text of target white enchantment you control that doesn't have cumulative upkeep by replacing all instances of one color word with another. (For example, you may change "black creatures can't attack" to "blue creatures can't attack.") That enchantment gains "Cumulative upkeep 1." (At the beginning of its controller's upkeep, that player puts an age counter on it, then sacrifices it unless they pay its upkeep cost for each age counter on it.) +SVar:DBCumUpkeep:DB$ Pump | Defined$ ParentTarget | KW$ Cumulative upkeep:1 | Duration$ Permanent AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/balduvian_shaman.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/baleful_mastery.txt b/forge-gui/res/cardsfolder/b/baleful_mastery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/baleful_mastery.txt rename to forge-gui/res/cardsfolder/b/baleful_mastery.txt diff --git a/forge-gui/res/cardsfolder/b/banisher_priest.txt b/forge-gui/res/cardsfolder/b/banisher_priest.txt index 5888ca0825c..572f0a93c4d 100644 --- a/forge-gui/res/cardsfolder/b/banisher_priest.txt +++ b/forge-gui/res/cardsfolder/b/banisher_priest.txt @@ -3,6 +3,6 @@ ManaCost:1 W W Types:Creature Human Cleric PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:When Banisher Priest enters the battlefield, exile target creature an opponent controls until Banisher Priest leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/b/banishing_light.txt b/forge-gui/res/cardsfolder/b/banishing_light.txt index 0bd3eaa65ea..20c971976ee 100644 --- a/forge-gui/res/cardsfolder/b/banishing_light.txt +++ b/forge-gui/res/cardsfolder/b/banishing_light.txt @@ -2,7 +2,7 @@ Name:Banishing Light ManaCost:2 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:When Banishing Light enters the battlefield, exile target nonland permanent an opponent controls until Banishing Light leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/b/bant.txt b/forge-gui/res/cardsfolder/b/bant.txt index 9ba96d9153b..3be0df64e47 100644 --- a/forge-gui/res/cardsfolder/b/bant.txt +++ b/forge-gui/res/cardsfolder/b/bant.txt @@ -4,7 +4,7 @@ Types:Plane Alara S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature | AddKeyword$ Exalted | Description$ All creatures have exalted. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, put a divinity counter on target green, white, or blue creature. That creature has indestructible for as long as it has a divinity counter on it. SVar:RolledChaos:DB$ PutCounter | ValidTgts$ Creature.Green,Creature.White,Creature.Blue | CounterType$ DIVINITY | CounterNum$ 1 | SubAbility$ DivineCharacter -SVar:DivineCharacter:DB$ Animate | Defined$ Targeted | staticAbilities$ IndestructibleAspect | Permanent$ True +SVar:DivineCharacter:DB$ Animate | Defined$ Targeted | staticAbilities$ IndestructibleAspect | Duration$ Permanent SVar:IndestructibleAspect:Mode$ Continuous | EffectZone$ Battlefield | Affected$ Card.Self+counters_GE1_DIVINITY | AddKeyword$ Indestructible SVar:Picture:http://www.wizards.com/global/images/magic/general/bant.jpg SVar:AIRollPlanarDieParams:Mode$ Always | HasColorCreatureInPlay$ GWU diff --git a/forge-gui/res/cardsfolder/b/barbed_wire.txt b/forge-gui/res/cardsfolder/b/barbed_wire.txt index 3d33cead9fb..6f796397b79 100644 --- a/forge-gui/res/cardsfolder/b/barbed_wire.txt +++ b/forge-gui/res/cardsfolder/b/barbed_wire.txt @@ -3,10 +3,9 @@ ManaCost:3 Types:Artifact T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of each player's upkeep, CARDNAME deals 1 damage to that player. SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 1 -A:AB$ Effect | Cost$ 2 | ImprintCards$ Self | Triggers$ OutOfSight | StaticAbilities$ STPrevent | SpellDescription$ Prevent the next 1 damage that would be dealt by CARDNAME this turn. | StackDescription$ SpellDescription -SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | Amount$ 1 | Source$ Card.IsImprinted | Description$ Prevent the next 1 damage that would be dealt by CARDNAME this turn. -SVar:OutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ ExileSelf | Static$ True -SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile +A:AB$ Effect | Cost$ 2 | RememberObjects$ Self | ReplacementEffects$ DBPrevent | ForgetOnMoved$ Battlefield | SpellDescription$ Prevent the next 1 damage that would be dealt by CARDNAME this turn. | StackDescription$ SpellDescription +SVar:DBPrevent:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.IsRemembered | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ Prevent the next 1 damage that would be dealt by EFFECTSOURCE this turn. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ ShieldAmount +SVar:ShieldAmount:Number$1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/barbed_wire.jpg Oracle:At the beginning of each player's upkeep, Barbed Wire deals 1 damage to that player.\n{2}: Prevent the next 1 damage that would be dealt by Barbed Wire this turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/barls_cage.txt b/forge-gui/res/cardsfolder/b/barls_cage.txt index c51c024d2a7..5afca6cd682 100644 --- a/forge-gui/res/cardsfolder/b/barls_cage.txt +++ b/forge-gui/res/cardsfolder/b/barls_cage.txt @@ -1,7 +1,7 @@ Name:Barl's Cage ManaCost:4 Types:Artifact -A:AB$ Pump | Cost$ 3 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. +A:AB$ Pump | Cost$ 3 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/barls_cage.jpg Oracle:{3}: Target creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/b/barrenton_cragtreads.txt b/forge-gui/res/cardsfolder/b/barrenton_cragtreads.txt index c1f29572f1c..d61100298b2 100644 --- a/forge-gui/res/cardsfolder/b/barrenton_cragtreads.txt +++ b/forge-gui/res/cardsfolder/b/barrenton_cragtreads.txt @@ -2,6 +2,5 @@ Name:Barrenton Cragtreads ManaCost:2 WU WU Types:Creature Kithkin Scout PT:3/3 -K:CantBeBlockedBy Creature.Red -SVar:Picture:http://www.wizards.com/global/images/magic/general/barrenton_cragtreads.jpg -Oracle:Barrenton Cragtreads can't be blocked by red creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Red | Description$ CARDNAME can't be blocked by red creatures. +Oracle:Barrenton Cragtreads can't be blocked by red creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/basalt_golem.txt b/forge-gui/res/cardsfolder/b/basalt_golem.txt index 0b4eada058f..8142b118a75 100644 --- a/forge-gui/res/cardsfolder/b/basalt_golem.txt +++ b/forge-gui/res/cardsfolder/b/basalt_golem.txt @@ -2,11 +2,10 @@ Name:Basalt Golem ManaCost:5 Types:Artifact Creature Golem PT:2/4 -K:CantBeBlockedBy Artifact.Creature +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Artifact.Creature | Description$ CARDNAME can't be blocked by artifact creatures. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigEndCombat | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, that creature's controller sacrifices it at end of combat. If the player does, they create a 0/2 colorless Wall artifact creature token with defender. SVar:TrigEndCombat:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | Execute$ TrigSacBlocker | RememberObjects$ TriggeredBlocker | TriggerDescription$ At end of combat, the controller of the creature that blocked CARDNAME sacrifices that creature. If the player does, they create a 0/2 colorless Wall artifact creature token with defender. SVar:TrigSacBlocker:DB$ Destroy | Defined$ DelayTriggerRemembered | Sacrifice$ True | SubAbility$ DBToken | RememberDestroyed$ True SVar:DBToken:DB$Token | TokenAmount$ 1 | TokenScript$ c_0_2_a_wall_defender | LegacyImage$ c 0 2 a wall defender mir | TokenOwner$ DelayTriggerRememberedController | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/basalt_golem.jpg -Oracle:Basalt Golem can't be blocked by artifact creatures.\nWhenever Basalt Golem becomes blocked by a creature, that creature's controller sacrifices it at end of combat. If the player does, they create a 0/2 colorless Wall artifact creature token with defender. +Oracle:Basalt Golem can't be blocked by artifact creatures.\nWhenever Basalt Golem becomes blocked by a creature, that creature's controller sacrifices it at end of combat. If the player does, they create a 0/2 colorless Wall artifact creature token with defender. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/base_camp.txt b/forge-gui/res/cardsfolder/b/base_camp.txt index 75aa8cb9624..eb9095b3225 100644 --- a/forge-gui/res/cardsfolder/b/base_camp.txt +++ b/forge-gui/res/cardsfolder/b/base_camp.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Cleric,Rogue,Warrior,Wizard | SpellDescription$ Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. +A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Cleric,Rogue,Warrior,Wizard,Activated.Cleric,Activated.Rogue,Activated.Warrior,Activated.Wizard | SpellDescription$ Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. DeckHas:Ability$Party DeckHints:Type$Cleric|Rogue|Warrior|Wizard Oracle:Base Camp enters the battlefield tapped.\n{T}: Add {C}.\n{T}: Add one mana of any color. Spend this mana only to cast a Cleric, Rogue, Warrior, or Wizard spell or to activate an ability of a Cleric, Rogue, Warrior, or Wizard. diff --git a/forge-gui/res/cardsfolder/upcoming/basic_conjuration.txt b/forge-gui/res/cardsfolder/b/basic_conjuration.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/basic_conjuration.txt rename to forge-gui/res/cardsfolder/b/basic_conjuration.txt diff --git a/forge-gui/res/cardsfolder/b/basri_ket.txt b/forge-gui/res/cardsfolder/b/basri_ket.txt index c7be58dd95e..014044ec0b6 100644 --- a/forge-gui/res/cardsfolder/b/basri_ket.txt +++ b/forge-gui/res/cardsfolder/b/basri_ket.txt @@ -5,9 +5,9 @@ Loyalty:3 A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on up to one target creature. It gains indestructible until end of turn. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Indestructible A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Triggers$ TrigAttack | SpellDescription$ Whenever one or more nontoken creatures attack this turn, create that many 1/1 white Soldier creature tokens that are tapped and attacking. -SVar:TrigAttack:Mode$ AttackersDeclared | ValidAttackers$ Creature.nonToken+YouCtrl | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ Whenever one or more nontoken creatures attack this turn, create that many 1/1 white Soldier creature tokens that are tapped and attacking. +SVar:TrigAttack:Mode$ AttackersDeclared | ValidAttackers$ Creature.nonToken | TriggerZones$ Command | Execute$ TrigToken | TriggerDescription$ Whenever one or more nontoken creatures attack this turn, create that many 1/1 white Soldier creature tokens that are tapped and attacking. SVar:TrigToken:DB$ Token | TokenAmount$ BasriX | TokenScript$ w_1_1_soldier | TokenOwner$ You | TokenTapped$ True | TokenAttacking$ True -SVar:BasriX:TriggerObjectsAttackers$Valid Creature.nonToken+YouCtrl +SVar:BasriX:TriggerObjectsAttackers$Valid Creature.nonToken A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Basri Ket | Image$ emblem_basri_ket | Triggers$ EffPhase | Duration$ Permanent | SpellDescription$ You get an emblem with "At the beginning of combat on your turn, create a 1/1 white Soldier creature token, then put a +1/+1 counter on each creature you control." SVar:EffPhase:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ EmblemTrigToken | TriggerDescription$ At the beginning of combat on your turn, create a 1/1 white Soldier creature token, then put a +1/+1 counter on each creature you control. SVar:EmblemTrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | SubAbility$ DBPutCounterAll diff --git a/forge-gui/res/cardsfolder/b/battering_ram.txt b/forge-gui/res/cardsfolder/b/battering_ram.txt index 24364d0589c..6f33633fd46 100644 --- a/forge-gui/res/cardsfolder/b/battering_ram.txt +++ b/forge-gui/res/cardsfolder/b/battering_ram.txt @@ -3,7 +3,7 @@ ManaCost:2 Types:Artifact Creature Construct PT:1/1 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigBanding | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, CARDNAME gains banding until end of combat. -SVar:TrigBanding:DB$ Pump | Defined$ Self | KW$ Banding | UntilEndOfCombat$ True +SVar:TrigBanding:DB$ Pump | Defined$ Self | KW$ Banding | Duration$ UntilEndOfCombat T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature.Wall | Execute$ DelayAttackTrig | TriggerDescription$ Whenever CARDNAME becomes blocked by a Wall, destroy that Wall at end of combat. SVar:DelayAttackTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigDestroyBlocker | RememberObjects$ TriggeredBlocker | TriggerDescription$ Destroy blocked creature at end of combat. SVar:TrigDestroyBlocker:DB$ Destroy | Defined$ DelayTriggerRemembered diff --git a/forge-gui/res/cardsfolder/b/battering_wurm.txt b/forge-gui/res/cardsfolder/b/battering_wurm.txt index 9e7ddbb5eb0..b7faa3fafa5 100644 --- a/forge-gui/res/cardsfolder/b/battering_wurm.txt +++ b/forge-gui/res/cardsfolder/b/battering_wurm.txt @@ -3,6 +3,6 @@ ManaCost:6 G Types:Creature Wurm PT:4/3 K:Bloodthirst:1 -K:Creatures with power less than CARDNAME's power can't block it. -SVar:Picture:http://www.wizards.com/global/images/magic/general/battering_wurm.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower Oracle:Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)\nCreatures with power less than Battering Wurm's power can't block it. diff --git a/forge-gui/res/cardsfolder/b/battlefield_percher.txt b/forge-gui/res/cardsfolder/b/battlefield_percher.txt index 8f61538127f..adf99e033ee 100644 --- a/forge-gui/res/cardsfolder/b/battlefield_percher.txt +++ b/forge-gui/res/cardsfolder/b/battlefield_percher.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Creature Bird PT:2/2 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. A:AB$ Pump | Cost$ 1 B | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. Oracle:Flying\nBattlefield Percher can block only creatures with flying.\n{1}{B}: Battlefield Percher gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/battlemages_bracers.txt b/forge-gui/res/cardsfolder/b/battlemages_bracers.txt similarity index 52% rename from forge-gui/res/cardsfolder/upcoming/battlemages_bracers.txt rename to forge-gui/res/cardsfolder/b/battlemages_bracers.txt index 86a7cd6faf6..d5fe9ed35a5 100644 --- a/forge-gui/res/cardsfolder/upcoming/battlemages_bracers.txt +++ b/forge-gui/res/cardsfolder/b/battlemages_bracers.txt @@ -3,6 +3,6 @@ ManaCost:2 R Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Haste | Description$ Equipped creature has haste. -T:Mode$ AbilityCast | ValidCard$ Creature.EquippedBy | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopyAbility | TriggerDescription$ Whenever an ability of equipped creature is activated, if it isn't a mana ability, you may pay {1}. If you do, copy that ability. You may choose new targets for the copy. -SVar:TrigCopyAbility:DB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | MayChooseTarget$ True +T:Mode$ AbilityCast | ValidCard$ Creature.EquippedBy+inRealZoneBattlefield | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigCopyAbility | TriggerDescription$ Whenever an ability of equipped creature is activated, if it isn't a mana ability, you may pay {1}. If you do, copy that ability. You may choose new targets for the copy. +SVar:TrigCopyAbility:AB$ CopySpellAbility | Cost$ 1 | Defined$ TriggeredSpellAbility | MayChooseTarget$ True Oracle:Equipped creature has haste.\nWhenever an ability of equipped creature is activated, if it isn't a mana ability, you may pay {1}. If you do, copy that ability. You may choose new targets for the copy.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/b/battletide_alchemist.txt b/forge-gui/res/cardsfolder/b/battletide_alchemist.txt index b6b13ba6383..d590a6b6e31 100644 --- a/forge-gui/res/cardsfolder/b/battletide_alchemist.txt +++ b/forge-gui/res/cardsfolder/b/battletide_alchemist.txt @@ -2,7 +2,7 @@ Name:Battletide Alchemist ManaCost:3 W W Types:Creature Kithkin Cleric PT:3/4 -S:Mode$ PreventDamage | Target$ Player | Amount$ AlchemicX | Optional$ True | AILogic$ ProtectFriendly | Description$ If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Player | ReplaceWith$ DBReplace | PreventionEffect$ True | Optional$ True | OptionalDecider$ You | AILogic$ ProtectFriendly | Description$ If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ AlchemicX SVar:AlchemicX:Count$Valid Cleric.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/battletide_alchemist.jpg Oracle:If a source would deal damage to a player, you may prevent X of that damage, where X is the number of Clerics you control. diff --git a/forge-gui/res/cardsfolder/upcoming/bayou_groff.txt b/forge-gui/res/cardsfolder/b/bayou_groff.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bayou_groff.txt rename to forge-gui/res/cardsfolder/b/bayou_groff.txt diff --git a/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt b/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt index 466d792d069..7b7622b8904 100644 --- a/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt +++ b/forge-gui/res/cardsfolder/b/beacon_of_destiny.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Human Cleric PT:1/3 A:AB$ ChooseSource | Cost$ T | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to CARDNAME instead. -SVar:DBEffect:DB$ Effect | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 +SVar:DBEffect:DB$ Effect | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ You | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ EffectSource | Description$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to EFFECTSOURCE instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource | VarType$ Card | SubAbility$ ExileEffect #Zone Change for the source of your choice diff --git a/forge-gui/res/cardsfolder/upcoming/beaming_defiance.txt b/forge-gui/res/cardsfolder/b/beaming_defiance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/beaming_defiance.txt rename to forge-gui/res/cardsfolder/b/beaming_defiance.txt diff --git a/forge-gui/res/cardsfolder/b/belbes_percher.txt b/forge-gui/res/cardsfolder/b/belbes_percher.txt index 62365d165b2..53d754551e6 100644 --- a/forge-gui/res/cardsfolder/b/belbes_percher.txt +++ b/forge-gui/res/cardsfolder/b/belbes_percher.txt @@ -3,6 +3,6 @@ ManaCost:2 B Types:Creature Bird PT:2/2 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. SVar:Picture:http://www.wizards.com/global/images/magic/general/belbes_percher.jpg Oracle:Flying\nBelbe's Percher can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/beledros_witherbloom.txt b/forge-gui/res/cardsfolder/b/beledros_witherbloom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/beledros_witherbloom.txt rename to forge-gui/res/cardsfolder/b/beledros_witherbloom.txt diff --git a/forge-gui/res/cardsfolder/b/beloved_princess.txt b/forge-gui/res/cardsfolder/b/beloved_princess.txt index 517805fe2da..6804b4a4614 100644 --- a/forge-gui/res/cardsfolder/b/beloved_princess.txt +++ b/forge-gui/res/cardsfolder/b/beloved_princess.txt @@ -3,5 +3,5 @@ ManaCost:W Types:Creature Human Noble PT:1/1 K:Lifelink -K:CantBeBlockedBy Creature.powerGE3 -Oracle:Lifelink\nBeloved Princess can't be blocked by creatures with power 3 or greater. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE3 | Description$ CARDNAME can't be blocked by creatures with power 3 or greater. +Oracle:Lifelink\nBeloved Princess can't be blocked by creatures with power 3 or greater. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/b/benalish_lancer.txt b/forge-gui/res/cardsfolder/b/benalish_lancer.txt index 2fc850c9c21..7a92ce5372e 100644 --- a/forge-gui/res/cardsfolder/b/benalish_lancer.txt +++ b/forge-gui/res/cardsfolder/b/benalish_lancer.txt @@ -5,7 +5,7 @@ PT:2/2 K:Kicker:2 W K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. -SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True +SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Duration$ Permanent DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_lancer.jpg Oracle:Kicker {2}{W} (You may pay an additional {2}{W} as you cast this spell.)\nIf Benalish Lancer was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike. diff --git a/forge-gui/res/cardsfolder/b/berg_strider.txt b/forge-gui/res/cardsfolder/b/berg_strider.txt index 95485eb7fc7..66be1984604 100644 --- a/forge-gui/res/cardsfolder/b/berg_strider.txt +++ b/forge-gui/res/cardsfolder/b/berg_strider.txt @@ -4,7 +4,7 @@ Types:Snow Creature Giant Wizard PT:4/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target artifact or creature an opponent controls. If {S} was spent to cast this spell, that permanent doesn't untap during its controller's next untap step. ({S} is mana from a snow source.) SVar:TrigTap:DB$ Tap | ValidTgts$ Artifact.OppCtrl,Creature.OppCtrl | TgtPrompt$ Choose target artifact or creature an opponent controls | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionCheckSVar$ S | ConditionSVarCompare$ GE1 | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionCheckSVar$ S | ConditionSVarCompare$ GE1 | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:S:Count$CastTotalSnowManaSpent DeckNeeds:Type$Snow Oracle:When Berg Strider enters the battlefield, tap target artifact or creature an opponent controls. If {S} was spent to cast this spell, that permanent doesn't untap during its controller's next untap step. ({S} is mana from a snow source.) diff --git a/forge-gui/res/cardsfolder/upcoming/biblioplex_assistant.txt b/forge-gui/res/cardsfolder/b/biblioplex_assistant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biblioplex_assistant.txt rename to forge-gui/res/cardsfolder/b/biblioplex_assistant.txt diff --git a/forge-gui/res/cardsfolder/upcoming/big_play.txt b/forge-gui/res/cardsfolder/b/big_play.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/big_play.txt rename to forge-gui/res/cardsfolder/b/big_play.txt diff --git a/forge-gui/res/cardsfolder/b/binding_the_old_gods.txt b/forge-gui/res/cardsfolder/b/binding_the_old_gods.txt index 96152aa8d76..50e0affd72d 100644 --- a/forge-gui/res/cardsfolder/b/binding_the_old_gods.txt +++ b/forge-gui/res/cardsfolder/b/binding_the_old_gods.txt @@ -1,8 +1,8 @@ Name:Binding the Old Gods ManaCost:2 B G Types:Enchantment Saga -K:Saga:3:DBDestroy,DBFetch,DBEffect -SVar:DBDestroy:DB$ ChangeZone | Origin$ Battlefield | Destination$ Graveyard | ValidTgts$ Permanent.OppCtrl+nonland | TgtPrompt$ Select target nonland permanent an opponent controls | SpellDescription$ Destroy target nonland permanent an opponent controls. -SVar:DBFetch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | Tapped$ True | ChangeNum$ 1 | SpellDescription$ Search your library for a Forest card, put it onto the battlefield tapped, then shuffle. -SVar:DBEffect:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Deathtouch | SpellDescription$ Creatures you control gain deathtouch until end of turn. +K:Saga:3:DBDestroy,DBFetch,DBPump +SVar:DBDestroy:DB$ Destroy | ValidTgts$ Permanent.OppCtrl+nonland | TgtPrompt$ Select target nonland permanent an opponent controls | SpellDescription$ Destroy target nonland permanent an opponent controls. +SVar:DBFetch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | Tapped$ True | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a Forest card, put it onto the battlefield tapped, then shuffle. +SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Deathtouch | SpellDescription$ Creatures you control gain deathtouch until end of turn. Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Destroy target nonland permanent an opponent controls.\nII — Search your library for a Forest card, put it onto the battlefield tapped, then shuffle.\nIII — Creatures you control gain deathtouch until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/biomathematician.txt b/forge-gui/res/cardsfolder/b/biomathematician.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/biomathematician.txt rename to forge-gui/res/cardsfolder/b/biomathematician.txt diff --git a/forge-gui/res/cardsfolder/b/bishop_of_binding.txt b/forge-gui/res/cardsfolder/b/bishop_of_binding.txt index 1a24359e8ca..878e73afc2b 100644 --- a/forge-gui/res/cardsfolder/b/bishop_of_binding.txt +++ b/forge-gui/res/cardsfolder/b/bishop_of_binding.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Vampire Cleric PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | ConditionPresent$ Card.Self | UntilHostLeavesPlay$ True | RememberChanged$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | ConditionPresent$ Card.Self | Duration$ UntilHostLeavesPlay | RememberChanged$ True T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, target Vampire gets +X/+X until end of turn, where X is the power of the exiled card. SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.Vampire | TgtPrompt$ Select target Vampire | NumAtt$ X | NumDef$ X SVar:X:Remembered$CardPower diff --git a/forge-gui/res/cardsfolder/upcoming/blade_historian.txt b/forge-gui/res/cardsfolder/b/blade_historian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blade_historian.txt rename to forge-gui/res/cardsfolder/b/blade_historian.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blex_vexing_pest_search_for_blex.txt b/forge-gui/res/cardsfolder/b/blex_vexing_pest_search_for_blex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blex_vexing_pest_search_for_blex.txt rename to forge-gui/res/cardsfolder/b/blex_vexing_pest_search_for_blex.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blight_mound.txt b/forge-gui/res/cardsfolder/b/blight_mound.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blight_mound.txt rename to forge-gui/res/cardsfolder/b/blight_mound.txt diff --git a/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt b/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt index 2de1f91fd82..d5a6eafba9e 100644 --- a/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt +++ b/forge-gui/res/cardsfolder/b/blim_comedic_genius.txt @@ -3,14 +3,12 @@ ManaCost:2 B R Types:Legendary Creature Imp PT:4/3 K:Flying -T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZone$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player gains control of target permanent you control. Then each player loses life and discards cards equal to the number of permanents they control but don't own. -SVar:TrigPump:DB$ ChooseCard | Choices$ Permanent.YouCtrl | ChoiceTitle$ Choose a permanent you control for damaged player to gain control of | Defined$ You | SubAbility$ DBControl -SVar:DBControl:DB$ GainControl | Defined$ ChosenCard | NewController$ TriggeredTarget | SubAbility$ DBRepeatEach -SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseLife | SubAbility$ DBCleanup +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZone$ Battlefield | Execute$ TrigControl | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player gains control of target permanent you control. Then each player loses life and discards cards equal to the number of permanents they control but don't own. +SVar:TrigControl:DB$ GainControl | ValidTgts$ Permanent.YouCtrl | TargetMin$ 1 | TgtPrompt$ Choose a permanent you control for damaged player to gain control of | NewController$ TriggeredTarget | SubAbility$ DBRepeatEach +SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBLoseLife SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ X | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ Player.IsRemembered | NumCards$ X | Mode$ TgtChoose SVar:X:Count$Valid Permanent.RememberedPlayerCtrl/Minus.Y SVar:Y:Count$Valid Permanent.RememberedPlayerCtrl+RememberedPlayerOwn -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True DeckHints:Ability$Token Oracle:Flying\nWhenever Blim, Comedic Genius deals combat damage to a player, that player gains control of target permanent you control. Then each player loses life and discards cards equal to the number of permanents they control but don't own. diff --git a/forge-gui/res/cardsfolder/upcoming/blood_age_general.txt b/forge-gui/res/cardsfolder/b/blood_age_general.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blood_age_general.txt rename to forge-gui/res/cardsfolder/b/blood_age_general.txt diff --git a/forge-gui/res/cardsfolder/b/blood_crypt.txt b/forge-gui/res/cardsfolder/b/blood_crypt.txt index 5d2febb6fba..bf9bd1574ef 100644 --- a/forge-gui/res/cardsfolder/b/blood_crypt.txt +++ b/forge-gui/res/cardsfolder/b/blood_crypt.txt @@ -2,6 +2,5 @@ Name:Blood Crypt ManaCost:no cost Types:Land Swamp Mountain K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97102.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {B} or {R}.)\nAs Blood Crypt enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/upcoming/blood_researcher.txt b/forge-gui/res/cardsfolder/b/blood_researcher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blood_researcher.txt rename to forge-gui/res/cardsfolder/b/blood_researcher.txt diff --git a/forge-gui/res/cardsfolder/b/bloodlord_of_vaasgoth.txt b/forge-gui/res/cardsfolder/b/bloodlord_of_vaasgoth.txt index 71eff2087c2..fbaeb77a3b4 100644 --- a/forge-gui/res/cardsfolder/b/bloodlord_of_vaasgoth.txt +++ b/forge-gui/res/cardsfolder/b/bloodlord_of_vaasgoth.txt @@ -5,6 +5,6 @@ PT:3/3 K:Bloodthirst:3 K:Flying T:Mode$ SpellCast | ValidCard$ Creature.Vampire | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ BloodPump | TriggerDescription$ Whenever you cast a Vampire creature spell, it gains bloodthirst 3. -SVar:BloodPump:DB$ Animate | Defined$ TriggeredCard | Keywords$ Bloodthirst:3 | Permanent$ True +SVar:BloodPump:DB$ Animate | Defined$ TriggeredCard | Keywords$ Bloodthirst:3 | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodlord_of_vaasgoth.jpg Oracle:Bloodthirst 3 (If an opponent was dealt damage this turn, this creature enters the battlefield with three +1/+1 counters on it.)\nFlying\nWhenever you cast a Vampire creature spell, it gains bloodthirst 3. diff --git a/forge-gui/res/cardsfolder/upcoming/blossoming_bogbeast.txt b/forge-gui/res/cardsfolder/b/blossoming_bogbeast.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blossoming_bogbeast.txt rename to forge-gui/res/cardsfolder/b/blossoming_bogbeast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/blot_out_the_sky.txt b/forge-gui/res/cardsfolder/b/blot_out_the_sky.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/blot_out_the_sky.txt rename to forge-gui/res/cardsfolder/b/blot_out_the_sky.txt diff --git a/forge-gui/res/cardsfolder/upcoming/body_of_research.txt b/forge-gui/res/cardsfolder/b/body_of_research.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/body_of_research.txt rename to forge-gui/res/cardsfolder/b/body_of_research.txt diff --git a/forge-gui/res/cardsfolder/b/bog_rats.txt b/forge-gui/res/cardsfolder/b/bog_rats.txt index b3717ef3a8c..14a660a5f4c 100644 --- a/forge-gui/res/cardsfolder/b/bog_rats.txt +++ b/forge-gui/res/cardsfolder/b/bog_rats.txt @@ -1,7 +1,5 @@ Name:Bog Rats ManaCost:B Types:Creature Rat -PT:1/1 -K:CantBeBlockedBy Creature.Wall -SVar:Picture:http://www.wizards.com/global/images/magic/general/bog_rats.jpg -Oracle:Bog Rats can't be blocked by Walls. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Wall | Description$ CARDNAME can't be blocked by Walls. +Oracle:Bog Rats can't be blocked by Walls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/bold_plagiarist.txt b/forge-gui/res/cardsfolder/b/bold_plagiarist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bold_plagiarist.txt rename to forge-gui/res/cardsfolder/b/bold_plagiarist.txt diff --git a/forge-gui/res/cardsfolder/b/boldwyr_intimidator.txt b/forge-gui/res/cardsfolder/b/boldwyr_intimidator.txt index 6b06adf98d7..e6b86e9224a 100644 --- a/forge-gui/res/cardsfolder/b/boldwyr_intimidator.txt +++ b/forge-gui/res/cardsfolder/b/boldwyr_intimidator.txt @@ -2,8 +2,7 @@ Name:Boldwyr Intimidator ManaCost:5 R R Types:Creature Giant Warrior PT:5/5 -S:Mode$ Continuous | Affected$ Creature.Coward | AddHiddenKeyword$ CantBlock Creature.Warrior:Warriors | Description$ Cowards can't block Warriors. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Warrior | ValidBlocker$ Creature.Coward | Description$ Cowards can't block Warriors. A:AB$ Animate | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ Coward | RemoveCreatureTypes$ True | SpellDescription$ Target creature becomes a Coward until end of turn. A:AB$ Animate | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ Warrior | RemoveCreatureTypes$ True | SpellDescription$ Target creature becomes a Warrior until end of turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/boldwyr_intimidator.jpg Oracle:Cowards can't block Warriors.\n{R}: Target creature becomes a Coward until end of turn.\n{2}{R}: Target creature becomes a Warrior until end of turn. diff --git a/forge-gui/res/cardsfolder/b/bond_of_revival.txt b/forge-gui/res/cardsfolder/b/bond_of_revival.txt index 6fdf0217c90..b685c9b48c3 100644 --- a/forge-gui/res/cardsfolder/b/bond_of_revival.txt +++ b/forge-gui/res/cardsfolder/b/bond_of_revival.txt @@ -2,5 +2,5 @@ Name:Bond of Revival ManaCost:4 B Types:Sorcery A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SubAbility$ DBPump | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains haste until your next turn. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | UntilYourNextTurn$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | Duration$ UntilYourNextTurn Oracle:Return target creature card from your graveyard to the battlefield. It gains haste until your next turn. diff --git a/forge-gui/res/cardsfolder/b/bonds_of_faith.txt b/forge-gui/res/cardsfolder/b/bonds_of_faith.txt index d37db9c775c..5fe2ba512cb 100644 --- a/forge-gui/res/cardsfolder/b/bonds_of_faith.txt +++ b/forge-gui/res/cardsfolder/b/bonds_of_faith.txt @@ -2,8 +2,7 @@ Name:Bonds of Faith ManaCost:1 W Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ SpecificCard +A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Human S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Human | AddPower$ 2 | AddToughness$ 2 | Description$ Enchanted creature gets +2/+2 as long as it's a Human. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonHuman | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Otherwise, it can't attack or block. -SVar:Picture:http://www.wizards.com/global/images/magic/general/bonds_of_faith.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 as long as it's a Human. Otherwise, it can't attack or block. diff --git a/forge-gui/res/cardsfolder/b/bone_rattler.txt b/forge-gui/res/cardsfolder/b/bone_rattler.txt new file mode 100644 index 00000000000..034076898ac --- /dev/null +++ b/forge-gui/res/cardsfolder/b/bone_rattler.txt @@ -0,0 +1,10 @@ +Name:Bone Rattler +ManaCost:3 B B +Types:Creature Skeleton +PT:4/4 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Graveyard | Execute$ TrigExile | TriggerDescription$ When CARDNAME is put into a graveyard from anywhere, exile it. If you do, create four Reassembling Skeleton token cards and put them into your graveyard. +SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True | SubAbility$ DBMakeCard +SVar:DBMakeCard:DB$ MakeCard | Name$ Reassembling Skeleton | Zone$ Graveyard | Amount$ 4 | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Graveyard +Oracle:When Bone Rattler is put into a graveyard from anywhere, exile it. If you do, create four Reassembling Skeleton token cards and put them into your graveyard. diff --git a/forge-gui/res/cardsfolder/b/boneyard_scourge.txt b/forge-gui/res/cardsfolder/b/boneyard_scourge.txt index a285def8f3c..8854c6d0ba5 100644 --- a/forge-gui/res/cardsfolder/b/boneyard_scourge.txt +++ b/forge-gui/res/cardsfolder/b/boneyard_scourge.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Creature Zombie Dragon PT:4/3 K:Flying -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Dragon.YouCtrl | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay {1}{B}. If you do, return Boneyard Scourge from your graveyard to the battlefield. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Dragon.YouCtrl | IsPresent$ Card.StrictlySelf+inZoneGraveyard | PresentZone$ Graveyard | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever a Dragon you control dies while Boneyard Scourge is in your graveyard, you may pay {1}{B}. If you do, return Boneyard Scourge from your graveyard to the battlefield. SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 B | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield SVar:SacMe:1 SVar:DiscardMe:1 diff --git a/forge-gui/res/cardsfolder/upcoming/bookwurm.txt b/forge-gui/res/cardsfolder/b/bookwurm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bookwurm.txt rename to forge-gui/res/cardsfolder/b/bookwurm.txt diff --git a/forge-gui/res/cardsfolder/b/boros_battleshaper.txt b/forge-gui/res/cardsfolder/b/boros_battleshaper.txt index 11649720c11..d0770f240ae 100644 --- a/forge-gui/res/cardsfolder/b/boros_battleshaper.txt +++ b/forge-gui/res/cardsfolder/b/boros_battleshaper.txt @@ -3,8 +3,8 @@ ManaCost:5 R W Types:Creature Minotaur Soldier PT:5/5 T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigMustAttackBlock | TriggerDescription$ At the beginning of each combat, up to one target creature attacks or blocks this combat if able and up to one target creature can't attack or block this combat. -SVar:TrigMustAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature to attack or block if able | KW$ HIDDEN CARDNAME attacks each combat if able. & HIDDEN CARDNAME blocks each combat if able. | IsCurse$ True | UntilEndOfCombat$ True | SubAbility$ DBCantAttackBlock -SVar:DBCantAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature that cannot attack or block this combat | KW$ HIDDEN CARDNAME can't attack or block. | IsCurse$ True | UntilEndOfCombat$ True +SVar:TrigMustAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature to attack or block if able | KW$ HIDDEN CARDNAME attacks each combat if able. & HIDDEN CARDNAME blocks each combat if able. | IsCurse$ True | Duration$ UntilEndOfCombat | SubAbility$ DBCantAttackBlock +SVar:DBCantAttackBlock:DB$ Pump | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose target creature that cannot attack or block this combat | KW$ HIDDEN CARDNAME can't attack or block. | IsCurse$ True | Duration$ UntilEndOfCombat AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/boros_battleshaper.jpg Oracle:At the beginning of each combat, up to one target creature attacks or blocks this combat if able and up to one target creature can't attack or block this combat. diff --git a/forge-gui/res/cardsfolder/upcoming/brackish_trudge.txt b/forge-gui/res/cardsfolder/b/brackish_trudge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/brackish_trudge.txt rename to forge-gui/res/cardsfolder/b/brackish_trudge.txt diff --git a/forge-gui/res/cardsfolder/b/brain_maggot.txt b/forge-gui/res/cardsfolder/b/brain_maggot.txt index bb13d54de8b..229e38b7c6d 100644 --- a/forge-gui/res/cardsfolder/b/brain_maggot.txt +++ b/forge-gui/res/cardsfolder/b/brain_maggot.txt @@ -3,6 +3,6 @@ ManaCost:1 B Types:Enchantment Creature Insect PT:1/1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand and you choose a nonland card from it. Exile that card until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonLand | ChangeNum$ 1 | IsCurse$ True | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:When Brain Maggot enters the battlefield, target opponent reveals their hand and you choose a nonland card from it. Exile that card until Brain Maggot leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt b/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt index 2540fd3665d..243f6703c1d 100644 --- a/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt +++ b/forge-gui/res/cardsfolder/b/brass_talon_chimera.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Chimera PT:2/2 K:First Strike A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) -SVar:DBPump:DB$ Pump | KW$ First Strike | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ First Strike | Defined$ Targeted | Duration$ Permanent AI:RemoveDeck:All Oracle:First strike\nSacrifice Brass-Talon Chimera: Put a +2/+2 counter on target Chimera creature. It gains first strike. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/b/brassclaw_orcs.txt b/forge-gui/res/cardsfolder/b/brassclaw_orcs.txt index 7c8917dd8e1..0a4e1d909c5 100644 --- a/forge-gui/res/cardsfolder/b/brassclaw_orcs.txt +++ b/forge-gui/res/cardsfolder/b/brassclaw_orcs.txt @@ -2,6 +2,5 @@ Name:Brassclaw Orcs ManaCost:2 R Types:Creature Orc PT:3/2 -K:CantBlock Creature.powerGE2:creatures with power 2 or greater -SVar:Picture:http://www.wizards.com/global/images/magic/general/brassclaw_orcs.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or greater. Oracle:Brassclaw Orcs can't block creatures with power 2 or greater. diff --git a/forge-gui/res/cardsfolder/b/brazen_borrower_petty_theft.txt b/forge-gui/res/cardsfolder/b/brazen_borrower_petty_theft.txt index 07a5d8b2ba8..b6af4b86943 100644 --- a/forge-gui/res/cardsfolder/b/brazen_borrower_petty_theft.txt +++ b/forge-gui/res/cardsfolder/b/brazen_borrower_petty_theft.txt @@ -4,7 +4,7 @@ Types:Creature Faerie Rogue PT:3/1 K:Flash K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flash\nFlying\nBrazen Borrower can block only creatures with flying. AlternateMode:Adventure diff --git a/forge-gui/res/cardsfolder/b/breaching_leviathan.txt b/forge-gui/res/cardsfolder/b/breaching_leviathan.txt index 20dd87dc2d0..d2a1f597cd0 100644 --- a/forge-gui/res/cardsfolder/b/breaching_leviathan.txt +++ b/forge-gui/res/cardsfolder/b/breaching_leviathan.txt @@ -4,6 +4,6 @@ Types:Creature Leviathan PT:9/9 T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, tap all nonblue creatures. Those creatures don't untap during their controllers' next untap steps. SVar:TrigTapAll:DB$ TapAll | ValidCards$ Creature.nonBlue | SubAbility$ TrigPump2 -SVar:TrigPump2:DB$ PumpAll | ValidCards$ Creature.nonBlue | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump2:DB$ PumpAll | ValidCards$ Creature.nonBlue | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/breaching_leviathan.jpg Oracle:When Breaching Leviathan enters the battlefield, if you cast it from your hand, tap all nonblue creatures. Those creatures don't untap during their controllers' next untap steps. diff --git a/forge-gui/res/cardsfolder/b/breeding_pool.txt b/forge-gui/res/cardsfolder/b/breeding_pool.txt index 780da3d82ef..1d101c3851f 100644 --- a/forge-gui/res/cardsfolder/b/breeding_pool.txt +++ b/forge-gui/res/cardsfolder/b/breeding_pool.txt @@ -2,6 +2,5 @@ Name:Breeding Pool ManaCost:no cost Types:Land Forest Island K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97088.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {G} or {U}.)\nAs Breeding Pool enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/upcoming/breena_the_demagogue.txt b/forge-gui/res/cardsfolder/b/breena_the_demagogue.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/breena_the_demagogue.txt rename to forge-gui/res/cardsfolder/b/breena_the_demagogue.txt diff --git a/forge-gui/res/cardsfolder/b/brine_hag.txt b/forge-gui/res/cardsfolder/b/brine_hag.txt index f6aa3c427a1..846a8eb0b90 100644 --- a/forge-gui/res/cardsfolder/b/brine_hag.txt +++ b/forge-gui/res/cardsfolder/b/brine_hag.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Creature Hag PT:2/2 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, change the base power and toughness of all creatures that dealt damage to it this turn to 0/2. (This effect lasts indefinitely.) -SVar:TrigAnimate:DB$ AnimateAll | ValidCards$ Creature.Damaged | Power$ 0 | Toughness$ 2 | Permanent$ True +SVar:TrigAnimate:DB$ AnimateAll | ValidCards$ Creature.Damaged | Power$ 0 | Toughness$ 2 | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/brine_hag.jpg Oracle:When Brine Hag dies, change the base power and toughness of all creatures that dealt damage to it this turn to 0/2. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/upcoming/bronze_guardian.txt b/forge-gui/res/cardsfolder/b/bronze_guardian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bronze_guardian.txt rename to forge-gui/res/cardsfolder/b/bronze_guardian.txt diff --git a/forge-gui/res/cardsfolder/b/bronzehide_lion.txt b/forge-gui/res/cardsfolder/b/bronzehide_lion.txt index 4d878653966..a5250da8417 100644 --- a/forge-gui/res/cardsfolder/b/bronzehide_lion.txt +++ b/forge-gui/res/cardsfolder/b/bronzehide_lion.txt @@ -5,7 +5,7 @@ PT:3/3 A:AB$ Pump | Cost$ G W | KW$ Indestructible | Defined$ Self | SpellDescription$ CARDNAME gains indestructible until end of turn. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ DBReturn | TriggerDescription$ When CARDNAME dies, return it to the battlefield. It's an Aura enchantment with enchant creature you control and CARDNAME has "{G}{W}: Enchanted creature gains indestructible until end of turn," and it loses all other abilities. SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | AnimateSubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveAllAbilities$ True | Keywords$ Enchant creature you control | Abilities$ SPAttach,ABPump | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveAllAbilities$ True | Keywords$ Enchant creature you control | Abilities$ SPAttach,ABPump | Duration$ Permanent SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature.YouCtrl | AILogic$ Pump SVar:ABPump:AB$ Pump | Cost$ G W | KW$ Indestructible | Defined$ Enchanted | SpellDescription$ Enchanted creature gains indestructible until end of turn. Oracle:{G}{W}: Bronzehide Lion gains indestructible until end of turn.\nWhen Bronzehide Lion dies, return it to the battlefield. It's an Aura enchantment with enchant creature you control and "{G}{W}: Enchanted creature gains indestructible until end of turn," and it loses all other abilities. diff --git a/forge-gui/res/cardsfolder/b/brushfire_elemental.txt b/forge-gui/res/cardsfolder/b/brushfire_elemental.txt index 47b5a1208ac..3619d1480d4 100644 --- a/forge-gui/res/cardsfolder/b/brushfire_elemental.txt +++ b/forge-gui/res/cardsfolder/b/brushfire_elemental.txt @@ -3,7 +3,7 @@ ManaCost:R G Types:Creature Elemental PT:1/1 K:Haste -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, Brushfire Elemental gets +2/+2 until end of turn. SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | NumDef$ 2 SVar:BuffedBy:Land diff --git a/forge-gui/res/cardsfolder/b/bulwark.txt b/forge-gui/res/cardsfolder/b/bulwark.txt index bde1e0518ce..acd010c78fe 100644 --- a/forge-gui/res/cardsfolder/b/bulwark.txt +++ b/forge-gui/res/cardsfolder/b/bulwark.txt @@ -4,7 +4,7 @@ Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ PsychicSlap | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, CARDNAME deals X damage to target opponent, where X is the number of cards in your hand minus the number of cards in that player's hand. SVar:PsychicSlap:DB$ DealDamage | ValidTgts$ Opponent | NumDmg$ X SVar:A:Count$InYourHand -SVar:B:Count$InOppHand +SVar:B:Count$InTargetedHand SVar:X:SVar$A/Minus.B AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/bulwark.jpg diff --git a/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt b/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt index a952186bbd2..e3039228f80 100644 --- a/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt +++ b/forge-gui/res/cardsfolder/b/burning_tree_bloodscale.txt @@ -3,8 +3,8 @@ ManaCost:2 R G Types:Creature Viashino Berserker PT:2/2 K:Bloodthirst:1 -A:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +A:AB$ Effect | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature that must block this creature this turn | SpellDescription$ Target creature blocks CARDNAME this turn if able. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/burning_tree_bloodscale.jpg Oracle:Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)\n{2}{R}: Target creature can't block Burning-Tree Bloodscale this turn.\n{2}{G}: Target creature blocks Burning-Tree Bloodscale this turn if able. diff --git a/forge-gui/res/cardsfolder/b/burrenton_forge_tender.txt b/forge-gui/res/cardsfolder/b/burrenton_forge_tender.txt index afdb16eaca5..8aa256cd5d5 100644 --- a/forge-gui/res/cardsfolder/b/burrenton_forge_tender.txt +++ b/forge-gui/res/cardsfolder/b/burrenton_forge_tender.txt @@ -5,7 +5,6 @@ PT:1/1 K:Protection from red A:AB$ ChooseSource | Cost$ Sac<1/CARDNAME> | Choices$ Card.RedSource | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a red source of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+RedSource | Prevent$ True | PreventionEffect$ True | Description$ Prevent all damage the chosen source would deal this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.ChosenCard+RedSource | Prevent$ True | Description$ Prevent all damage the chosen source would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/burrenton_forge_tender.jpg Oracle:Protection from red\nSacrifice Burrenton Forge-Tender: Prevent all damage a red source of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/burrog_befuddler.txt b/forge-gui/res/cardsfolder/b/burrog_befuddler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/burrog_befuddler.txt rename to forge-gui/res/cardsfolder/b/burrog_befuddler.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bury_in_books.txt b/forge-gui/res/cardsfolder/b/bury_in_books.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/bury_in_books.txt rename to forge-gui/res/cardsfolder/b/bury_in_books.txt diff --git a/forge-gui/res/cardsfolder/b/buzzing_whack_a_doodle.txt b/forge-gui/res/cardsfolder/b/buzzing_whack_a_doodle.txt index c01a4b5a5a9..10b736f40f0 100644 --- a/forge-gui/res/cardsfolder/b/buzzing_whack_a_doodle.txt +++ b/forge-gui/res/cardsfolder/b/buzzing_whack_a_doodle.txt @@ -9,9 +9,9 @@ SVar:YouDoodle:DB$ StoreSVar | SVar$ Doodles | Type$ Number | Expression$ 1 | Sp SVar:StoreYou:DB$ StoreSVar | SVar$ YouChose | Type$ CountSVar | Expression$ Doodles | SubAbility$ OppChoice SVar:OppChoice:DB$ GenericChoice | Choices$ AniWhack,OppDoodle | Defined$ Player.Chosen | AILogic$ Random | ShowChoice$ ExceptSelf SVar:OppDoodle:DB$ StoreSVar | SVar$ Doodles | Type$ CountSVar | Expression$ Doodles/Plus.1 | SubAbility$ AniBuzz | SpellDescription$ Doodle -SVar:AniWhack:DB$ Animate | Defined$ Self | Abilities$ ABWhack | Permanent$ True | SpellDescription$ Whack | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ0 | SubAbility$ AniBuzz -SVar:AniBuzz:DB$ Animate | Defined$ Self | Abilities$ ABBuzz | Permanent$ True | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ1 | SubAbility$ AniDoodle -SVar:AniDoodle:DB$ Animate | Defined$ Self | Abilities$ ABDoodle | Permanent$ True | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ2 | SubAbility$ NotifyWhack +SVar:AniWhack:DB$ Animate | Defined$ Self | Abilities$ ABWhack | Duration$ Permanent | SpellDescription$ Whack | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ0 | SubAbility$ AniBuzz +SVar:AniBuzz:DB$ Animate | Defined$ Self | Abilities$ ABBuzz | Duration$ Permanent | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ1 | SubAbility$ AniDoodle +SVar:AniDoodle:DB$ Animate | Defined$ Self | Abilities$ ABDoodle | Duration$ Permanent | ConditionCheckSVar$ Doodles | ConditionSVarCompare$ EQ2 | SubAbility$ NotifyWhack SVar:NotifyWhack:DB$ GenericChoice | Choices$ YouWhack | AtRandom$ True | Defined$ You | ShowChoice$ ExceptSelf | ConditionCheckSVar$ YouChose | ConditionSVarCompare$ EQ0 | SubAbility$ NotifyDoodle SVar:NotifyDoodle:DB$ GenericChoice | Choices$ YouDoodle | AtRandom$ True | Defined$ You | ShowChoice$ ExceptSelf | ConditionCheckSVar$ YouChose | ConditionSVarCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenPlayer$ True diff --git a/forge-gui/res/cardsfolder/upcoming/callous_bloodmage.txt b/forge-gui/res/cardsfolder/c/callous_bloodmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/callous_bloodmage.txt rename to forge-gui/res/cardsfolder/c/callous_bloodmage.txt diff --git a/forge-gui/res/cardsfolder/c/calming_licid.txt b/forge-gui/res/cardsfolder/c/calming_licid.txt index 51ac547bb14..93858b2c870 100644 --- a/forge-gui/res/cardsfolder/c/calming_licid.txt +++ b/forge-gui/res/cardsfolder/c/calming_licid.txt @@ -2,7 +2,7 @@ Name:Calming Licid ManaCost:2 W Types:Creature Licid PT:2/2 -A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ W | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. +A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ W | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Enchanted creature can't attack. diff --git a/forge-gui/res/cardsfolder/upcoming/campus_guide.txt b/forge-gui/res/cardsfolder/c/campus_guide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/campus_guide.txt rename to forge-gui/res/cardsfolder/c/campus_guide.txt diff --git a/forge-gui/res/cardsfolder/c/canal_courier.txt b/forge-gui/res/cardsfolder/c/canal_courier.txt index af151abfe71..df725907409 100644 --- a/forge-gui/res/cardsfolder/c/canal_courier.txt +++ b/forge-gui/res/cardsfolder/c/canal_courier.txt @@ -5,5 +5,5 @@ PT:3/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMonarch | TriggerDescription$ When CARDNAME enters the battlefield, you become the monarch. SVar:TrigMonarch:DB$ BecomeMonarch | Defined$ You T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | AttackDifferentPlayers$ True | TriggerDescription$ Whenever CARDNAME and another creature attack different players, CARDNAME can't be blocked this combat. -SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | UntilEndOfCombat$ True +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | Duration$ UntilEndOfCombat Oracle:When Canal Courier enters the battlefield, you become the monarch.\nWhenever Canal Courier and another creature attack different players, Canal Courier can't be blocked this combat. diff --git a/forge-gui/res/cardsfolder/c/capricious_efreet.txt b/forge-gui/res/cardsfolder/c/capricious_efreet.txt index a115b6aaade..6aca978daa1 100644 --- a/forge-gui/res/cardsfolder/c/capricious_efreet.txt +++ b/forge-gui/res/cardsfolder/c/capricious_efreet.txt @@ -3,7 +3,7 @@ ManaCost:4 R R Types:Creature Efreet PT:6/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of your upkeep, choose target nonland permanent you control and up to two target nonland permanents you don't control. Destroy one of them at random. -SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouCtrl | TgtPrompt$ Select target nonland permanent you control | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump | StackDescription$ None +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouCtrl | TgtPrompt$ Select target nonland permanent you control | Mandatory$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump | StackDescription$ None SVar:DBPump:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBPump2 | StackDescription$ None SVar:DBPump2:DB$ Pump | ValidTgts$ Permanent.nonLand+YouDontCtrl | TgtPrompt$ Select another target nonland permanent you don't control | TargetMin$ 0 | TargetMax$ 1 | TargetUnique$ True | RememberObjects$ Targeted | IsCurse$ True | SubAbility$ DBChooseRandom | StackDescription$ None SVar:DBChooseRandom:DB$ ChooseCard | Defined$ You | Amount$ 1 | AtRandom$ True | Choices$ Card.IsRemembered | SubAbility$ DBDestroy diff --git a/forge-gui/res/cardsfolder/c/captivating_vampire.txt b/forge-gui/res/cardsfolder/c/captivating_vampire.txt index b27c02cbfff..3dd4811df01 100644 --- a/forge-gui/res/cardsfolder/c/captivating_vampire.txt +++ b/forge-gui/res/cardsfolder/c/captivating_vampire.txt @@ -4,7 +4,7 @@ Types:Creature Vampire PT:2/2 S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Vampire creatures you control get +1/+1. A:AB$ GainControl | Cost$ tapXType<5/Vampire> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ Animate | SpellDescription$ Gain control of target creature. It becomes a Vampire in addition to its other types. -SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Permanent$ True +SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Duration$ Permanent AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/captivating_vampire.jpg Oracle:Other Vampire creatures you control get +1/+1.\nTap five untapped Vampires you control: Gain control of target creature. It becomes a Vampire in addition to its other types. diff --git a/forge-gui/res/cardsfolder/c/cast_out.txt b/forge-gui/res/cardsfolder/c/cast_out.txt index db42afe6f50..11266256ed5 100644 --- a/forge-gui/res/cardsfolder/c/cast_out.txt +++ b/forge-gui/res/cardsfolder/c/cast_out.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay K:Cycling:W SVar:OblivionRing:TRUE Oracle:Flash\nWhen Cast Out enters the battlefield, exile target nonland permanent an opponent controls until Cast Out leaves the battlefield.\nCycling {W} ({W}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/c/cauldron_dance.txt b/forge-gui/res/cardsfolder/c/cauldron_dance.txt index 063ff8af7a0..1bb07551c71 100644 --- a/forge-gui/res/cardsfolder/c/cauldron_dance.txt +++ b/forge-gui/res/cardsfolder/c/cauldron_dance.txt @@ -2,9 +2,9 @@ Name:Cauldron Dance ManaCost:4 B R Types:Instant A:SP$ ChangeZone | Cost$ 4 B R | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature from your graveyard | ActivationPhases$ BeginCombat->EndCombat | RememberChanged$ True | AILogic$ SurpriseBlock | SubAbility$ DBAnimate | SpellDescription$ Cast CARDNAME only during combat. Return target creature card from your graveyard to the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. You may put a creature card from your hand onto the battlefield. That creature gains haste. Its controller sacrifices it at the beginning of the next end step. -SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Permanent$ True | Defined$ Remembered | SubAbility$ DBChangeZone | AtEOT$ Hand +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Duration$ Permanent | Defined$ Remembered | SubAbility$ DBChangeZone | AtEOT$ Hand SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Battlefield | Optional$ You | ChangeType$ Creature | ChangeNum$ 1 | RememberChanged$ True | ForgetOtherRemembered$ True | SubAbility$ DBAnimate2 -SVar:DBAnimate2:DB$ Animate | Keywords$ Haste | Permanent$ True | Defined$ Remembered | SubAbility$ DBCleanup | AtEOT$ SacrificeCtrl +SVar:DBAnimate2:DB$ Animate | Keywords$ Haste | Duration$ Permanent | Defined$ Remembered | SubAbility$ DBCleanup | AtEOT$ SacrificeCtrl SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/cauldron_dance.jpg Oracle:Cast this spell only during combat.\nReturn target creature card from your graveyard to the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step.\nYou may put a creature card from your hand onto the battlefield. That creature gains haste. Its controller sacrifices it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/c/ceremonial_guard.txt b/forge-gui/res/cardsfolder/c/ceremonial_guard.txt index 25cf794c27a..f8f20f372d2 100644 --- a/forge-gui/res/cardsfolder/c/ceremonial_guard.txt +++ b/forge-gui/res/cardsfolder/c/ceremonial_guard.txt @@ -5,6 +5,5 @@ PT:3/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, destroy it at end of combat. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, destroy it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Destroy CARDNAME at end of combat. -SVar:TrigSacrifice:DB$ Destroy | Defined$ Self -SVar:Picture:http://www.wizards.com/global/images/magic/general/ceremonial_guard.jpg +SVar:TrigSacrifice:DB$ Destroy | Defined$ DelayTriggerRememberedLKI Oracle:When Ceremonial Guard attacks or blocks, destroy it at end of combat. diff --git a/forge-gui/res/cardsfolder/c/cetavolver.txt b/forge-gui/res/cardsfolder/c/cetavolver.txt index 1b803909d78..5005afba822 100644 --- a/forge-gui/res/cardsfolder/c/cetavolver.txt +++ b/forge-gui/res/cardsfolder/c/cetavolver.txt @@ -6,9 +6,9 @@ K:Kicker:1 R:G K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverSpeed | SpellDescription$ If CARDNAME was kicked with its {1}{R} kicker, it enters the battlefield with two +1/+1 counters on it and with first strike. -SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True +SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Duration$ Permanent SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {G} kicker, it enters the battlefield with a +1/+1 counter on it and with trample. -SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True +SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Duration$ Permanent AI:RemoveDeck:Random DeckNeeds:Color$Red|Green DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/c/chained_to_the_rocks.txt b/forge-gui/res/cardsfolder/c/chained_to_the_rocks.txt index c64fd52b790..1d224193301 100644 --- a/forge-gui/res/cardsfolder/c/chained_to_the_rocks.txt +++ b/forge-gui/res/cardsfolder/c/chained_to_the_rocks.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant Mountain you control A:SP$ Attach | Cost$ W | ValidTgts$ Mountain.YouCtrl | TgtPrompt$ Select target Mountain you control | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlay:Creature.OppCtrl Oracle:Enchant Mountain you control\nWhen Chained to the Rocks enters the battlefield, exile target creature an opponent controls until Chained to the Rocks leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/c/chainer_dementia_master.txt b/forge-gui/res/cardsfolder/c/chainer_dementia_master.txt index d3552564736..ebb5cefec4b 100644 --- a/forge-gui/res/cardsfolder/c/chainer_dementia_master.txt +++ b/forge-gui/res/cardsfolder/c/chainer_dementia_master.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Minion PT:3/3 S:Mode$ Continuous | Affected$ Creature.Nightmare | AddPower$ 1 | AddToughness$ 1 | Description$ Nightmare creatures get +1/+1. A:AB$ ChangeZone | Cost$ B B B PayLife<3> | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | ChangeNum$ 1 | AnimateSubAbility$ DBAnimate | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. That creature is black and is a Nightmare in addition to its other creature types. -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Nightmare | Colors$ Black | Permanent$ True | OverwriteColors$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Nightmare | Colors$ Black | Duration$ Permanent | OverwriteColors$ True T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, exile all Nightmares. SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Nightmare SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt b/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt index 87b8086aa84..d7aeca1001e 100644 --- a/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt +++ b/forge-gui/res/cardsfolder/c/chainer_nightmare_adept.txt @@ -6,5 +6,5 @@ A:AB$ Effect | Cost$ Discard<1/Card> | StaticAbilities$ STYardCast | ActivationL SVar:STYardCast:Mode$ Continuous | Affected$ Creature.nonLand+YouCtrl | MayPlay$ True | MayPlayLimit$ 1 | EffectZone$ Command | AffectedZone$ Graveyard AI:RemoveDeck:All T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+YouCtrl+wasNotCastFromHand | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever a nontoken creature enters the battlefield under your control, if you didn't cast it from your hand, it gains haste until your next turn. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | KW$ Haste | UntilYourNextTurn$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | KW$ Haste | Duration$ UntilYourNextTurn Oracle:Discard a card: You may cast a creature spell from your graveyard this turn. Activate only once each turn.\nWhenever a nontoken creature enters the battlefield under your control, if you didn't cast it from your hand, it gains haste until your next turn. diff --git a/forge-gui/res/cardsfolder/c/chance_for_glory.txt b/forge-gui/res/cardsfolder/c/chance_for_glory.txt index b777f82f540..e2825476aab 100644 --- a/forge-gui/res/cardsfolder/c/chance_for_glory.txt +++ b/forge-gui/res/cardsfolder/c/chance_for_glory.txt @@ -1,7 +1,7 @@ Name:Chance for Glory ManaCost:1 R W Types:Instant -A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | Permanent$ True | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible. +A:SP$ PumpAll | Cost$ 1 R W | ValidCards$ Creature.YouCtrl | KW$ Indestructible | Duration$ Permanent | SubAbility$ DBAddTurn | SpellDescription$ Creatures you control gain indestructible. SVar:DBAddTurn:DB$ AddTurn | NumTurns$ 1 | ExtraTurnDelayedTrigger$ DBDelTrig | ExtraTurnDelayedTriggerExcute$ TrigLose | SpellDescription$ Take an extra turn after this one. At the beginning of that turn's end step, you lose the game. SVar:DBDelTrig:ThisTurn$ True | Mode$ Phase | Phase$ End of Turn | TriggerDescription$ At the beginning of that turn's end step, you lose the game. SVar:TrigLose:DB$ LosesGame | Defined$ You diff --git a/forge-gui/res/cardsfolder/c/chandra_acolyte_of_flame.txt b/forge-gui/res/cardsfolder/c/chandra_acolyte_of_flame.txt index 171c4db794f..b52cd83b1ea 100644 --- a/forge-gui/res/cardsfolder/c/chandra_acolyte_of_flame.txt +++ b/forge-gui/res/cardsfolder/c/chandra_acolyte_of_flame.txt @@ -4,7 +4,7 @@ ManaCost:1 R R Loyalty:4 A:AB$ PutCounterAll | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidCards$ Planeswalker.YouCtrl+Red | CounterType$ LOYALTY | CounterNum$ 1 | SpellDescription$ Put a loyalty counter on each red planeswalker you control. A:AB$ Token | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | TokenAmount$ 2 | TokenScript$ r_1_1_elemental | TokenOwner$ You | LegacyImage$ r 1 1 elemental m20 | AtEOT$ Sacrifice | RememberTokens$ True | SubAbility$ DBPump | SpellDescription$ Create two 1/1 red Elemental creature tokens. They gain haste. Sacrifice them at the beginning of the next end step. -SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Permanent$ True | SubAbility$ DBCleanup +SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | AILogic$ CastFromGraveThisTurn | ValidTgts$ Instant.YouCtrl+cmcLE3,Sorcery.YouCtrl+cmcLE3 | TgtZone$ Graveyard | TgtPrompt$ Select target instant or sorcery card with mana cost 3 or less | RememberObjects$ Targeted | StaticAbilities$ Play | ExileOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may cast target instant or sorcery card with mana cost 3 or less from your graveyard this turn. If that card would be put into your graveyard this turn, exile it instead. SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play remembered card. diff --git a/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt b/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt index 53b0826c1d9..6e6952ed53c 100644 --- a/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt +++ b/forge-gui/res/cardsfolder/c/chandra_pyromaster.txt @@ -11,7 +11,7 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Pl SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Dig | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ You | DigNum$ 10 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBChoose | SpellDescription$ Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs. -SVar:DBChoose:DB$ ChooseCard | Choices$ Instant.IsRemembered,Sorcery.IsRemembered | ChoiceZone$ Exile | Defined$ You | SubAbility$ DBPlay +SVar:DBChoose:DB$ ChooseCard | Choices$ Instant.IsRemembered,Sorcery.IsRemembered | Mandatory$ True | ChoiceZone$ Exile | Defined$ You | SubAbility$ DBPlay SVar:DBPlay:DB$ Play | Defined$ ChosenCard | WithoutManaCost$ True | CopyCard$ True | Amount$ 3 | AllowRepeats$ True | Controller$ You | Optional$ True | SubAbility$ DBCleanup AI:RemoveDeck:All Oracle:[+1]: Chandra, Pyromaster deals 1 damage to target player or planeswalker and 1 damage to up to one target creature that player or that planeswalker's controller controls. That creature can't block this turn.\n[0]: Exile the top card of your library. You may play it this turn.\n[−7]: Exile the top ten cards of your library. Choose an instant or sorcery card exiled this way and copy it three times. You may cast the copies without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/c/chandras_incinerator.txt b/forge-gui/res/cardsfolder/c/chandras_incinerator.txt index 3b1b293a1d1..2b516889be5 100644 --- a/forge-gui/res/cardsfolder/c/chandras_incinerator.txt +++ b/forge-gui/res/cardsfolder/c/chandras_incinerator.txt @@ -3,7 +3,7 @@ ManaCost:5 R Types:Creature Elemental PT:6/6 S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {X} less to cast, where X is the total amount of noncombat damage dealt to your opponents this turn. -SVar:X:PlayerCountOpponents$NonCombatDamageDealtThisTurn +SVar:X:PlayerCountRegisteredOpponents$NonCombatDamageDealtThisTurn K:Trample T:Mode$ DamageDone | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Opponent | CombatDamage$ False | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever a source you control deals noncombat damage to an opponent, CARDNAME deals that much damage to target creature or planeswalker that player controls. SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker that player controls | TargetsWithDefinedController$ TriggeredTarget | NumDmg$ Y diff --git a/forge-gui/res/cardsfolder/c/chandras_revolution.txt b/forge-gui/res/cardsfolder/c/chandras_revolution.txt index d684aaa0ba6..662710108e1 100644 --- a/forge-gui/res/cardsfolder/c/chandras_revolution.txt +++ b/forge-gui/res/cardsfolder/c/chandras_revolution.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Sorcery A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 4 | SubAbility$ DBTapLand | SpellDescription$ CARDNAME deals 4 damage to target creature. Tap target land. That land doesn't untap during its controller's next untap step. SVar:DBTapLand:DB$ Tap | ValidTgts$ Land | TgtPrompt$ Choose target land | RememberTapped$ True | AlwaysRemember$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBCleanup +SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/chandras_revolution.jpg Oracle:Chandra's Revolution deals 4 damage to target creature. Tap target land. That land doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/c/channel_harm.txt b/forge-gui/res/cardsfolder/c/channel_harm.txt index 51a797e798a..5df6bd002e3 100644 --- a/forge-gui/res/cardsfolder/c/channel_harm.txt +++ b/forge-gui/res/cardsfolder/c/channel_harm.txt @@ -3,7 +3,6 @@ ManaCost:5 W Types:Instant A:SP$ Effect | Cost$ 5 W | ValidTgts$ Creature | ReplacementEffects$ ChannelHarmRep | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | AILogic$ Fog | SpellDescription$ Prevent all damage that would be dealt to you and permanents you control this turn by sources you don't control. If damage is prevented this way, you may have CARDNAME deal that much damage to target creature. SVar:ChannelHarmRep:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | ValidSource$ Card.YouDontCtrl,Emblem.YouDontCtrl | ReplaceWith$ DamageSourceInstead | PreventionEffect$ True | Description$ Prevent all damage that would be dealt to you and permanents you control this turn by sources you don't control. If damage is prevented this way, you may have EFFECTHOST deal that much damage to target creature. -SVar:DamageSourceInstead:DB$ DealDamage | NumDmg$ X | Defined$ Remembered | DamageSouce$ EffectSource | OptionalDecider$ You +SVar:DamageSourceInstead:DB$ DealDamage | NumDmg$ X | Defined$ Remembered | DamageSource$ EffectSource | OptionalDecider$ You SVar:X:ReplaceCount$DamageAmount -SVar:Picture:http://www.wizards.com/global/images/magic/general/channel_harm.jpg Oracle:Prevent all damage that would be dealt to you and permanents you control this turn by sources you don't control. If damage is prevented this way, you may have Channel Harm deal that much damage to target creature. diff --git a/forge-gui/res/cardsfolder/c/chaoslace.txt b/forge-gui/res/cardsfolder/c/chaoslace.txt index 9cd8c931421..5a6f39876c7 100644 --- a/forge-gui/res/cardsfolder/c/chaoslace.txt +++ b/forge-gui/res/cardsfolder/c/chaoslace.txt @@ -1,7 +1,7 @@ Name:Chaoslace ManaCost:R Types:Instant -A:SP$ Animate | Cost$ R | Colors$ Red | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes red. (Mana symbols on that permanent remain unchanged.) +A:SP$ Animate | Cost$ R | Colors$ Red | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes red. (Mana symbols on that permanent remain unchanged.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chaoslace.jpg diff --git a/forge-gui/res/cardsfolder/c/chaosphere.txt b/forge-gui/res/cardsfolder/c/chaosphere.txt index 9b7a469aa81..a03dd7198c1 100644 --- a/forge-gui/res/cardsfolder/c/chaosphere.txt +++ b/forge-gui/res/cardsfolder/c/chaosphere.txt @@ -1,10 +1,9 @@ Name:Chaosphere ManaCost:2 R Types:World Enchantment -S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME can block only creatures with flying. | Description$ Creatures with flying can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.withFlying | Description$ Creatures with flying can block only creatures with flying. S:Mode$ Continuous | Affected$ Creature.withoutFlying | AddKeyword$ Reach | Description$ Creatures without flying have reach. (They can block creatures with flying.) SVar:NonStackingEffect:True SVar:PlayMain1:TRUE AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/chaosphere.jpg Oracle:Creatures with flying can block only creatures with flying.\nCreatures without flying have reach. (They can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/upcoming/charge_through.txt b/forge-gui/res/cardsfolder/c/charge_through.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/charge_through.txt rename to forge-gui/res/cardsfolder/c/charge_through.txt diff --git a/forge-gui/res/cardsfolder/c/cherished_hatchling.txt b/forge-gui/res/cardsfolder/c/cherished_hatchling.txt index 240cfdf6f64..2a745a41cfd 100644 --- a/forge-gui/res/cardsfolder/c/cherished_hatchling.txt +++ b/forge-gui/res/cardsfolder/c/cherished_hatchling.txt @@ -6,7 +6,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ SVar:TrigEffect:DB$ Effect | Name$ Cherished Hatchling Effect | StaticAbilities$ STFlash | Triggers$ HatchlingCast SVar:STFlash:Mode$ Continuous | EffectZone$ Command | Affected$ Dinosaur.nonToken+YouCtrl | MayPlay$ True | MayPlayCardOwner$ True | MayPlayWithFlash$ True | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Library,Exile | Description$ You may cast Dinosaur spells this turn as though they had flash. SVar:HatchlingCast:Mode$ SpellCast | ValidCard$ Dinosaur | ValidActivatingPlayer$ You | Execute$ TrigHatchlingAnimate | TriggerZones$ Command | TriggerDescription$ Whenever you cast a Dinosaur spell this turn, it gains "When this creature enters the battlefield, you may have it fight another target creature." -SVar:TrigHatchlingAnimate:DB$ Animate | Defined$ TriggeredCard | Permanent$ True | Triggers$ TrigETBHatchling | sVars$ HatchlingFight +SVar:TrigHatchlingAnimate:DB$ Animate | Defined$ TriggeredCard | Duration$ Permanent | Triggers$ TrigETBHatchling | sVars$ HatchlingFight SVar:TrigETBHatchling:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ HatchlingFight | OptionalDecider$ You | TriggerDescription$ When this creature enters the battlefield, you may have it fight another target creature. SVar:HatchlingFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature DeckHints:Type$Dinosaur diff --git a/forge-gui/res/cardsfolder/c/chillbringer.txt b/forge-gui/res/cardsfolder/c/chillbringer.txt index d7b4facc2b4..a1721dcd781 100644 --- a/forge-gui/res/cardsfolder/c/chillbringer.txt +++ b/forge-gui/res/cardsfolder/c/chillbringer.txt @@ -5,6 +5,6 @@ PT:3/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE Oracle:Flying\nWhen Chillbringer enters the battlefield, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/c/chilling_grasp.txt b/forge-gui/res/cardsfolder/c/chilling_grasp.txt index 354844e9992..26f504c1f5d 100644 --- a/forge-gui/res/cardsfolder/c/chilling_grasp.txt +++ b/forge-gui/res/cardsfolder/c/chilling_grasp.txt @@ -2,7 +2,7 @@ Name:Chilling Grasp ManaCost:2 U Types:Instant A:SP$ Tap | Cost$ 2 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent K:Madness:3 U DeckHints:Ability$Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/chilling_grasp.jpg diff --git a/forge-gui/res/cardsfolder/c/chimeric_coils.txt b/forge-gui/res/cardsfolder/c/chimeric_coils.txt index c41020c7a77..35b7673ab82 100644 --- a/forge-gui/res/cardsfolder/c/chimeric_coils.txt +++ b/forge-gui/res/cardsfolder/c/chimeric_coils.txt @@ -1,7 +1,7 @@ Name:Chimeric Coils ManaCost:1 Types:Artifact -A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | AtEOT$ Sacrifice | Permanent$ True | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. +A:AB$ Animate | Cost$ X 1 | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Artifact,Construct | AtEOT$ Sacrifice | Duration$ Permanent | SpellDescription$ CARDNAME becomes an X/X Construct artifact creature. Sacrifice it at the beginning of the next end step. SVar:X:Count$xPaid AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/chimeric_coils.jpg diff --git a/forge-gui/res/cardsfolder/c/cinder_marsh.txt b/forge-gui/res/cardsfolder/c/cinder_marsh.txt index 0994b986575..967a9d97d93 100644 --- a/forge-gui/res/cardsfolder/c/cinder_marsh.txt +++ b/forge-gui/res/cardsfolder/c/cinder_marsh.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ DBStayTapped | SpellDescription$ Add {B}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ DBStayTapped | SpellDescription$ Add {R}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {B} or {R}. Cinder Marsh doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt b/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt index 7dc5b62035c..9bd8f7f1fde 100644 --- a/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt +++ b/forge-gui/res/cardsfolder/c/circle_of_protection_shadow.txt @@ -1,12 +1,11 @@ Name:Circle of Protection: Shadow ManaCost:1 W Types:Enchantment -A:AB$ ChooseCard | Cost$ 1 | Choices$ Creature.withShadow | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. +A:AB$ ChooseCard | Cost$ 1 | Choices$ Creature.withShadow | AILogic$ NeedsPrevention | Mandatory$ True | SubAbility$ DBEffect | SpellDescription$ The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromCreature | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:RPreventNextFromCreature:Event$ DamageDone | ValidSource$ Card.ChosenCard+withShadow | ValidTarget$ You | ReplaceWith$ ExileEffect | PreventionEffect$ True | Description$ The next time a creature of your choice with shadow would deal damage to you, prevent that damage. SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/circle_of_protection_shadow.jpg Oracle:{1}: The next time a creature of your choice with shadow would deal damage to you this turn, prevent that damage. diff --git a/forge-gui/res/cardsfolder/c/citadel_siege.txt b/forge-gui/res/cardsfolder/c/citadel_siege.txt index 7576b7d6d59..c4351d94d77 100644 --- a/forge-gui/res/cardsfolder/c/citadel_siege.txt +++ b/forge-gui/res/cardsfolder/c/citadel_siege.txt @@ -3,10 +3,10 @@ ManaCost:2 W W Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Khans or Dragons. Khans — At the beginning of combat on your turn, put two +1/+1 counters on target creature you control. Dragons — At the beginning of combat on each opponent's turn, tap target creature that player controls. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Khans,Dragons | Defined$ You | SetChosenMode$ True | AILogic$ Dragons | ShowChoice$ ExceptSelf -SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Permanent$ True | SpellDescription$ Khans +SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Duration$ Permanent | SpellDescription$ Khans SVar:KhansTrigger:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ Boost | TriggerDescription$ At the beginning of combat on your turn, put two +1/+1 counters on target creature you control. SVar:Boost:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 2 -SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Permanent$ True | SpellDescription$ Dragons +SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Duration$ Permanent | SpellDescription$ Dragons SVar:DragonsTrigger:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | ValidPlayer$ Opponent | Execute$ TapCreature | TriggerDescription$ At the beginning of combat on each opponent's turn, tap target creature that player controls. SVar:TapCreature:DB$ Tap | ValidTgts$ Creature.ActivePlayerCtrl | TgtPrompt$ Choose target creature the active player controls. SVar:Picture:http://www.wizards.com/global/images/magic/general/citadel_siege.jpg diff --git a/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt b/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt index 1b1034af96d..f68431217da 100644 --- a/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt +++ b/forge-gui/res/cardsfolder/c/city_in_a_bottle.txt @@ -1,7 +1,7 @@ Name:City in a Bottle ManaCost:2 Types:Artifact -T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.nontoken+setARN+Other | Execute$ TrigSac | TriggerDescription$ Whenever one or more other nontoken permanents with a name originally printed in the Arabian Nights expansion are on the battlefield, their controllers sacrifice them. +T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.nonToken+setARN+Other | Execute$ TrigSac | TriggerDescription$ Whenever one or more other nontoken permanents with a name originally printed in the Arabian Nights expansion are on the battlefield, their controllers sacrifice them. SVar:TrigSac:DB$ SacrificeAll | ValidCards$ Permanent.nontoken+setARN+Other S:Mode$ CantPlayLand | ValidCard$ Card.setARN | Description$ Players can't cast spells or play lands with a name originally printed in the Arabian Nights expansion. S:Mode$ CantBeCast | ValidCard$ Card.setARN diff --git a/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt b/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt index 6bf52e86834..7599ed0c7cd 100644 --- a/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt +++ b/forge-gui/res/cardsfolder/c/cleric_of_chill_depths.txt @@ -3,5 +3,5 @@ ManaCost:1 U Types:Creature Merfolk Cleric PT:1/3 T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent Oracle:Whenever Cleric of Chill Depths blocks a creature, that creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/clever_lumimancer.txt b/forge-gui/res/cardsfolder/c/clever_lumimancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/clever_lumimancer.txt rename to forge-gui/res/cardsfolder/c/clever_lumimancer.txt diff --git a/forge-gui/res/cardsfolder/c/clinging_mists.txt b/forge-gui/res/cardsfolder/c/clinging_mists.txt index 9423a5b4c72..f63a7c9600d 100644 --- a/forge-gui/res/cardsfolder/c/clinging_mists.txt +++ b/forge-gui/res/cardsfolder/c/clinging_mists.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Instant A:SP$ Fog | Cost$ 2 G | SubAbility$ DBTapAll | SpellDescription$ Prevent all combat damage that would be dealt this turn. Fateful hour — If you have 5 or less life, tap all attacking creatures. Those creatures don't untap during their controllers next untap step. SVar:DBTapAll:DB$ TapAll | Cost$ 1 G G | ValidCards$ Creature.attacking | SubAbility$ DBPumpAll | ConditionCheckSVar$ FatefulHour | ConditionSVarCompare$ LE5 -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | ConditionCheckSVar$ FatefulHour | ConditionSVarCompare$ LE5 +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | ConditionCheckSVar$ FatefulHour | ConditionSVarCompare$ LE5 SVar:FatefulHour:Count$YourLifeTotal SVar:Picture:http://www.wizards.com/global/images/magic/general/clinging_mists.jpg Oracle:Prevent all combat damage that would be dealt this turn.\nFateful hour — If you have 5 or less life, tap all attacking creatures. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/c/clockwork_steed.txt b/forge-gui/res/cardsfolder/c/clockwork_steed.txt index 0001f3f52e6..709e9e5e860 100644 --- a/forge-gui/res/cardsfolder/c/clockwork_steed.txt +++ b/forge-gui/res/cardsfolder/c/clockwork_steed.txt @@ -3,10 +3,9 @@ ManaCost:4 Types:Artifact Creature Horse PT:0/3 K:etbCounter:P1P0:4 -K:CantBeBlockedBy Artifact.Creature +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Artifact.Creature | Description$ CARDNAME can't be blocked by artifact creatures. T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | IsPresent$ Card.Self+attackedThisCombat,Card.Self+blockedThisCombat | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At end of combat, if CARDNAME attacked or blocked this combat, remove a +1/+0 counter from it. SVar:TrigSubCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P0 | CounterNum$ 1 A:AB$ PutCounter | Cost$ X T | Defined$ Self | UpTo$ True | MaxFromEffect$ 4 | CounterType$ P1P0 | CounterNum$ X | ActivationPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Put up to X +1/+0 counters on CARDNAME. This ability can't cause the total number of +1/+0 counters on CARDNAME to be greater than four. Activate only during your upkeep. SVar:X:Count$xPaid -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_steed.jpg Oracle:Clockwork Steed enters the battlefield with four +1/+0 counters on it.\nClockwork Steed can't be blocked by artifact creatures.\nAt end of combat, if Clockwork Steed attacked or blocked this combat, remove a +1/+0 counter from it.\n{X}, {T}: Put up to X +1/+0 counters on Clockwork Steed. This ability can't cause the total number of +1/+0 counters on Clockwork Steed to be greater than four. Activate only during your upkeep. diff --git a/forge-gui/res/cardsfolder/c/clockwork_swarm.txt b/forge-gui/res/cardsfolder/c/clockwork_swarm.txt index b266dfd9894..ffbf4abe8af 100644 --- a/forge-gui/res/cardsfolder/c/clockwork_swarm.txt +++ b/forge-gui/res/cardsfolder/c/clockwork_swarm.txt @@ -3,10 +3,9 @@ ManaCost:4 Types:Artifact Creature Insect PT:0/3 K:etbCounter:P1P0:4 -K:CantBeBlockedBy Creature.Wall +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Wall | Description$ CARDNAME can't be blocked by Walls. T:Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | IsPresent$ Card.Self+attackedThisCombat,Card.Self+blockedThisCombat | TriggerZones$ Battlefield | Execute$ TrigSubCounter | TriggerDescription$ At end of combat, if CARDNAME attacked or blocked this combat, remove a +1/+0 counter from it. SVar:TrigSubCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P0 | CounterNum$ 1 A:AB$ PutCounter | Cost$ X T | Defined$ Self | UpTo$ True | MaxFromEffect$ 4 | CounterType$ P1P0 | CounterNum$ X | ActivationPhases$ Upkeep | PlayerTurn$ True | SpellDescription$ Put up to X +1/+0 counters on CARDNAME. This ability can't cause the total number of +1/+0 counters on CARDNAME to be greater than four. Activate only during your upkeep. SVar:X:Count$xPaid -SVar:Picture:http://www.wizards.com/global/images/magic/general/clockwork_swarm.jpg -Oracle:Clockwork Swarm enters the battlefield with four +1/+0 counters on it.\nClockwork Swarm can't be blocked by Walls.\nAt end of combat, if Clockwork Swarm attacked or blocked this combat, remove a +1/+0 counter from it.\n{X}, {T}: Put up to X +1/+0 counters on Clockwork Swarm. This ability can't cause the total number of +1/+0 counters on Clockwork Swarm to be greater than four. Activate only during your upkeep. +Oracle:Clockwork Swarm enters the battlefield with four +1/+0 counters on it.\nClockwork Swarm can't be blocked by Walls.\nAt end of combat, if Clockwork Swarm attacked or blocked this combat, remove a +1/+0 counter from it.\n{X}, {T}: Put up to X +1/+0 counters on Clockwork Swarm. This ability can't cause the total number of +1/+0 counters on Clockwork Swarm to be greater than four. Activate only during your upkeep. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/closing_statement.txt b/forge-gui/res/cardsfolder/c/closing_statement.txt similarity index 86% rename from forge-gui/res/cardsfolder/upcoming/closing_statement.txt rename to forge-gui/res/cardsfolder/c/closing_statement.txt index 6e266464f78..e69cb3c424c 100644 --- a/forge-gui/res/cardsfolder/upcoming/closing_statement.txt +++ b/forge-gui/res/cardsfolder/c/closing_statement.txt @@ -3,6 +3,6 @@ ManaCost:3 W B Types:Instant S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | Phases$ End of Turn | PlayerTurn$ You | EffectZone$ All | Description$ This spell costs {2} less to cast during your end step. A:SP$ Destroy | Cost$ 3 W B | ValidTgts$ Creature.YouDontCtrl,Planeswalker.YouDontCtrl | TgtPrompt$ Select target creature or planeswalker you don't control | SubAbility$ DBPutCounter | SpellDescription$ Destroy target creature or planeswalker you don't control. Put a +1/+1 counter on up to one target creature you control. -SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to one target creature you don't control | TargetMin$ 0 | TargetMax$ 1 | CounterType$ P1P1 | CounterNum$ 1 +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to one target creature you control | TargetMin$ 0 | TargetMax$ 1 | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters Oracle:This spell costs {2} less to cast during your end step.\nDestroy target creature or planeswalker you don't control. Put a +1/+1 counter on up to one target creature you control. diff --git a/forge-gui/res/cardsfolder/c/cloud_djinn.txt b/forge-gui/res/cardsfolder/c/cloud_djinn.txt index 51c116fe3eb..e31b21e3ce6 100644 --- a/forge-gui/res/cardsfolder/c/cloud_djinn.txt +++ b/forge-gui/res/cardsfolder/c/cloud_djinn.txt @@ -3,6 +3,5 @@ ManaCost:5 U Types:Creature Djinn PT:5/4 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_djinn.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nCloud Djinn can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloud_dragon.txt b/forge-gui/res/cardsfolder/c/cloud_dragon.txt index d53385ac720..37ba6a4e8df 100644 --- a/forge-gui/res/cardsfolder/c/cloud_dragon.txt +++ b/forge-gui/res/cardsfolder/c/cloud_dragon.txt @@ -3,6 +3,5 @@ ManaCost:5 U Types:Creature Illusion Dragon PT:5/4 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_dragon.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nCloud Dragon can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloud_elemental.txt b/forge-gui/res/cardsfolder/c/cloud_elemental.txt index 606206363cc..e087a0ffd9f 100644 --- a/forge-gui/res/cardsfolder/c/cloud_elemental.txt +++ b/forge-gui/res/cardsfolder/c/cloud_elemental.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Elemental PT:2/3 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_elemental.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nCloud Elemental can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloud_pirates.txt b/forge-gui/res/cardsfolder/c/cloud_pirates.txt index 48845bb8f47..6a5b9af4fc5 100644 --- a/forge-gui/res/cardsfolder/c/cloud_pirates.txt +++ b/forge-gui/res/cardsfolder/c/cloud_pirates.txt @@ -3,6 +3,5 @@ ManaCost:U Types:Creature Human Pirate PT:1/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_pirates.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nCloud Pirates can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloud_spirit.txt b/forge-gui/res/cardsfolder/c/cloud_spirit.txt index 6da3b0a2d47..f75a275dcf1 100644 --- a/forge-gui/res/cardsfolder/c/cloud_spirit.txt +++ b/forge-gui/res/cardsfolder/c/cloud_spirit.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Spirit PT:3/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_spirit.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nCloud Spirit can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloud_sprite.txt b/forge-gui/res/cardsfolder/c/cloud_sprite.txt index 438a7ea17e3..14b66b34a82 100644 --- a/forge-gui/res/cardsfolder/c/cloud_sprite.txt +++ b/forge-gui/res/cardsfolder/c/cloud_sprite.txt @@ -3,6 +3,5 @@ ManaCost:U Types:Creature Faerie PT:1/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/cloud_sprite.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nCloud Sprite can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/c/cloudcrest_lake.txt b/forge-gui/res/cardsfolder/c/cloudcrest_lake.txt index c78999ee13c..1881681f44a 100644 --- a/forge-gui/res/cardsfolder/c/cloudcrest_lake.txt +++ b/forge-gui/res/cardsfolder/c/cloudcrest_lake.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ DBStayTapped | SpellDescription$ Add {W}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ DBStayTapped | SpellDescription$ Add {U}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {W} or {U}. Cloudcrest Lake doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/c/cloudform.txt b/forge-gui/res/cardsfolder/c/cloudform.txt index e443c56fdf6..d706a75f68b 100644 --- a/forge-gui/res/cardsfolder/c/cloudform.txt +++ b/forge-gui/res/cardsfolder/c/cloudform.txt @@ -3,7 +3,7 @@ ManaCost:1 U U Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigManifest | TriggerDescription$ When CARDNAME enters the battlefield, it becomes an Aura with enchant creature. Manifest the top card of your library and attach CARDNAME to it. (To manifest a card, put it onto the battlefield face down as a 2/2 creature. You may turn it face up at any time for its mana cost if it's a creature card.) SVar:TrigManifest:DB$ Manifest | Amount$ 1 | Defined$ TopOfLibrary | RememberManifested$ True | SubAbility$ Aurify -SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Permanent$ True | SubAbility$ RageformAttach +SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Duration$ Permanent | SubAbility$ RageformAttach SVar:NewAttach:SP$ Attach | Cost$ 1 U U | ValidTgts$ Creature | AILogic$ Pump SVar:RageformAttach:DB$ Attach | Defined$ Remembered | IsPresent$ Card.Self S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying & Hexproof | Description$ Enchanted creature has flying and hexproof. diff --git a/forge-gui/res/cardsfolder/c/clutch_of_undeath.txt b/forge-gui/res/cardsfolder/c/clutch_of_undeath.txt index 58aeb70876a..8d688464af9 100644 --- a/forge-gui/res/cardsfolder/c/clutch_of_undeath.txt +++ b/forge-gui/res/cardsfolder/c/clutch_of_undeath.txt @@ -2,9 +2,8 @@ Name:Clutch of Undeath ManaCost:3 B B Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 3 B B | ValidTgts$ Creature | AILogic$ SpecificCard +A:SP$ Attach | Cost$ 3 B B | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Zombie S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Zombie | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3 as long as it's a Zombie. Otherwise, it gets -3/-3. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonZombie | AddPower$ -3 | AddToughness$ -3 DeckNeeds:Type$Zombie -SVar:Picture:http://www.wizards.com/global/images/magic/general/clutch_of_undeath.jpg Oracle:Enchant creature\nEnchanted creature gets +3/+3 as long as it's a Zombie. Otherwise, it gets -3/-3. diff --git a/forge-gui/res/cardsfolder/c/cocoon.txt b/forge-gui/res/cardsfolder/c/cocoon.txt index 8022b901a2c..f7a2aa47093 100644 --- a/forge-gui/res/cardsfolder/c/cocoon.txt +++ b/forge-gui/res/cardsfolder/c/cocoon.txt @@ -11,7 +11,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ PUPA | CounterNum$ 1 | RememberRemoved$ True | SubAbility$ TrigPutCounter # TODO need EnchantedLKI because it isn't enchanted anymore if this is sacrificed SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | SubAbility$ TrigPump -SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Flying | Permanent$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | SubAbility$ TrigSac +SVar:TrigPump:DB$ Pump | Defined$ Enchanted | KW$ Flying | Duration$ Permanent | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | SubAbility$ TrigSac SVar:TrigSac:DB$ Sacrifice | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ LE0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize diff --git a/forge-gui/res/cardsfolder/c/code_of_constraint.txt b/forge-gui/res/cardsfolder/c/code_of_constraint.txt index 3c915c898cc..a43c8b3c7a4 100644 --- a/forge-gui/res/cardsfolder/c/code_of_constraint.txt +++ b/forge-gui/res/cardsfolder/c/code_of_constraint.txt @@ -4,6 +4,6 @@ Types:Instant A:SP$ Pump | Cost$ 2 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -4 | IsCurse$ True | SubAbility$ DBDraw | SpellDescription$ Target creature gets -4/-0 until end of turn. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. | SubAbility$ DBAddendum SVar:DBAddendum:DB$ Tap | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | SubAbility$ DBPump | SpellDescription$ Addendum - If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | ConditionPlayerTurn$ True | ConditionPhases$ Main1,Main2 | ConditionDefined$ Self | ConditionPresent$ Card.wasCast | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE Oracle:Target creature gets -4/-0 until end of turn.\nDraw a card.\nAddendum — If you cast this spell during your main phase, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/codie_vociferous_codex.txt b/forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/codie_vociferous_codex.txt rename to forge-gui/res/cardsfolder/c/codie_vociferous_codex.txt diff --git a/forge-gui/res/cardsfolder/c/coerced_confession.txt b/forge-gui/res/cardsfolder/c/coerced_confession.txt index b22b5f7da8f..47c791278a3 100644 --- a/forge-gui/res/cardsfolder/c/coerced_confession.txt +++ b/forge-gui/res/cardsfolder/c/coerced_confession.txt @@ -4,5 +4,5 @@ Types:Sorcery A:SP$ Mill | Cost$ 4 UB | NumCards$ 4 | ValidTgts$ Player | TgtPrompt$ Choose a player | RememberMilled$ True | SubAbility$ DBDraw | SpellDescription$ Target player mills four cards. You draw a card for each creature card put into a graveyard this way. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$Valid Creature +SVar:X:Remembered$Valid Creature.inZoneGraveyard Oracle:Target player mills four cards. You draw a card for each creature card put into their graveyard this way. diff --git a/forge-gui/res/cardsfolder/upcoming/cogwork_archivist.txt b/forge-gui/res/cardsfolder/c/cogwork_archivist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cogwork_archivist.txt rename to forge-gui/res/cardsfolder/c/cogwork_archivist.txt diff --git a/forge-gui/res/cardsfolder/c/colossal_whale.txt b/forge-gui/res/cardsfolder/c/colossal_whale.txt index 00339b4e9b7..5c77c785382 100644 --- a/forge-gui/res/cardsfolder/c/colossal_whale.txt +++ b/forge-gui/res/cardsfolder/c/colossal_whale.txt @@ -4,6 +4,6 @@ Types:Creature Whale PT:5/5 K:Islandwalk T:Mode$ Attacks | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may exile target creature defending player controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player control | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.DefenderCtrl | TgtPrompt$ Select target creature defending player control | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:Islandwalk (This creature can't be blocked as long as defending player controls an Island.)\nWhenever Colossal Whale attacks, you may exile target creature defending player controls until Colossal Whale leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/upcoming/combat_calligrapher.txt b/forge-gui/res/cardsfolder/c/combat_calligrapher.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/combat_calligrapher.txt rename to forge-gui/res/cardsfolder/c/combat_calligrapher.txt diff --git a/forge-gui/res/cardsfolder/upcoming/combat_professor.txt b/forge-gui/res/cardsfolder/c/combat_professor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/combat_professor.txt rename to forge-gui/res/cardsfolder/c/combat_professor.txt diff --git a/forge-gui/res/cardsfolder/c/comeuppance.txt b/forge-gui/res/cardsfolder/c/comeuppance.txt index 0a121ba70a7..04408ffb0ec 100644 --- a/forge-gui/res/cardsfolder/c/comeuppance.txt +++ b/forge-gui/res/cardsfolder/c/comeuppance.txt @@ -2,9 +2,8 @@ Name:Comeuppance ManaCost:3 W Types:Instant A:SP$ Effect | Cost$ 3 W | ReplacementEffects$ RPrevent -SVar:RPrevent:Event$ DamageDone | ValidSource$ Card.YouDontCtrl,Emblem.YouDontCtrl | ValidTarget$ You,Planeswalker.YouCtrl | ReplaceWith$ DamageCreature | PreventionEffect$ True | Description$ Prevent all damage that would be dealt to you and planeswalkers you control this turn by sources you don't control. If damage from a creature source is prevented this way, CARDNAME deals that much damage to that creature. If damage from a noncreature source is prevented this way, CARDNAME deals that much damage to the source's controller. +SVar:RPrevent:Event$ DamageDone | ValidSource$ Card.YouDontCtrl,Emblem.YouDontCtrl | ValidTarget$ You,Planeswalker.YouCtrl | ReplaceWith$ DamageCreature | PreventionEffect$ True | ExecuteMode$ PerSource | Description$ Prevent all damage that would be dealt to you and planeswalkers you control this turn by sources you don't control. If damage from a creature source is prevented this way, CARDNAME deals that much damage to that creature. If damage from a noncreature source is prevented this way, CARDNAME deals that much damage to the source's controller. SVar:DamageCreature:DB$ DealDamage | Defined$ ReplacedSource | DamageSource$ EffectSource | NumDmg$ X | ConditionDefined$ ReplacedSource | ConditionPresent$ Card.Creature | ConditionCompare$ GE1 | SubAbility$ DamageNonCreature SVar:DamageNonCreature:DB$ DealDamage | Defined$ ReplacedSourceController | DamageSource$ EffectSource | NumDmg$ X | ConditionDefined$ ReplacedSource | ConditionPresent$ Card.nonCreature | ConditionCompare$ GE1 SVar:X:ReplaceCount$DamageAmount -SVar:Picture:http://www.wizards.com/global/images/magic/general/comeuppance.jpg Oracle:Prevent all damage that would be dealt to you and planeswalkers you control this turn by sources you don't control. If damage from a creature source is prevented this way, Comeuppance deals that much damage to that creature. If damage from a noncreature source is prevented this way, Comeuppance deals that much damage to the source's controller. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/commanders_insight.txt b/forge-gui/res/cardsfolder/c/commanders_insight.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/commanders_insight.txt rename to forge-gui/res/cardsfolder/c/commanders_insight.txt diff --git a/forge-gui/res/cardsfolder/c/conclave_tribunal.txt b/forge-gui/res/cardsfolder/c/conclave_tribunal.txt index b2d008c2c74..f573e5d1953 100644 --- a/forge-gui/res/cardsfolder/c/conclave_tribunal.txt +++ b/forge-gui/res/cardsfolder/c/conclave_tribunal.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Enchantment K:Convoke T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:OblivionRing:TRUE Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nWhen Conclave Tribunal enters the battlefield, exile target nonland permanent an opponent controls until Conclave Tribunal leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/c/conflagrate.txt b/forge-gui/res/cardsfolder/c/conflagrate.txt index 8e4d1a5a424..c137e495ebd 100644 --- a/forge-gui/res/cardsfolder/c/conflagrate.txt +++ b/forge-gui/res/cardsfolder/c/conflagrate.txt @@ -1,10 +1,9 @@ Name:Conflagrate ManaCost:X X R Types:Sorcery -A:SP$ DealDamage | Cost$ X X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ X | TargetMin$ Min | TargetMax$ MaxTgts | DividedAsYouChoose$ X | SpellDescription$ CARDNAME deals X damage divided as you choose among any number of targets. +A:SP$ DealDamage | Cost$ X X R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to distribute damage to | NumDmg$ X | TargetMin$ 1 | TargetMax$ MaxTgts | DividedAsYouChoose$ X | SpellDescription$ CARDNAME deals X damage divided as you choose among any number of targets. SVar:MaxTgts:PlayerCountPlayers$Amount/Plus.NumCreatures SVar:NumCreatures:Count$Valid Creature,Planeswalker -SVar:Min:SVar$X/LimitMax.1 SVar:X:Count$xPaid K:Flashback:R R Discard Oracle:Conflagrate deals X damage divided as you choose among any number of targets.\nFlashback—{R}{R}, Discard X cards. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/confront_the_past.txt b/forge-gui/res/cardsfolder/c/confront_the_past.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/confront_the_past.txt rename to forge-gui/res/cardsfolder/c/confront_the_past.txt diff --git a/forge-gui/res/cardsfolder/upcoming/conspiracy_theorist.txt b/forge-gui/res/cardsfolder/c/conspiracy_theorist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/conspiracy_theorist.txt rename to forge-gui/res/cardsfolder/c/conspiracy_theorist.txt diff --git a/forge-gui/res/cardsfolder/c/consulate_crackdown.txt b/forge-gui/res/cardsfolder/c/consulate_crackdown.txt index fab8c3a93a8..c51f7d8d92d 100644 --- a/forge-gui/res/cardsfolder/c/consulate_crackdown.txt +++ b/forge-gui/res/cardsfolder/c/consulate_crackdown.txt @@ -2,7 +2,7 @@ Name:Consulate Crackdown ManaCost:3 W W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile all artifacts your opponents control until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Artifact.OppCtrl | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Artifact.OppCtrl | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlayVar:Z GE2 SVar:Z:Count$Valid Artifact.OppCtrl diff --git a/forge-gui/res/cardsfolder/upcoming/containment_breach.txt b/forge-gui/res/cardsfolder/c/containment_breach.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/containment_breach.txt rename to forge-gui/res/cardsfolder/c/containment_breach.txt diff --git a/forge-gui/res/cardsfolder/c/convulsing_licid.txt b/forge-gui/res/cardsfolder/c/convulsing_licid.txt index eaf41cd513d..a973225a6b7 100644 --- a/forge-gui/res/cardsfolder/c/convulsing_licid.txt +++ b/forge-gui/res/cardsfolder/c/convulsing_licid.txt @@ -2,7 +2,7 @@ Name:Convulsing Licid ManaCost:2 R Types:Creature Licid PT:2/2 -A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ R | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. +A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ R | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't block. | Description$ Enchanted creature can't block. diff --git a/forge-gui/res/cardsfolder/c/corrupting_licid.txt b/forge-gui/res/cardsfolder/c/corrupting_licid.txt index 7eb796b8153..4c9aa417d92 100644 --- a/forge-gui/res/cardsfolder/c/corrupting_licid.txt +++ b/forge-gui/res/cardsfolder/c/corrupting_licid.txt @@ -2,7 +2,7 @@ Name:Corrupting Licid ManaCost:2 B Types:Creature Licid PT:2/2 -A:AB$ Animate | Cost$ B T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ B | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. +A:AB$ Animate | Cost$ B T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ B | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Fear | Description$ Enchanted creature has fear. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/c/cosima_god_of_the_voyage_the_omenkeel.txt b/forge-gui/res/cardsfolder/c/cosima_god_of_the_voyage_the_omenkeel.txt index 726f70bc991..c1f7c178abc 100644 --- a/forge-gui/res/cardsfolder/c/cosima_god_of_the_voyage_the_omenkeel.txt +++ b/forge-gui/res/cardsfolder/c/cosima_god_of_the_voyage_the_omenkeel.txt @@ -4,7 +4,7 @@ Types:Legendary Creature God PT:2/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigExile | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may exile NICKNAME. If you do, it gains "Whenever a land enters the battlefield under your control, if Cosima is exiled, you may put a voyage counter on it. If you don't, return Cosima to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it." SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Triggers$ LandEnter | Permanent$ True | sVars$ TrigReturn,DBDraw,X | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Triggers$ LandEnter | Duration$ Permanent | sVars$ TrigReturn,DBDraw,X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:LandEnter:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | TriggerZones$ Exile | ValidCard$ Land.YouCtrl | Execute$ TrigAddCounter | TriggerDescription$ Whenever a land enters the battlefield under your control, if NICKNAME is exiled, you may put a voyage counter on it. If you don't, return NICKNAME to the battlefield with X +1/+1 counters on it and draw X cards, where X is the number of voyage counters on it. SVar:TrigAddCounter:DB$ PutCounter | Optional$ True | Defined$ Self | CounterType$ VOYAGE | CounterNum$ 1 | RememberAmount$ True | SubAbility$ DBReturn diff --git a/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt b/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt index 6665ffae4f4..0f83b0cff5d 100644 --- a/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt +++ b/forge-gui/res/cardsfolder/c/cosmotronic_wave.txt @@ -1,7 +1,7 @@ Name:Cosmotronic Wave ManaCost:3 R Types:Sorcery -A:SP$ DamageAll | Cost$ 3 R | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SubAbility$ CantBlock | SpellDescription$ CARDNAME deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. -SVar:CantBlock:DB$ Effect | Name$ Cosmotronic Wave Effect | StaticAbilities$ KWPump | SpellDescription$ Creatures your opponents control can't block this turn. -SVar:KWPump:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.OppCtrl | AddHiddenKeyword$ CARDNAME can't block. | Description$ Creatures your opponents control can't block this turn. +A:SP$ DamageAll | Cost$ 3 R | ValidCards$ Creature.OppCtrl | NumDmg$ 1 | SubAbility$ OppCantBlock | SpellDescription$ CARDNAME deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. +SVar:OppCantBlock:DB$ Effect | Name$ Cosmotronic Wave Effect | StaticAbilities$ KWPump | SpellDescription$ Creatures your opponents control can't block this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidBlocker$ Creature.OppCtrl | Description$ Creatures your opponents control can't block this turn. Oracle:Cosmotronic Wave deals 1 damage to each creature your opponents control. Creatures your opponents control can't block this turn. diff --git a/forge-gui/res/cardsfolder/c/council_guardian.txt b/forge-gui/res/cardsfolder/c/council_guardian.txt index 87540f7e1c0..d064e6120e7 100644 --- a/forge-gui/res/cardsfolder/c/council_guardian.txt +++ b/forge-gui/res/cardsfolder/c/council_guardian.txt @@ -4,9 +4,9 @@ Types:Creature Giant Soldier PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigVote | TriggerDescription$ Will of the Council — When CARDNAME enters the battlefield, starting with you, each player votes for blue, black, red, or green. CARDNAME gains protection from each color with the most votes or tied for most votes. SVar:TrigVote:DB$ Vote | Defined$ Player | VoteRed$ PumpRed | VoteGreen$ PumpGreen | VoteBlack$ PumpBlack | VoteBlue$ PumpBlue | VoteType$ Blue,Black,Red,Green | AILogic$ Protection -SVar:PumpRed:DB$ Pump | KW$ Protection from red | Permanent$ True | Defined$ Self -SVar:PumpGreen:DB$ Pump | KW$ Protection from green | Permanent$ True | Defined$ Self -SVar:PumpBlack:DB$ Pump | KW$ Protection from black | Permanent$ True | Defined$ Self -SVar:PumpBlue:DB$ Pump | KW$ Protection from blue | Permanent$ True | Defined$ Self +SVar:PumpRed:DB$ Pump | KW$ Protection from red | Duration$ Permanent | Defined$ Self +SVar:PumpGreen:DB$ Pump | KW$ Protection from green | Duration$ Permanent | Defined$ Self +SVar:PumpBlack:DB$ Pump | KW$ Protection from black | Duration$ Permanent | Defined$ Self +SVar:PumpBlue:DB$ Pump | KW$ Protection from blue | Duration$ Permanent | Defined$ Self SVar:Picture:http://www.wizards.com/global/images/magic/general/council_guardian.jpg Oracle:Will of the council — When Council Guardian enters the battlefield, starting with you, each player votes for blue, black, red, or green. Council Guardian gains protection from each color with the most votes or tied for most votes. diff --git a/forge-gui/res/cardsfolder/c/counterbore.txt b/forge-gui/res/cardsfolder/c/counterbore.txt index 516abe1c826..7750374e72c 100644 --- a/forge-gui/res/cardsfolder/c/counterbore.txt +++ b/forge-gui/res/cardsfolder/c/counterbore.txt @@ -1,12 +1,11 @@ Name:Counterbore ManaCost:3 U U Types:Instant -A:SP$ Counter | Cost$ 3 U U | TargetType$ Spell | ValidTgts$ Card | RememberCountered$ True | ForgetOtherTargets$ True | SubAbility$ ExileYard | SpellDescription$ Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. -SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ Remembered.sameName | SubAbility$ ExileHand | StackDescription$ None -SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None -SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | SubAbility$ DBCleanup | StackDescription$ None +A:SP$ Counter | Cost$ 3 U U | TargetType$ Spell | ValidTgts$ Card | SubAbility$ ExileYard | SpellDescription$ Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. +SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ TargetedCard.sameName | SubAbility$ ExileHand | StackDescription$ None +SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None +SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | StackDescription$ None SVar:NumInHand:TargetedController$CardsInHand SVar:NumInLib:TargetedController$CardsInLibrary -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/counterbore.jpg Oracle:Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. diff --git a/forge-gui/res/cardsfolder/c/cover_of_winter.txt b/forge-gui/res/cardsfolder/c/cover_of_winter.txt index ec4afab7142..4e80c2d938d 100644 --- a/forge-gui/res/cardsfolder/c/cover_of_winter.txt +++ b/forge-gui/res/cardsfolder/c/cover_of_winter.txt @@ -2,8 +2,8 @@ Name:Cover of Winter ManaCost:2 W Types:Snow Enchantment K:Cumulative upkeep:S -S:Mode$ PreventDamage | Target$ You,Creature.YouCtrl | Source$ Creature | CombatDamage$ True | Amount$ X | Description$ If a creature would deal combat damage to you and/or one or more creatures you control, prevent X of that damage, where X is the number of age counters on CARDNAME. -A:AB$ PutCounter | Cost$ S | CounterType$ AGE | CounterNum$ 1 | SpellDescription$ Put a age counter on CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Creature.YouCtrl | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a creature would deal combat damage to you and/or one or more creatures you control, prevent X of that damage, where X is the number of age counters on CARDNAME. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ X +A:AB$ PutCounter | Cost$ S | CounterType$ AGE | CounterNum$ 1 | SpellDescription$ Put an age counter on CARDNAME. SVar:X:Count$CardCounters.AGE -SVar:Picture:http://www.wizards.com/global/images/magic/general/cover_of_winter.jpg Oracle:Cumulative upkeep {S} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it. {S} can be paid with one mana from a snow source.)\nIf a creature would deal combat damage to you and/or one or more creatures you control, prevent X of that damage, where X is the number of age counters on Cover of Winter.\n{S}: Put an age counter on Cover of Winter. diff --git a/forge-gui/res/cardsfolder/upcoming/crackle_with_power.txt b/forge-gui/res/cardsfolder/c/crackle_with_power.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/crackle_with_power.txt rename to forge-gui/res/cardsfolder/c/crackle_with_power.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cram_session.txt b/forge-gui/res/cardsfolder/c/cram_session.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cram_session.txt rename to forge-gui/res/cardsfolder/c/cram_session.txt diff --git a/forge-gui/res/cardsfolder/c/crawling_barrens.txt b/forge-gui/res/cardsfolder/c/crawling_barrens.txt index ad52fcdec67..9da7187f82f 100755 --- a/forge-gui/res/cardsfolder/c/crawling_barrens.txt +++ b/forge-gui/res/cardsfolder/c/crawling_barrens.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ PutCounter | Cost$ 4 | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBAnimate | AILogic$ CrawlingBarrens | SpellDescription$ Put two +1/+1 counters on CARDNAME. Then you may have it become a 0/0 Elemental creature until end of turn. It's still a land. -SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Optional$ True +SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Optional$ True | StackDescription$ Then you may have it become a 0/0 Elemental creature until end of turn. It's still a land. DeckHas:Ability$Counters Oracle:{T}: Add {C}.\n{4}: Put two +1/+1 counters on Crawling Barrens. Then you may have it become a 0/0 Elemental creature until end of turn. It's still a land. diff --git a/forge-gui/res/cardsfolder/upcoming/creative_outburst.txt b/forge-gui/res/cardsfolder/c/creative_outburst.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/creative_outburst.txt rename to forge-gui/res/cardsfolder/c/creative_outburst.txt diff --git a/forge-gui/res/cardsfolder/upcoming/creative_technique.txt b/forge-gui/res/cardsfolder/c/creative_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/creative_technique.txt rename to forge-gui/res/cardsfolder/c/creative_technique.txt diff --git a/forge-gui/res/cardsfolder/c/crippling_chill.txt b/forge-gui/res/cardsfolder/c/crippling_chill.txt index 9c7f23b4198..db7c8fac8fb 100644 --- a/forge-gui/res/cardsfolder/c/crippling_chill.txt +++ b/forge-gui/res/cardsfolder/c/crippling_chill.txt @@ -2,7 +2,7 @@ Name:Crippling Chill ManaCost:2 U Types:Instant A:SP$ Tap | Cost$ 2 U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBDraw +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Picture:http://www.wizards.com/global/images/magic/general/crippling_chill.jpg Oracle:Tap target creature. It doesn't untap during its controller's next untap step.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/c/crumbling_colossus.txt b/forge-gui/res/cardsfolder/c/crumbling_colossus.txt index f9353a8df4a..f2c0d1ddf87 100644 --- a/forge-gui/res/cardsfolder/c/crumbling_colossus.txt +++ b/forge-gui/res/cardsfolder/c/crumbling_colossus.txt @@ -5,7 +5,6 @@ PT:7/4 K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ When CARDNAME attacks, sacrifice it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$ Sacrifice | Defined$ Self +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/crumbling_colossus.jpg Oracle:Trample (This creature can deal excess combat damage to the player or planeswalker it's attacking.)\nWhen Crumbling Colossus attacks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt b/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt index 143802ee2e9..1239600c16f 100644 --- a/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt +++ b/forge-gui/res/cardsfolder/c/crumbling_sanctuary.txt @@ -1,7 +1,7 @@ Name:Crumbling Sanctuary ManaCost:5 Types:Artifact -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Player | ReplaceWith$ ExileTop | PreventionEffect$ True | Description$ If damage would be dealt to a player, that player exiles that many cards from the top of their library instead. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Player | ReplaceWith$ ExileTop | ExecuteMode$ PerTarget | Description$ If damage would be dealt to a player, that player exiles that many cards from the top of their library instead. SVar:ExileTop:DB$ Dig | Defined$ ReplacedTarget | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile SVar:X:ReplaceCount$DamageAmount SVar:NonStackingEffect:True diff --git a/forge-gui/res/cardsfolder/c/crush_underfoot.txt b/forge-gui/res/cardsfolder/c/crush_underfoot.txt index d5f048d6860..6317421f4af 100644 --- a/forge-gui/res/cardsfolder/c/crush_underfoot.txt +++ b/forge-gui/res/cardsfolder/c/crush_underfoot.txt @@ -1,10 +1,9 @@ Name:Crush Underfoot ManaCost:1 R Types:Tribal Instant Giant -A:SP$ ChooseCard | Cost$ 1 R | Defined$ You | Amount$ 1 | Choices$ Creature.Giant+YouCtrl | ChoiceTitle$ Choose a Giant creature you control | RememberChosen$ True | SubAbility$ DBDmg | SpellDescription$ Choose a Giant creature you control. It deals damage equal to its power to target creature. +A:SP$ ChooseCard | Cost$ 1 R | Defined$ You | Mandatory$ True | Choices$ Creature.Giant+YouCtrl | ChoiceTitle$ Choose a Giant creature you control | RememberChosen$ True | SubAbility$ DBDmg | SpellDescription$ Choose a Giant creature you control. It deals damage equal to its power to target creature. SVar:DBDmg:DB$ DealDamage | NumDmg$ X | DamageSource$ Remembered | ValidTgts$ Creature | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Remembered$CardPower AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/crush_underfoot.jpg Oracle:Choose a Giant creature you control. It deals damage equal to its power to target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/crushing_disappointment.txt b/forge-gui/res/cardsfolder/c/crushing_disappointment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/crushing_disappointment.txt rename to forge-gui/res/cardsfolder/c/crushing_disappointment.txt diff --git a/forge-gui/res/cardsfolder/upcoming/culling_ritual.txt b/forge-gui/res/cardsfolder/c/culling_ritual.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/culling_ritual.txt rename to forge-gui/res/cardsfolder/c/culling_ritual.txt diff --git a/forge-gui/res/cardsfolder/upcoming/culmination_of_studies.txt b/forge-gui/res/cardsfolder/c/culmination_of_studies.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/culmination_of_studies.txt rename to forge-gui/res/cardsfolder/c/culmination_of_studies.txt diff --git a/forge-gui/res/cardsfolder/c/cunning.txt b/forge-gui/res/cardsfolder/c/cunning.txt index 10a4ac8365e..d15ccf941c4 100644 --- a/forge-gui/res/cardsfolder/c/cunning.txt +++ b/forge-gui/res/cardsfolder/c/cunning.txt @@ -5,8 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3. T:Mode$ Attacks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ DelayedTrig | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice CARDNAME at the beginning of the next cleanup step. -T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield| Execute$ DelayedTrig | Secondary$ True | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice CARDNAME at the beginning of the next cleanup step. -SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Player | Execute$ TrigSac | TriggerDescription$ Sacrifice CARDNAME. -SVar:TrigSac:DB$Sacrifice | Defined$ Self -SVar:Picture:http://www.wizards.com/global/images/magic/general/cunning.jpg +T:Mode$ Blocks | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ DelayedTrig | Secondary$ True | TriggerDescription$ When enchanted creature attacks or blocks, sacrifice CARDNAME at the beginning of the next cleanup step. +SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Cleanup | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME. +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI Oracle:Enchant creature\nEnchanted creature gets +3/+3.\nWhen enchanted creature attacks or blocks, sacrifice Cunning at the beginning of the next cleanup step. diff --git a/forge-gui/res/cardsfolder/upcoming/cunning_rhetoric.txt b/forge-gui/res/cardsfolder/c/cunning_rhetoric.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cunning_rhetoric.txt rename to forge-gui/res/cardsfolder/c/cunning_rhetoric.txt diff --git a/forge-gui/res/cardsfolder/upcoming/curate.txt b/forge-gui/res/cardsfolder/c/curate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/curate.txt rename to forge-gui/res/cardsfolder/c/curate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/curiosity_crafter.txt b/forge-gui/res/cardsfolder/c/curiosity_crafter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/curiosity_crafter.txt rename to forge-gui/res/cardsfolder/c/curiosity_crafter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cursed_mirror.txt b/forge-gui/res/cardsfolder/c/cursed_mirror.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/cursed_mirror.txt rename to forge-gui/res/cardsfolder/c/cursed_mirror.txt diff --git a/forge-gui/res/cardsfolder/c/cursed_scroll.txt b/forge-gui/res/cardsfolder/c/cursed_scroll.txt index 1d64b72e84f..aeb77d0a223 100644 --- a/forge-gui/res/cardsfolder/c/cursed_scroll.txt +++ b/forge-gui/res/cardsfolder/c/cursed_scroll.txt @@ -6,5 +6,4 @@ SVar:DBReveal:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ You SVar:DBDamage:DB$ DealDamage | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PreferredHandSize:1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/cursed_scroll.jpg Oracle:{3}, {T}: Choose a card name, then reveal a card at random from your hand. If that card has the chosen name, Cursed Scroll deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/c/cycle_of_life.txt b/forge-gui/res/cardsfolder/c/cycle_of_life.txt index 0642fc1f012..c948735db8b 100644 --- a/forge-gui/res/cardsfolder/c/cycle_of_life.txt +++ b/forge-gui/res/cardsfolder/c/cycle_of_life.txt @@ -1,7 +1,7 @@ Name:Cycle of Life ManaCost:1 G G Types:Enchantment -A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.ThisTurnCast+YouOwn | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | UntilYourNextUpkeep$ True | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature. +A:AB$ Animate | Cost$ Return<1/CARDNAME> | ValidTgts$ Creature.ThisTurnCast+YouOwn | TgtPrompt$ Select target creature you cast this turn | Power$ 0 | Toughness$ 1 | Duration$ UntilYourNextUpkeep | SubAbility$ DelTrig | SpellDescription$ Target creature you cast this turn has base power and toughness 0/1 until your next upkeep. At the beginning of your next upkeep, put a +1/+1 counter on that creature. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | RememberObjects$ Targeted | Execute$ TrigGrowth | TriggerDescription$ Put a +1/+1 counter on that creature. SVar:TrigGrowth:DB$ PutCounter | Defined$ DelayTriggerRemembered | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/cycle_of_life.jpg diff --git a/forge-gui/res/cardsfolder/c/cyclone_sire.txt b/forge-gui/res/cardsfolder/c/cyclone_sire.txt index 65c581f8235..58211204084 100644 --- a/forge-gui/res/cardsfolder/c/cyclone_sire.txt +++ b/forge-gui/res/cardsfolder/c/cyclone_sire.txt @@ -5,6 +5,6 @@ PT:3/4 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclone_sire.jpg Oracle:Flying\nWhen Cyclone Sire dies, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/cardsfolder/c/cyclopean_giant.txt b/forge-gui/res/cardsfolder/c/cyclopean_giant.txt index 9e32a5ec9e5..d51ebce81ae 100644 --- a/forge-gui/res/cardsfolder/c/cyclopean_giant.txt +++ b/forge-gui/res/cardsfolder/c/cyclopean_giant.txt @@ -3,6 +3,6 @@ ManaCost:2 B B Types:Creature Zombie Giant PT:4/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigAnimate | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, target land becomes a Swamp. Exile CARDNAME. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | Permanent$ True | SubAbility$ DBExile | SpellDescription$ Target land becomes a Swamp. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | Duration$ Permanent | SubAbility$ DBExile | SpellDescription$ Target land becomes a Swamp. SVar:DBExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile Oracle:When Cyclopean Giant dies, target land becomes a Swamp. Exile Cyclopean Giant. diff --git a/forge-gui/res/cardsfolder/c/cyclopean_titan.txt b/forge-gui/res/cardsfolder/c/cyclopean_titan.txt index 7bba19ee41f..0fc901f2a3c 100644 --- a/forge-gui/res/cardsfolder/c/cyclopean_titan.txt +++ b/forge-gui/res/cardsfolder/c/cyclopean_titan.txt @@ -3,7 +3,7 @@ ManaCost:4 B B B B Types:Creature Zombie Giant PT:4/2 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigAnimate | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, two target lands becomes Swamps. Exile CARDNAME. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select two target lands | Types$ Swamp | RemoveLandTypes$ True | Permanent$ True | SubAbility$ DBExile +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TargetMin$ 2 | TargetMax$ 2 | TgtPrompt$ Select two target lands | Types$ Swamp | RemoveLandTypes$ True | Duration$ Permanent | SubAbility$ DBExile SVar:DBExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile A:AB$ Tap | Cost$ 3 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Tap target creature, then return CARDNAME to its owner's hand. | SubAbility$ DBBounce SVar:DBBounce:DB$ChangeZone | Origin$ Battlefield | Destination$ Hand diff --git a/forge-gui/res/cardsfolder/c/cyclops_tyrant.txt b/forge-gui/res/cardsfolder/c/cyclops_tyrant.txt index 2498acc742a..fa7f506d586 100644 --- a/forge-gui/res/cardsfolder/c/cyclops_tyrant.txt +++ b/forge-gui/res/cardsfolder/c/cyclops_tyrant.txt @@ -2,7 +2,6 @@ Name:Cyclops Tyrant ManaCost:5 R Types:Creature Cyclops PT:3/4 -K:CantBlock Creature.powerLE2:creatures with power 2 or less +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerLE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or less. K:Intimidate -SVar:Picture:http://www.wizards.com/global/images/magic/general/cyclops_tyrant.jpg Oracle:Intimidate (This creature can't be blocked except by artifact creatures and/or creatures that share a color with it.)\nCyclops Tyrant can't block creatures with power 2 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/daemogoth_titan.txt b/forge-gui/res/cardsfolder/d/daemogoth_titan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/daemogoth_titan.txt rename to forge-gui/res/cardsfolder/d/daemogoth_titan.txt diff --git a/forge-gui/res/cardsfolder/upcoming/daemogoth_woe_eater.txt b/forge-gui/res/cardsfolder/d/daemogoth_woe_eater.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/daemogoth_woe_eater.txt rename to forge-gui/res/cardsfolder/d/daemogoth_woe_eater.txt diff --git a/forge-gui/res/cardsfolder/d/dance_of_the_dead.txt b/forge-gui/res/cardsfolder/d/dance_of_the_dead.txt index d6383569b01..16ca1607863 100644 --- a/forge-gui/res/cardsfolder/d/dance_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/dance_of_the_dead.txt @@ -5,7 +5,7 @@ K:Enchant creature card in a graveyard A:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature | TgtZone$ Graveyard | AILogic$ Reanimate T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReanimate | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it loses "enchant creature card in a graveyard" and gains "enchant creature put onto the battlefield with CARDNAME." Put enchanted creature card onto the battlefield tapped under your control and attach CARDNAME to it. SVar:TrigReanimate:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Enchanted | RememberChanged$ True | GainControl$ True | Tapped$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Permanent$ True | SubAbility$ DBAttach +SVar:DBAnimate:DB$ Animate | Defined$ Self | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | RemoveKeywords$ Enchant creature card in a graveyard | Duration$ Permanent | SubAbility$ DBAttach SVar:DBAttach:DB$ Attach | Defined$ Remembered SVar:NewAttach:SP$ Attach | Cost$ 1 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSacrifice | TriggerDescription$ When CARDNAME leaves the battlefield, that creature's controller sacrifices it. diff --git a/forge-gui/res/cardsfolder/d/dance_of_the_manse.txt b/forge-gui/res/cardsfolder/d/dance_of_the_manse.txt index c1c32a6cb9a..a8f2b16cc9c 100644 --- a/forge-gui/res/cardsfolder/d/dance_of_the_manse.txt +++ b/forge-gui/res/cardsfolder/d/dance_of_the_manse.txt @@ -2,7 +2,7 @@ Name:Dance of the Manse ManaCost:X W U Types:Sorcery A:SP$ ChangeZone | Cost$ X W U | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Artifact.cmcLEX+YouOwn,Enchantment.cmcLEX+YouOwn+nonAura | TgtPrompt$ Select target artifact or non-Aura enchantment in your graveyard | TargetMin$ 0 | TargetMax$ X | AnimateSubAbility$ DBAnimate | SpellDescription$ Return up to X target artifact and/or non-Aura enchantment cards with mana value X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Creature | Power$ 4 | Toughness$ 4 | Permanent$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE6 +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Creature | Power$ 4 | Toughness$ 4 | Duration$ Permanent | ConditionCheckSVar$ X | ConditionSVarCompare$ GE6 SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:Return up to X target artifact and/or non-Aura enchantment cards each with mana value X or less from your graveyard to the battlefield. If X is 6 or more, those permanents are 4/4 creatures in addition to their other types. diff --git a/forge-gui/res/cardsfolder/d/dark_sphere.txt b/forge-gui/res/cardsfolder/d/dark_sphere.txt index a726fab6935..63586e6adf4 100644 --- a/forge-gui/res/cardsfolder/d/dark_sphere.txt +++ b/forge-gui/res/cardsfolder/d/dark_sphere.txt @@ -2,9 +2,9 @@ Name:Dark Sphere ManaCost:0 Types:Artifact A:AB$ ChooseSource | Cost$ T Sac<1/CARDNAME> | Choices$ Card | RememberChosen$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage to you this turn, prevent half that damage, rounded down. -SVar:DBEffect:DB$ Effect | Triggers$ DamageDealt | StaticAbilities$ StaticPrevent | RememberObjects$ Remembered -SVar:StaticPrevent:Mode$ PreventDamage | Source$ Card.IsRemembered | Target$ You | Amount$ HalfDown | EffectZone$ Command | Description$ The next time a source of your choice would deal damage to you this turn, prevent half that damage, rounded down. -SVar:DamageDealt:Mode$ DamageDone | ValidSource$ Card.IsRemembered | ValidTarget$ You | Execute$ ExileEffect | Static$ True +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | ReplacementEffects$ DBPrevent | ForgetOnMoved$ Battlefield +SVar:DBPrevent:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.IsRemembered | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ The next time a source of your choice would deal damage to you this turn, prevent half that damage, rounded down. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ ShieldAmount | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -SVar:Picture:http://www.wizards.com/global/images/magic/general/dark_sphere.jpg +SVar:ShieldAmount:ReplaceCount$DamageAmount/HalfDown Oracle:{T}, Sacrifice Dark Sphere: The next time a source of your choice would deal damage to you this turn, prevent half that damage, rounded down. diff --git a/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt b/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt index 6fed75a368c..75008e3bd93 100644 --- a/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt +++ b/forge-gui/res/cardsfolder/d/daughter_of_autumn.txt @@ -2,7 +2,7 @@ Name:Daughter of Autumn ManaCost:2 G G Types:Legendary Creature Avatar PT:2/4 -A:AB$ Effect | Cost$ W | Name$ Daughter of Autumn's Effect | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature to redirect damage from | ReplacementEffects$ DamageEvent | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target white creature this turn is dealt to CARDNAME instead. +A:AB$ Effect | Cost$ W | Name$ Daughter of Autumn's Effect | ValidTgts$ Creature.White | TgtPrompt$ Select target white creature to redirect damage from | ReplacementEffects$ DamageEvent | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target white creature this turn is dealt to CARDNAME instead. SVar:DamageEvent:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ EffectSource | Description$ The next 1 damage that would be dealt to target white creature this turn is dealt to EFFECTSOURCE instead. SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ EffectSource AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/d/daunting_defender.txt b/forge-gui/res/cardsfolder/d/daunting_defender.txt index 75d16e14362..c9bc6ebda52 100644 --- a/forge-gui/res/cardsfolder/d/daunting_defender.txt +++ b/forge-gui/res/cardsfolder/d/daunting_defender.txt @@ -1,7 +1,7 @@ Name:Daunting Defender ManaCost:4 W Types:Creature Human Cleric -S:Mode$ PreventDamage | Target$ Creature.Cleric+YouCtrl | Amount$ 1 | Description$ If a source would deal damage to a Cleric creature you control, prevent 1 of that damage. PT:3/3 -SVar:Picture:http://www.wizards.com/global/images/magic/general/daunting_defender.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Creature.Cleric+YouCtrl | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to a Cleric creature you control, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:If a source would deal damage to a Cleric creature you control, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/d/dauthi_horror.txt b/forge-gui/res/cardsfolder/d/dauthi_horror.txt index 24c775413c4..d6036a3e3f5 100644 --- a/forge-gui/res/cardsfolder/d/dauthi_horror.txt +++ b/forge-gui/res/cardsfolder/d/dauthi_horror.txt @@ -3,6 +3,5 @@ ManaCost:1 B Types:Creature Dauthi Horror PT:2/1 K:Shadow -K:CantBeBlockedBy Creature.White -SVar:Picture:http://www.wizards.com/global/images/magic/general/dauthi_horror.jpg -Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nDauthi Horror can't be blocked by white creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.White | Description$ CARDNAME can't be blocked by white creatures. +Oracle:Shadow (This creature can block or be blocked by only creatures with shadow.)\nDauthi Horror can't be blocked by white creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt b/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt index e1a364c368d..4d6b81031fb 100644 --- a/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt +++ b/forge-gui/res/cardsfolder/d/daxos_of_meletis.txt @@ -2,7 +2,7 @@ Name:Daxos of Meletis ManaCost:1 W U Types:Legendary Creature Human Soldier PT:2/2 -K:CantBeBlockedBy Creature.powerGE3 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE3 | Description$ CARDNAME can't be blocked by creatures with power 3 or greater. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, exile the top card of that player's library. You gain life equal to that card's mana value. Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. SVar:TrigExile:DB$ Dig | Defined$ TriggeredTarget | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBEffect diff --git a/forge-gui/res/cardsfolder/upcoming/dazzling_sphinx.txt b/forge-gui/res/cardsfolder/d/dazzling_sphinx.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dazzling_sphinx.txt rename to forge-gui/res/cardsfolder/d/dazzling_sphinx.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deadly_brew.txt b/forge-gui/res/cardsfolder/d/deadly_brew.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/deadly_brew.txt rename to forge-gui/res/cardsfolder/d/deadly_brew.txt diff --git a/forge-gui/res/cardsfolder/d/deathcult_rogue.txt b/forge-gui/res/cardsfolder/d/deathcult_rogue.txt index c6bba48423d..46b9206a489 100644 --- a/forge-gui/res/cardsfolder/d/deathcult_rogue.txt +++ b/forge-gui/res/cardsfolder/d/deathcult_rogue.txt @@ -2,6 +2,5 @@ Name:Deathcult Rogue ManaCost:1 UB UB Types:Creature Human Rogue PT:2/2 -K:CantBeBlockedBy Creature.nonRogue -SVar:Picture:http://www.wizards.com/global/images/magic/general/deathcult_rogue.jpg -Oracle:Deathcult Rogue can't be blocked except by Rogues. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonRogue | Description$ CARDNAME can't be blocked except by Rogues. +Oracle:Deathcult Rogue can't be blocked except by Rogues. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/deathlace.txt b/forge-gui/res/cardsfolder/d/deathlace.txt index 4694f14af75..cee9071e65a 100644 --- a/forge-gui/res/cardsfolder/d/deathlace.txt +++ b/forge-gui/res/cardsfolder/d/deathlace.txt @@ -1,7 +1,7 @@ Name:Deathlace ManaCost:B Types:Instant -A:SP$ Animate | Cost$ B | Colors$ Black | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes black. (Mana symbols on that permanent remain unchanged.) +A:SP$ Animate | Cost$ B | Colors$ Black | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes black. (Mana symbols on that permanent remain unchanged.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/deathlace.jpg diff --git a/forge-gui/res/cardsfolder/d/decision_paralysis.txt b/forge-gui/res/cardsfolder/d/decision_paralysis.txt index 4b777a85bc6..1df74310661 100644 --- a/forge-gui/res/cardsfolder/d/decision_paralysis.txt +++ b/forge-gui/res/cardsfolder/d/decision_paralysis.txt @@ -2,6 +2,6 @@ Name:Decision Paralysis ManaCost:3 U Types:Instant A:SP$ Tap | Cost$ 3 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/decision_paralysis.jpg Oracle:Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/decisive_denial.txt b/forge-gui/res/cardsfolder/d/decisive_denial.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/decisive_denial.txt rename to forge-gui/res/cardsfolder/d/decisive_denial.txt diff --git a/forge-gui/res/cardsfolder/upcoming/deekah_fractal_theorist.txt b/forge-gui/res/cardsfolder/d/deekah_fractal_theorist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/deekah_fractal_theorist.txt rename to forge-gui/res/cardsfolder/d/deekah_fractal_theorist.txt diff --git a/forge-gui/res/cardsfolder/d/deep_spawn.txt b/forge-gui/res/cardsfolder/d/deep_spawn.txt index 76689936bec..5c0ec910f20 100644 --- a/forge-gui/res/cardsfolder/d/deep_spawn.txt +++ b/forge-gui/res/cardsfolder/d/deep_spawn.txt @@ -5,6 +5,6 @@ PT:6/6 K:Trample K:UpkeepCost:Mill<2> A:AB$ Pump | Cost$ U | Defined$ Self | KW$ Shroud | SubAbility$ DBPump | SpellDescription$ CARDNAME gains shroud until end of turn and doesn't untap during your next untap step. Tap CARDNAME. (A permanent with shroud can't be the target of spells or abilities.) -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBTap +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBTap SVar:DBTap:DB$ Tap | Defined$ Self Oracle:Trample\nAt the beginning of your upkeep, sacrifice Deep Spawn unless you mill two cards.\n{U}: Deep Spawn gains shroud until end of turn and doesn't untap during your next untap step. Tap Deep Spawn. (A creature with shroud can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/d/deep_water.txt b/forge-gui/res/cardsfolder/d/deep_water.txt index 8c300df12bd..1048cd1c09e 100644 --- a/forge-gui/res/cardsfolder/d/deep_water.txt +++ b/forge-gui/res/cardsfolder/d/deep_water.txt @@ -2,7 +2,7 @@ Name:Deep Water ManaCost:U U Types:Enchantment A:AB$ Effect | Cost$ U | ReplacementEffects$ ReplaceU | SpellDescription$ Until end of turn, if you tap a land you control for mana, it produces {U} instead of any other type. -SVar:ReplaceU:Event$ ProduceMana | ActiveZones$ Command | ValidPlayer$ You | ValidCard$ Land.YouCtrl | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceU | Description$ If you tap a land you control for mana, it produces U instead of any other type. +SVar:ReplaceU:Event$ ProduceMana | ActiveZones$ Command | ValidActivator$ You | ValidCard$ Land.YouCtrl | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceU | Description$ If you tap a land you control for mana, it produces U instead of any other type. SVar:ProduceU:DB$ ReplaceMana | ReplaceType$ U AI:RemoveDeck:All AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/upcoming/defend_the_campus.txt b/forge-gui/res/cardsfolder/d/defend_the_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/defend_the_campus.txt rename to forge-gui/res/cardsfolder/d/defend_the_campus.txt diff --git a/forge-gui/res/cardsfolder/d/degavolver.txt b/forge-gui/res/cardsfolder/d/degavolver.txt index 7d10983bfde..e0000355b28 100644 --- a/forge-gui/res/cardsfolder/d/degavolver.txt +++ b/forge-gui/res/cardsfolder/d/degavolver.txt @@ -6,10 +6,10 @@ K:Kicker:1 B:R K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverResilience | SpellDescription$ If CARDNAME was kicked with its {1}{B} kicker, it enters the battlefield with two +1/+1 counters on it and with "Pay 3 life: Regenerate CARDNAME." -SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Permanent$ True +SVar:VolverResilience:DB$ Animate | Defined$ Self | Abilities$ ABRegen | Duration$ Permanent SVar:ABRegen:AB$Regenerate | Cost$ PayLife<3> | SpellDescription$ Regenerate CARDNAME. SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverSpeed | SpellDescription$ If CARDNAME was kicked with its {R} kicker, it enters the battlefield with a +1/+1 counter on it and with first strike. -SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True +SVar:VolverSpeed:DB$ Animate | Defined$ Self | Keywords$ First Strike | Duration$ Permanent AI:RemoveDeck:Random DeckNeeds:Color$Black|Red DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/d/delay.txt b/forge-gui/res/cardsfolder/d/delay.txt index 6d28bf591cb..6177dfe82ae 100644 --- a/forge-gui/res/cardsfolder/d/delay.txt +++ b/forge-gui/res/cardsfolder/d/delay.txt @@ -1,9 +1,9 @@ Name:Delay ManaCost:1 U Types:Instant -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | RememberCountered$ True | Destination$ Exile | SubAbility$ DBPutCounter | SpellDescription$ Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | RememberCountered$ True | Destination$ Exile | SubAbility$ DBPutCounter | SpellDescription$ Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 3 | CounterType$ TIME | SubAbility$ DBPump -SVar:DBPump:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | PumpZone$ Exile | KW$ Suspend | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +SVar:DBPump:DB$ Pump | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Card.withoutSuspend | PumpZone$ Exile | KW$ Suspend | Duration$ Permanent | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/delay.jpg +DeckHas:Ability$Counters Oracle:Counter target spell. If the spell is countered this way, exile it with three time counters on it instead of putting it into its owner's graveyard. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) diff --git a/forge-gui/res/cardsfolder/d/demolition_stomper.txt b/forge-gui/res/cardsfolder/d/demolition_stomper.txt index 9cb99f85f82..2856c5f6c61 100644 --- a/forge-gui/res/cardsfolder/d/demolition_stomper.txt +++ b/forge-gui/res/cardsfolder/d/demolition_stomper.txt @@ -2,7 +2,6 @@ Name:Demolition Stomper ManaCost:6 Types:Artifact Vehicle PT:10/7 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. K:Crew:5 -SVar:Picture:http://www.wizards.com/global/images/magic/general/demolition_stomper.jpg -Oracle:Demolition Stomper can't be blocked by creatures with power 2 or less.\nCrew 5 (Tap any number of creatures you control with total power 5 or more: This Vehicle becomes an artifact creature until end of turn.) +Oracle:Demolition Stomper can't be blocked by creatures with power 2 or less.\nCrew 5 (Tap any number of creatures you control with total power 5 or more: This Vehicle becomes an artifact creature until end of turn.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/demonic_hordes.txt b/forge-gui/res/cardsfolder/d/demonic_hordes.txt index d87dbbff843..e1c97dec5b2 100644 --- a/forge-gui/res/cardsfolder/d/demonic_hordes.txt +++ b/forge-gui/res/cardsfolder/d/demonic_hordes.txt @@ -6,8 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | E A:AB$ Destroy | ValidTgts$ Land | TgtPrompt$ Select target land. | Cost$ T | SpellDescription$ Destroy target land. SVar:DBTap:DB$ Tap | Defined$ Self | UnlessCost$ B B B | UnlessPayer$ You | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBChooseOpponent SVar:DBChooseOpponent:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent | SubAbility$ DBChooseLand -SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand +SVar:DBChooseLand:DB$ ChooseCard | Defined$ ChosenPlayer | Choices$ Land.YouCtrl | Mandatory$ True | ChoiceTitle$ Select a land for opponent to sacrifice | SubAbility$ DBSacLand SVar:DBSacLand:DB$ Destroy | Sacrifice$ True | Defined$ ChosenCard SVar:PlayMain1:FALSE -SVar:Picture:http://www.wizards.com/global/images/magic/general/demonic_hordes.jpg Oracle:{T}: Destroy target land.\nAt the beginning of your upkeep, unless you pay {B}{B}{B}, tap Demonic Hordes and sacrifice a land of an opponent's choice. diff --git a/forge-gui/res/cardsfolder/d/den_protector.txt b/forge-gui/res/cardsfolder/d/den_protector.txt index df0be0cd6d6..103b8406206 100644 --- a/forge-gui/res/cardsfolder/d/den_protector.txt +++ b/forge-gui/res/cardsfolder/d/den_protector.txt @@ -2,9 +2,9 @@ Name:Den Protector ManaCost:1 G Types:Creature Human Warrior PT:2/1 -K:Creatures with power less than CARDNAME's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower K:Megamorph:1 G T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, return target card from your graveyard to your hand. SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.YouOwn | TgtPrompt$ Select target card | Origin$ Graveyard | Destination$ Hand -SVar:Picture:http://www.wizards.com/global/images/magic/general/den_protector.jpg Oracle:Creatures with power less than Den Protector's power can't block it.\nMegamorph {1}{G} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its megamorph cost and put a +1/+1 counter on it.)\nWhen Den Protector is turned face up, return target card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/d/dense_canopy.txt b/forge-gui/res/cardsfolder/d/dense_canopy.txt index f67c2a0ded0..1e6eddbea64 100644 --- a/forge-gui/res/cardsfolder/d/dense_canopy.txt +++ b/forge-gui/res/cardsfolder/d/dense_canopy.txt @@ -1,9 +1,8 @@ Name:Dense Canopy ManaCost:1 G Types:Enchantment -S:Mode$ Continuous | Affected$ Creature.withFlying | AddHiddenKeyword$ CARDNAME can block only creatures with flying. | Description$ Creatures with flying can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.withFlying | Description$ Creatures with flying can block only creatures with flying. SVar:NonStackingEffect:True SVar:PlayMain1:TRUE AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/dense_canopy.jpg Oracle:Creatures with flying can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt index 6de82d128a9..336dde3ebcb 100644 --- a/forge-gui/res/cardsfolder/d/deputy_of_detention.txt +++ b/forge-gui/res/cardsfolder/d/deputy_of_detention.txt @@ -3,6 +3,6 @@ ManaCost:1 W U Types:Creature Vedalken Wizard PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ DBChangeZoneAll | UntilHostLeavesPlay$ True -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Permanent.nonLand+NotDefinedTargeted+sharesNameWith Targeted+ControlledBy TargetedOrController | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ DBChangeZoneAll | Duration$ UntilHostLeavesPlay +SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Permanent.nonLand+NotDefinedTargeted+sharesNameWith Targeted+ControlledBy TargetedOrController | Duration$ UntilHostLeavesPlay Oracle:When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/detention_vortex.txt b/forge-gui/res/cardsfolder/d/detention_vortex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/detention_vortex.txt rename to forge-gui/res/cardsfolder/d/detention_vortex.txt diff --git a/forge-gui/res/cardsfolder/upcoming/devastating_mastery.txt b/forge-gui/res/cardsfolder/d/devastating_mastery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/devastating_mastery.txt rename to forge-gui/res/cardsfolder/d/devastating_mastery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/devouring_tendrils.txt b/forge-gui/res/cardsfolder/d/devouring_tendrils.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/devouring_tendrils.txt rename to forge-gui/res/cardsfolder/d/devouring_tendrils.txt diff --git a/forge-gui/res/cardsfolder/upcoming/digsite_engineer.txt b/forge-gui/res/cardsfolder/d/digsite_engineer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/digsite_engineer.txt rename to forge-gui/res/cardsfolder/d/digsite_engineer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dina_soul_steeper.txt b/forge-gui/res/cardsfolder/d/dina_soul_steeper.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dina_soul_steeper.txt rename to forge-gui/res/cardsfolder/d/dina_soul_steeper.txt diff --git a/forge-gui/res/cardsfolder/upcoming/divide_by_zero.txt b/forge-gui/res/cardsfolder/d/divide_by_zero.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/divide_by_zero.txt rename to forge-gui/res/cardsfolder/d/divide_by_zero.txt diff --git a/forge-gui/res/cardsfolder/d/divine_deflection.txt b/forge-gui/res/cardsfolder/d/divine_deflection.txt new file mode 100644 index 00000000000..03207af8e6a --- /dev/null +++ b/forge-gui/res/cardsfolder/d/divine_deflection.txt @@ -0,0 +1,13 @@ +Name:Divine Deflection +ManaCost:X W +Types:Instant +A:SP$ StoreSVar | Cost$ X W | SVar$ ShieldAmount | Type$ Calculate | Expression$ X | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Prevent the next X damage that would be dealt to you and/or permanents you control this turn. If damage is prevented this way, CARDNAME deals that much damage to any target. +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to deal prevented damage to | ReplacementEffects$ ReDamage | RememberObjects$ Targeted +SVar:ReDamage:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | ReplaceWith$ PreventDamage | PreventionEffect$ NextN | Description$ Prevent the next X damage that would be dealt to you and/or permanents you control this turn. If damage is prevented this way, EFFECTSOURCE deals that much damage to any target. +SVar:PreventDamage:DB$ ReplaceDamage | Amount$ ShieldAmount | DivideShield$ True | SubAbility$ DBDealDamage +SVar:DBDealDamage:DB$ DealDamage | NumDmg$ Y | Defined$ Remembered | DamageSource$ EffectSource +SVar:X:Count$xPaid +SVar:ShieldAmount:Number$0 +SVar:Y:ReplaceCount$DamageAmount +AI:RemoveDeck:All +Oracle:Prevent the next X damage that would be dealt to you and/or permanents you control this turn. If damage is prevented this way, Divine Deflection deals that much damage to any target. diff --git a/forge-gui/res/cardsfolder/d/djeru_with_eyes_open.txt b/forge-gui/res/cardsfolder/d/djeru_with_eyes_open.txt index 6e436c6e0d0..48944c189da 100644 --- a/forge-gui/res/cardsfolder/d/djeru_with_eyes_open.txt +++ b/forge-gui/res/cardsfolder/d/djeru_with_eyes_open.txt @@ -5,6 +5,6 @@ PT:4/3 K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle. SVar:TrigChange:DB$ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Planeswalker | ChangeNum$ 1 | ShuffleNonMandatory$ True -S:Mode$ PreventDamage | Target$ Planeswalker.YouCtrl | Amount$ 1 | Description$ If a source would deal damage to a planeswalker you control, prevent 1 of that damage. -SVar:Picture:http://www.wizards.com/global/images/magic/general/djeru_with_eyes_open.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Planeswalker.YouCtrl | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to a planeswalker you control, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:Vigilance\nWhen Djeru, With Eyes Open enters the battlefield, you may search your library for a planeswalker card, reveal it, put it into your hand, then shuffle.\nIf a source would deal damage to a planeswalker you control, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/d/dominating_licid.txt b/forge-gui/res/cardsfolder/d/dominating_licid.txt index b432c621160..891e14f7ad3 100644 --- a/forge-gui/res/cardsfolder/d/dominating_licid.txt +++ b/forge-gui/res/cardsfolder/d/dominating_licid.txt @@ -2,7 +2,7 @@ Name:Dominating Licid ManaCost:1 U U Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ 1 U U T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. +A:AB$ Animate | Cost$ 1 U U T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ GainControl SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Card.EnchantedBy | GainControl$ You | Description$ You control enchanted creature. diff --git a/forge-gui/res/cardsfolder/upcoming/double_major.txt b/forge-gui/res/cardsfolder/d/double_major.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/double_major.txt rename to forge-gui/res/cardsfolder/d/double_major.txt diff --git a/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt b/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt index 227219ac320..e9796040b93 100644 --- a/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt +++ b/forge-gui/res/cardsfolder/d/dovin_architect_of_law.txt @@ -5,7 +5,7 @@ Loyalty:5 A:AB$ GainLife | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ You gain 2 life and draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Tap | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Choose target creature to tap. | Planeswalker$ True | SubAbility$ DovinPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DovinPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DovinPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. A:AB$ TapAll | Cost$ SubCounter<9/LOYALTY> | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent | Planeswalker$ True | Ultimate$ True | SubAbility$ NoUntap | SpellDescription$ Tap all permanents target opponent controls. That player skips their next untap step. SVar:NoUntap:DB$ SkipPhase | Defined$ TargetedPlayer | Step$ Untap | IsCurse$ True Oracle:[+1]: You gain 2 life and draw a card.\n[−1]: Tap target creature. It doesn't untap during its controller's next untap step.\n[−9]: Tap all permanents target opponent controls. That player skips their next untap step. diff --git a/forge-gui/res/cardsfolder/d/dovin_baan.txt b/forge-gui/res/cardsfolder/d/dovin_baan.txt index 3abbd2b683f..ce22ca83fbe 100644 --- a/forge-gui/res/cardsfolder/d/dovin_baan.txt +++ b/forge-gui/res/cardsfolder/d/dovin_baan.txt @@ -2,7 +2,7 @@ Name:Dovin Baan ManaCost:2 W U Types:Legendary Planeswalker Dovin Loyalty:3 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -3 | IsCurse$ True | UntilYourNextTurn$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's activated abilities can't be activated. | SpellDescription$ Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -3 | IsCurse$ True | Duration$ UntilYourNextTurn | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME's activated abilities can't be activated. | SpellDescription$ Until your next turn, up to one target creature gets -3/-0 and its activated abilities can't be activated. A:AB$ GainLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | LifeAmount$ 2 | SubAbility$ DBDraw | SpellDescription$ You gain 2 life and draw a card. SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Name$ Emblem - Dovin Baan | Image$ Emblem_dovin_baan | StaticAbilities$ STDovin | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Your opponents can't untap more than two permanents during their untap steps." diff --git a/forge-gui/res/cardsfolder/d/dovin_hand_of_control.txt b/forge-gui/res/cardsfolder/d/dovin_hand_of_control.txt index db48abc39d6..60cf03b7700 100644 --- a/forge-gui/res/cardsfolder/d/dovin_hand_of_control.txt +++ b/forge-gui/res/cardsfolder/d/dovin_hand_of_control.txt @@ -3,6 +3,6 @@ ManaCost:2 W/U Types:Legendary Planeswalker Dovin Loyalty:5 S:Mode$ RaiseCost | ValidCard$ Artifact,Instant,Sorcery | Activator$ Opponent | Type$ Spell | Amount$ 1 | Description$ Artifact, instant, and sorcery spells your opponents cast cost {1} more to cast. -A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | Planeswalker$ True | KW$ Prevent all damage that would be dealt to and dealt by CARDNAME. | IsCurse$ True | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. +A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | Planeswalker$ True | KW$ Prevent all damage that would be dealt to and dealt by CARDNAME. | IsCurse$ True | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. AI:RemoveDeck:All Oracle:Artifact, instant, and sorcery spells your opponents cast cost {1} more to cast.\n[−1]: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/draconic_intervention.txt b/forge-gui/res/cardsfolder/d/draconic_intervention.txt similarity index 84% rename from forge-gui/res/cardsfolder/upcoming/draconic_intervention.txt rename to forge-gui/res/cardsfolder/d/draconic_intervention.txt index 3dc05503dfe..40146325017 100644 --- a/forge-gui/res/cardsfolder/upcoming/draconic_intervention.txt +++ b/forge-gui/res/cardsfolder/d/draconic_intervention.txt @@ -2,6 +2,7 @@ Name:Draconic Intervention ManaCost:2 R R Types:Sorcery A:SP$ DamageAll | Cost$ 2 R R ExileFromGrave<1/Instant;Sorcery> | NumDmg$ X | ValidCards$ Creature.nonDragon | RememberDamaged$ True | ReplaceDyingDefined$ Remembered | SubAbility$ DBCleanup | SpellDescription$ CARDNAME deals X damage to each non-Dragon creature, where X is the exiled card’s mana value. If a creature dealt damage this way would die this turn, exile it instead. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBChange +SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile SVar:X:Exiled$CardManaCost Oracle:As an additional cost to cast this spell, exile an instant or sorcery card from your graveyard.\nDraconic Intervention deals X damage to each non-Dragon creature, where X is the exiled card's mana value. If a creature dealt damage this way would die this turn, exile it instead.\nExile Draconic Intervention. diff --git a/forge-gui/res/cardsfolder/d/dracoplasm.txt b/forge-gui/res/cardsfolder/d/dracoplasm.txt index f589db634ce..03992813e9c 100644 --- a/forge-gui/res/cardsfolder/d/dracoplasm.txt +++ b/forge-gui/res/cardsfolder/d/dracoplasm.txt @@ -5,7 +5,7 @@ PT:0/0 K:Flying K:ETBReplacement:Other:TrigSac SVar:TrigSac:DB$ Sacrifice | Amount$ SacX | SacValid$ Creature | Defined$ You | RememberSacrificed$ True | Optional$ True | SubAbility$ DBAnimate | SpellDescription$ As CARDNAME enters the battlefield, sacrifice any number of creatures. CARDNAME's power becomes the total power of those creatures and its toughness becomes their total toughness. -SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ DracoPwr | Toughness$ DracoTgn | Permanent$ True | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ DracoPwr | Toughness$ DracoTgn | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:SacX:Count$Valid Creature.YouCtrl SVar:DracoPwr:RememberedLKI$CardPower diff --git a/forge-gui/res/cardsfolder/upcoming/dragons_approach.txt b/forge-gui/res/cardsfolder/d/dragons_approach.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dragons_approach.txt rename to forge-gui/res/cardsfolder/d/dragons_approach.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dragonsguard_elite.txt b/forge-gui/res/cardsfolder/d/dragonsguard_elite.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dragonsguard_elite.txt rename to forge-gui/res/cardsfolder/d/dragonsguard_elite.txt diff --git a/forge-gui/res/cardsfolder/d/dralnus_pet.txt b/forge-gui/res/cardsfolder/d/dralnus_pet.txt index 1141f0c6f05..4231b71a231 100644 --- a/forge-gui/res/cardsfolder/d/dralnus_pet.txt +++ b/forge-gui/res/cardsfolder/d/dralnus_pet.txt @@ -4,7 +4,7 @@ Types:Creature Shapeshifter PT:2/2 K:Kicker:2 B Discard<1/Creature> R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPump | Description$ If CARDNAME was kicked, it enters the battlefield with flying and with X +1/+1 counters on it, where X is the discarded card's mana value. -SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ True | SubAbility$ DBPutCounter +SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ Flying | Duration$ Permanent | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ KickedPet | SubAbility$ DBMoveToPlay SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard SVar:KickedPet:Discarded$CardManaCost diff --git a/forge-gui/res/cardsfolder/upcoming/dramatic_finale.txt b/forge-gui/res/cardsfolder/d/dramatic_finale.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dramatic_finale.txt rename to forge-gui/res/cardsfolder/d/dramatic_finale.txt diff --git a/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt index 9d0b66d69de..c51e75fec6a 100755 --- a/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt +++ b/forge-gui/res/cardsfolder/d/drana_the_last_bloodchief.txt @@ -4,9 +4,9 @@ Types:Legendary Creature Vampire Cleric PT:4/4 K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME attacks, defending player chooses a nonlegendary creature card in your graveyard. You return that card to the battlefield with an additional +1/+1 counter on it. The creature is a Vampire in addition to its other types. -SVar:TrigChoose:DB$ ChooseCard | Defined$ DefendingPlayer | Choices$ Creature.YouOwn+nonLegendary | ChoiceZone$ Graveyard | AILogic$ WorstCard | RememberChosen$ True | SubAbility$ DBChangeZone +SVar:TrigChoose:DB$ ChooseCard | Defined$ DefendingPlayer | Choices$ Creature.YouOwn+nonLegendary | Mandatory$ True | ChoiceZone$ Graveyard | AILogic$ WorstCard | RememberChosen$ True | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | Destination$ Battlefield | WithCounters$ P1P1_1 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Vampire | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Types$ Vampire | Duration$ Permanent DeckHas:Ability$Graveyard & Ability$Counters DeckHints:Type$Vampire Oracle:Flying\nWhenever Drana, the Last Bloodchief attacks, defending player chooses a nonlegendary creature card in your graveyard. You return that card to the battlefield with an additional +1/+1 counter on it. The creature is a Vampire in addition to its other types. diff --git a/forge-gui/res/cardsfolder/d/dread_slaver.txt b/forge-gui/res/cardsfolder/d/dread_slaver.txt index 7479765ca30..ce775d826ff 100644 --- a/forge-gui/res/cardsfolder/d/dread_slaver.txt +++ b/forge-gui/res/cardsfolder/d/dread_slaver.txt @@ -4,5 +4,5 @@ Types:Creature Zombie Horror PT:3/5 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.DamagedBy | Execute$ TrigChange | TriggerDescription$ Whenever a creature dealt damage by CARDNAME this turn dies, return it to the battlefield under your control. That creature is a black Zombie in addition to its other colors and types. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredNewCardLKICopy | AnimateSubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent Oracle:Whenever a creature dealt damage by Dread Slaver this turn dies, return it to the battlefield under your control. That creature is a black Zombie in addition to its other colors and types. diff --git a/forge-gui/res/cardsfolder/d/dread_summons.txt b/forge-gui/res/cardsfolder/d/dread_summons.txt index 99123619e97..fb1f2f33e94 100644 --- a/forge-gui/res/cardsfolder/d/dread_summons.txt +++ b/forge-gui/res/cardsfolder/d/dread_summons.txt @@ -5,6 +5,6 @@ A:SP$ Mill | Cost$ X B B | NumCards$ X | Defined$ Player | RememberMilled$ True SVar:DBToken:DB$ Token | TokenAmount$ Y | TokenScript$ b_2_2_zombie | TokenOwner$ You | TokenTapped$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:Y:Count$ValidGraveyard Creature.IsRemembered +SVar:Y:Remembered$Valid Creature.inZoneGraveyard DeckHas:Ability$Token Oracle:Each player mills X cards. For each creature card put into a graveyard this way, you create a tapped 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/d/dread_warlock.txt b/forge-gui/res/cardsfolder/d/dread_warlock.txt index aaacbfb9fb3..68f4c47dcb9 100644 --- a/forge-gui/res/cardsfolder/d/dread_warlock.txt +++ b/forge-gui/res/cardsfolder/d/dread_warlock.txt @@ -2,6 +2,5 @@ Name:Dread Warlock ManaCost:1 B B Types:Creature Human Wizard Warlock PT:2/2 -K:CantBeBlockedBy Creature.nonBlack -SVar:Picture:http://www.wizards.com/global/images/magic/general/dread_warlock.jpg -Oracle:Dread Warlock can't be blocked except by black creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonBlack | Description$ CARDNAME can't be blocked except by black creatures. +Oracle:Dread Warlock can't be blocked except by black creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/d/dread_wight.txt b/forge-gui/res/cardsfolder/d/dread_wight.txt index b88a5880be7..e2373ef98d3 100644 --- a/forge-gui/res/cardsfolder/d/dread_wight.txt +++ b/forge-gui/res/cardsfolder/d/dread_wight.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ EndCombat | Execute$ TrigCounter | TriggerZones$ Battlefi SVar:TrigCounter:DB$ PutCounterAll | CounterType$ PARALYZATION | CounterNum$ 1 | ValidCards$ Creature.blockedBySource,Creature.blockingSource | SubAbility$ DBTap SVar:DBTap:DB$ TapAll | ValidCards$ Creature.blockedBySource,Creature.blockingSource | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Valid Creature.blockedBySource,Valid Creature.blockingSource | StaticAbilities$ DontUntap | Duration$ Permanent | ConditionPresent$ Creature.blockedBySource,Creature.blockingSource | SubAbility$ DBAnimate | ForgetOnMoved$ Battlefield | ForgetCounter$ PARALYZATION -SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.blockedBySource,Creature.blockingSource | Abilities$ ABRemoveCounter | Permanent$ True +SVar:DBAnimate:DB$ AnimateAll | ValidCards$ Creature.blockedBySource,Creature.blockingSource | Abilities$ ABRemoveCounter | Duration$ Permanent SVar:ABRemoveCounter:AB$ RemoveCounter | Defined$ Self | Cost$ 4 | CounterType$ PARALYZATION | CounterNum$ 1 | SpellDescription$ Remove a paralyzation counter from this creature. SVar:DontUntap:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Each of those creatures doesn't untap during its controller's untap step for as long as it has a paralyzation counter on it. Oracle:At end of combat, put a paralyzation counter on each creature blocking or blocked by Dread Wight and tap those creatures. Each of those creatures doesn't untap during its controller's untap step for as long as it has a paralyzation counter on it. Each of those creatures gains "{4}: Remove a paralyzation counter from this creature." diff --git a/forge-gui/res/cardsfolder/d/dream_coat.txt b/forge-gui/res/cardsfolder/d/dream_coat.txt index 1026a0dbc46..a0692dcb4c0 100644 --- a/forge-gui/res/cardsfolder/d/dream_coat.txt +++ b/forge-gui/res/cardsfolder/d/dream_coat.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Pump A:AB$ ChooseColor | Cost$ 0 | Defined$ You | OrColors$ True | ActivationLimit$ 1 | SubAbility$ DBAnimate | SpellDescription$ Enchanted creature becomes the color or colors of your choice. Activate only once each turn. -SVar:DBAnimate:DB$ Animate | Colors$ ChosenColor | OverwriteColors$ True | Defined$ Enchanted | Permanent$ True +SVar:DBAnimate:DB$ Animate | Colors$ ChosenColor | OverwriteColors$ True | Defined$ Enchanted | Duration$ Permanent AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dream_coat.jpg Oracle:Enchant creature\n{0}: Enchanted creature becomes the color or colors of your choice. Activate only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/dream_strix.txt b/forge-gui/res/cardsfolder/d/dream_strix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dream_strix.txt rename to forge-gui/res/cardsfolder/d/dream_strix.txt diff --git a/forge-gui/res/cardsfolder/d/dreamcaller_siren.txt b/forge-gui/res/cardsfolder/d/dreamcaller_siren.txt index 8a8722c142b..f3959b5fe26 100644 --- a/forge-gui/res/cardsfolder/d/dreamcaller_siren.txt +++ b/forge-gui/res/cardsfolder/d/dreamcaller_siren.txt @@ -4,8 +4,7 @@ Types:Creature Siren Pirate PT:3/3 K:Flash K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | IsPresent$ Creature.Pirate+Other+YouCtrl | TriggerDescription$ When CARDNAME enters the battlefield, if you control another Pirate, tap up to two target nonland permanents. SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target nonland permanent | SpellDescription$ Tap up to two target nonland permanents. -SVar:Picture:http://www.wizards.com/global/images/magic/general/dreamcaller_siren.jpg Oracle:Flash\nFlying\nDreamcaller Siren can block only creatures with flying.\nWhen Dreamcaller Siren enters the battlefield, if you control another Pirate, tap up to two target nonland permanents. diff --git a/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt b/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt index fc5b9020c90..34ac7a390b2 100644 --- a/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/d/dreams_of_the_dead.txt @@ -2,7 +2,7 @@ Name:Dreams of the Dead ManaCost:3 U Types:Enchantment A:AB$ ChangeZone | Cost$ 1 U | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.White+YouCtrl,Creature.Black+YouCtrl | TgtPrompt$ Select target white or black creature in your graveyard | SubAbility$ DBPump | SpellDescription$ Return target white or black creature card from your graveyard to the battlefield. That creature gains "Cumulative upkeep {2}." If the creature would leave the battlefield, exile it instead of putting it anywhere else. -SVar:DBPump:DB$ Pump | KW$ Cumulative upkeep:2 | LeaveBattlefield$ Exile | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ Cumulative upkeep:2 | LeaveBattlefield$ Exile | Defined$ Targeted | Duration$ Permanent SVar:NonStackingEffect:True AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/dreams_of_the_dead.jpg diff --git a/forge-gui/res/cardsfolder/d/duct_crawler.txt b/forge-gui/res/cardsfolder/d/duct_crawler.txt index 816b3f16f2a..f36d80863b7 100644 --- a/forge-gui/res/cardsfolder/d/duct_crawler.txt +++ b/forge-gui/res/cardsfolder/d/duct_crawler.txt @@ -2,7 +2,8 @@ Name:Duct Crawler ManaCost:R Types:Creature Insect PT:1/1 -A:AB$ Pump | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +A:AB$ Effect | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/duct_crawler.jpg Oracle:{1}{R}: Target creature can't block Duct Crawler this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/dueling_coach.txt b/forge-gui/res/cardsfolder/d/dueling_coach.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/dueling_coach.txt rename to forge-gui/res/cardsfolder/d/dueling_coach.txt diff --git a/forge-gui/res/cardsfolder/d/dungeon_geists.txt b/forge-gui/res/cardsfolder/d/dungeon_geists.txt index 7323440c9b3..4223a8befbd 100644 --- a/forge-gui/res/cardsfolder/d/dungeon_geists.txt +++ b/forge-gui/res/cardsfolder/d/dungeon_geists.txt @@ -5,7 +5,7 @@ PT:3/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap for as long as you control CARDNAME. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilLoseControlOfHost$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/dungeon_geists.jpg Oracle:Flying\nWhen Dungeon Geists enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's untap step for as long as you control Dungeon Geists. diff --git a/forge-gui/res/cardsfolder/d/duskmantle_operative.txt b/forge-gui/res/cardsfolder/d/duskmantle_operative.txt index 582eac4fda7..583beb82c8f 100644 --- a/forge-gui/res/cardsfolder/d/duskmantle_operative.txt +++ b/forge-gui/res/cardsfolder/d/duskmantle_operative.txt @@ -2,5 +2,5 @@ Name:Duskmantle Operative ManaCost:1 B Types:Creature Human Rogue PT:2/2 -K:CantBeBlockedBy Creature.powerGE4 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE4 | Description$ CARDNAME can't be blocked by creatures with power 4 or greater. Oracle:Duskmantle Operative can't be blocked by creatures with power 4 or greater. diff --git a/forge-gui/res/cardsfolder/d/duskwalker.txt b/forge-gui/res/cardsfolder/d/duskwalker.txt index 12191815491..85bcf5f7834 100644 --- a/forge-gui/res/cardsfolder/d/duskwalker.txt +++ b/forge-gui/res/cardsfolder/d/duskwalker.txt @@ -5,7 +5,7 @@ PT:1/1 K:Kicker:3 B R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ GatherDust | Description$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with fear. (It can't be blocked except by artifact creatures and/or black creatures.) SVar:GatherDust:DB$ PutCounter | Defined$ Self | ETB$ True | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ Dustwalk -SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Fear | Permanent$ True | SubAbility$ DBMoveToPlay +SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Fear | Duration$ Permanent | SubAbility$ DBMoveToPlay SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard SVar:Picture:http://www.wizards.com/global/images/magic/general/duskwalker.jpg Oracle:Kicker {3}{B} (You may pay an additional {3}{B} as you cast this spell.)\nIf Duskwalker was kicked, it enters the battlefield with two +1/+1 counters on it and with fear. (It can't be blocked except by artifact creatures and/or black creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/eager_first_year.txt b/forge-gui/res/cardsfolder/e/eager_first_year.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eager_first_year.txt rename to forge-gui/res/cardsfolder/e/eager_first_year.txt diff --git a/forge-gui/res/cardsfolder/e/earthbind.txt b/forge-gui/res/cardsfolder/e/earthbind.txt index a50ffdd6ce9..295d24c1836 100644 --- a/forge-gui/res/cardsfolder/e/earthbind.txt +++ b/forge-gui/res/cardsfolder/e/earthbind.txt @@ -5,7 +5,7 @@ K:Enchant creature A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Curse | AITgts$ Creature.withFlying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | IsPresent$ Card.EnchantedBy+withFlying | PresentCompare$ EQ1 | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, if enchanted creature has flying, CARDNAME deals 2 damage to that creature and CARDNAME gains "Enchanted creature loses flying." SVar:TrigDealDamage:DB$DealDamage | Defined$ Valid Card.EnchantedBy | NumDmg$ 2 | SubAbility$ DBLoseFlying -SVar:DBLoseFlying:DB$ Animate | Defined$ Self | staticAbilities$ LoseFlyingStatic | Permanent$ True +SVar:DBLoseFlying:DB$ Animate | Defined$ Self | staticAbilities$ LoseFlyingStatic | Duration$ Permanent SVar:LoseFlyingStatic:Mode$ Continuous | Affected$ Card.EnchantedBy | RemoveKeyword$ Flying | Description$ Enchanted creature loses flying. SVar:Picture:http://www.wizards.com/global/images/magic/general/earthbind.jpg Oracle:Enchant creature\nWhen Earthbind enters the battlefield, if enchanted creature has flying, Earthbind deals 2 damage to that creature and Earthbind gains "Enchanted creature loses flying." diff --git a/forge-gui/res/cardsfolder/upcoming/ecological_appreciation.txt b/forge-gui/res/cardsfolder/e/ecological_appreciation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ecological_appreciation.txt rename to forge-gui/res/cardsfolder/e/ecological_appreciation.txt diff --git a/forge-gui/res/cardsfolder/e/edifice_of_authority.txt b/forge-gui/res/cardsfolder/e/edifice_of_authority.txt index 7fa2c75811d..27a2ec57d10 100644 --- a/forge-gui/res/cardsfolder/e/edifice_of_authority.txt +++ b/forge-gui/res/cardsfolder/e/edifice_of_authority.txt @@ -3,7 +3,7 @@ ManaCost:3 Types:Artifact A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN CARDNAME can't attack. | SubAbility$ DBPutCounter | IsCurse$ True | SpellDescription$ Target creature can't attack this turn. Put a brick counter on CARDNAME. SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ BRICK | CounterNum$ 1 -A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | CheckSVar$ X | SVarCompare$ GE3 | IsCurse$ True | SpellDescription$ Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate only if there are three or more brick counters on Edifice of Authority. +A:AB$ Pump | Cost$ 1 T | ValidTgts$ Creature | TgtPrompt$ Select target creature | Duration$ UntilYourNextTurn | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | CheckSVar$ X | SVarCompare$ GE3 | IsCurse$ True | SpellDescription$ Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate only if there are three or more brick counters on Edifice of Authority. SVar:X:Count$CardCounters.BRICK SVar:Picture:http://www.wizards.com/global/images/magic/general/edifice_of_authority.jpg Oracle:{1}, {T}: Target creature can't attack this turn. Put a brick counter on Edifice of Authority.\n{1}, {T}: Until your next turn, target creature can't attack or block and its activated abilities can't be activated. Activate only if there are three or more brick counters on Edifice of Authority. diff --git a/forge-gui/res/cardsfolder/upcoming/efreet_flamepainter.txt b/forge-gui/res/cardsfolder/e/efreet_flamepainter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/efreet_flamepainter.txt rename to forge-gui/res/cardsfolder/e/efreet_flamepainter.txt diff --git a/forge-gui/res/cardsfolder/e/elder_land_wurm.txt b/forge-gui/res/cardsfolder/e/elder_land_wurm.txt index 475b062e91b..c1833bf1277 100644 --- a/forge-gui/res/cardsfolder/e/elder_land_wurm.txt +++ b/forge-gui/res/cardsfolder/e/elder_land_wurm.txt @@ -5,6 +5,6 @@ PT:5/5 K:Defender K:Trample T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigDebuff | TriggerDescription$ When CARDNAME blocks, it loses defender. -SVar:TrigDebuff:DB$Debuff | Keywords$ Defender | Defined$ TriggeredBlocker | Permanent$ True +SVar:TrigDebuff:DB$Debuff | Keywords$ Defender | Defined$ TriggeredBlocker | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_land_wurm.jpg Oracle:Defender, trample\nWhen Elder Land Wurm blocks, it loses defender. diff --git a/forge-gui/res/cardsfolder/e/elder_spawn.txt b/forge-gui/res/cardsfolder/e/elder_spawn.txt index 183b4de13dd..8929190750a 100644 --- a/forge-gui/res/cardsfolder/e/elder_spawn.txt +++ b/forge-gui/res/cardsfolder/e/elder_spawn.txt @@ -2,14 +2,13 @@ Name:Elder Spawn ManaCost:4 U U U Types:Creature Spawn PT:6/6 -K:CantBeBlockedBy Creature.Red T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigElderSpawnSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, unless you sacrifice an Island, sacrifice CARDNAME and it deals 6 damage to you. CARDNAME can't be blocked by red creatures. SVar:TrigElderSpawnSacrifice:DB$ Sacrifice | SacValid$ Island | Optional$ True | RememberSacrificed$ True | SubAbility$ DBElderSpawnSacrificeMe SVar:DBElderSpawnSacrificeMe:DB$ Sacrifice | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Island | ConditionCompare$ EQ0 | SubAbility$ DBElderSpawnDamage SVar:DBElderSpawnDamage:DB$ DealDamage | Defined$ You | NumDmg$ 6 | ConditionDefined$ Remembered | ConditionPresent$ Island | ConditionCompare$ EQ0 | SubAbility$ DBElderSpawnCleanup SVar:DBElderSpawnCleanup:DB$ Cleanup | ClearRemembered$ True +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Red | Description$ CARDNAME can't be blocked by red creatures. AI:RemoveDeck:Random SVar:NeedsToPlayVar:Z GE3 SVar:Z:Count$Valid Island.YouCtrl+inZoneBattlefield -SVar:Picture:http://www.wizards.com/global/images/magic/general/elder_spawn.jpg -Oracle:At the beginning of your upkeep, unless you sacrifice an Island, sacrifice Elder Spawn and it deals 6 damage to you.\nElder Spawn can't be blocked by red creatures. +Oracle:At the beginning of your upkeep, unless you sacrifice an Island, sacrifice Elder Spawn and it deals 6 damage to you.\nElder Spawn can't be blocked by red creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/elegant_edgecrafters.txt b/forge-gui/res/cardsfolder/e/elegant_edgecrafters.txt index bcf596aeb69..700bd228c72 100644 --- a/forge-gui/res/cardsfolder/e/elegant_edgecrafters.txt +++ b/forge-gui/res/cardsfolder/e/elegant_edgecrafters.txt @@ -2,8 +2,7 @@ Name:Elegant Edgecrafters ManaCost:4 G G Types:Creature Elf Artificer PT:3/4 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. K:Fabricate:2 DeckHas:Ability$Counters & Ability$Token -SVar:Picture:http://www.wizards.com/global/images/magic/general/elegant_edgecrafters.jpg Oracle:Elegant Edgecrafters can't be blocked by creatures with power 2 or less.\nFabricate 2 (When this creature enters the battlefield, put two +1/+1 counters on it or create two 1/1 colorless Servo artifact creature tokens.) diff --git a/forge-gui/res/cardsfolder/upcoming/elemental_expressionist.txt b/forge-gui/res/cardsfolder/e/elemental_expressionist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elemental_expressionist.txt rename to forge-gui/res/cardsfolder/e/elemental_expressionist.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elemental_masterpiece.txt b/forge-gui/res/cardsfolder/e/elemental_masterpiece.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elemental_masterpiece.txt rename to forge-gui/res/cardsfolder/e/elemental_masterpiece.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elemental_summoning.txt b/forge-gui/res/cardsfolder/e/elemental_summoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elemental_summoning.txt rename to forge-gui/res/cardsfolder/e/elemental_summoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elementalists_palette.txt b/forge-gui/res/cardsfolder/e/elementalists_palette.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elementalists_palette.txt rename to forge-gui/res/cardsfolder/e/elementalists_palette.txt diff --git a/forge-gui/res/cardsfolder/upcoming/elite_spellbinder.txt b/forge-gui/res/cardsfolder/e/elite_spellbinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/elite_spellbinder.txt rename to forge-gui/res/cardsfolder/e/elite_spellbinder.txt diff --git a/forge-gui/res/cardsfolder/e/elven_riders.txt b/forge-gui/res/cardsfolder/e/elven_riders.txt index 7ff7e0e2344..19406444b7e 100644 --- a/forge-gui/res/cardsfolder/e/elven_riders.txt +++ b/forge-gui/res/cardsfolder/e/elven_riders.txt @@ -2,6 +2,5 @@ Name:Elven Riders ManaCost:3 G G Types:Creature Elf PT:3/3 -K:CantBeBlockedBy Creature.withoutFlying+nonWall -SVar:Picture:http://www.wizards.com/global/images/magic/general/elven_riders.jpg -Oracle:Elven Riders can't be blocked except by Walls and/or creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying+nonWall | Description$ CARDNAME can't be blocked except by Walls and/or creatures with flying. +Oracle:Elven Riders can't be blocked except by Walls and/or creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/elvish_hunter.txt b/forge-gui/res/cardsfolder/e/elvish_hunter.txt index 863cc26a7df..e848539c7bc 100644 --- a/forge-gui/res/cardsfolder/e/elvish_hunter.txt +++ b/forge-gui/res/cardsfolder/e/elvish_hunter.txt @@ -2,6 +2,6 @@ Name:Elvish Hunter ManaCost:1 G Types:Creature Elf Archer PT:1/1 -A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. +A:AB$ Pump | Cost$ 1 G T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. SVar:Picture:http://www.wizards.com/global/images/magic/general/elvish_hunter.jpg Oracle:{1}{G}, {T}: Target creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/e/ember_gale.txt b/forge-gui/res/cardsfolder/e/ember_gale.txt index 91fec0362f2..414c3a3d6de 100644 --- a/forge-gui/res/cardsfolder/e/ember_gale.txt +++ b/forge-gui/res/cardsfolder/e/ember_gale.txt @@ -1,9 +1,8 @@ Name:Ember Gale ManaCost:3 R Types:Sorcery -A:SP$ Effect | Cost$ 3 R | Name$ Ember Gale Effect | ValidTgts$ Player | TgtPrompt$ Select target player | AILogic$ Evasion | StaticAbilities$ CantBlock | RememberObjects$ Targeted | SubAbility$ DBDamage | SpellDescription$ Creatures target player controls can't block this turn. CARDNAME deals 1 damage to each white and/or blue creature that player controls. +A:SP$ Effect | Cost$ 3 R | Name$ Ember Gale Effect | ValidTgts$ Player | TgtPrompt$ Select target player | AILogic$ Evasion | StaticAbilities$ OppCantBlock | RememberObjects$ Targeted | SubAbility$ DBDamage | SpellDescription$ Creatures target player controls can't block this turn. CARDNAME deals 1 damage to each white and/or blue creature that player controls. SVar:DBDamage:DB$ DamageAll | NumDmg$ 1 | ValidCards$ Creature.White+TargetedPlayerCtrl,Creature.Blue+TargetedPlayerCtrl | ValidDescription$ each creature that's white or blue that player controls. -SVar:CantBlock:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.RememberedPlayerCtrl | AddHiddenKeyword$ CARDNAME can't block. | SubAbility$ DBDamage | SpellDescription$ Creatures targeted player controls can't block this turn. +SVar:OppCantBlock:Mode$ CantBlockBy | ValidBlocker$ Creature.RememberedPlayerCtrl | Description$ Creatures targeted player controls can't block this turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/ember_gale.jpg Oracle:Creatures target player controls can't block this turn. Ember Gale deals 1 damage to each white and/or blue creature that player controls. diff --git a/forge-gui/res/cardsfolder/upcoming/emergent_sequence.txt b/forge-gui/res/cardsfolder/e/emergent_sequence.txt similarity index 95% rename from forge-gui/res/cardsfolder/upcoming/emergent_sequence.txt rename to forge-gui/res/cardsfolder/e/emergent_sequence.txt index a62a646c185..df0755f074d 100644 --- a/forge-gui/res/cardsfolder/upcoming/emergent_sequence.txt +++ b/forge-gui/res/cardsfolder/e/emergent_sequence.txt @@ -2,7 +2,7 @@ Name:Emergent Sequence ManaCost:1 G Types:Sorcery A:SP$ ChangeZone | Cost$ 1 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | Tapped$ True | RememberChanged$ True | ChangeNum$ 1 | SubAbility$ DBAnimate | StackDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. That land becomes a 0/0 green and blue Fractal creature that's still a land. Put a +1/+1 counter on it for each land you had enter the battlefield under your control this turn. | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. That land becomes a 0/0 green and blue Fractal creature that's still a land. Put a +1/+1 counter on it for each land you had enter the battlefield under your control this turn. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Colors$ Green,Blue | OverwriteColors$ True | Types$ Creature,Fractal | Permanent$ True | SubAbility$ DBPutCounter +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Colors$ Green,Blue | OverwriteColors$ True | Types$ Creature,Fractal | Duration$ Permanent | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$Valid Land.YouCtrl+ThisTurnEntered diff --git a/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt b/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt index 4f778265140..ed6b9adcdba 100644 --- a/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt +++ b/forge-gui/res/cardsfolder/e/emerias_call_emeria_shattered_skyclave.txt @@ -2,7 +2,7 @@ Name:Emeria's Call ManaCost:4 W W W Types:Sorcery A:SP$ Token | Cost$ 4 W W W | TokenAmount$ 2 | TokenScript$ w_4_4_angel_warrior_flying | SubAbility$ DBPumpAll | SpellDescription$ Create two 4/4 white Angel Warrior creature tokens with flying. Non-Angel creatures you control gain indestructible until your next turn. -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.nonAngel+YouCtrl | KW$ Indestructible | UntilYourNextTurn$ True +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.nonAngel+YouCtrl | KW$ Indestructible | Duration$ UntilYourNextTurn AlternateMode:Modal DeckHas:Ability$Token Oracle:Create two 4/4 white Angel Warrior creature tokens with flying. Non-Angel creatures you control gain indestructible until your next turn. @@ -13,6 +13,6 @@ Name:Emeria, Shattered Skyclave ManaCost:no cost Types:Land K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. Oracle:As Emeria, Shattered Skyclave enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped.\n{T}: Add {W}. diff --git a/forge-gui/res/cardsfolder/e/enraged_ceratok.txt b/forge-gui/res/cardsfolder/e/enraged_ceratok.txt index d5f0e24dbe4..0977a40811d 100644 --- a/forge-gui/res/cardsfolder/e/enraged_ceratok.txt +++ b/forge-gui/res/cardsfolder/e/enraged_ceratok.txt @@ -2,5 +2,5 @@ Name:Enraged Ceratok ManaCost:2 G G Types:Creature Rhino PT:4/4 -K:CantBeBlockedBy Creature.powerLE2 -Oracle:Enraged Ceratok can't be blocked by creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +Oracle:Enraged Ceratok can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/enraging_licid.txt b/forge-gui/res/cardsfolder/e/enraging_licid.txt index eac27319ae1..8c8f40f812d 100644 --- a/forge-gui/res/cardsfolder/e/enraging_licid.txt +++ b/forge-gui/res/cardsfolder/e/enraging_licid.txt @@ -2,7 +2,7 @@ Name:Enraging Licid ManaCost:1 R Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ R | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. +A:AB$ Animate | Cost$ R T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ R | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {R} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Haste | Description$ Enchanted creature has haste. diff --git a/forge-gui/res/cardsfolder/e/entangling_trap.txt b/forge-gui/res/cardsfolder/e/entangling_trap.txt index d9168d880e1..333d8df1449 100644 --- a/forge-gui/res/cardsfolder/e/entangling_trap.txt +++ b/forge-gui/res/cardsfolder/e/entangling_trap.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Enchantment T:Mode$ Clashed | ValidPlayer$ You | Won$ True | TriggerZones$ Battlefield | Execute$ TrigTapW | TriggerDescription$ Whenever you clash, tap target creature an opponent controls. If you won, that creature doesn't untap during its controller's next untap step. (This ability triggers after the clash ends.) SVar:TrigTapW:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ TrigTapW2 -SVar:TrigTapW2:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigTapW2:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent T:Mode$ Clashed | ValidPlayer$ You | Won$ False | TriggerZones$ Battlefield | Execute$ TrigTapL | Secondary$ True | TriggerDescription$ Whenever you clash, tap target creature an opponent controls. If you won, that creature doesn't untap during its controller's next untap step. (This ability triggers after the clash ends.) SVar:TrigTapL:DB$ Tap | ValidTgts$ Creature.OppCtrl AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/upcoming/enthusiastic_study.txt b/forge-gui/res/cardsfolder/e/enthusiastic_study.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/enthusiastic_study.txt rename to forge-gui/res/cardsfolder/e/enthusiastic_study.txt diff --git a/forge-gui/res/cardsfolder/upcoming/environmental_sciences.txt b/forge-gui/res/cardsfolder/e/environmental_sciences.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/environmental_sciences.txt rename to forge-gui/res/cardsfolder/e/environmental_sciences.txt diff --git a/forge-gui/res/cardsfolder/e/eon_frolicker.txt b/forge-gui/res/cardsfolder/e/eon_frolicker.txt index 776b202c7d4..9a6c95b234a 100644 --- a/forge-gui/res/cardsfolder/e/eon_frolicker.txt +++ b/forge-gui/res/cardsfolder/e/eon_frolicker.txt @@ -5,6 +5,6 @@ PT:5/5 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.wasCast+Self | Destination$ Battlefield | Execute$ DBAddTurn | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, target opponent takes an extra turn after this one. Until your next turn, you and planeswalkers you control gain protection from that player. (You and planeswalkers you control can't be targeted, dealt damage, or enchanted by anything controlled by that player.) SVar:DBAddTurn:DB$ AddTurn | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | NumTurns$ 1 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ You | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | UntilYourNextTurn$ True | SubAbility$ DBPumpWalkers -SVar:DBPumpWalkers:DB$ Pump | Defined$ Valid Planeswalker.YouCtrl | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | UntilYourNextTurn$ True +SVar:DBPump:DB$ Pump | Defined$ You | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn | SubAbility$ DBPumpWalkers +SVar:DBPumpWalkers:DB$ Pump | Defined$ Valid Planeswalker.YouCtrl | KW$ Protection:Player.TargetedPlayer:Protection from the target opponent | DefinedKW$ TargetedPlayer | Duration$ UntilYourNextTurn Oracle:Flying\nWhen Eon Frolicker enters the battlefield, if you cast it, target opponent takes an extra turn after this one. Until your next turn, you and planeswalkers you control gain protection from that player. (You and planeswalkers you control can't be targeted, dealt damage, or enchanted by anything controlled by that player.) diff --git a/forge-gui/res/cardsfolder/e/epochrasite.txt b/forge-gui/res/cardsfolder/e/epochrasite.txt index 2654f2306c9..46d2c6ba7b0 100644 --- a/forge-gui/res/cardsfolder/e/epochrasite.txt +++ b/forge-gui/res/cardsfolder/e/epochrasite.txt @@ -6,6 +6,6 @@ K:etbCounter:P1P1:3:ValidCard$ Card.Self+wasNotCastFromHand:CARDNAME enters the T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigExile | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, exile it with three time counters on it and it gains suspend. SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Exile | SubAbility$ DBPutCounter | RememberChanged$ True SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ 3 | SubAbility$ GiveSuspend -SVar:GiveSuspend:DB$ Pump | Defined$ Remembered | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup +SVar:GiveSuspend:DB$ Pump | Defined$ Remembered | KW$ Suspend | PumpZone$ Exile | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Epochrasite enters the battlefield with three +1/+1 counters on it if you didn't cast it from your hand.\nWhen Epochrasite dies, exile it with three time counters on it and it gains suspend. (At the beginning of your upkeep, remove a time counter. When the last is removed, cast this card without paying its mana cost. It has haste.) diff --git a/forge-gui/res/cardsfolder/e/erhnam_djinn.txt b/forge-gui/res/cardsfolder/e/erhnam_djinn.txt index dbc9e297cef..0bf2b37e841 100644 --- a/forge-gui/res/cardsfolder/e/erhnam_djinn.txt +++ b/forge-gui/res/cardsfolder/e/erhnam_djinn.txt @@ -3,6 +3,6 @@ ManaCost:3 G Types:Creature Djinn PT:4/5 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep. (It can't be blocked as long as defending player controls a Forest.) -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.nonWall+OppCtrl | TgtPrompt$ Select target non-Wall creature an opponent controls | KW$ Forestwalk | UntilYourNextUpkeep$ True +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.nonWall+OppCtrl | TgtPrompt$ Select target non-Wall creature an opponent controls | KW$ Forestwalk | Duration$ UntilYourNextUpkeep SVar:Picture:http://www.wizards.com/global/images/magic/general/erhnam_djinn.jpg Oracle:At the beginning of your upkeep, target non-Wall creature an opponent controls gains forestwalk until your next upkeep. (It can't be blocked as long as defending player controls a Forest.) diff --git a/forge-gui/res/cardsfolder/e/errant_minion.txt b/forge-gui/res/cardsfolder/e/errant_minion.txt index f15d034c6bd..690ea3cd362 100644 --- a/forge-gui/res/cardsfolder/e/errant_minion.txt +++ b/forge-gui/res/cardsfolder/e/errant_minion.txt @@ -4,12 +4,12 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Curse T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | Execute$ DBPay | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, that player may pay any amount of mana. CARDNAME deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. -S:Mode$ PreventDamage | Target$ EnchantedController | Source$ Card.Self | Amount$ PaidAmount | Secondary$ True +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.Self | ReplaceWith$ DBReplace | PreventionEffect$ True | Secondary$ True +SVar:DBReplace:DB$ ReplaceDamage | Amount$ PaidAmount SVar:DBPay:DB$ ChooseNumber | Defined$ EnchantedController | ChooseAnyNumber$ True | ListTitle$ Pay Any Mana | AILogic$ PowerLeakMaxMana.2 | SubAbility$ DBStore SVar:DBStore:DB$ StoreSVar | SVar$ PaidAmount | Type$ CountSVar | Expression$ X | UnlessCost$ X | UnlessPayer$ EnchantedController | UnlessSwitched$ True | SubAbility$ DBDmg SVar:DBDmg:DB$ DealDamage | Defined$ EnchantedController | NumDmg$ 2 | SubAbility$ DBReset | StackDescription$ None SVar:DBReset:DB$ StoreSVar | SVar$ PaidAmount | Type$ Number | Expression$ 0 SVar:X:Count$ChosenNumber SVar:PaidAmount:Number$0 -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_leak.jpg Oracle:Enchant creature\nAt the beginning of the upkeep of enchanted creature's controller, that player may pay any amount of mana. Errant Minion deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. diff --git a/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt b/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt index b560c996754..ad78a18d234 100644 --- a/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt +++ b/forge-gui/res/cardsfolder/e/ersatz_gnomes.txt @@ -2,7 +2,7 @@ Name:Ersatz Gnomes ManaCost:3 Types:Artifact Creature Gnome PT:1/1 -A:AB$ Animate | Cost$ T | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select target spell to make colorless | Permanent$ True | SpellDescription$ Target spell becomes colorless. +A:AB$ Animate | Cost$ T | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack | TgtPrompt$ Select target spell to make colorless | Duration$ Permanent | SpellDescription$ Target spell becomes colorless. A:AB$ Animate | Cost$ T | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Permanent | TgtPrompt$ Select target permanent to make colorless | SpellDescription$ Target permanent becomes colorless until end of turn. AI:RemoveDeck:Random AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/e/ertais_familiar.txt b/forge-gui/res/cardsfolder/e/ertais_familiar.txt index 3973d49973f..f7104eb295b 100644 --- a/forge-gui/res/cardsfolder/e/ertais_familiar.txt +++ b/forge-gui/res/cardsfolder/e/ertais_familiar.txt @@ -6,5 +6,5 @@ K:Phasing T:Mode$ PhaseOut | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME phases out or leaves the battlefield, mill three cards. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | TriggerZones$ Battlefield | Secondary$ True | Execute$ TrigMill | TriggerDescription$ When CARDNAME phases out or leaves the battlefield, mill three cards. SVar:TrigMill:DB$ Mill | NumCards$ 3 | Defined$ You -A:AB$ Pump | Cost$ U | Defined$ Self | KW$ HIDDEN CARDNAME can't phase out. | UntilYourNextUpkeep$ True | SpellDescription$ Until your next upkeep, CARDNAME can't phase out. +A:AB$ Pump | Cost$ U | Defined$ Self | KW$ HIDDEN CARDNAME can't phase out. | Duration$ UntilYourNextUpkeep | SpellDescription$ Until your next upkeep, CARDNAME can't phase out. Oracle:Phasing (This phases in or out before you untap during each of your untap steps. While it's phased out, it's treated as though it doesn't exist.)\nWhen Ertai's Familiar phases out or leaves the battlefield, mill three cards.\n{U}: Until your next upkeep, Ertai's Familiar can't phase out. diff --git a/forge-gui/res/cardsfolder/e/escape_protocol.txt b/forge-gui/res/cardsfolder/e/escape_protocol.txt index d6ee285aace..e6d3d7413cd 100644 --- a/forge-gui/res/cardsfolder/e/escape_protocol.txt +++ b/forge-gui/res/cardsfolder/e/escape_protocol.txt @@ -3,6 +3,7 @@ ManaCost:1 U Types:Enchantment T:Mode$ Cycled | ValidCard$ Card.YouOwn | Execute$ TrigImmediateTrig | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cycle a card, you may pay {1}. When you do, exile target artifact or creature you control, then return it to the battlefield under its owner's control. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 1 | Execute$ TrigExile | TriggerDescription$ When you do, exile target creature or artifact you control, then return it to the battlefield under its owner's control. -SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl,Artifact.YouCtrl | TgtPrompt$ Select target creature or artifact you control | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturn -SVar:DBReturn:DB$ ChangeZone | Defined$ Targeted | Origin$ Exile | Destination$ Battlefield +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Creature.YouCtrl,Artifact.YouCtrl | TgtPrompt$ Select target creature or artifact you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Whenever you cycle a card, you may pay {1}. When you do, exile target artifact or creature you control, then return it to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/upcoming/esix_fractal_bloom.txt b/forge-gui/res/cardsfolder/e/esix_fractal_bloom.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/esix_fractal_bloom.txt rename to forge-gui/res/cardsfolder/e/esix_fractal_bloom.txt diff --git a/forge-gui/res/cardsfolder/upcoming/essence_infusion.txt b/forge-gui/res/cardsfolder/e/essence_infusion.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/essence_infusion.txt rename to forge-gui/res/cardsfolder/e/essence_infusion.txt diff --git a/forge-gui/res/cardsfolder/upcoming/essence_pulse.txt b/forge-gui/res/cardsfolder/e/essence_pulse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/essence_pulse.txt rename to forge-gui/res/cardsfolder/e/essence_pulse.txt diff --git a/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt b/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt index 83e63109173..7fabd4ef6ab 100644 --- a/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt +++ b/forge-gui/res/cardsfolder/e/eunuchs_intrigues.txt @@ -1,7 +1,7 @@ Name:Eunuchs' Intrigues ManaCost:2 R Types:Sorcery -A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Amount$ 1 | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. +A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Mandatory$ True | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsNotRemembered+TargetedPlayerCtrl | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/e/eureka.txt b/forge-gui/res/cardsfolder/e/eureka.txt index 66be4ea0f36..48b4dd2e265 100644 --- a/forge-gui/res/cardsfolder/e/eureka.txt +++ b/forge-gui/res/cardsfolder/e/eureka.txt @@ -1,21 +1,19 @@ Name:Eureka ManaCost:2 G G Types:Sorcery -A:SP$ Repeat | Cost$ 2 G G | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ DBChangeZoneAll | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put a permanent card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. +A:SP$ Repeat | Cost$ 2 G G | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ FinalReset | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put a permanent card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. SVar:ResetCheck:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBRepeatChoice SVar:DBRepeatChoice:DB$ RepeatEach | StartingWithActivator$ True | RepeatSubAbility$ DBChoice | RepeatPlayers$ Player SVar:DBChoice:DB$ GenericChoice | Choices$ DBCheckHand,DBNoChange | Defined$ Player.IsRemembered SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | SubAbility$ DBChoose | SpellDescription$ Choose a permanent to put onto the battlefield -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.IsNotRemembered+RememberedPlayerCtrl | ChoiceZone$ Hand | Amount$ 1 | RememberChosen$ True | Mandatory$ True | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 +SVar:DBChoose:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Origin$ Hand | Destination$ Battlefield | ChangeType$ Permanent | ChangeNum$ 1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 SVar:DBNoChange:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | SpellDescription$ Do not put a permanent onto the battlefield -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ FinalReset SVar:FinalReset:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumPlayerGiveup:Number$0 SVar:TotalPlayer:PlayerCountPlayers$Amount -SVar:CheckHand:Count$ValidHand Permanent.IsNotRemembered+RememberedPlayerCtrl +SVar:CheckHand:Count$ValidHand Permanent.RememberedPlayerCtrl AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$ValidHand Permanent.YouCtrl+cmcGE5 -SVar:Picture:http://www.wizards.com/global/images/magic/general/eureka.jpg Oracle:Starting with you, each player may put a permanent card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/eureka_moment.txt b/forge-gui/res/cardsfolder/e/eureka_moment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eureka_moment.txt rename to forge-gui/res/cardsfolder/e/eureka_moment.txt diff --git a/forge-gui/res/cardsfolder/e/ever_after.txt b/forge-gui/res/cardsfolder/e/ever_after.txt index 831f5aa0798..dba7f9ea0a6 100644 --- a/forge-gui/res/cardsfolder/e/ever_after.txt +++ b/forge-gui/res/cardsfolder/e/ever_after.txt @@ -2,7 +2,7 @@ Name:Ever After ManaCost:4 B B Types:Sorcery A:SP$ ChangeZone | Cost$ 4 B B | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | TargetMin$ 0 | TargetMax$ 2 | AnimateSubAbility$ Animate | SubAbility$ DBPut | SpellDescription$ Return up to two target creature cards from your graveyard onto the battlefield. -SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True | SpellDescription$ Each of those creatures is a black Zombie in addition to its other colors and types. +SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent | SpellDescription$ Each of those creatures is a black Zombie in addition to its other colors and types. SVar:DBPut:DB$ChangeZone | Origin$ Stack | Destination$ Library | LibraryPosition$ -1 | SpellDescription$ Put Ever After on the bottom of its owner's library. DeckHints:Ability$Graveyard & Ability$Discard & Type$Zombie SVar:Picture:http://www.wizards.com/global/images/magic/general/ever_after.jpg diff --git a/forge-gui/res/cardsfolder/e/evil_eye_of_orms_by_gore.txt b/forge-gui/res/cardsfolder/e/evil_eye_of_orms_by_gore.txt index 30ac57446f5..debb658bfbc 100644 --- a/forge-gui/res/cardsfolder/e/evil_eye_of_orms_by_gore.txt +++ b/forge-gui/res/cardsfolder/e/evil_eye_of_orms_by_gore.txt @@ -2,7 +2,6 @@ Name:Evil Eye of Orms-by-Gore ManaCost:4 B Types:Creature Eye PT:3/6 -K:CantBeBlockedBy Creature.nonWall -S:Mode$ Continuous | Affected$ Creature.nonEye+YouCtrl | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Non-Eye creatures you control can't attack. -SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_eye_of_orms_by_gore.jpg -Oracle:Non-Eye creatures you control can't attack.\nEvil Eye of Orms-by-Gore can't be blocked except by Walls. +S:Mode$ CantAttack | ValidCard$ Creature.nonEye+YouCtrl | Description$ Non-Eye creatures you control can't attack. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonWall | Description$ CARDNAME can't be blocked except by Walls. +Oracle:Non-Eye creatures you control can't attack.\nEvil Eye of Orms-by-Gore can't be blocked except by Walls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/e/evil_eye_of_urborg.txt b/forge-gui/res/cardsfolder/e/evil_eye_of_urborg.txt index 03da358a0ef..0560c2ffdec 100644 --- a/forge-gui/res/cardsfolder/e/evil_eye_of_urborg.txt +++ b/forge-gui/res/cardsfolder/e/evil_eye_of_urborg.txt @@ -2,8 +2,7 @@ Name:Evil Eye of Urborg ManaCost:4 B Types:Creature Eye PT:6/3 -S:Mode$ Continuous | Affected$ Creature.nonEye+YouCtrl | AddHiddenKeyword$ CARDNAME can't attack. | Description$ Non-Eye creatures you control can't attack. +S:Mode$ CantAttack | ValidCard$ Creature.nonEye+YouCtrl | Description$ Non-Eye creatures you control can't attack. T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigDestroyBlocker | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, destroy that creature. SVar:TrigDestroyBlocker:DB$ Destroy | Defined$ TriggeredBlockerLKICopy -SVar:Picture:http://www.wizards.com/global/images/magic/general/evil_eye_of_urborg.jpg -Oracle:Non-Eye creatures you control can't attack.\nWhenever Evil Eye of Urborg becomes blocked by a creature, destroy that creature. +Oracle:Non-Eye creatures you control can't attack.\nWhenever Evil Eye of Urborg becomes blocked by a creature, destroy that creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/excavated_wall.txt b/forge-gui/res/cardsfolder/e/excavated_wall.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/excavated_wall.txt rename to forge-gui/res/cardsfolder/e/excavated_wall.txt diff --git a/forge-gui/res/cardsfolder/upcoming/excavation_technique.txt b/forge-gui/res/cardsfolder/e/excavation_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/excavation_technique.txt rename to forge-gui/res/cardsfolder/e/excavation_technique.txt diff --git a/forge-gui/res/cardsfolder/upcoming/exhilarating_elocution.txt b/forge-gui/res/cardsfolder/e/exhilarating_elocution.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/exhilarating_elocution.txt rename to forge-gui/res/cardsfolder/e/exhilarating_elocution.txt diff --git a/forge-gui/res/cardsfolder/upcoming/expanded_anatomy.txt b/forge-gui/res/cardsfolder/e/expanded_anatomy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/expanded_anatomy.txt rename to forge-gui/res/cardsfolder/e/expanded_anatomy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/expel.txt b/forge-gui/res/cardsfolder/e/expel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/expel.txt rename to forge-gui/res/cardsfolder/e/expel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/explosive_welcome.txt b/forge-gui/res/cardsfolder/e/explosive_welcome.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/explosive_welcome.txt rename to forge-gui/res/cardsfolder/e/explosive_welcome.txt diff --git a/forge-gui/res/cardsfolder/upcoming/exponential_growth.txt b/forge-gui/res/cardsfolder/e/exponential_growth.txt similarity index 96% rename from forge-gui/res/cardsfolder/upcoming/exponential_growth.txt rename to forge-gui/res/cardsfolder/e/exponential_growth.txt index ade52f6f6f3..d9696369e1d 100644 --- a/forge-gui/res/cardsfolder/upcoming/exponential_growth.txt +++ b/forge-gui/res/cardsfolder/e/exponential_growth.txt @@ -5,4 +5,5 @@ A:SP$ Repeat | Cost$ X X G G | ValidTgts$ Creature | TgtPrompt$ Select target cr SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +Y | SpellDescription$ Double the power of target creature X times until end of turn. SVar:X:Count$xPaid SVar:Y:Targeted$CardPower +AI:RemoveDeck:All Oracle:Until end of turn, double target creature's power X times. diff --git a/forge-gui/res/cardsfolder/upcoming/expressive_iteration.txt b/forge-gui/res/cardsfolder/e/expressive_iteration.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/expressive_iteration.txt rename to forge-gui/res/cardsfolder/e/expressive_iteration.txt diff --git a/forge-gui/res/cardsfolder/e/expropriate.txt b/forge-gui/res/cardsfolder/e/expropriate.txt index 32834258f05..4e9832103dd 100644 --- a/forge-gui/res/cardsfolder/e/expropriate.txt +++ b/forge-gui/res/cardsfolder/e/expropriate.txt @@ -3,7 +3,7 @@ ManaCost:7 U U Types:Sorcery A:SP$ Vote | Cost$ 7 U U | Defined$ Player | VoteType$ Time,Money | VoteTime$ DBTime | VoteMoney$ DBMoney | EachVote$ True | SubAbility$ DBChange | SpellDescription$ Council's dilemma — Starting with you, each player votes for time or money. For each time vote, take an extra turn after this one. For each money vote, choose a permanent owned by the voter and gain control of it. Exile Expropriate. SVar:DBTime:DB$ AddTurn | Defined$ You | NumTurns$ 1 -SVar:DBMoney:DB$ ChooseCard | Defined$ You | Choices$ Permanent.RememberedPlayerOwn | SubAbility$ DBControl +SVar:DBMoney:DB$ ChooseCard | Defined$ You | Choices$ Permanent.RememberedPlayerOwn | Mandatory$ True | SubAbility$ DBControl SVar:DBControl:DB$ GainControl | Defined$ ChosenCard | NewController$ You SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | StackDescription$ None Oracle:Council's dilemma — Starting with you, each player votes for time or money. For each time vote, take an extra turn after this one. For each money vote, choose a permanent owned by the voter and gain control of it. Exile Expropriate. diff --git a/forge-gui/res/cardsfolder/upcoming/extus_oriq_overlord_awaken_the_blood_avatar.txt b/forge-gui/res/cardsfolder/e/extus_oriq_overlord_awaken_the_blood_avatar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/extus_oriq_overlord_awaken_the_blood_avatar.txt rename to forge-gui/res/cardsfolder/e/extus_oriq_overlord_awaken_the_blood_avatar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/eyetwitch.txt b/forge-gui/res/cardsfolder/e/eyetwitch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/eyetwitch.txt rename to forge-gui/res/cardsfolder/e/eyetwitch.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ezzaroot_channeler.txt b/forge-gui/res/cardsfolder/e/ezzaroot_channeler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ezzaroot_channeler.txt rename to forge-gui/res/cardsfolder/e/ezzaroot_channeler.txt diff --git a/forge-gui/res/cardsfolder/f/faerie_squadron.txt b/forge-gui/res/cardsfolder/f/faerie_squadron.txt index 9481564c4a8..6c071496e79 100644 --- a/forge-gui/res/cardsfolder/f/faerie_squadron.txt +++ b/forge-gui/res/cardsfolder/f/faerie_squadron.txt @@ -5,6 +5,6 @@ PT:1/1 K:Kicker:3 U T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ SquadronEnlist | Static$ True | TriggerDescription$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with flying. SVar:SquadronEnlist:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ SquadronLaunch -SVar:SquadronLaunch:DB$ Pump | Defined$ Self | KW$ Flying | Permanent$ True +SVar:SquadronLaunch:DB$ Pump | Defined$ Self | KW$ Flying | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_squadron.jpg Oracle:Kicker {3}{U} (You may pay an additional {3}{U} as you cast this spell.)\nIf Faerie Squadron was kicked, it enters the battlefield with two +1/+1 counters on it and with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/fain_the_broker.txt b/forge-gui/res/cardsfolder/f/fain_the_broker.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fain_the_broker.txt rename to forge-gui/res/cardsfolder/f/fain_the_broker.txt diff --git a/forge-gui/res/cardsfolder/f/fairgrounds_warden.txt b/forge-gui/res/cardsfolder/f/fairgrounds_warden.txt index 91c2498c367..40950281e95 100644 --- a/forge-gui/res/cardsfolder/f/fairgrounds_warden.txt +++ b/forge-gui/res/cardsfolder/f/fairgrounds_warden.txt @@ -3,6 +3,6 @@ ManaCost:2 W Types:Creature Dwarf Soldier PT:1/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:When Fairgrounds Warden enters the battlefield, exile target creature an opponent controls until Fairgrounds Warden leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/f/faith_unbroken.txt b/forge-gui/res/cardsfolder/f/faith_unbroken.txt index 58d61490fc5..e21c64c5914 100644 --- a/forge-gui/res/cardsfolder/f/faith_unbroken.txt +++ b/forge-gui/res/cardsfolder/f/faith_unbroken.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature you control A:SP$ Attach | Cost$ 3 W | ValidTgts$ Creature | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | Description$ Enchanted creature gets +2/+2. Oracle:Enchant creature you control\nWhen Faith Unbroken enters the battlefield, exile target creature an opponent controls until Faith Unbroken leaves the battlefield.\nEnchanted creature gets +2/+2. diff --git a/forge-gui/res/cardsfolder/f/fated_return.txt b/forge-gui/res/cardsfolder/f/fated_return.txt index 5c9d4adc0c2..b7e881c1b8a 100644 --- a/forge-gui/res/cardsfolder/f/fated_return.txt +++ b/forge-gui/res/cardsfolder/f/fated_return.txt @@ -2,7 +2,7 @@ Name:Fated Return ManaCost:4 B B B Types:Instant A:SP$ ChangeZone | Cost$ 4 B B B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. It gains indestructible. If it's your turn, scry 2. -SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ Indestructible | Permanent$ True | SubAbility$ DBScry +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ Indestructible | Duration$ Permanent | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 2 | ConditionPlayerTurn$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/fated_return.jpg Oracle:Put target creature card from a graveyard onto the battlefield under your control. It gains indestructible. If it's your turn, scry 2. (Look at the top two cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.) diff --git a/forge-gui/res/cardsfolder/f/fathom_fleet_cutthroat.txt b/forge-gui/res/cardsfolder/f/fathom_fleet_cutthroat.txt index 8578bb3da10..bda45911694 100644 --- a/forge-gui/res/cardsfolder/f/fathom_fleet_cutthroat.txt +++ b/forge-gui/res/cardsfolder/f/fathom_fleet_cutthroat.txt @@ -3,6 +3,6 @@ ManaCost:3 B Types:Creature Human Pirate PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, destroy target creature an opponent controls that was dealt damage this turn. -SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.OppCtrl+wasDealtDamageThisTurn | TgtPrompt$ Select target creature tan opponent controls that was dealt damage this turn. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.OppCtrl+wasDealtDamageThisTurn | TgtPrompt$ Select target creature an opponent controls that was dealt damage this turn. SVar:Picture:http://www.wizards.com/global/images/magic/general/fathom_fleet_cutthroat.jpg Oracle:When Fathom Fleet Cutthroat enters the battlefield, destroy target creature an opponent controls that was dealt damage this turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/fearsome_temper.txt b/forge-gui/res/cardsfolder/f/fearsome_temper.txt index 2e01ac87d62..79c30fa0b02 100644 --- a/forge-gui/res/cardsfolder/f/fearsome_temper.txt +++ b/forge-gui/res/cardsfolder/f/fearsome_temper.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 2 R | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddAbility$ CantBlockFT | Description$ Enchanted creature gets +2/+2 and has "{2}{R}: Target creature can't block this creature this turn." -SVar:CantBlockFT:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/fearsome_temper.jpg +SVar:CantBlockFT:AB$ Effect | Cost$ 2 R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. Oracle:Enchant creature\nEnchanted creature gets +2/+2 and has "{2}{R}: Target creature can't block this creature this turn." diff --git a/forge-gui/res/cardsfolder/upcoming/felisa_fang_of_silverquill.txt b/forge-gui/res/cardsfolder/f/felisa_fang_of_silverquill.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/felisa_fang_of_silverquill.txt rename to forge-gui/res/cardsfolder/f/felisa_fang_of_silverquill.txt diff --git a/forge-gui/res/cardsfolder/f/fen_hauler.txt b/forge-gui/res/cardsfolder/f/fen_hauler.txt index 789c47a13c3..e864dc88909 100644 --- a/forge-gui/res/cardsfolder/f/fen_hauler.txt +++ b/forge-gui/res/cardsfolder/f/fen_hauler.txt @@ -3,6 +3,5 @@ ManaCost:6 B Types:Creature Insect PT:5/5 K:Improvise -K:CantBeBlockedBy Artifact.Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/fen_hauler.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Artifact.Creature | Description$ CARDNAME can't be blocked by artifact creatures. Oracle:Improvise (Your artifacts can help cast this spell. Each artifact you tap after you're done activating mana abilities pays for {1}.)\nFen Hauler can't be blocked by artifact creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/fervent_mastery.txt b/forge-gui/res/cardsfolder/f/fervent_mastery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fervent_mastery.txt rename to forge-gui/res/cardsfolder/f/fervent_mastery.txt diff --git a/forge-gui/res/cardsfolder/f/fickle_efreet.txt b/forge-gui/res/cardsfolder/f/fickle_efreet.txt index 4ee2f0184dd..66e6156c244 100644 --- a/forge-gui/res/cardsfolder/f/fickle_efreet.txt +++ b/forge-gui/res/cardsfolder/f/fickle_efreet.txt @@ -6,6 +6,6 @@ T:Mode$ Blocks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ Del T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DelayTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, flip a coin at end of combat. If you lose the flip, an opponent gains control of CARDNAME. SVar:DelayTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | Execute$ TrigFlip | TriggerDescription$ flip a coin at end of combat. If you lose the flip, an opponent gains control of CARDNAME. SVar:TrigFlip:DB$ FlipACoin | LoseSubAbility$ DBGiveControl -SVar:DBGiveControl:DB$ GainControl | Defined$ Self | NewController$ Opponent | Permanent$ True +SVar:DBGiveControl:DB$ GainControl | Defined$ Self | NewController$ Opponent | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/fickle_efreet.jpg Oracle:Whenever Fickle Efreet attacks or blocks, flip a coin at end of combat. If you lose the flip, an opponent gains control of Fickle Efreet. diff --git a/forge-gui/res/cardsfolder/upcoming/field_trip.txt b/forge-gui/res/cardsfolder/f/field_trip.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/field_trip.txt rename to forge-gui/res/cardsfolder/f/field_trip.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fiery_encore.txt b/forge-gui/res/cardsfolder/f/fiery_encore.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fiery_encore.txt rename to forge-gui/res/cardsfolder/f/fiery_encore.txt diff --git a/forge-gui/res/cardsfolder/f/figure_of_destiny.txt b/forge-gui/res/cardsfolder/f/figure_of_destiny.txt index 64e1eab845e..6d5ebc4b972 100644 --- a/forge-gui/res/cardsfolder/f/figure_of_destiny.txt +++ b/forge-gui/res/cardsfolder/f/figure_of_destiny.txt @@ -2,8 +2,8 @@ Name:Figure of Destiny ManaCost:RW Types:Creature Kithkin PT:1/1 -A:AB$ Animate | Cost$ RW | Types$ Kithkin,Spirit | Permanent$ True | Power$ 2 | Toughness$ 2 | SpellDescription$ CARDNAME becomes a Kithkin Spirit with base power and toughness 2/2. -A:AB$ Animate | Cost$ RW RW RW | ConditionPresent$ Card.Self+Spirit | Types$ Kithkin,Spirit,Warrior | Permanent$ True | Power$ 4 | Toughness$ 4 | SpellDescription$ If CARDNAME is a Spirit, it becomes a Kithkin Spirit Warrior with base power and toughness 4/4. -A:AB$ Animate | Cost$ RW RW RW RW RW RW| ConditionPresent$ Card.Self+Warrior | Types$ Kithkin,Spirit,Warrior,Avatar | Permanent$ True | Power$ 8 | Toughness$ 8 | Keywords$ Flying & First Strike | SpellDescription$ If CARDNAME is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike. +A:AB$ Animate | Cost$ RW | Types$ Kithkin,Spirit | Duration$ Permanent | Power$ 2 | Toughness$ 2 | SpellDescription$ CARDNAME becomes a Kithkin Spirit with base power and toughness 2/2. +A:AB$ Animate | Cost$ RW RW RW | ConditionPresent$ Card.Self+Spirit | Types$ Kithkin,Spirit,Warrior | Duration$ Permanent | Power$ 4 | Toughness$ 4 | SpellDescription$ If CARDNAME is a Spirit, it becomes a Kithkin Spirit Warrior with base power and toughness 4/4. +A:AB$ Animate | Cost$ RW RW RW RW RW RW| ConditionPresent$ Card.Self+Warrior | Types$ Kithkin,Spirit,Warrior,Avatar | Duration$ Permanent | Power$ 8 | Toughness$ 8 | Keywords$ Flying & First Strike | SpellDescription$ If CARDNAME is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike. SVar:Picture:http://www.wizards.com/global/images/magic/general/figure_of_destiny.jpg Oracle:{R/W}: Figure of Destiny becomes a Kithkin Spirit with base power and toughness 2/2.\n{R/W}{R/W}{R/W}: If Figure of Destiny is a Spirit, it becomes a Kithkin Spirit Warrior with base power and toughness 4/4.\n{R/W}{R/W}{R/W}{R/W}{R/W}{R/W}: If Figure of Destiny is a Warrior, it becomes a Kithkin Spirit Warrior Avatar with base power and toughness 8/8, flying, and first strike. diff --git a/forge-gui/res/cardsfolder/f/fin_clade_fugitives.txt b/forge-gui/res/cardsfolder/f/fin_clade_fugitives.txt index 9ac5e3a32fc..f4a262c433a 100644 --- a/forge-gui/res/cardsfolder/f/fin_clade_fugitives.txt +++ b/forge-gui/res/cardsfolder/f/fin_clade_fugitives.txt @@ -2,7 +2,7 @@ Name:Fin-Clade Fugitives ManaCost:5 G Types:Creature Elf Salamander Rogue PT:7/4 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. K:Encore:4 G DeckHas:Ability$Token -Oracle:Fin-Clade Fugitives can't be blocked by creatures with power 2 or less.\nEncore {4}{G} ({4}{G}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) +Oracle:Fin-Clade Fugitives can't be blocked by creatures with power 2 or less.\nEncore {4}{G} ({4}{G}, Exile this card from your graveyard: For each opponent, create a token copy that attacks that opponent this turn if able. They gain haste. Sacrifice them at the beginning of the next end step. Activate only as a sorcery.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/fires_of_invention.txt b/forge-gui/res/cardsfolder/f/fires_of_invention.txt index 6f15e865a6e..039255efd04 100644 --- a/forge-gui/res/cardsfolder/f/fires_of_invention.txt +++ b/forge-gui/res/cardsfolder/f/fires_of_invention.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Enchantment S:Mode$ CantBeCast | NonCasterTurn$ True | Caster$ You | Description$ You can cast spells only during your turn and you can cast no more than two spells each turn. S:Mode$ CantBeCast | NumLimitEachTurn$ 2 | Caster$ You | Secondary$ True | Description$ You can cast spells only during your turn and you can cast no more than two spells each turn. -S:Mode$ Continuous | Affected$ Card.nonLand+YouOwn+cmcLEX | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand,Graveyard,Exile,Command,Library | MayPlayDontGrantZonePermissions$ True | Description$ You may cast spells with mana value less than or equal to the number of lands you control without paying their mana costs. +S:Mode$ Continuous | Affected$ Card.nonLand+cmcLEX | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand,Graveyard,Exile,Command,Library | MayPlayDontGrantZonePermissions$ True | Description$ You may cast spells with mana value less than or equal to the number of lands you control without paying their mana costs. SVar:X:Count$Valid Land.YouCtrl AI:RemoveDeck:Random SVar:NonStackingEffect:True diff --git a/forge-gui/res/cardsfolder/upcoming/first_day_of_class.txt b/forge-gui/res/cardsfolder/f/first_day_of_class.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/first_day_of_class.txt rename to forge-gui/res/cardsfolder/f/first_day_of_class.txt diff --git a/forge-gui/res/cardsfolder/f/flame_wreathed_phoenix.txt b/forge-gui/res/cardsfolder/f/flame_wreathed_phoenix.txt index e769f82db37..840bd19e6c7 100644 --- a/forge-gui/res/cardsfolder/f/flame_wreathed_phoenix.txt +++ b/forge-gui/res/cardsfolder/f/flame_wreathed_phoenix.txt @@ -4,7 +4,7 @@ Types:Creature Phoenix PT:3/3 K:Flying K:Tribute:2 -SVar:TrigNotTribute:DB$ Animate | Permanent$ True | Triggers$ FlamePhoenixChangeZone | Keywords$ Haste | SpellDescription$ When CARDNAME enters the battlefield, if tribute wasn't paid, it gains haste and "When this creature dies, return it to its owner's hand." +SVar:TrigNotTribute:DB$ Animate | Duration$ Permanent | Triggers$ FlamePhoenixChangeZone | Keywords$ Haste | SpellDescription$ When CARDNAME enters the battlefield, if tribute wasn't paid, it gains haste and "When this creature dies, return it to its owner's hand." SVar:FlamePhoenixChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ TriggeredNewCardLKICopy SVar:TributeAILogic:CanBlockThisTurn diff --git a/forge-gui/res/cardsfolder/upcoming/flamescroll_celebrant_revel_in_silence.txt b/forge-gui/res/cardsfolder/f/flamescroll_celebrant_revel_in_silence.txt similarity index 99% rename from forge-gui/res/cardsfolder/upcoming/flamescroll_celebrant_revel_in_silence.txt rename to forge-gui/res/cardsfolder/f/flamescroll_celebrant_revel_in_silence.txt index 8e662b04e3e..684ce80140d 100644 --- a/forge-gui/res/cardsfolder/upcoming/flamescroll_celebrant_revel_in_silence.txt +++ b/forge-gui/res/cardsfolder/f/flamescroll_celebrant_revel_in_silence.txt @@ -1,7 +1,7 @@ Name:Flamescroll Celebrant ManaCost:1 R Types:Creature Human Cleric -PT:2/2 +PT:2/1 T:Mode$ AbilityCast | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever an opponent activates an ability that isn't a mana ability, CARDNAME deals 1 damage to that player. SVar:TrigDmg:DB$ DealDamage | NumDmg$ 1 | Defined$ TriggeredActivator A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +2 | SpellDescription$ CARDNAME gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/fleet_footed_monk.txt b/forge-gui/res/cardsfolder/f/fleet_footed_monk.txt index 962ac9c2f54..b3bb46f0676 100644 --- a/forge-gui/res/cardsfolder/f/fleet_footed_monk.txt +++ b/forge-gui/res/cardsfolder/f/fleet_footed_monk.txt @@ -2,6 +2,5 @@ Name:Fleet-Footed Monk ManaCost:1 W Types:Creature Human Monk PT:1/1 -K:CantBeBlockedBy Creature.powerGE2 -SVar:Picture:http://serv3.tcgimages.eu/img/cards/Portal/fleet_footed_monk.jpg -Oracle:Fleet-Footed Monk can't be blocked by creatures with power 2 or greater. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or greater. +Oracle:Fleet-Footed Monk can't be blocked by creatures with power 2 or greater. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/flow_of_maggots.txt b/forge-gui/res/cardsfolder/f/flow_of_maggots.txt index 82330770241..3f91e57c092 100644 --- a/forge-gui/res/cardsfolder/f/flow_of_maggots.txt +++ b/forge-gui/res/cardsfolder/f/flow_of_maggots.txt @@ -3,6 +3,5 @@ ManaCost:2 B Types:Creature Insect PT:2/2 K:Cumulative upkeep:1 -K:CantBeBlockedBy Creature.nonWall -SVar:Picture:http://www.wizards.com/global/images/magic/general/flow_of_maggots.jpg -Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nFlow of Maggots can't be blocked by non-Wall creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonWall | Description$ CARDNAME can't be blocked by non-Wall creatures. +Oracle:Cumulative upkeep {1} (At the beginning of your upkeep, put an age counter on this permanent, then sacrifice it unless you pay its upkeep cost for each age counter on it.)\nFlow of Maggots can't be blocked by non-Wall creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/f/flowstone_sculpture.txt b/forge-gui/res/cardsfolder/f/flowstone_sculpture.txt index 97b6e760547..ef8fecaad71 100644 --- a/forge-gui/res/cardsfolder/f/flowstone_sculpture.txt +++ b/forge-gui/res/cardsfolder/f/flowstone_sculpture.txt @@ -4,8 +4,8 @@ Types:Artifact Creature Shapeshifter PT:4/4 A:AB$ GenericChoice | Cost$ 2 Discard<1/Card> | Choices$ ChooseCounters,ChooseFlying,ChooseFirstStrike,ChooseTrample | SpellDescription$ Put a +1/+1 counter on CARDNAME or CARDNAME gains flying, first strike, or trample. (This effect lasts indefinitely.) SVar:ChooseCounters:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:ChooseFlying:DB$ Pump | Defined$ Self | KW$ Flying | Permanent$ True | SpellDescription$ CARDNAME gains flying. -SVar:ChooseFirstStrike:DB$ Pump | Defined$ Self | KW$ First Strike | Permanent$ True | SpellDescription$ CARDNAME gains first strike. -SVar:ChooseTrample:DB$ Pump | Defined$ Self | KW$ Trample | Permanent$ True | SpellDescription$ CARDNAME gains trample. +SVar:ChooseFlying:DB$ Pump | Defined$ Self | KW$ Flying | Duration$ Permanent | SpellDescription$ CARDNAME gains flying. +SVar:ChooseFirstStrike:DB$ Pump | Defined$ Self | KW$ First Strike | Duration$ Permanent | SpellDescription$ CARDNAME gains first strike. +SVar:ChooseTrample:DB$ Pump | Defined$ Self | KW$ Trample | Duration$ Permanent | SpellDescription$ CARDNAME gains trample. SVar:Picture:http://www.wizards.com/global/images/magic/general/flowstone_sculpture.jpg Oracle:{2}, Discard a card: Put a +1/+1 counter on Flowstone Sculpture or Flowstone Sculpture gains flying, first strike, or trample. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/f/flowstone_shambler.txt b/forge-gui/res/cardsfolder/f/flowstone_shambler.txt index ad43166a721..4666bb4abb0 100644 --- a/forge-gui/res/cardsfolder/f/flowstone_shambler.txt +++ b/forge-gui/res/cardsfolder/f/flowstone_shambler.txt @@ -2,5 +2,5 @@ Name:Flowstone Shambler ManaCost:2 R Types:Creature Beast PT:2/2 -A:AB$ Pump | Cost$ R | Defined$ Self | +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. +A:AB$ Pump | Cost$ R | Defined$ Self | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. Oracle:{R}: Flowstone Shambler gets +1/-1 until end of turn. diff --git a/forge-gui/res/cardsfolder/f/flummoxed_cyclops.txt b/forge-gui/res/cardsfolder/f/flummoxed_cyclops.txt index 9cd2a5a8b9e..e48ace4fe35 100644 --- a/forge-gui/res/cardsfolder/f/flummoxed_cyclops.txt +++ b/forge-gui/res/cardsfolder/f/flummoxed_cyclops.txt @@ -4,6 +4,6 @@ Types:Creature Cyclops PT:4/4 K:Reach T:Mode$ AttackersDeclared | AttackingPlayer$ Player.Opponent | CheckSVar$ CheckAttackers | SVarCompare$ GE2 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever two or more creatures your opponents control attack, CARDNAME can't block this combat. -SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can't block. | UntilEndOfCombat$ True +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can't block. | Duration$ UntilEndOfCombat SVar:CheckAttackers:Count$Valid Creature.OppCtrl+attacking Oracle:Reach\nWhenever two or more creatures your opponents control attack, Flummoxed Cyclops can't block this combat. diff --git a/forge-gui/res/cardsfolder/upcoming/flunk.txt b/forge-gui/res/cardsfolder/f/flunk.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/flunk.txt rename to forge-gui/res/cardsfolder/f/flunk.txt diff --git a/forge-gui/res/cardsfolder/f/fog_elemental.txt b/forge-gui/res/cardsfolder/f/fog_elemental.txt index b7e23e40d4a..42229329d09 100644 --- a/forge-gui/res/cardsfolder/f/fog_elemental.txt +++ b/forge-gui/res/cardsfolder/f/fog_elemental.txt @@ -6,7 +6,6 @@ K:Flying T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$Sacrifice | Defined$ Self +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/fog_elemental.jpg Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWhen Fog Elemental attacks or blocks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/f/fogwalker.txt b/forge-gui/res/cardsfolder/f/fogwalker.txt index fe1d60197ed..98b81e7efdc 100644 --- a/forge-gui/res/cardsfolder/f/fogwalker.txt +++ b/forge-gui/res/cardsfolder/f/fogwalker.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:1/3 K:Skulk T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/fogwalker.jpg Oracle:Skulk (This creature can't be blocked by creatures with greater power.)\nWhen Fogwalker enters the battlefield, target creature an opponent controls doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/f/forcefield.txt b/forge-gui/res/cardsfolder/f/forcefield.txt index b07ac4f2781..ac911de3ea9 100644 --- a/forge-gui/res/cardsfolder/f/forcefield.txt +++ b/forge-gui/res/cardsfolder/f/forcefield.txt @@ -1,12 +1,12 @@ Name:Forcefield ManaCost:3 Types:Artifact -A:AB$ ChooseCard | Cost$ 1 | Choices$ Creature.unblocked | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time an unblocked creature of your choice would deal combat damage to you this turn, prevent all but 1 of that damage. +A:AB$ ChooseCard | Cost$ 1 | Choices$ Creature.unblocked | AILogic$ NeedsPrevention | Mandatory$ True | SubAbility$ DBEffect | SpellDescription$ The next time an unblocked creature of your choice would deal combat damage to you this turn, prevent all but 1 of that damage. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventDamage | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:RPreventDamage:Event$ DamageDone | ValidSource$ Card.ChosenCard | ValidTarget$ You | ReplaceWith$ PreventDmg | PreventionEffect$ True | IsCombat$ True | Description$ The next time an unblocked creature of your choice would deal combat damage to you this turn, prevent all but 1 of that damage. -SVar:PreventDmg:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 1 | SubAbility$ ExileEffect +SVar:PreventDmg:DB$ ReplaceDamage | Amount$ ShieldAmount | SubAbility$ ExileEffect +SVar:ShieldAmount:ReplaceCount$DamageAmount/Minus.1 SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:NonStackingEffect:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/forcefield.jpg Oracle:{1}: The next time an unblocked creature of your choice would deal combat damage to you this turn, prevent all but 1 of that damage. diff --git a/forge-gui/res/cardsfolder/f/forgestoker_dragon.txt b/forge-gui/res/cardsfolder/f/forgestoker_dragon.txt index 8073103c232..2b18d55bc5d 100644 --- a/forge-gui/res/cardsfolder/f/forgestoker_dragon.txt +++ b/forge-gui/res/cardsfolder/f/forgestoker_dragon.txt @@ -4,6 +4,6 @@ Types:Creature Dragon PT:5/4 K:Flying A:AB$ DealDamage | Cost$ 1 R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 1 | SubAbility$ DBPump | IsPresent$ Card.Self+attacking | SpellDescription$ CARDNAME deals 1 damage to target creature. It can't be regenerated this turn. That creature can't block this combat. Activate only if CARDNAME is attacking. -SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ HIDDEN CARDNAME can't block. | UntilEndOfCombat$ True +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ HIDDEN CARDNAME can't block. | Duration$ UntilEndOfCombat SVar:Picture:http://www.wizards.com/global/images/magic/general/forgestoker_dragon.jpg Oracle:Flying\n{1}{R}: Forgestoker Dragon deals 1 damage to target creature. That creature can't block this combat. Activate only if Forgestoker Dragon is attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/fortifying_draught.txt b/forge-gui/res/cardsfolder/f/fortifying_draught.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fortifying_draught.txt rename to forge-gui/res/cardsfolder/f/fortifying_draught.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fractal_harness.txt b/forge-gui/res/cardsfolder/f/fractal_harness.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fractal_harness.txt rename to forge-gui/res/cardsfolder/f/fractal_harness.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fractal_summoning.txt b/forge-gui/res/cardsfolder/f/fractal_summoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fractal_summoning.txt rename to forge-gui/res/cardsfolder/f/fractal_summoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/fracture.txt b/forge-gui/res/cardsfolder/f/fracture.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fracture.txt rename to forge-gui/res/cardsfolder/f/fracture.txt diff --git a/forge-gui/res/cardsfolder/f/fractured_loyalty.txt b/forge-gui/res/cardsfolder/f/fractured_loyalty.txt index 606f902b6cb..f5189d489ef 100644 --- a/forge-gui/res/cardsfolder/f/fractured_loyalty.txt +++ b/forge-gui/res/cardsfolder/f/fractured_loyalty.txt @@ -4,7 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 R | ValidTgts$ Creature | AILogic$ Curse T:Mode$ BecomesTarget | ValidTarget$ Card.EnchantedBy | TriggerZones$ Battlefield | Execute$ TrigGainControl | TriggerDescription$ Whenever enchanted creature becomes the target of a spell or ability, that spell or ability's controller gains control of that creature. (This effect lasts indefinitely.) -SVar:TrigGainControl:DB$ GainControl | Defined$ Enchanted | NewController$ TriggeredSourceController | Permanent$ True +SVar:TrigGainControl:DB$ GainControl | Defined$ Enchanted | NewController$ TriggeredSourceController | Duration$ Permanent AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/fractured_loyalty.jpg Oracle:Enchant creature\nWhenever enchanted creature becomes the target of a spell or ability, that spell or ability's controller gains control of that creature. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/f/frontier_siege.txt b/forge-gui/res/cardsfolder/f/frontier_siege.txt index 1b30e4a04f3..9ea5098c537 100644 --- a/forge-gui/res/cardsfolder/f/frontier_siege.txt +++ b/forge-gui/res/cardsfolder/f/frontier_siege.txt @@ -3,10 +3,10 @@ ManaCost:3 G Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Khans or Dragons. Khans — At the beginning of each of your main phases, add {G}{G}. Dragons — Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Khans,Dragons | Defined$ You | SetChosenMode$ True | AILogic$ Khans | ShowChoice$ ExceptSelf -SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Permanent$ True | SpellDescription$ Khans +SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Duration$ Permanent | SpellDescription$ Khans SVar:KhansTrigger:Mode$ Phase | Phase$ Main1,Main2 | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ ManaGain | TriggerDescription$ At the beginning of each of your main phases, add {G}{G}. SVar:ManaGain:DB$ Mana | Produced$ G G -SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Permanent$ True | SpellDescription$ Dragons +SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Duration$ Permanent | SpellDescription$ Dragons SVar:DragonsTrigger:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+withFlying | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ AirFight | TriggerDescription$ Whenever a creature with flying enters the battlefield under your control, you may have it fight target creature you don't control. SVar:AirFight:DB$ Fight | Defined$ TriggeredCardLKICopy | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control SVar:Picture:http://www.wizards.com/global/images/magic/general/frontier_siege.jpg diff --git a/forge-gui/res/cardsfolder/f/frost_breath.txt b/forge-gui/res/cardsfolder/f/frost_breath.txt index 1dfb1b96719..a5864cbf73b 100644 --- a/forge-gui/res/cardsfolder/f/frost_breath.txt +++ b/forge-gui/res/cardsfolder/f/frost_breath.txt @@ -2,5 +2,5 @@ Name:Frost Breath ManaCost:2 U Types:Instant A:SP$ Tap | Cost$ 2 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent Oracle:Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/f/frost_lynx.txt b/forge-gui/res/cardsfolder/f/frost_lynx.txt index 0b72c1b13e6..ae4ce5c9514 100644 --- a/forge-gui/res/cardsfolder/f/frost_lynx.txt +++ b/forge-gui/res/cardsfolder/f/frost_lynx.txt @@ -4,7 +4,7 @@ Types:Creature Elemental Cat PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_lynx.jpg Oracle:When Frost Lynx enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/f/frost_titan.txt b/forge-gui/res/cardsfolder/f/frost_titan.txt index 228ab8d1e33..aae9c60e3fc 100644 --- a/forge-gui/res/cardsfolder/f/frost_titan.txt +++ b/forge-gui/res/cardsfolder/f/frost_titan.txt @@ -6,7 +6,7 @@ T:Mode$ BecomesTarget | ValidSource$ Card.OppCtrl | ValidTarget$ Card.Self | Tri T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, tap target permanent. It doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSourceSA | UnlessCost$ 2 | UnlessPayer$ TriggeredSourceSAController SVar:HasAttackEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/frost_titan.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/frost_trickster.txt b/forge-gui/res/cardsfolder/f/frost_trickster.txt similarity index 91% rename from forge-gui/res/cardsfolder/upcoming/frost_trickster.txt rename to forge-gui/res/cardsfolder/f/frost_trickster.txt index ab190b5ace3..9523ff02cff 100644 --- a/forge-gui/res/cardsfolder/upcoming/frost_trickster.txt +++ b/forge-gui/res/cardsfolder/f/frost_trickster.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE Oracle:Flying\nWhen Frost Trickster enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/frostboil_snarl.txt b/forge-gui/res/cardsfolder/f/frostboil_snarl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/frostboil_snarl.txt rename to forge-gui/res/cardsfolder/f/frostboil_snarl.txt diff --git a/forge-gui/res/cardsfolder/f/frostveil_ambush.txt b/forge-gui/res/cardsfolder/f/frostveil_ambush.txt index ef8a7570c07..0c371648eba 100644 --- a/forge-gui/res/cardsfolder/f/frostveil_ambush.txt +++ b/forge-gui/res/cardsfolder/f/frostveil_ambush.txt @@ -2,6 +2,6 @@ Name:Frostveil Ambush ManaCost:3 U U Types:Instant A:SP$ Tap | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose up to two target creatures | ValidTgts$ Creature | SubAbility$ TrigPump | StackDescription$ SpellDescription | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | StackDescription$ None +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | StackDescription$ None K:Cycling:1 Oracle:Tap up to two target creatures. Those creatures don't untap during their controller's next untap step.\nCycling {1} ({1}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt b/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt index 9a9847c0368..0988e787344 100644 --- a/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt +++ b/forge-gui/res/cardsfolder/f/frostwalk_bastion.txt @@ -5,6 +5,6 @@ A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Animate | Cost$ 1 S | Defined$ Self | Power$ 2 | Toughness$ 3 | Types$ Creature,Artifact,Construct | SpellDescription$ Until end of turn, CARDNAME becomes a 2/3 Construct artifact creature. It's still a land. ({S} can be paid with one mana from a snow source.) T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:{T}: Add {C}.\n{1}{S}: Until end of turn, Frostwalk Bastion becomes a 2/3 Construct artifact creature. It's still a land. ({S} can be paid with one mana from a snow source.)\nWhenever Frostwalk Bastion deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/fuming_effigy.txt b/forge-gui/res/cardsfolder/f/fuming_effigy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/fuming_effigy.txt rename to forge-gui/res/cardsfolder/f/fuming_effigy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/furycalm_snarl.txt b/forge-gui/res/cardsfolder/f/furycalm_snarl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/furycalm_snarl.txt rename to forge-gui/res/cardsfolder/f/furycalm_snarl.txt diff --git a/forge-gui/res/cardsfolder/f/fylamarid.txt b/forge-gui/res/cardsfolder/f/fylamarid.txt index cca14fbe4ca..88ffa04302f 100644 --- a/forge-gui/res/cardsfolder/f/fylamarid.txt +++ b/forge-gui/res/cardsfolder/f/fylamarid.txt @@ -3,8 +3,7 @@ ManaCost:1 U U Types:Creature Squid Beast PT:1/3 K:Flying -K:CantBeBlockedBy Creature.Blue +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Blue | Description$ CARDNAME can't be blocked by blue creatures. A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/fylamarid.jpg -Oracle:Flying\nFylamarid can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. +Oracle:Flying\nFylamarid can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt b/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt index d696f7e4e9b..e68a4a459d4 100644 --- a/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt +++ b/forge-gui/res/cardsfolder/g/gabriel_angelfire.txt @@ -4,10 +4,10 @@ Types:Legendary Creature Angel PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChoice | TriggerDescription$ At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. CARDNAME gains that ability until your next upkeep. SVar:TrigChoice:DB$ GenericChoice | Defined$ You | Choices$ SVar1,SVar2,SVar3,SVar4 -SVar:SVar1:DB$ Pump | Defined$ Self | KW$ Flying | UntilYourNextUpkeep$ True | SpellDescription$ Flying -SVar:SVar2:DB$ Pump | Defined$ Self | KW$ First Strike | UntilYourNextUpkeep$ True | SpellDescription$ First strike -SVar:SVar3:DB$ Pump | Defined$ Self | KW$ Trample | UntilYourNextUpkeep$ True | SpellDescription$ Trample -SVar:SVar4:DB$ Pump | Defined$ Self | KW$ Rampage:3 | UntilYourNextUpkeep$ True | SpellDescription$ Rampage 3 +SVar:SVar1:DB$ Pump | Defined$ Self | KW$ Flying | Duration$ UntilYourNextUpkeep | SpellDescription$ Flying +SVar:SVar2:DB$ Pump | Defined$ Self | KW$ First Strike | Duration$ UntilYourNextUpkeep | SpellDescription$ First strike +SVar:SVar3:DB$ Pump | Defined$ Self | KW$ Trample | Duration$ UntilYourNextUpkeep | SpellDescription$ Trample +SVar:SVar4:DB$ Pump | Defined$ Self | KW$ Rampage:3 | Duration$ UntilYourNextUpkeep | SpellDescription$ Rampage 3 AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gabriel_angelfire.jpg Oracle:At the beginning of your upkeep, choose flying, first strike, trample, or rampage 3. Gabriel Angelfire gains that ability until your next upkeep. (Whenever a creature with rampage 3 becomes blocked, it gets +3/+3 until end of turn for each creature blocking it beyond the first.) diff --git a/forge-gui/res/cardsfolder/g/gaeas_liege.txt b/forge-gui/res/cardsfolder/g/gaeas_liege.txt index 28f7ba39b34..75878b870d4 100644 --- a/forge-gui/res/cardsfolder/g/gaeas_liege.txt +++ b/forge-gui/res/cardsfolder/g/gaeas_liege.txt @@ -8,7 +8,7 @@ SVar:X:Count$Valid Forest.YouCtrl S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ Y | SetToughness$ Y | CheckSVar$ B | SVarCompare$ EQ1 SVar:B:Count$Valid Card.Self+attacking SVar:Y:Count$Valid Forest.DefenderCtrl -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | UntilHostLeavesPlay$ True | SpellDescription$ Target land becomes a Forest until CARDNAME leaves the battlefield. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | Duration$ UntilHostLeavesPlay | SpellDescription$ Target land becomes a Forest until CARDNAME leaves the battlefield. SVar:BuffedBy:Forest AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/gaeas_liege.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/galazeth_prismari.txt b/forge-gui/res/cardsfolder/g/galazeth_prismari.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/galazeth_prismari.txt rename to forge-gui/res/cardsfolder/g/galazeth_prismari.txt diff --git a/forge-gui/res/cardsfolder/g/garenbrig_paladin.txt b/forge-gui/res/cardsfolder/g/garenbrig_paladin.txt index d302fe81796..e62814210e5 100644 --- a/forge-gui/res/cardsfolder/g/garenbrig_paladin.txt +++ b/forge-gui/res/cardsfolder/g/garenbrig_paladin.txt @@ -3,7 +3,7 @@ ManaCost:4 G Types:Creature Giant Knight PT:4/4 K:etbCounter:P1P1:1:Adamant$ Green:Adamant — If at least three green mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it. -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. SVar:AIManaPref:G DeckHas:Ability$Counters -Oracle:Adamant — If at least three green mana was spent to cast this spell, Garenbrig Paladin enters the battlefield with a +1/+1 counter on it.\nGarenbrig Paladin can't be blocked by creatures with power 2 or less. +Oracle:Adamant — If at least three green mana was spent to cast this spell, Garenbrig Paladin enters the battlefield with a +1/+1 counter on it.\nGarenbrig Paladin can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gate_colossus.txt b/forge-gui/res/cardsfolder/g/gate_colossus.txt index 57c7144c16e..5c728bf07c9 100644 --- a/forge-gui/res/cardsfolder/g/gate_colossus.txt +++ b/forge-gui/res/cardsfolder/g/gate_colossus.txt @@ -5,8 +5,8 @@ PT:8/8 S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each Gate you control. SVar:X:Count$Valid Gate.YouCtrl DeckNeeds:Type$Gate -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Gate.YouCtrl | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Whenever a Gate enters the battlefield under your control, you may put CARDNAME from your graveyard on top of your library. SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Library | Defined$ Self DeckHints:Type$Gate -Oracle:This spell costs {1} less to cast for each Gate you control.\nGate Colossus can't be blocked by creatures with power 2 or less.\nWhenever a Gate enters the battlefield under your control, you may put Gate Colossus from your graveyard on top of your library. +Oracle:This spell costs {1} less to cast for each Gate you control.\nGate Colossus can't be blocked by creatures with power 2 or less.\nWhenever a Gate enters the battlefield under your control, you may put Gate Colossus from your graveyard on top of your library. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gateway_shade.txt b/forge-gui/res/cardsfolder/g/gateway_shade.txt index 2e91e7ebbd3..aec7fa12f13 100644 --- a/forge-gui/res/cardsfolder/g/gateway_shade.txt +++ b/forge-gui/res/cardsfolder/g/gateway_shade.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Creature Shade PT:1/1 A:AB$ Pump | Cost$ B | Defined$ Self | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. -A:AB$ Pump | Cost$ tapXType<1/Gate> | Defined$ Self | +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. +A:AB$ Pump | Cost$ tapXType<1/Gate> | Defined$ Self | NumAtt$ +2 | NumDef$ +2 | SpellDescription$ CARDNAME gets +2/+2 until end of turn. AI:RemoveDeck:Random DeckNeeds:Type$Gate Oracle:{B}: Gateway Shade gets +1/+1 until end of turn.\nTap an untapped Gate you control: Gateway Shade gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/geometric_nexus.txt b/forge-gui/res/cardsfolder/g/geometric_nexus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/geometric_nexus.txt rename to forge-gui/res/cardsfolder/g/geometric_nexus.txt diff --git a/forge-gui/res/cardsfolder/g/geometric_weird.txt b/forge-gui/res/cardsfolder/g/geometric_weird.txt index 28e74283fc1..caa56ecb041 100644 --- a/forge-gui/res/cardsfolder/g/geometric_weird.txt +++ b/forge-gui/res/cardsfolder/g/geometric_weird.txt @@ -4,5 +4,5 @@ Types:Creature Weird PT:1/1 SVar:X:Count$MaxDistinctOnStack T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigGeo | OptionalDecider$ You | TriggerDescription$ At the beginning of each end step, you may have Geometric Weird’s base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn. -SVar:TrigGeo:DB$ Animate | Permanent$ True | Power$ X | Toughness$ X | Geometric Weird’s base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn. +SVar:TrigGeo:DB$ Animate | Duration$ Permanent | Power$ X | Toughness$ X | Geometric Weird’s base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn. Oracle:At the beginning of each end step, you may have Geometric Weird's base power and toughness each become equal to the greatest number of spells and abilities from different sources that were on the stack simultaneously that turn. diff --git a/forge-gui/res/cardsfolder/g/ghost_of_ramirez_depietro.txt b/forge-gui/res/cardsfolder/g/ghost_of_ramirez_depietro.txt index dcd6cb6a67f..ad62819425b 100755 --- a/forge-gui/res/cardsfolder/g/ghost_of_ramirez_depietro.txt +++ b/forge-gui/res/cardsfolder/g/ghost_of_ramirez_depietro.txt @@ -2,10 +2,10 @@ Name:Ghost of Ramirez DePietro ManaCost:2 U Types:Legendary Creature Pirate Spirit PT:2/3 -K:CantBeBlockedBy Creature.toughnessGE3 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.toughnessGE3 | Description$ CARDNAME can't be blocked by creatures with toughness 3 or greater. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigChangeZone | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, choose up to one target card in a graveyard that was discarded or put there from a library this turn. Put that card into its owner's hand. SVar:TrigChangeZone:DB$ ChangeZone | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.DiscardedThisTurn,Card.ThisTurnEnteredFrom_Library | TgtPrompt$ Choose up to one target card in any graveyard that has been discarded or put there from a library this turn K:Partner DeckHas:Ability$Graveyard DeckHints:Ability$Mill -Oracle:Ghost of Ramirez DePietro can't be blocked by creatures with toughness 3 or greater.\nWhenever Ghost of Ramirez DePietro deals combat damage to a player, choose up to one target card in a graveyard that was discarded or put there from a library this turn. Put that card into its owner's hand.\nPartner (You can have two commanders if both have partner.) +Oracle:Ghost of Ramirez DePietro can't be blocked by creatures with toughness 3 or greater.\nWhenever Ghost of Ramirez DePietro deals combat damage to a player, choose up to one target card in a graveyard that was discarded or put there from a library this turn. Put that card into its owner's hand.\nPartner (You can have two commanders if both have partner.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/giant_opportunity.txt b/forge-gui/res/cardsfolder/g/giant_opportunity.txt index 2442c4b1d57..bfc1a755929 100644 --- a/forge-gui/res/cardsfolder/g/giant_opportunity.txt +++ b/forge-gui/res/cardsfolder/g/giant_opportunity.txt @@ -1,7 +1,7 @@ Name:Giant Opportunity ManaCost:2 G Types:Sorcery -A:SP$ Sacrifice | Cost$ 2 G | SacValid$ Food | Defined$ You | Amount$ 2 | Optional$ True | StrictAmount$ True | RememberSacrificed$ True | SubAbility$ DBToken | SpellDescription$ You may sacrifice two Foods. If you do, create a 7/7 green Giant creature token. Otherwise, create three Food tokens. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +A:SP$ Sacrifice | Cost$ 2 G | SacValid$ Food | Defined$ You | Amount$ 2 | OptionalSacrifice$ True | StrictAmount$ True | RememberSacrificed$ True | SubAbility$ DBToken | SpellDescription$ You may sacrifice two Foods. If you do, create a 7/7 green Giant creature token. Otherwise, create three Food tokens. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_7_7_giant | TokenOwner$ You | ConditionDefined$ RememberedLKI | ConditionPresent$ Food | ConditionCompare$ EQ2 | SubAbility$ DBToken2 SVar:DBToken2:DB$ Token | TokenAmount$ 3 | TokenScript$ c_a_food_sac | TokenOwner$ You | ConditionDefined$ RememberedLKI | ConditionPresent$ Food | ConditionCompare$ EQ0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/g/gibbering_hyenas.txt b/forge-gui/res/cardsfolder/g/gibbering_hyenas.txt index 5b3b6c065ab..6d4f1724fae 100644 --- a/forge-gui/res/cardsfolder/g/gibbering_hyenas.txt +++ b/forge-gui/res/cardsfolder/g/gibbering_hyenas.txt @@ -2,6 +2,5 @@ Name:Gibbering Hyenas ManaCost:2 G Types:Creature Hyena PT:3/2 -K:CantBlock Creature.Black:black creatures -SVar:Picture:http://www.wizards.com/global/images/magic/general/gibbering_hyenas.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Black | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block black creatures. Oracle:Gibbering Hyenas can't block black creatures. diff --git a/forge-gui/res/cardsfolder/g/gideon_of_the_trials.txt b/forge-gui/res/cardsfolder/g/gideon_of_the_trials.txt index 26b6e385097..dad1cc630e3 100644 --- a/forge-gui/res/cardsfolder/g/gideon_of_the_trials.txt +++ b/forge-gui/res/cardsfolder/g/gideon_of_the_trials.txt @@ -2,7 +2,7 @@ Name:Gideon of the Trials ManaCost:1 W W Types:Legendary Planeswalker Gideon Loyalty:3 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Planeswalker$ True | KW$ Prevent all damage that would be dealt by CARDNAME. | IsCurse$ True | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, prevent all damage target permanent would deal. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Planeswalker$ True | KW$ Prevent all damage that would be dealt by CARDNAME. | IsCurse$ True | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, prevent all damage target permanent would deal. A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Defined$ Self | Power$ 4 | Toughness$ 4 | Keywords$ Indestructible | Types$ Creature,Human,Soldier | SubAbility$ GideonPrevent | Planeswalker$ True | SpellDescription$ Until end of turn, CARDNAME becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. SVar:GideonPrevent:DB$ Pump | Defined$ Self | KW$ Prevent all damage that would be dealt to CARDNAME. A:AB$ Effect | Cost$ AddCounter<0/LOYALTY> | Name$ Emblem - Gideon of the Trials | StaticAbilities$ STPump1,STPump2 | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | Stackable$ False | SpellDescription$ You get an emblem with "As long as you control a Gideon planeswalker, you can't lose the game and your opponents can't win the game." diff --git a/forge-gui/res/cardsfolder/g/gideons_sacrifice.txt b/forge-gui/res/cardsfolder/g/gideons_sacrifice.txt index 66ee881dc95..d16c7e894d7 100644 --- a/forge-gui/res/cardsfolder/g/gideons_sacrifice.txt +++ b/forge-gui/res/cardsfolder/g/gideons_sacrifice.txt @@ -1,7 +1,7 @@ Name:Gideon's Sacrifice ManaCost:W Types:Instant -A:SP$ ChooseCard | Cost$ W | Choices$ Creature.YouCtrl,Planeswalker.YouCtrl | SubAbility$ DBEffect | SpellDescription$ Choose a creature or planeswalker you control. All damage that would be dealt this turn to you and permanents you control is dealt to the chosen permanent instead (if it's still on the battlefield). +A:SP$ ChooseCard | Cost$ W | Choices$ Creature.YouCtrl,Planeswalker.YouCtrl | Mandatory$ True | SubAbility$ DBEffect | SpellDescription$ Choose a creature or planeswalker you control. All damage that would be dealt this turn to you and permanents you control is dealt to the chosen permanent instead (if it's still on the battlefield). SVar:DBEffect:DB$ Effect | ReplacementEffects$ DamageEvent | ExileOnMoved$ True | RememberObjects$ ChosenCard SVar:DamageEvent:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | ReplaceWith$ GideonSac | DamageTarget$ Remembered | Description$ All damage that would be dealt this turn to you and permanents you control is dealt to the chosen permanent instead (if it's still on the battlefield). SVar:GideonSac:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card diff --git a/forge-gui/res/cardsfolder/g/gigantoplasm.txt b/forge-gui/res/cardsfolder/g/gigantoplasm.txt index b7b3b1a55fd..545f6c0336b 100644 --- a/forge-gui/res/cardsfolder/g/gigantoplasm.txt +++ b/forge-gui/res/cardsfolder/g/gigantoplasm.txt @@ -4,7 +4,7 @@ Types:Creature Shapeshifter PT:0/0 K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddAbilities$ Gigantoplasm | AddSVars$ X | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness of X/X." -SVar:Gigantoplasm:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | ValidCards$ Self | Permanent$ True | SpellDescription$ CARDNAME has base power and toughness of X/X. +SVar:Gigantoplasm:AB$ Animate | Cost$ X | Power$ X | Toughness$ X | ValidCards$ Self | Duration$ Permanent | SpellDescription$ CARDNAME has base power and toughness of X/X. SVar:X:Count$xPaid SVar:Picture:http://www.wizards.com/global/images/magic/general/gigantoplasm.jpg Oracle:You may have Gigantoplasm enter the battlefield as a copy of any creature on the battlefield, except it has "{X}: This creature has base power and toughness X/X." diff --git a/forge-gui/res/cardsfolder/g/giltgrove_stalker.txt b/forge-gui/res/cardsfolder/g/giltgrove_stalker.txt index b636ac41582..12135eeaa5d 100644 --- a/forge-gui/res/cardsfolder/g/giltgrove_stalker.txt +++ b/forge-gui/res/cardsfolder/g/giltgrove_stalker.txt @@ -2,6 +2,5 @@ Name:Giltgrove Stalker ManaCost:1 G Types:Creature Merfolk Warrior PT:2/1 -K:CantBeBlockedBy Creature.powerLE2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/giltgrove_stalker.jpg -Oracle:Giltgrove Stalker can't be blocked by creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +Oracle:Giltgrove Stalker can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/gisela_blade_of_goldnight.txt b/forge-gui/res/cardsfolder/g/gisela_blade_of_goldnight.txt index a2be0e1d295..d33d8bf4311 100644 --- a/forge-gui/res/cardsfolder/g/gisela_blade_of_goldnight.txt +++ b/forge-gui/res/cardsfolder/g/gisela_blade_of_goldnight.txt @@ -7,7 +7,8 @@ K:First Strike R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card,Emblem | ValidTarget$ Opponent,Permanent.OppCtrl | ReplaceWith$ DmgTwice | Description$ If a source would deal damage to an opponent or a permanent an opponent controls, that source deals double that damage to that player or permanent instead. SVar:DmgTwice:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X SVar:X:ReplaceCount$DamageAmount/Twice -S:Mode$ PreventDamage | Target$ You,Permanent.YouCtrl | Amount$ HalfUp | Description$ If a source would deal damage to you or a permanent you control, prevent half that damage, rounded up. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Permanent.YouCtrl | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to you or a permanent you control, prevent half that damage, rounded up. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ ShieldAmount +SVar:ShieldAmount:ReplaceCount$DamageAmount/HalfUp SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/gisela_blade_of_goldnight.jpg Oracle:Flying, first strike\nIf a source would deal damage to an opponent or a permanent an opponent controls, that source deals double that damage to that player or permanent instead.\nIf a source would deal damage to you or a permanent you control, prevent half that damage, rounded up. diff --git a/forge-gui/res/cardsfolder/g/glacial_grasp.txt b/forge-gui/res/cardsfolder/g/glacial_grasp.txt index 68c71987d1b..c62d94047ae 100755 --- a/forge-gui/res/cardsfolder/g/glacial_grasp.txt +++ b/forge-gui/res/cardsfolder/g/glacial_grasp.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Instant A:SP$ Tap | Cost$ 2 U | ValidTgts$ Creature | AILogic$ Curse | TgtPrompt$ Select target creature | SubAbility$ DBMill | SpellDescription$ Tap target creature. Its controller mills two cards. That creature doesn't untap during its controller's next untap step. (They put the top two cards of their library into their graveyard.) SVar:DBMill:DB$ Mill | Defined$ TargetedController | NumCards$ 2 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBDraw | StackDescription$ {c:Targeted} doesn't untap during its controller's next untap step. +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw | StackDescription$ {c:Targeted} doesn't untap during its controller's next untap step. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:NeedsToPlay:Creature.OppCtrl DeckHas:Ability$Mill diff --git a/forge-gui/res/cardsfolder/g/glamerdye.txt b/forge-gui/res/cardsfolder/g/glamerdye.txt index 503f2e45542..ed2fb4e6258 100644 --- a/forge-gui/res/cardsfolder/g/glamerdye.txt +++ b/forge-gui/res/cardsfolder/g/glamerdye.txt @@ -2,7 +2,7 @@ Name:Glamerdye ManaCost:1 U Types:Instant K:Retrace -A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. +A:SP$ ChangeText | Cost$ 1 U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Duration$ Permanent | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/glamerdye.jpg diff --git a/forge-gui/res/cardsfolder/g/glass_casket.txt b/forge-gui/res/cardsfolder/g/glass_casket.txt index f688927328f..1da8ff93146 100644 --- a/forge-gui/res/cardsfolder/g/glass_casket.txt +++ b/forge-gui/res/cardsfolder/g/glass_casket.txt @@ -2,7 +2,7 @@ Name:Glass Casket ManaCost:1 W Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls with mana value 3 or less until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl+cmcLE3 | TgtPrompt$ Select target creature an opponent controls with mana value 3 or less | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl+cmcLE3 | TgtPrompt$ Select target creature an opponent controls with mana value 3 or less | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlay:Creature.OppCtrl+cmcLE3 Oracle:When Glass Casket enters the battlefield, exile target creature an opponent controls with mana value 3 or less until Glass Casket leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/gliding_licid.txt b/forge-gui/res/cardsfolder/g/gliding_licid.txt index 54880df24c8..011b703ebe5 100644 --- a/forge-gui/res/cardsfolder/g/gliding_licid.txt +++ b/forge-gui/res/cardsfolder/g/gliding_licid.txt @@ -2,7 +2,7 @@ Name:Gliding Licid ManaCost:2 U Types:Creature Licid PT:2/2 -A:AB$ Animate | Cost$ U T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. +A:AB$ Animate | Cost$ U T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. diff --git a/forge-gui/res/cardsfolder/g/glimpse_the_cosmos.txt b/forge-gui/res/cardsfolder/g/glimpse_the_cosmos.txt index da97cff92ed..db23fe3c260 100644 --- a/forge-gui/res/cardsfolder/g/glimpse_the_cosmos.txt +++ b/forge-gui/res/cardsfolder/g/glimpse_the_cosmos.txt @@ -2,7 +2,7 @@ Name:Glimpse the Cosmos ManaCost:1 U Types:Sorcery A:SP$ Dig | Cost$ 1 U | DigNum$ 3 | ChangeNum$ 1 | StackDescription$ SpellDescription | SpellDescription$ Look at the top three cards of your library. Put one of them into your hand and the rest on the bottom of your library in any order. -S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Graveyard | MayPlay$ True | MayPlayAltManaCost$ U | IsPresent$ Giant.YouCtrl | Description$ As long as you control a Giant, you may cast CARDNAME from your graveyard by paying {U} rather than paying its mana cost. If you cast CARDNAME this way and it would be put into your graveyard, exile it instead. +S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Graveyard | AffectedZone$ Graveyard | MayPlay$ True | MayPlayAltManaCost$ U | IsPresent$ Giant.YouCtrl | Description$ As long as you control a Giant, you may cast CARDNAME from your graveyard by paying {U} rather than paying its mana cost. If you cast CARDNAME this way and it would be put into your graveyard, exile it instead. R:Event$ Moved | ValidLKI$ Card.CastSa Spell.MayPlaySource | Origin$ Stack | Destination$ Graveyard | ReplaceWith$ MoveExile SVar:MoveExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Stack | Destination$ Exile DeckHints:Type$Giant diff --git a/forge-gui/res/cardsfolder/g/gloom_surgeon.txt b/forge-gui/res/cardsfolder/g/gloom_surgeon.txt index b717a5b8b37..5f9e73e77bd 100644 --- a/forge-gui/res/cardsfolder/g/gloom_surgeon.txt +++ b/forge-gui/res/cardsfolder/g/gloom_surgeon.txt @@ -2,8 +2,7 @@ Name:Gloom Surgeon ManaCost:1 B Types:Creature Spirit PT:2/1 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | IsCombat$ True | ReplaceWith$ Exile | PreventionEffect$ True | Description$ If combat damage would be dealt to CARDNAME, prevent that damage and exile that many cards from the top of your library. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | IsCombat$ True | ReplaceWith$ Exile | PreventionEffect$ True | AlwaysReplace$ True | Description$ If combat damage would be dealt to CARDNAME, prevent that damage and exile that many cards from the top of your library. SVar:Exile:DB$ Dig | DigNum$ X | ChangeNum$ All | ChangeValid$ Card | DestinationZone$ Exile SVar:X:ReplaceCount$DamageAmount -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloom_surgeon.jpg Oracle:If combat damage would be dealt to Gloom Surgeon, prevent that damage and exile that many cards from the top of your library. diff --git a/forge-gui/res/cardsfolder/g/gloomwidow.txt b/forge-gui/res/cardsfolder/g/gloomwidow.txt index bc6da7168e3..e702951d0c4 100644 --- a/forge-gui/res/cardsfolder/g/gloomwidow.txt +++ b/forge-gui/res/cardsfolder/g/gloomwidow.txt @@ -3,6 +3,5 @@ ManaCost:2 G Types:Creature Spider PT:3/3 K:Reach -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/gloomwidow.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Reach\nGloomwidow can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/g/glorious_protector.txt b/forge-gui/res/cardsfolder/g/glorious_protector.txt index ecf075f3fa0..dab4f125d1e 100644 --- a/forge-gui/res/cardsfolder/g/glorious_protector.txt +++ b/forge-gui/res/cardsfolder/g/glorious_protector.txt @@ -5,7 +5,7 @@ PT:3/4 K:Flash K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, you may exile any number of other non-Angel creatures you control until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Hidden$ True | ChangeType$ Creature.nonAngel+YouCtrl | ChangeNum$ MaxTgts | SelectPrompt$ Choose any number of non-Angel creatures you control | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Hidden$ True | ChangeType$ Creature.nonAngel+YouCtrl | ChangeNum$ MaxTgts | SelectPrompt$ Choose any number of non-Angel creatures you control | Duration$ UntilHostLeavesPlay SVar:MaxTgts:Count$Valid Creature.nonAngel+YouCtrl AI:RemoveDeck:Random K:Foretell:2 W diff --git a/forge-gui/res/cardsfolder/g/glyph_of_delusion.txt b/forge-gui/res/cardsfolder/g/glyph_of_delusion.txt index fd2a3cb1dbd..fa50238cd5b 100644 --- a/forge-gui/res/cardsfolder/g/glyph_of_delusion.txt +++ b/forge-gui/res/cardsfolder/g/glyph_of_delusion.txt @@ -4,7 +4,7 @@ Types:Instant A:SP$ Pump | Cost$ U | ValidTgts$ Wall.blockedThisTurn | TgtPrompt$ Select target Wall that blocked this turn | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ Put X glyph counters on target creature that target Wall blocked this turn, where X is the power of that blocked creature. The creature gains "This creature doesn't untap during your untap step if it has a glyph counter on it" and "At the beginning of your upkeep, remove a glyph counter from this creature." SVar:DBPutCounter:DB$ PutCounter | CounterType$ GLYPH | CounterNum$ X | ValidTgts$ Creature.blockedByValidThisTurn ParentTarget | TgtPrompt$ Select target creature blocked by target Wall this turn to put counters on | SubAbility$ Delude | IsCurse$ True SVar:X:Targeted$CardPower -SVar:Delude:DB$ Animate | Defined$ ParentTarget | staticAbilities$ Delusional | Triggers$ TrigGlyphUpkeep | sVars$ LoseGlyph | Permanent$ True | StackDescription$ None +SVar:Delude:DB$ Animate | Defined$ ParentTarget | staticAbilities$ Delusional | Triggers$ TrigGlyphUpkeep | sVars$ LoseGlyph | Duration$ Permanent | StackDescription$ None SVar:Delusional:Mode$ Continuous | Affected$ Card.Self+counters_GE1_GLYPH | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a glyph counter on it. SVar:TrigGlyphUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseGlyph | TriggerDescription$ At the beginning of your upkeep, remove a glyph counter from CARDNAME. SVar:LoseGlyph:DB$ RemoveCounter | CounterType$ GLYPH | CounterNum$ 1 diff --git a/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt b/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt index e511ef74b0e..662486eb0b5 100644 --- a/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt +++ b/forge-gui/res/cardsfolder/g/glyph_of_destruction.txt @@ -2,7 +2,7 @@ Name:Glyph of Destruction ManaCost:R Types:Instant A:SP$ Pump | Cost$ R | ValidTgts$ Creature.Wall+blocking | TgtPrompt$ Select target blocking Wall you control | SubAbility$ DBPump | KW$ Prevent all damage that would be dealt to CARDNAME. | SpellDescription$ Target blocking Wall you control gets +10/+0 until end of combat. Prevent all damage that would be dealt to it this turn. Destroy it at the beginning of the next end step. -SVar:DBPump:DB$ Pump | NumAtt$ +10 | Defined$ Targeted | UntilEndOfCombat$ True | AtEOT$ Destroy +SVar:DBPump:DB$ Pump | NumAtt$ +10 | Defined$ Targeted | Duration$ UntilEndOfCombat | AtEOT$ Destroy AI:RemoveDeck:All AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/glyph_of_destruction.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/gnarled_professor.txt b/forge-gui/res/cardsfolder/g/gnarled_professor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gnarled_professor.txt rename to forge-gui/res/cardsfolder/g/gnarled_professor.txt diff --git a/forge-gui/res/cardsfolder/g/gnat_alley_creeper.txt b/forge-gui/res/cardsfolder/g/gnat_alley_creeper.txt index a423e508072..f2947f76b97 100644 --- a/forge-gui/res/cardsfolder/g/gnat_alley_creeper.txt +++ b/forge-gui/res/cardsfolder/g/gnat_alley_creeper.txt @@ -2,6 +2,5 @@ Name:Gnat Alley Creeper ManaCost:2 R Types:Creature Human Rogue PT:3/1 -K:CantBeBlockedBy Creature.withFlying -SVar:Picture:http://www.wizards.com/global/images/magic/general/gnat_alley_creeper.jpg -Oracle:Gnat Alley Creeper can't be blocked by creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withFlying | Description$ CARDNAME can't be blocked by creatures with flying. +Oracle:Gnat Alley Creeper can't be blocked by creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/go_blank.txt b/forge-gui/res/cardsfolder/g/go_blank.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/go_blank.txt rename to forge-gui/res/cardsfolder/g/go_blank.txt diff --git a/forge-gui/res/cardsfolder/g/goblin_artisans.txt b/forge-gui/res/cardsfolder/g/goblin_artisans.txt index e0f85b739a0..cd12095301f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_artisans.txt +++ b/forge-gui/res/cardsfolder/g/goblin_artisans.txt @@ -2,7 +2,8 @@ Name:Goblin Artisans ManaCost:R Types:Creature Goblin Artificer PT:1/1 -T:Mode$ ChangesZone | Static$ True | ValidCard$ Artifact.YouCtrl | Origin$ Any | Destination$ Stack | RememberTriggeringCard +T:Mode$ ChangesZone | Static$ True | ValidCard$ Artifact.YouCtrl | Origin$ Any | Destination$ Stack | Execute$ DBRemember +SVar:DBRemember:DB$ Pump | RememberObjects$ TriggeredCard T:Mode$ BecomesTarget | Static$ True | ValidSource$ Card.Other+namedGoblin Artisans | ValidTarget$ Spell | Execute$ DBForget SVar:DBForget:DB$ Cleanup | ForgetDefined$ TriggeredTargetHostCard T:Mode$ ChangesZone | Static$ True | ValidCard$ Artifact.YouCtrl+IsRemembered | Origin$ Stack | Destination$ Any | Execute$ DBCleanup diff --git a/forge-gui/res/cardsfolder/g/goblin_mutant.txt b/forge-gui/res/cardsfolder/g/goblin_mutant.txt index ed023942db9..95649eb406b 100644 --- a/forge-gui/res/cardsfolder/g/goblin_mutant.txt +++ b/forge-gui/res/cardsfolder/g/goblin_mutant.txt @@ -4,6 +4,5 @@ Types:Creature Goblin Mutant PT:5/3 K:Trample S:Mode$ CantAttack | ValidCard$ Card.Self | IfDefenderControls$ Creature.untapped+powerGE3 | Description$ CARDNAME can't attack if defending player controls an untapped creature with power 3 or greater. -K:CantBlock Creature.powerGE3:creatures with power 3 or greater -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_mutant.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE3 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 3 or greater. Oracle:Trample\nGoblin Mutant can't attack if defending player controls an untapped creature with power 3 or greater.\nGoblin Mutant can't block creatures with power 3 or greater. diff --git a/forge-gui/res/cardsfolder/g/goblin_psychopath.txt b/forge-gui/res/cardsfolder/g/goblin_psychopath.txt index 1740627829c..3e31608b698 100644 --- a/forge-gui/res/cardsfolder/g/goblin_psychopath.txt +++ b/forge-gui/res/cardsfolder/g/goblin_psychopath.txt @@ -6,7 +6,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ CoinFlip | TriggerDescription$ T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ CoinFlip | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, flip a coin. If you lose the flip, the next time it would deal combat damage this turn, it deals that damage to you instead. SVar:CoinFlip:DB$ FlipACoin | LoseSubAbility$ CreateEffect SVar:CreateEffect:DB$ Effect | Name$ Goblin Psychopath Effect | ReplacementEffects$ EventDamageDone -SVar:EventDamageDone:Event$ DamageDone | ValidSource$ Card.EffectSource | ReplaceWith$ DamageYou | IsCombat$ True | Description$ The next time EFFECTSOURCE would deal combat damage this turn, it deals that damage to you instead. +SVar:EventDamageDone:Event$ DamageDone | ValidSource$ Card.EffectSource | DamageTarget$ You | ReplaceWith$ DamageYou | IsCombat$ True | Description$ The next time EFFECTSOURCE would deal combat damage this turn, it deals that damage to you instead. SVar:DamageYou:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType$ Player | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:PsychoX:ReplaceCount$DamageAmount diff --git a/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt b/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt index 1e8ac688d68..5b33198c76f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt +++ b/forge-gui/res/cardsfolder/g/goblin_ski_patrol.txt @@ -2,6 +2,6 @@ Name:Goblin Ski Patrol ManaCost:1 R Types:Creature Goblin PT:1/1 -A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +2 | KW$ Flying | Permanent$ True | ActivationLimit$ 1 | IsPresent$ Mountain.Snow+YouCtrl | AtEOT$ Sacrifice | SpellDescription$ CARDNAME gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate only once and only if you control a snow Mountain. +A:AB$ Pump | Cost$ 1 R | Defined$ Self | NumAtt$ +2 | KW$ Flying | Duration$ Permanent | ActivationLimit$ 1 | IsPresent$ Mountain.Snow+YouCtrl | AtEOT$ Sacrifice | SpellDescription$ CARDNAME gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate only once and only if you control a snow Mountain. AI:RemoveDeck:All Oracle:{1}{R}: Goblin Ski Patrol gets +2/+0 and gains flying. Its controller sacrifices it at the beginning of the next end step. Activate only once and only if you control a snow Mountain. diff --git a/forge-gui/res/cardsfolder/g/goblin_war_cry.txt b/forge-gui/res/cardsfolder/g/goblin_war_cry.txt index 8c885813763..af97701ff26 100644 --- a/forge-gui/res/cardsfolder/g/goblin_war_cry.txt +++ b/forge-gui/res/cardsfolder/g/goblin_war_cry.txt @@ -1,9 +1,8 @@ Name:Goblin War Cry ManaCost:2 R Types:Sorcery -A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Amount$ 1 | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. +A:SP$ ChooseCard | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Mandatory$ True | Choices$ Creature.TargetedPlayerCtrl | SubAbility$ DBPumpAll | RememberChosen$ True | AILogic$ BestBlocker | SpellDescription$ Target opponent chooses a creature they control. Other creatures they control can't block this turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsNotRemembered+TargetedPlayerCtrl | KW$ HIDDEN CARDNAME can't block. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/goblin_war_cry.jpg Oracle:Target opponent chooses a creature they control. Other creatures they control can't block this turn. diff --git a/forge-gui/res/cardsfolder/g/godless_shrine.txt b/forge-gui/res/cardsfolder/g/godless_shrine.txt index 19f60dfeb1d..ee29953a243 100644 --- a/forge-gui/res/cardsfolder/g/godless_shrine.txt +++ b/forge-gui/res/cardsfolder/g/godless_shrine.txt @@ -2,6 +2,5 @@ Name:Godless Shrine ManaCost:no cost Types:Land Plains Swamp K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96935.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {W} or {B}.)\nAs Godless Shrine enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/upcoming/golden_ratio.txt b/forge-gui/res/cardsfolder/g/golden_ratio.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/golden_ratio.txt rename to forge-gui/res/cardsfolder/g/golden_ratio.txt diff --git a/forge-gui/res/cardsfolder/g/goldmeadow_dodger.txt b/forge-gui/res/cardsfolder/g/goldmeadow_dodger.txt index 064875eda6d..dd6ede06410 100644 --- a/forge-gui/res/cardsfolder/g/goldmeadow_dodger.txt +++ b/forge-gui/res/cardsfolder/g/goldmeadow_dodger.txt @@ -2,6 +2,5 @@ Name:Goldmeadow Dodger ManaCost:W Types:Creature Kithkin Rogue PT:1/1 -K:CantBeBlockedBy Creature.powerGE4 -SVar:Picture:http://www.wizards.com/global/images/magic/general/goldmeadow_dodger.jpg -Oracle:Goldmeadow Dodger can't be blocked by creatures with power 4 or greater. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE4 | Description$ CARDNAME can't be blocked by creatures with power 4 or greater. +Oracle:Goldmeadow Dodger can't be blocked by creatures with power 4 or greater. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt index c7a05eb151a..6d7de5e1ed1 100644 --- a/forge-gui/res/cardsfolder/g/goryos_vengeance.txt +++ b/forge-gui/res/cardsfolder/g/goryos_vengeance.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Instant Arcane K:Splice:Arcane:2 B A:SP$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature in your graveyard | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | AILogic$ BeforeCombat | SpellDescription$ Return target legendary creature card from your graveyard to the battlefield. That creature gains haste. Exile it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:Random DeckHints:Type$Spirit|Arcane diff --git a/forge-gui/res/cardsfolder/g/graceful_antelope.txt b/forge-gui/res/cardsfolder/g/graceful_antelope.txt index 7cbb1a0c85b..03ecc2f5f15 100644 --- a/forge-gui/res/cardsfolder/g/graceful_antelope.txt +++ b/forge-gui/res/cardsfolder/g/graceful_antelope.txt @@ -4,7 +4,7 @@ Types:Creature Antelope PT:1/4 K:Plainswalk T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigAnimate | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, you may have target land become a Plains until CARDNAME leaves the battlefield. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | UntilHostLeavesPlay$ True | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | TgtPrompt$ Select target land | Duration$ UntilHostLeavesPlay | Types$ Plains | RemoveLandTypes$ True | RemoveIntrinsicAbilities$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/graceful_antelope.jpg Oracle:Plainswalk (This creature can't be blocked as long as defending player controls a Plains.)\nWhenever Graceful Antelope deals combat damage to a player, you may have target land become a Plains until Graceful Antelope leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/grasp_of_fate.txt b/forge-gui/res/cardsfolder/g/grasp_of_fate.txt index dcd711bc2b4..a6e4c69aa89 100644 --- a/forge-gui/res/cardsfolder/g/grasp_of_fate.txt +++ b/forge-gui/res/cardsfolder/g/grasp_of_fate.txt @@ -2,7 +2,7 @@ Name:Grasp of Fate ManaCost:1 W W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, for each opponent, exile up to one target nonland permanent that player controls until CARDNAME leaves the battlefield. (Those permanents return under their owners' control.) -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | TgtPrompt$ Select up to one target nonland permanent each opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | TgtPrompt$ Select up to one target nonland permanent each opponent controls | Duration$ UntilHostLeavesPlay SVar:OneEach:PlayerCountOpponents$Amount SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE diff --git a/forge-gui/res/cardsfolder/g/grasping_giant.txt b/forge-gui/res/cardsfolder/g/grasping_giant.txt index bf6f6315546..e2b7be814b8 100644 --- a/forge-gui/res/cardsfolder/g/grasping_giant.txt +++ b/forge-gui/res/cardsfolder/g/grasping_giant.txt @@ -4,5 +4,5 @@ Types:Creature Giant PT:5/7 K:Vigilance T:Mode$ AttackerBlockedByCreature | ValidCard$ Card.Self | ValidBlocker$ Creature | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME becomes blocked by a creature, exile that creature until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredBlockerLKICopy | Origin$ Battlefield | Destination$ Exile | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredBlockerLKICopy | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay Oracle:Vigilance\nWhenever Grasping Giant becomes blocked by a creature, exile that creature until Grasping Giant leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/g/grave_betrayal.txt b/forge-gui/res/cardsfolder/g/grave_betrayal.txt index 9af910eeecb..bc8ec839cc9 100644 --- a/forge-gui/res/cardsfolder/g/grave_betrayal.txt +++ b/forge-gui/res/cardsfolder/g/grave_betrayal.txt @@ -4,5 +4,5 @@ Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouDontCtrl | TriggerZones$ Battlefield | Execute$ DelTrig | TriggerDescription$ Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ GBReturn | RememberObjects$ TriggeredNewCardLKICopy | TriggerDescription$ Return creature to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. It is a black Zombie in addition to its other colors and types. SVar:GBReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | WithCounters$ P1P1_1 | AnimateSubAbility$ GBZombify -SVar:GBZombify:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:GBZombify:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent Oracle:Whenever a creature you don't control dies, return it to the battlefield under your control with an additional +1/+1 counter on it at the beginning of the next end step. That creature is a black Zombie in addition to its other colors and types. diff --git a/forge-gui/res/cardsfolder/g/grave_upheaval.txt b/forge-gui/res/cardsfolder/g/grave_upheaval.txt index 584b4a473a4..ce7598e5ce0 100644 --- a/forge-gui/res/cardsfolder/g/grave_upheaval.txt +++ b/forge-gui/res/cardsfolder/g/grave_upheaval.txt @@ -2,7 +2,7 @@ Name:Grave Upheaval ManaCost:4 B R Types:Sorcery A:SP$ ChangeZone | Cost$ 4 B R | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature | TgtPrompt$ Select target creature card | GainControl$ True | SubAbility$ DBPump | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. It gains haste. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Targeted | Duration$ Permanent K:TypeCycling:Basic:2 SVar:Picture:http://www.wizards.com/global/images/magic/general/grave_upheaval.jpg Oracle:Put target creature card from a graveyard onto the battlefield under your control. It gains haste.\nBasic landcycling {2} ({2}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/g/gravitic_punch.txt b/forge-gui/res/cardsfolder/g/gravitic_punch.txt index 148ff952dae..130e3c94aee 100644 --- a/forge-gui/res/cardsfolder/g/gravitic_punch.txt +++ b/forge-gui/res/cardsfolder/g/gravitic_punch.txt @@ -3,6 +3,6 @@ ManaCost:3 R Types:Sorcery K:Jump-start A:SP$ Pump | Cost$ 3 R | ValidTgts$ Creature.YouCtrl | AILogic$ PowerDmg | TgtPrompt$ Select target creature you control | SubAbility$ SoulsDamage | StackDescription$ None | SpellDescription$ Target creature you control deals damage equal to its power to target player. -SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Player | TargetUnique$ True | AILogic$ PowerDmg | NumDmg$ X | TgtPrompt$ Select target player +SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Player | TargetUnique$ True | AILogic$ PowerDmg | NumDmg$ X | TgtPrompt$ Select target player | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower Oracle:Target creature you control deals damage equal to its power to target player.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) diff --git a/forge-gui/res/cardsfolder/g/greater_sandwurm.txt b/forge-gui/res/cardsfolder/g/greater_sandwurm.txt index 6b075c6715c..84181ec5cf1 100644 --- a/forge-gui/res/cardsfolder/g/greater_sandwurm.txt +++ b/forge-gui/res/cardsfolder/g/greater_sandwurm.txt @@ -2,7 +2,6 @@ Name:Greater Sandwurm ManaCost:5 G G Types:Creature Wurm PT:7/7 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. K:Cycling:2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/greater_sandwurm.jpg Oracle:Greater Sandwurm can't be blocked by creatures with power 2 or less.\nCycling {2} ({2}, Discard this card: Draw a card.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/g/greater_stone_spirit.txt b/forge-gui/res/cardsfolder/g/greater_stone_spirit.txt index 4029635a986..51a27d7c1bc 100644 --- a/forge-gui/res/cardsfolder/g/greater_stone_spirit.txt +++ b/forge-gui/res/cardsfolder/g/greater_stone_spirit.txt @@ -2,7 +2,7 @@ Name:Greater Stone Spirit ManaCost:4 R R Types:Creature Elemental Spirit PT:4/4 -K:CantBeBlockedBy Creature.withFlying +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withFlying | Description$ CARDNAME can't be blocked by creatures with flying. A:AB$ Pump | Cost$ 2 R | ValidTgts$ Creature | NumDef$ 2 | SubAbility$ DBAnimate | SpellDescription$ Until end of turn, target creature gets +0/+2 and gains "{R}: This creature gets +1/+0 until end of turn." SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ Pump SVar:Pump:AB$ Pump | Cost$ R | Defined$ Self | NumAtt$ 1 | SpellDescription$ This creature gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt b/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt index 77d0777360b..77c9da770f0 100644 --- a/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/g/grimoire_of_the_dead.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Legendary Artifact A:AB$ PutCounter | Cost$ 1 T Discard<1/Card> | Defined$ Self | CounterType$ STUDY | CounterNum$ 1 | SpellDescription$ Put a study counter on Grimoire of the Dead. A:AB$ ChangeZoneAll | Cost$ T SubCounter<3/STUDY> Sac<1/CARDNAME> | ChangeType$ Creature | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | AnimateSubAbility$ DBAnimate | SpellDescription$ Put all creature cards in all graveyards onto the battlefield under your control. They are black Zombies in addition to their other colors and types. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Colors$ Black | Types$ Zombie | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Colors$ Black | Types$ Zombie | Duration$ Permanent AI:RemoveDeck:All SVar:IsReanimatorCard:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/grimoire_of_the_dead.jpg diff --git a/forge-gui/res/cardsfolder/g/grindstone.txt b/forge-gui/res/cardsfolder/g/grindstone.txt index bcc01d7dfa1..b0d11a982e4 100644 --- a/forge-gui/res/cardsfolder/g/grindstone.txt +++ b/forge-gui/res/cardsfolder/g/grindstone.txt @@ -1,11 +1,10 @@ Name:Grindstone ManaCost:1 Types:Artifact -A:AB$ Repeat | Cost$ 3 T | ValidTgts$ Player | RepeatSubAbility$ DBCleanAndGrind | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledSharesColor | RepeatSVarCompare$ EQ2 | SubAbility$ DBCleanup | SpellDescription$ Target player mills two cards. If two cards that share a color were milled this way, repeat this process. | StackDescription$ SpellDescription -SVar:DBCleanAndGrind:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBPeek -SVar:DBPeek:DB$ PeekAndReveal | Defined$ Targeted | PeekAmount$ 2 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ DBGrind -SVar:DBGrind:DB$ Mill | NumCards$ 2 | Defined$ Targeted | NoReveal$ True +A:AB$ Repeat | Cost$ 3 T | ValidTgts$ Player | RepeatSubAbility$ DBCleanAndGrind | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledSharesColor | RepeatSVarCompare$ GE2 | SubAbility$ DBCleanup | SpellDescription$ Target player mills two cards. If two cards that share a color were milled this way, repeat this process. | StackDescription$ SpellDescription +SVar:DBCleanAndGrind:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBGrind +SVar:DBGrind:DB$ Mill | NumCards$ 2 | Defined$ Targeted | NoReveal$ True | RememberMilled$ True SVar:MaxRepeats:TargetedPlayer$CardsInLibrary -SVar:MilledSharesColor:RememberedLKI$Valid Card.SharesColorWith Remembered +SVar:MilledSharesColor:Remembered$Valid Card.SharesColorWithOther Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:{3}, {T}: Target player mills two cards. If two cards that share a color were milled this way, repeat this process. diff --git a/forge-gui/res/cardsfolder/g/grip_of_the_roil.txt b/forge-gui/res/cardsfolder/g/grip_of_the_roil.txt index a707954e5f8..995e6b910a7 100644 --- a/forge-gui/res/cardsfolder/g/grip_of_the_roil.txt +++ b/forge-gui/res/cardsfolder/g/grip_of_the_roil.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Instant K:Surge:1 U A:SP$ Tap | Cost$ 2 U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBDraw +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Picture:http://www.wizards.com/global/images/magic/general/grip_of_the_roil.jpg Oracle:Surge {1}{U} (You may cast this spell for its surge cost if you or a teammate has cast another spell this turn.)\nTap target creature. It doesn't untap during its controller's next untap step.\nDraw a card. diff --git a/forge-gui/res/cardsfolder/g/gruesome_encore.txt b/forge-gui/res/cardsfolder/g/gruesome_encore.txt index 543bfde8460..aa299594c9f 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_encore.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_encore.txt @@ -2,7 +2,7 @@ Name:Gruesome Encore ManaCost:2 B Types:Sorcery A:SP$ ChangeZone | Cost$ 2 B | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.OppOwn | TgtPrompt$ Select target creature in an opponent's graveyard | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | SpellDescription$ Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. -SVar:DBPump:DB$ Animate | Keywords$ Haste | LeaveBattlefield$ Exile | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | LeaveBattlefield$ Exile | Defined$ Remembered | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/gruesome_encore.jpg Oracle:Put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. Exile it at the beginning of the next end step. If that creature would leave the battlefield, exile it instead of putting it anywhere else. diff --git a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt index 8173712338a..cb8658bc399 100644 --- a/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt +++ b/forge-gui/res/cardsfolder/g/gruesome_menagerie.txt @@ -1,9 +1,9 @@ Name:Gruesome Menagerie ManaCost:3 B B Types:Sorcery -A:SP$ ChooseCard | Cost$ 3 B B | Defined$ You | Choices$ Creature.YouOwn+cmcEQ1 | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBChoose2 | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 1 in your graveyard, then do the same for creature cards with mana value 2 and 3. Return those cards to the battlefield. -SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ2 | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBChoose3 | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 2 in your graveyard. -SVar:DBChoose3:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ3 | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBReturn | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 3 in your graveyard. +A:SP$ ChooseCard | Cost$ 3 B B | Defined$ You | Choices$ Creature.YouOwn+cmcEQ1 | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBChoose2 | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 1 in your graveyard, then do the same for creature cards with mana value 2 and 3. Return those cards to the battlefield. +SVar:DBChoose2:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ2 | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBChoose3 | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 2 in your graveyard. +SVar:DBChoose3:DB$ ChooseCard | Defined$ You | Choices$ Creature.YouOwn+cmcEQ3 | ChoiceZone$ Graveyard | Mandatory$ True | SubAbility$ DBReturn | RememberChosen$ True | SpellDescription$ Choose a creature card with mana value 3 in your graveyard. SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NeedsToPlayVar:Z GE1 diff --git a/forge-gui/res/cardsfolder/g/guard_dogs.txt b/forge-gui/res/cardsfolder/g/guard_dogs.txt index 0642c320db3..633cb7cfdcc 100644 --- a/forge-gui/res/cardsfolder/g/guard_dogs.txt +++ b/forge-gui/res/cardsfolder/g/guard_dogs.txt @@ -2,10 +2,9 @@ Name:Guard Dogs ManaCost:3 W Types:Creature Dog PT:2/2 -A:AB$ ChooseCard | Cost$ 2 W T | Choices$ Permanent.YouCtrl | Amount$ 1 | ChoiceTitle$ Choose a permanent you control | RememberChosen$ True | SubAbility$ DBPrevent | SpellDescription$ Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. +A:AB$ ChooseCard | Cost$ 2 W T | Choices$ Permanent.YouCtrl | Mandatory$ True | ChoiceTitle$ Choose a permanent you control | RememberChosen$ True | SubAbility$ DBPrevent | SpellDescription$ Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. SVar:DBPrevent:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature whose combat damage will be prevented | KW$ Prevent all combat damage that would be dealt by CARDNAME. | ConditionDefined$ Targeted | ConditionPresent$ Card.SharesColorWith Card.IsRemembered | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/guard_dogs.jpg Oracle:{2}{W}, {T}: Choose a permanent you control. Prevent all combat damage target creature would deal this turn if it shares a color with that permanent. diff --git a/forge-gui/res/cardsfolder/upcoming/guardian_archon.txt b/forge-gui/res/cardsfolder/g/guardian_archon.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/guardian_archon.txt rename to forge-gui/res/cardsfolder/g/guardian_archon.txt diff --git a/forge-gui/res/cardsfolder/upcoming/guardian_augmenter.txt b/forge-gui/res/cardsfolder/g/guardian_augmenter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/guardian_augmenter.txt rename to forge-gui/res/cardsfolder/g/guardian_augmenter.txt diff --git a/forge-gui/res/cardsfolder/g/guardian_of_tazeem.txt b/forge-gui/res/cardsfolder/g/guardian_of_tazeem.txt index 8c7d7c3a901..5f52cc3ce7e 100644 --- a/forge-gui/res/cardsfolder/g/guardian_of_tazeem.txt +++ b/forge-gui/res/cardsfolder/g/guardian_of_tazeem.txt @@ -5,7 +5,7 @@ PT:4/5 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | ConditionDefined$ TriggeredCard | ConditionPresent$ Island +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | ConditionDefined$ TriggeredCard | ConditionPresent$ Island SVar:BuffedBy:Land SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_tazeem.jpg Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, tap target creature an opponent controls. If that land is an Island, that creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/g/guardian_of_the_ages.txt b/forge-gui/res/cardsfolder/g/guardian_of_the_ages.txt index dfe82e0b0a9..51baa1b7e83 100644 --- a/forge-gui/res/cardsfolder/g/guardian_of_the_ages.txt +++ b/forge-gui/res/cardsfolder/g/guardian_of_the_ages.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Golem PT:7/7 K:Defender T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | IsPresent$ Card.Self+withDefender | TriggerZones$ Battlefield | Execute$ DBAnimate | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, if CARDNAME has defender, it loses defender and gains trample. -SVar:DBAnimate:DB$ Animate | Keywords$ Trample | RemoveKeywords$ Defender | Permanent$ True +SVar:DBAnimate:DB$ Animate | Keywords$ Trample | RemoveKeywords$ Defender | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_of_the_ages.jpg Oracle:Defender (This creature can't attack.)\nWhen a creature attacks you or a planeswalker you control, if Guardian of the Ages has defender, it loses defender and gains trample. diff --git a/forge-gui/res/cardsfolder/g/guardian_seraph.txt b/forge-gui/res/cardsfolder/g/guardian_seraph.txt index 0e2a71faa4c..4340de456c5 100644 --- a/forge-gui/res/cardsfolder/g/guardian_seraph.txt +++ b/forge-gui/res/cardsfolder/g/guardian_seraph.txt @@ -3,6 +3,6 @@ ManaCost:2 W W Types:Creature Angel PT:3/4 K:Flying -S:Mode$ PreventDamage | Target$ You | Source$ Card.OppCtrl | Amount$ 1 | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. -SVar:Picture:http://www.wizards.com/global/images/magic/general/guardian_seraph.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:Flying\nIf a source an opponent controls would deal damage to you, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/upcoming/guiding_voice.txt b/forge-gui/res/cardsfolder/g/guiding_voice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/guiding_voice.txt rename to forge-gui/res/cardsfolder/g/guiding_voice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/gyome_master_chef.txt b/forge-gui/res/cardsfolder/g/gyome_master_chef.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/gyome_master_chef.txt rename to forge-gui/res/cardsfolder/g/gyome_master_chef.txt diff --git a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt index 0f486e4b82f..b3e6706b96f 100644 --- a/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt +++ b/forge-gui/res/cardsfolder/h/haakon_stromgald_scourge_avatar.txt @@ -5,7 +5,7 @@ HandLifeModifier:+0/-3 A:AB$ Effect | ActivationZone$ Command | Cost$ PayLife<1> | TgtZone$ Graveyard | ValidTgts$ Creature.YouOwn | PumpZone$ Graveyard | TgtPrompt$ Select target creature in your graveyard, you may play it this turn | RememberObjects$ Targeted | StaticAbilities$ Play | ExileOnMoved$ Graveyard | SpellDescription$ You may cast target creature card in your graveyard this turn. SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play remembered card. T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidControllingPlayer$ You | TriggerZones$ Command | Execute$ TrigAnimate | TriggerDescription$ Whenever you cast a creature spell from your graveyard, it becomes a black Zombie Knight. -SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Types$ Zombie,Knight | Colors$ Black | OverwriteColors$ True | Permanent$ True | RemoveCreatureTypes$ True +SVar:TrigAnimate:DB$ Animate | Defined$ TriggeredCard | Types$ Zombie,Knight | Colors$ Black | OverwriteColors$ True | Duration$ Permanent | RemoveCreatureTypes$ True R:Event$ Moved | ValidCard$ Card.Zombie+Knight | Destination$ Graveyard | ReplaceWith$ DBExile | Description$ If a Zombie Knight would be put into your graveyard from the battlefield, exile it instead. SVar:DBExile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile SVar:Picture:https://downloads.cardforge.org/images/cards/VAN/Haakon, Stromgald Scourge Avatar.full.jpg diff --git a/forge-gui/res/cardsfolder/h/halfdane.txt b/forge-gui/res/cardsfolder/h/halfdane.txt index a1463c55922..906a71eb0c6 100644 --- a/forge-gui/res/cardsfolder/h/halfdane.txt +++ b/forge-gui/res/cardsfolder/h/halfdane.txt @@ -4,8 +4,7 @@ Types:Legendary Creature Shapeshifter PT:3/3 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ At the beginning of your upkeep, change CARDNAME's base power and toughness to the power and toughness of target creature other than CARDNAME until the end of your next upkeep. SVar:TrigAnimate:DB$ Pump | ValidTgts$ Creature.Other | TgtPrompt$ Select target creature other than this creature | AILogic$ HighestPower | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ Y | UntilTheEndOfYourNextUpkeep$ True +SVar:DBAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ Y | Duration$ UntilTheEndOfYourNextUpkeep SVar:X:Targeted$CardPower SVar:Y:Targeted$CardToughness -SVar:Picture:http://www.wizards.com/global/images/magic/general/halfdane.jpg Oracle:At the beginning of your upkeep, change Halfdane's base power and toughness to the power and toughness of target creature other than Halfdane until the end of your next upkeep. diff --git a/forge-gui/res/cardsfolder/upcoming/hall_monitor.txt b/forge-gui/res/cardsfolder/h/hall_monitor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hall_monitor.txt rename to forge-gui/res/cardsfolder/h/hall_monitor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hall_of_oracles.txt b/forge-gui/res/cardsfolder/h/hall_of_oracles.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hall_of_oracles.txt rename to forge-gui/res/cardsfolder/h/hall_of_oracles.txt diff --git a/forge-gui/res/cardsfolder/h/hallowed_fountain.txt b/forge-gui/res/cardsfolder/h/hallowed_fountain.txt index def43e2799e..f6c18313e18 100644 --- a/forge-gui/res/cardsfolder/h/hallowed_fountain.txt +++ b/forge-gui/res/cardsfolder/h/hallowed_fountain.txt @@ -2,6 +2,5 @@ Name:Hallowed Fountain ManaCost:no cost Types:Land Plains Island K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/dis/en-us/card97071.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {W} or {U}.)\nAs Hallowed Fountain enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/h/hands_of_binding.txt b/forge-gui/res/cardsfolder/h/hands_of_binding.txt index 7604c56a914..5ae97b9acc6 100644 --- a/forge-gui/res/cardsfolder/h/hands_of_binding.txt +++ b/forge-gui/res/cardsfolder/h/hands_of_binding.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Sorcery K:Cipher A:SP$ Tap | Cost$ 1 U | ValidTgts$ Creature.OppCtrl | SubAbility$ DBPump | SpellDescription$ Tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ Cipher +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ Cipher SVar:Cipher:DB$ Encode | Defined$ Self DeckNeeds:Type$Creature SVar:Picture:http://www.wizards.com/global/images/magic/general/hands_of_binding.jpg diff --git a/forge-gui/res/cardsfolder/h/harmless_offering.txt b/forge-gui/res/cardsfolder/h/harmless_offering.txt index 8a56afd9466..cf0cefd41c8 100644 --- a/forge-gui/res/cardsfolder/h/harmless_offering.txt +++ b/forge-gui/res/cardsfolder/h/harmless_offering.txt @@ -1,10 +1,7 @@ Name:Harmless Offering ManaCost:2 R Types:Sorcery -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ D1 | SpellDescription$ Target opponent gains control of target permanent you control. | StackDescription$ None -SVar:D1:DB$ Pump | Static$ True | SubAbility$ D2 | StackDescription$ None -SVar:D2:DB$ Pump | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | SubAbility$ D3 | StackDescription$ None -SVar:D3:DB$ GainControl | Defined$ Targeted | NewController$ TargetedPlayer +A:SP$ Pump | Cost$ 2 R | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SubAbility$ DBGainControl | SpellDescription$ Target opponent gains control of target permanent you control. | StackDescription$ None +SVar:DBGainControl:DB$ GainControl | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | NewController$ ParentTarget AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/harmless_offering.jpg Oracle:Target opponent gains control of target permanent you control. diff --git a/forge-gui/res/cardsfolder/h/harms_way.txt b/forge-gui/res/cardsfolder/h/harms_way.txt new file mode 100644 index 00000000000..33fd78c0f01 --- /dev/null +++ b/forge-gui/res/cardsfolder/h/harms_way.txt @@ -0,0 +1,11 @@ +Name:Harm's Way +ManaCost:W +Types:Instant +A:SP$ ChooseSource | Cost$ W | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to any target instead. +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage to | ReplacementEffects$ ReDamage | RememberObjects$ Targeted | SubAbility$ DBCleanup +SVar:ReDamage:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SplitDamage | DamageTarget$ Remembered | Description$ The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to any target instead. +SVar:SplitDamage:DB$ ReplaceSplitDamage | DamageTarget$ Remembered | VarName$ ShieldAmount | DivideShield$ True +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +SVar:ShieldAmount:Number$2 +AI:RemoveDeck:All +Oracle:The next 2 damage that a source of your choice would deal to you and/or permanents you control this turn is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/upcoming/harness_infinity.txt b/forge-gui/res/cardsfolder/h/harness_infinity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/harness_infinity.txt rename to forge-gui/res/cardsfolder/h/harness_infinity.txt diff --git a/forge-gui/res/cardsfolder/h/harsh_judgment.txt b/forge-gui/res/cardsfolder/h/harsh_judgment.txt index 4c95488a3b1..8cf0d8ca660 100644 --- a/forge-gui/res/cardsfolder/h/harsh_judgment.txt +++ b/forge-gui/res/cardsfolder/h/harsh_judgment.txt @@ -3,7 +3,7 @@ ManaCost:2 W W Types:Enchantment K:ETBReplacement:Other:ChooseColor SVar:ChooseColor:DB$ ChooseColor | Defined$ You | AILogic$ MostProminentInHumanDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a color. -R:Event$ DamageDone | ValidTarget$ You | ActiveZones$ Battlefield | ValidSource$ Instant.ChosenColor,Sorcery.ChosenColor | ReplaceWith$ HarshDmg | Description$ If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead. +R:Event$ DamageDone | ValidTarget$ You | ActiveZones$ Battlefield | ValidSource$ Instant.ChosenColor,Sorcery.ChosenColor | DamageTarget$ ReplacedSourceController | ReplaceWith$ HarshDmg | Description$ If an instant or sorcery spell of the chosen color would deal damage to you, it deals that damage to its controller instead. SVar:HarshDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ ReplacedSourceController | VarType$ Player AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/harsh_judgment.jpg diff --git a/forge-gui/res/cardsfolder/h/harvest_mage.txt b/forge-gui/res/cardsfolder/h/harvest_mage.txt index 9a808e30a70..1f7b9053a52 100644 --- a/forge-gui/res/cardsfolder/h/harvest_mage.txt +++ b/forge-gui/res/cardsfolder/h/harvest_mage.txt @@ -3,7 +3,7 @@ ManaCost:G Types:Creature Human Spellshaper PT:1/1 A:AB$ Effect | Cost$ G T Discard<1/Card> | ReplacementEffects$ HarvestReplacement | AILogic$ Never | Stackable$ False | SpellDescription$ Until end of turn, if you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. -SVar:HarvestReplacement:Event$ ProduceMana | ActiveZones$ Command | ValidPlayer$ You | ValidCard$ Land | ValidAbility$ Activated.hasTapCost | ReplaceWith$ HarvestProduce | Description$ If you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. +SVar:HarvestReplacement:Event$ ProduceMana | ActiveZones$ Command | ValidActivator$ You | ValidCard$ Land | ValidAbility$ Activated.hasTapCost | ReplaceWith$ HarvestProduce | Description$ If you tap a land for mana, it produces one mana of a color of your choice instead of any other type and amount. SVar:HarvestProduce:DB$ ReplaceMana | ReplaceMana$ Any AI:RemoveDeck:All SVar:NonStackingEffect:True diff --git a/forge-gui/res/cardsfolder/h/healing_grace.txt b/forge-gui/res/cardsfolder/h/healing_grace.txt index e6bb01c3cb9..40d9669dc1e 100644 --- a/forge-gui/res/cardsfolder/h/healing_grace.txt +++ b/forge-gui/res/cardsfolder/h/healing_grace.txt @@ -3,10 +3,10 @@ ManaCost:W Types:Instant A:SP$ ChooseSource | Cost$ W | Choices$ Card,Emblem | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Prevent the next 3 damage that would be dealt to any target this turn by a source of your choice. You gain 3 life. SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to prevent damage to | ReplacementEffects$ GraceDamage | ForgetOnMoved$ Battlefield | RememberObjects$ Targeted | SubAbility$ DBGainLife -SVar:GraceDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered,Player.IsRemembered | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ GraceDmg | PreventionEffect$ True | Description$ Prevent the next 3 damage that would be dealt to any target this turn by a source of your choice. -SVar:GraceDmg:DB$ ReplaceDamage | VarName$ X +SVar:GraceDamage:Event$ DamageDone | ValidTarget$ Card.IsRemembered,Player.IsRemembered | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ GraceDmg | PreventionEffect$ True | Description$ Prevent the next 3 damage that would be dealt to any target this turn by a source of your choice. +SVar:GraceDmg:DB$ ReplaceDamage | Amount$ ShieldAmount SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -SVar:X:Number$3 +SVar:ShieldAmount:Number$3 AI:RemoveDeck:All Oracle:Prevent the next 3 damage that would be dealt to any target this turn by a source of your choice. You gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/healing_technique.txt b/forge-gui/res/cardsfolder/h/healing_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/healing_technique.txt rename to forge-gui/res/cardsfolder/h/healing_technique.txt diff --git a/forge-gui/res/cardsfolder/upcoming/heated_debate.txt b/forge-gui/res/cardsfolder/h/heated_debate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/heated_debate.txt rename to forge-gui/res/cardsfolder/h/heated_debate.txt diff --git a/forge-gui/res/cardsfolder/h/hedron_field_purists.txt b/forge-gui/res/cardsfolder/h/hedron_field_purists.txt index ee01371e7f6..8aae72ec6ea 100644 --- a/forge-gui/res/cardsfolder/h/hedron_field_purists.txt +++ b/forge-gui/res/cardsfolder/h/hedron_field_purists.txt @@ -6,9 +6,10 @@ K:Level up:2 W SVar:maxLevel:5 S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 1 | SetToughness$ 4 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ LEVEL 1-4 1/4 If a source would deal damage to you or a creature you control prevent 1 of that damage. S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 5 | CheckSVar$ Y | SVarCompare$ EQ1 | Description$ LEVEL 5+ 2/5 If a source would deal damage to you or a creature you control prevent 2 of that damage. -S:Mode$ PreventDamage | Target$ You,Creature.YouCtrl | Amount$ 1 | CheckSVar$ X | SVarCompare$ EQ1 -S:Mode$ PreventDamage | Target$ You,Creature.YouCtrl | Amount$ 2 | CheckSVar$ Y | SVarCompare$ EQ1 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Creature.YouCtrl | ReplaceWith$ DBReplace1 | PreventionEffect$ True | CheckSVar$ X | SVarCompare$ EQ1 +SVar:DBReplace1:DB$ ReplaceDamage | Amount$ 1 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You,Creature.YouCtrl | ReplaceWith$ DBReplace2 | PreventionEffect$ True | CheckSVar$ Y | SVarCompare$ EQ1 +SVar:DBReplace2:DB$ ReplaceDamage | Amount$ 2 SVar:X:Count$Valid Card.Self+counters_GE1_LEVEL+counters_LT5_LEVEL SVar:Y:Count$Valid Card.Self+counters_GE5_LEVEL -SVar:Picture:http://www.wizards.com/global/images/magic/general/hedron_field_purists.jpg Oracle:Level up {2}{W} ({2}{W}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n1/4\nIf a source would deal damage to you or a creature you control, prevent 1 of that damage.\nLEVEL 5+\n2/5\nIf a source would deal damage to you or a creature you control, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/h/hellkite_courser.txt b/forge-gui/res/cardsfolder/h/hellkite_courser.txt index a38ce6764d7..0907fc79da9 100644 --- a/forge-gui/res/cardsfolder/h/hellkite_courser.txt +++ b/forge-gui/res/cardsfolder/h/hellkite_courser.txt @@ -5,7 +5,7 @@ PT:6/5 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put a commander you own from the command zone onto the battlefield. It gains haste. Return it to the command zone at the beginning of the next end step. SVar:TrigChangeZone:DB$ ChangeZone | ChangeType$ Card.IsCommander+YouOwn | SelectPrompt$ Select a commander | ChangeNum$ 1 | Mandatory$ True | Origin$ Command | Destination$ Battlefield | Hidden$ True | RememberChanged$ True | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | SubAbility$ DBDelTrig +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | SubAbility$ DBDelTrig SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigReturn | RememberObjects$ RememberedLKI | SubAbility$ DBCleanup | TriggerDescription$ Return the commander to the command zone. SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Command | Defined$ DelayTriggerRememberedLKI SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/h/hidden_ancients.txt b/forge-gui/res/cardsfolder/h/hidden_ancients.txt index 5ab3dcaeba0..a7b0cd07bb9 100644 --- a/forge-gui/res/cardsfolder/h/hidden_ancients.txt +++ b/forge-gui/res/cardsfolder/h/hidden_ancients.txt @@ -2,6 +2,6 @@ Name:Hidden Ancients ManaCost:1 G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an enchantment spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/5 Treefolk creature. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 5 | Types$ Creature,Treefolk | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 5 | Types$ Creature,Treefolk | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_ancients.jpg Oracle:When an opponent casts an enchantment spell, if Hidden Ancients is an enchantment, Hidden Ancients becomes a 5/5 Treefolk creature. diff --git a/forge-gui/res/cardsfolder/h/hidden_gibbons.txt b/forge-gui/res/cardsfolder/h/hidden_gibbons.txt index d2ef3de4e2f..230527bec41 100644 --- a/forge-gui/res/cardsfolder/h/hidden_gibbons.txt +++ b/forge-gui/res/cardsfolder/h/hidden_gibbons.txt @@ -2,6 +2,6 @@ Name:Hidden Gibbons ManaCost:G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an instant spell, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Ape creature. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Ape | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Ape | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_gibbons.jpg Oracle:When an opponent casts an instant spell, if Hidden Gibbons is an enchantment, Hidden Gibbons becomes a 4/4 Ape creature. diff --git a/forge-gui/res/cardsfolder/h/hidden_guerrillas.txt b/forge-gui/res/cardsfolder/h/hidden_guerrillas.txt index 370e0b74f2c..cf06f72d139 100644 --- a/forge-gui/res/cardsfolder/h/hidden_guerrillas.txt +++ b/forge-gui/res/cardsfolder/h/hidden_guerrillas.txt @@ -2,6 +2,6 @@ Name:Hidden Guerrillas ManaCost:G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts an artifact spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/3 Soldier creature with trample. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 3 | Keywords$ Trample | Types$ Creature,Soldier | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 3 | Keywords$ Trample | Types$ Creature,Soldier | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_guerrillas.jpg Oracle:When an opponent casts an artifact spell, if Hidden Guerrillas is an enchantment, Hidden Guerrillas becomes a 5/3 Soldier creature with trample. diff --git a/forge-gui/res/cardsfolder/h/hidden_herd.txt b/forge-gui/res/cardsfolder/h/hidden_herd.txt index b1a8a262dda..f8d5fc0baba 100644 --- a/forge-gui/res/cardsfolder/h/hidden_herd.txt +++ b/forge-gui/res/cardsfolder/h/hidden_herd.txt @@ -2,6 +2,6 @@ Name:Hidden Herd ManaCost:G Types:Enchantment T:Mode$ LandPlayed | ValidCard$ Land.nonBasic+OppCtrl | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent plays a nonbasic land, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Beast creature. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Beast | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Beast | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_herd.jpg Oracle:When an opponent plays a nonbasic land, if Hidden Herd is an enchantment, Hidden Herd becomes a 3/3 Beast creature. diff --git a/forge-gui/res/cardsfolder/h/hidden_predators.txt b/forge-gui/res/cardsfolder/h/hidden_predators.txt index 7ef38b1cf89..45268599a77 100644 --- a/forge-gui/res/cardsfolder/h/hidden_predators.txt +++ b/forge-gui/res/cardsfolder/h/hidden_predators.txt @@ -2,6 +2,6 @@ Name:Hidden Predators ManaCost:G Types:Enchantment T:Mode$ Always | IsPresent$ Creature.powerGE4+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigLurkingJackalsAnimate | IsPresent2$ Card.Self+Enchantment | ResolvingCheck$ IsPresent2 | TriggerDescription$ When an opponent controls a creature with power 4 or greater, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Beast creature. -SVar:TrigLurkingJackalsAnimate:DB$ Animate | Types$ Creature,Beast | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Permanent$ True +SVar:TrigLurkingJackalsAnimate:DB$ Animate | Types$ Creature,Beast | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_predators.jpg Oracle:When an opponent controls a creature with power 4 or greater, if Hidden Predators is an enchantment, Hidden Predators becomes a 4/4 Beast creature. diff --git a/forge-gui/res/cardsfolder/h/hidden_spider.txt b/forge-gui/res/cardsfolder/h/hidden_spider.txt index 989be698e2a..69064939c07 100644 --- a/forge-gui/res/cardsfolder/h/hidden_spider.txt +++ b/forge-gui/res/cardsfolder/h/hidden_spider.txt @@ -2,6 +2,6 @@ Name:Hidden Spider ManaCost:G Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature.withFlying | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell with flying, if CARDNAME is an enchantment, CARDNAME becomes a 3/5 Spider creature with reach. (It can block creatures with flying.) -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 5 | Keywords$ Reach | Types$ Creature,Spider | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 5 | Keywords$ Reach | Types$ Creature,Spider | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_spider.jpg Oracle:When an opponent casts a creature spell with flying, if Hidden Spider is an enchantment, Hidden Spider becomes a 3/5 Spider creature with reach. (It can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/h/hidden_stag.txt b/forge-gui/res/cardsfolder/h/hidden_stag.txt index 30c21758e83..09c5a5f3021 100644 --- a/forge-gui/res/cardsfolder/h/hidden_stag.txt +++ b/forge-gui/res/cardsfolder/h/hidden_stag.txt @@ -2,9 +2,9 @@ Name:Hidden Stag ManaCost:1 G Types:Enchantment T:Mode$ LandPlayed | ValidCard$ Land.OppCtrl | IsPresent$ Card.Self+Enchantment | Execute$ TrigHiddenStagAnimateOppLand | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent plays a land, if CARDNAME is an enchantment, CARDNAME becomes a 3/2 Elk Beast creature. -SVar:TrigHiddenStagAnimateOppLand:DB$ Animate | Defined$ Self | Types$ Creature,Elk,Beast | Power$ 3 | Toughness$ 2 | RemoveCardTypes$ True | Permanent$ True +SVar:TrigHiddenStagAnimateOppLand:DB$ Animate | Defined$ Self | Types$ Creature,Elk,Beast | Power$ 3 | Toughness$ 2 | RemoveCardTypes$ True | Duration$ Permanent T:Mode$ LandPlayed | ValidCard$ Land.YouCtrl | IsPresent$ Card.Self+Creature | Execute$ TrigHiddenStagAnimateYourLand | TriggerZones$ Battlefield | TriggerDescription$ Whenever you play a land, if CARDNAME is a creature, CARDNAME becomes an enchantment. -SVar:TrigHiddenStagAnimateYourLand:DB$ Animate | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Permanent$ True +SVar:TrigHiddenStagAnimateYourLand:DB$ Animate | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Duration$ Permanent AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/hidden_stag.jpg Oracle:Whenever an opponent plays a land, if Hidden Stag is an enchantment, Hidden Stag becomes a 3/2 Elk Beast creature.\nWhenever you play a land, if Hidden Stag is a creature, Hidden Stag becomes an enchantment. diff --git a/forge-gui/res/cardsfolder/h/hidetsugus_second_rite.txt b/forge-gui/res/cardsfolder/h/hidetsugus_second_rite.txt index a400eb74dd2..3173a9140a8 100644 --- a/forge-gui/res/cardsfolder/h/hidetsugus_second_rite.txt +++ b/forge-gui/res/cardsfolder/h/hidetsugus_second_rite.txt @@ -5,5 +5,4 @@ A:SP$ DealDamage | Cost$ 3 R | ValidTgts$ Player | TgtPrompt$ Select target play SVar:X:TargetedPlayer$LifeTotal SVar:Y:Count$OppsAtLifeTotal.10 SVar:NeedsToPlayVar:Y GE1 -SVar:Picture:http://resources.wizards.com/magic/cards/sok/en-us/card88818.jpg -Oracle:If target player has exactly 10 life, Hidetsugu's Second Rite deals 10 damage to that player. +Oracle:If target player has exactly 10 life, Hidetsugu's Second Rite deals 10 damage to that player. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/h/hieromancers_cage.txt b/forge-gui/res/cardsfolder/h/hieromancers_cage.txt index a4719227a5b..730f6d3310f 100644 --- a/forge-gui/res/cardsfolder/h/hieromancers_cage.txt +++ b/forge-gui/res/cardsfolder/h/hieromancers_cage.txt @@ -2,7 +2,7 @@ Name:Hieromancer's Cage ManaCost:3 W Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls until Hieromancer's Cage leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:When Hieromancer's Cage enters the battlefield, exile target nonland permanent an opponent controls until Hieromancer's Cage leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/h/hinterland_drake.txt b/forge-gui/res/cardsfolder/h/hinterland_drake.txt index 67da922e1cf..cd9ee0b3a7c 100644 --- a/forge-gui/res/cardsfolder/h/hinterland_drake.txt +++ b/forge-gui/res/cardsfolder/h/hinterland_drake.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Drake PT:2/3 K:Flying -K:CantBlock Artifact.Creature:artifact creatures -SVar:Picture:http://www.wizards.com/global/images/magic/general/hinterland_drake.jpg -Oracle:Flying\nHinterland Drake can't block artifact creatures. \ No newline at end of file +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Artifact | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block artifact creatures. +Oracle:Flying\nHinterland Drake can't block artifact creatures. diff --git a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt index a85c8b88ca0..ef8319eafd7 100644 --- a/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt +++ b/forge-gui/res/cardsfolder/h/hixus_prison_warden.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Soldier PT:4/4 K:Flash T:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ You | CombatDamage$ True | IsPresent$ Card.Self+ThisTurnEntered | Execute$ TrigExile | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature deals combat damage to you, if CARDNAME entered the battlefield this turn, exile that creature until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ TriggeredSourceLKICopy | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ TriggeredSourceLKICopy | Duration$ UntilHostLeavesPlay SVar:AmbushAI:BlockOnly Oracle:Flash (You may cast this spell any time you could cast an instant.)\nWhenever a creature deals combat damage to you, if Hixus, Prison Warden entered the battlefield this turn, exile that creature until Hixus leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/upcoming/hofri_ghostforge.txt b/forge-gui/res/cardsfolder/h/hofri_ghostforge.txt similarity index 92% rename from forge-gui/res/cardsfolder/upcoming/hofri_ghostforge.txt rename to forge-gui/res/cardsfolder/h/hofri_ghostforge.txt index 0c9a59f2b9e..f942c3cde2f 100644 --- a/forge-gui/res/cardsfolder/upcoming/hofri_ghostforge.txt +++ b/forge-gui/res/cardsfolder/h/hofri_ghostforge.txt @@ -6,7 +6,7 @@ S:Mode$ Continuous | Affected$ Spirit.YouCtrl | AddPower$ 1 | AddToughness$ 1 | T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.Other+nonToken+YouCtrl | Execute$ TrigChange | TriggerDescription$ Whenever another nontoken creature you control dies, exile it. If you do, create a token that's a copy of that creature, except it's a Spirit in addition to its other types and it has "When this creature leaves the battlefield, return the exiled card to its owner's graveyard." SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredNewCardLKICopy | RememberChanged$ True | SubAbility$ DBCopy SVar:DBCopy:DB$ CopyPermanent | Defined$ TriggeredCardLKICopy | AddTypes$ Spirit | ConditionDefined$ TriggeredNewCardLKICopy | ConditionPresent$ Card | ConditionCompare$ EQExiledCount | ImprintTokens$ True | TokenRemembered$ Remembered | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | Permanent$ True | Triggers$ TrigLeavesBattlefield | sVars$ TrigReturn | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | Duration$ Permanent | Triggers$ TrigLeavesBattlefield | sVars$ TrigReturn | SubAbility$ DBCleanup SVar:TrigLeavesBattlefield:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When this creature leaves the battlefield, return the exiled card to your graveyard. SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True diff --git a/forge-gui/res/cardsfolder/h/homarid_warrior.txt b/forge-gui/res/cardsfolder/h/homarid_warrior.txt index 721b6894830..d74a704504d 100644 --- a/forge-gui/res/cardsfolder/h/homarid_warrior.txt +++ b/forge-gui/res/cardsfolder/h/homarid_warrior.txt @@ -3,6 +3,6 @@ ManaCost:4 U Types:Creature Homarid Warrior PT:3/3 A:AB$ Pump | Cost$ U | Defined$ Self | KW$ Shroud | SubAbility$ DBPumpNoUntap | SpellDescription$ CARDNAME gains shroud until end of turn and doesn't untap during your next untap step. Tap CARDNAME. (A permanent with shroud can't be the target of spells or abilities.) -SVar:DBPumpNoUntap:DB$ Pump | Defined$ Self | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBTap +SVar:DBPumpNoUntap:DB$ Pump | Defined$ Self | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBTap SVar:DBTap:DB$ Tap | Defined$ Self Oracle:{U}: Homarid Warrior gains shroud until end of turn and doesn't untap during your next untap step. Tap Homarid Warrior. (A creature with shroud can't be the target of spells or abilities.) diff --git a/forge-gui/res/cardsfolder/upcoming/honor_troll.txt b/forge-gui/res/cardsfolder/h/honor_troll.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/honor_troll.txt rename to forge-gui/res/cardsfolder/h/honor_troll.txt diff --git a/forge-gui/res/cardsfolder/h/hostage_taker.txt b/forge-gui/res/cardsfolder/h/hostage_taker.txt index 8183c5122cd..85ca640374b 100644 --- a/forge-gui/res/cardsfolder/h/hostage_taker.txt +++ b/forge-gui/res/cardsfolder/h/hostage_taker.txt @@ -3,7 +3,7 @@ ManaCost:2 U B Types:Creature Human Pirate PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile another target creature or artifact until CARDNAME leaves the battlefield. You may cast that card for as long as it remains exiled, and you may spend mana as though it were mana of any type to cast that spell. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other,Artifact.Other | TgtPrompt$ Select another target creature or artifact | UntilHostLeavesPlay$ True | RememberChanged$ True | SubAbility$ DBEffect +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other,Artifact.Other | TgtPrompt$ Select another target creature or artifact | Duration$ UntilHostLeavesPlay | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreType$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may cast that card and you may spend mana as though it were mana of any type to cast it. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/h/house_guildmage.txt b/forge-gui/res/cardsfolder/h/house_guildmage.txt index 4a0c6f751c1..3cdd2773a87 100644 --- a/forge-gui/res/cardsfolder/h/house_guildmage.txt +++ b/forge-gui/res/cardsfolder/h/house_guildmage.txt @@ -2,7 +2,7 @@ Name:House Guildmage ManaCost:U B Types:Creature Human Wizard PT:2/2 -A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. +A:AB$ Pump | Cost$ 1 U T | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. A:AB$ Surveil | Cost$ 2 B T | Amount$ 2 | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) DeckHas:Ability$Surveil & Ability$Graveyard Oracle:{1}{U}, {T}: Target creature doesn't untap during its controller's next untap step.\n{2}{B}, {T}: Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) diff --git a/forge-gui/res/cardsfolder/h/hoverguard_observer.txt b/forge-gui/res/cardsfolder/h/hoverguard_observer.txt index 31b5fa2abec..cc726564e6b 100644 --- a/forge-gui/res/cardsfolder/h/hoverguard_observer.txt +++ b/forge-gui/res/cardsfolder/h/hoverguard_observer.txt @@ -3,6 +3,5 @@ ManaCost:2 U U Types:Creature Drone PT:3/3 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/hoverguard_observer.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nHoverguard Observer can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/h/howlgeist.txt b/forge-gui/res/cardsfolder/h/howlgeist.txt index 0d0123f8ba8..e5e9e186218 100644 --- a/forge-gui/res/cardsfolder/h/howlgeist.txt +++ b/forge-gui/res/cardsfolder/h/howlgeist.txt @@ -2,7 +2,7 @@ Name:Howlgeist ManaCost:5 G Types:Creature Spirit Wolf PT:4/2 -K:Creatures with power less than CARDNAME's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower K:Undying -SVar:Picture:http://www.wizards.com/global/images/magic/general/howlgeist.jpg Oracle:Creatures with power less than Howlgeist's power can't block it.\nUndying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/humiliate.txt b/forge-gui/res/cardsfolder/h/humiliate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/humiliate.txt rename to forge-gui/res/cardsfolder/h/humiliate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/hunt_for_specimens.txt b/forge-gui/res/cardsfolder/h/hunt_for_specimens.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/hunt_for_specimens.txt rename to forge-gui/res/cardsfolder/h/hunt_for_specimens.txt diff --git a/forge-gui/res/cardsfolder/h/hunted_ghoul.txt b/forge-gui/res/cardsfolder/h/hunted_ghoul.txt index 3942cd56574..4895e64e025 100644 --- a/forge-gui/res/cardsfolder/h/hunted_ghoul.txt +++ b/forge-gui/res/cardsfolder/h/hunted_ghoul.txt @@ -2,6 +2,5 @@ Name:Hunted Ghoul ManaCost:B Types:Creature Zombie PT:1/2 -K:CantBlock Creature.Human:Humans -SVar:Picture:http://www.wizards.com/global/images/magic/general/hunted_ghoul.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Human | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block Humans. Oracle:Hunted Ghoul can't block Humans. diff --git a/forge-gui/res/cardsfolder/h/hunting_wilds.txt b/forge-gui/res/cardsfolder/h/hunting_wilds.txt index 8db84065074..34cc3656dfb 100644 --- a/forge-gui/res/cardsfolder/h/hunting_wilds.txt +++ b/forge-gui/res/cardsfolder/h/hunting_wilds.txt @@ -4,7 +4,7 @@ Types:Sorcery K:Kicker:3 G A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ 2 | Tapped$ True | RememberChanged$ True | SubAbility$ DBUntap | SpellDescription$ Search your library for up to two Forest cards, put them onto the battlefield tapped, then shuffle. If this spell was kicked, untap all Forests put onto the battlefield this way. They become 3/3 green creatures with haste that are still lands. SVar:DBUntap:DB$ Untap | Defined$ Remembered | SubAbility$ DBAnimate | Condition$ Kicked | ConditionDescription$ If it was kicked, -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 3 | Toughness$ 3 | Colors$ Green | Types$ Creature | Keywords$ Haste | Condition$ Kicked | Permanent$ True | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 3 | Toughness$ 3 | Colors$ Green | Types$ Creature | Keywords$ Haste | Condition$ Kicked | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/hunting_wilds.jpg Oracle:Kicker {3}{G} (You may pay an additional {3}{G} as you cast this spell.)\nSearch your library for up to two Forest cards, put them onto the battlefield tapped, then shuffle.\nIf this spell was kicked, untap all Forests put onto the battlefield this way. They become 3/3 green creatures with haste that are still lands. diff --git a/forge-gui/res/cardsfolder/h/hypergenesis.txt b/forge-gui/res/cardsfolder/h/hypergenesis.txt index 9192d5a2ff3..8ac16c725b7 100644 --- a/forge-gui/res/cardsfolder/h/hypergenesis.txt +++ b/forge-gui/res/cardsfolder/h/hypergenesis.txt @@ -3,21 +3,19 @@ ManaCost:no cost Types:Sorcery Colors:green K:Suspend:3:1 G G -A:SP$ Repeat | Cost$ 0 | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ DBChangeZoneAll | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put an artifact, creature, enchantment, or land card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. +A:SP$ Repeat | Cost$ 0 | RepeatSubAbility$ ResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ FinalReset | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may put an artifact, creature, enchantment, or land card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. SVar:ResetCheck:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBRepeatChoice SVar:DBRepeatChoice:DB$ RepeatEach | StartingWithActivator$ True | RepeatSubAbility$ DBChoice | RepeatPlayers$ Player SVar:DBChoice:DB$ GenericChoice | Choices$ DBCheckHand,DBNoChange | Defined$ Player.IsRemembered SVar:DBCheckHand:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ EQ0 | SubAbility$ DBChoose | SpellDescription$ Choose an artifact, creature, enchantment, or land card from your hand onto the battlefield -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Artifact.IsNotRemembered+RememberedPlayerCtrl,Creature.IsNotRemembered+RememberedPlayerCtrl,Enchantment.IsNotRemembered+RememberedPlayerCtrl,Land.IsNotRemembered+RememberedPlayerCtrl | ChoiceZone$ Hand | Amount$ 1 | RememberChosen$ True | Mandatory$ True | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 +SVar:DBChoose:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Origin$ Hand | Destination$ Battlefield | ChangeType$ Artifact,Creature,Enchantment,Land | ChangeNum$ 1 | ConditionCheckSVar$ CheckHand | ConditionSVarCompare$ GE1 SVar:DBNoChange:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | SpellDescription$ Do not put an artifact, creature, enchantment, or land card from your hand onto the battlefield -SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Hand | Defined$ Player | Destination$ Battlefield | ChangeType$ Card.IsRemembered | SubAbility$ FinalReset SVar:FinalReset:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NumPlayerGiveup:Number$0 SVar:TotalPlayer:PlayerCountPlayers$Amount -SVar:CheckHand:Count$ValidHand Artifact.IsNotRemembered+RememberedPlayerCtrl,Creature.IsNotRemembered+RememberedPlayerCtrl,Enchantment.IsNotRemembered+RememberedPlayerCtrl,Land.IsNotRemembered+RememberedPlayerCtrl +SVar:CheckHand:Count$ValidHand Artifact.RememberedPlayerCtrl,Creature.RememberedPlayerCtrl,Enchantment.RememberedPlayerCtrl,Land.RememberedPlayerCtrl AI:RemoveDeck:Random SVar:NeedsToPlayVar:Y GE1 SVar:Y:Count$ValidHand Permanent.YouCtrl+cmcGE5 -SVar:Picture:http://www.wizards.com/global/images/magic/general/hypergenesis.jpg Oracle:Suspend 3—{1}{G}{G}\nStarting with you, each player may put an artifact, creature, enchantment, or land card from their hand onto the battlefield. Repeat this process until no one puts a card onto the battlefield. diff --git a/forge-gui/res/cardsfolder/i/icebreaker_kraken.txt b/forge-gui/res/cardsfolder/i/icebreaker_kraken.txt index 0e303eff3bd..e2d9553e8df 100644 --- a/forge-gui/res/cardsfolder/i/icebreaker_kraken.txt +++ b/forge-gui/res/cardsfolder/i/icebreaker_kraken.txt @@ -5,7 +5,7 @@ PT:8/8 S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ CARDNAME costs {1} less to cast for each snow land you control. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | ValidCards$ Artifact,Creature | Execute$ TrigTapDown | TriggerDescription$ When CARDNAME enters the battlefield, artifacts and creatures target opponent controls don't untap during that player's next untap step. A:AB$ ChangeZone | Cost$ Return<3/Land.Snow> | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. -SVar:TrigTapDown:DB$ PumpAll | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Artifact,Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigTapDown:DB$ PumpAll | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Artifact,Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:X:Count$Valid Land.Snow+YouCtrl DeckHints:Type$Snow Oracle:This spell costs {1} less to cast for each snow land you control.\nWhen Icebreaker Kraken enters the battlefield, artifacts and creatures target opponent controls don't untap during that player's next untap step.\nReturn three snow lands you control to their owner's hand: Return Icebreaker Kraken to its owner's hand. diff --git a/forge-gui/res/cardsfolder/i/icefall_regent.txt b/forge-gui/res/cardsfolder/i/icefall_regent.txt index 25b5c1db426..44e61d6001f 100644 --- a/forge-gui/res/cardsfolder/i/icefall_regent.txt +++ b/forge-gui/res/cardsfolder/i/icefall_regent.txt @@ -5,7 +5,7 @@ PT:4/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap for as long as you control CARDNAME. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilLoseControlOfHost$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost S:Mode$ RaiseCost | ValidTarget$ Card.Self | Activator$ Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target CARDNAME cost {2} more to cast. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/icefall_regent.jpg diff --git a/forge-gui/res/cardsfolder/i/icy_blast.txt b/forge-gui/res/cardsfolder/i/icy_blast.txt index dfa9b40ce4b..a08b07e81fb 100644 --- a/forge-gui/res/cardsfolder/i/icy_blast.txt +++ b/forge-gui/res/cardsfolder/i/icy_blast.txt @@ -2,6 +2,6 @@ Name:Icy Blast ManaCost:X U Types:Instant A:SP$ Tap | Cost$ X U | ValidTgts$ Creature | TgtPrompt$ Select X target creatures | TargetMin$ X | TargetMax$ X | SubAbility$ DBPump | SpellDescription$ Tap X target creatures. Ferocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps. -SVar:DBPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. | ConditionPresent$ Creature.YouCtrl+powerGE4 | ConditionCompare$ GE1 SVar:X:Count$xPaid Oracle:Tap X target creatures.\nFerocious — If you control a creature with power 4 or greater, those creatures don't untap during their controllers' next untap steps. diff --git a/forge-gui/res/cardsfolder/upcoming/igneous_inspiration.txt b/forge-gui/res/cardsfolder/i/igneous_inspiration.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/igneous_inspiration.txt rename to forge-gui/res/cardsfolder/i/igneous_inspiration.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illuminate_history.txt b/forge-gui/res/cardsfolder/i/illuminate_history.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illuminate_history.txt rename to forge-gui/res/cardsfolder/i/illuminate_history.txt diff --git a/forge-gui/res/cardsfolder/i/illusionists_bracers.txt b/forge-gui/res/cardsfolder/i/illusionists_bracers.txt index 7be98b5b050..cfd2f8e5fc3 100644 --- a/forge-gui/res/cardsfolder/i/illusionists_bracers.txt +++ b/forge-gui/res/cardsfolder/i/illusionists_bracers.txt @@ -2,6 +2,6 @@ Name:Illusionist's Bracers ManaCost:2 Types:Artifact Equipment K:Equip:3 -T:Mode$ AbilityCast | ValidCard$ Creature.EquippedBy | TriggerZones$ Battlefield | Execute$ TrigCopyAbility | OptionalDecider$ You | TriggerDescription$ Whenever an ability of equipped creature is activated, if it isn't a mana ability, copy that ability. You may choose new targets for the copy. +T:Mode$ AbilityCast | ValidCard$ Creature.EquippedBy+inRealZoneBattlefield | TriggerZones$ Battlefield | Execute$ TrigCopyAbility | OptionalDecider$ You | TriggerDescription$ Whenever an ability of equipped creature is activated, if it isn't a mana ability, copy that ability. You may choose new targets for the copy. SVar:TrigCopyAbility:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | MayChooseTarget$ True Oracle:Whenever an ability of equipped creature is activated, if it isn't a mana ability, copy that ability. You may choose new targets for the copy.\nEquip {3} diff --git a/forge-gui/res/cardsfolder/upcoming/illustrious_historian.txt b/forge-gui/res/cardsfolder/i/illustrious_historian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/illustrious_historian.txt rename to forge-gui/res/cardsfolder/i/illustrious_historian.txt diff --git a/forge-gui/res/cardsfolder/i/impetuous_devils.txt b/forge-gui/res/cardsfolder/i/impetuous_devils.txt index 09f3a5fe6c0..e55525ccaff 100644 --- a/forge-gui/res/cardsfolder/i/impetuous_devils.txt +++ b/forge-gui/res/cardsfolder/i/impetuous_devils.txt @@ -5,7 +5,7 @@ PT:6/1 K:Haste K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigProvoke | TriggerDescription$ When CARDNAME attacks, up to one target creature defending player controls blocks it this combat if able. -SVar:TrigProvoke:DB$ MustBlock | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.DefenderCtrl | UntilEndOfCombat$ True | TgtPrompt$ Select up to one target creature defending player controls +SVar:TrigProvoke:DB$ MustBlock | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.DefenderCtrl | Duration$ UntilEndOfCombat | TgtPrompt$ Select up to one target creature defending player controls T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. SVar:TrigSac:DB$ Sacrifice | SacValid$ Self SVar:EndOfTurnLeavePlay:True diff --git a/forge-gui/res/cardsfolder/i/impromptu_raid.txt b/forge-gui/res/cardsfolder/i/impromptu_raid.txt index 7b4bc1f5055..fbd6c76a65a 100644 --- a/forge-gui/res/cardsfolder/i/impromptu_raid.txt +++ b/forge-gui/res/cardsfolder/i/impromptu_raid.txt @@ -2,7 +2,7 @@ Name:Impromptu Raid ManaCost:3 RG Types:Enchantment A:AB$ Dig | Cost$ 2 RG | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Creature | DestinationZone$ Battlefield | DestinationZone2$ Graveyard | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Reveal the top card of your library. If it isn't a creature card, put it into your graveyard. Otherwise, put that card onto the battlefield. That creature gains haste. Sacrifice it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/impromptu_raid.jpg diff --git a/forge-gui/res/cardsfolder/i/inaction_injunction.txt b/forge-gui/res/cardsfolder/i/inaction_injunction.txt index e459f4e1406..eabb1ecca76 100644 --- a/forge-gui/res/cardsfolder/i/inaction_injunction.txt +++ b/forge-gui/res/cardsfolder/i/inaction_injunction.txt @@ -1,7 +1,7 @@ Name:Inaction Injunction ManaCost:1 U Types:Sorcery -A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | SubAbility$ DBDraw | SpellDescription$ Detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) +A:SP$ Pump | Cost$ 1 U | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | SubAbility$ DBDraw | SpellDescription$ Detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. SVar:Picture:http://www.wizards.com/global/images/magic/general/inaction_injunction.jpg Oracle:Detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.)\nDraw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/incarnation_technique.txt b/forge-gui/res/cardsfolder/i/incarnation_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/incarnation_technique.txt rename to forge-gui/res/cardsfolder/i/incarnation_technique.txt diff --git a/forge-gui/res/cardsfolder/i/infernal_denizen.txt b/forge-gui/res/cardsfolder/i/infernal_denizen.txt index 1759c1fa9c4..664e147ca8c 100644 --- a/forge-gui/res/cardsfolder/i/infernal_denizen.txt +++ b/forge-gui/res/cardsfolder/i/infernal_denizen.txt @@ -6,7 +6,7 @@ T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigSacrificeSwamp | SVar:TrigSacrificeSwamp:DB$ Sacrifice | Defined$ You | Amount$ 2 | SacValid$ Swamp | RememberSacrificed$ True | SubAbility$ DBTap SVar:DBTap:DB$ Tap | Defined$ Self | ConditionDefined$ Remembered | ConditionPresent$ Swamp | ConditionCompare$ LE1 | SubAbility$ DBChooseOpponent SVar:DBChooseOpponent:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | ChoiceTitle$ Choose an opponent: | AILogic$ Random | ConditionDefined$ Remembered | ConditionPresent$ Swamp | ConditionCompare$ LE1 | SubAbility$ DBChooseCreature -SVar:DBChooseCreature:DB$ ChooseCard | Optional$ Yes | Defined$ Player.Chosen | Choices$ Creature.YouCtrl | ChoiceTitle$ Choose a creature you want to control: | AILogic$ BestCard | ConditionDefined$ Remembered | ConditionPresent$ Swamp | ConditionCompare$ LE1 | SubAbility$ DBOpponentGainControl +SVar:DBChooseCreature:DB$ ChooseCard | Defined$ Player.Chosen | Choices$ Creature.YouCtrl | ChoiceTitle$ Choose a creature you want to control: | AILogic$ BestCard | ConditionDefined$ Remembered | ConditionPresent$ Swamp | ConditionCompare$ LE1 | SubAbility$ DBOpponentGainControl SVar:DBOpponentGainControl:DB$ GainControl | Defined$ ChosenCard | NewController$ Player.Chosen | LoseControl$ LeavesPlay | ConditionDefined$ Remembered | ConditionPresent$ Swamp | ConditionCompare$ LE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenPlayer$ True | ClearChosenCard$ True A:AB$ GainControl | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature. | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/inferno_project.txt b/forge-gui/res/cardsfolder/i/inferno_project.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/inferno_project.txt rename to forge-gui/res/cardsfolder/i/inferno_project.txt diff --git a/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt new file mode 100644 index 00000000000..888f37d3bb2 --- /dev/null +++ b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt @@ -0,0 +1,10 @@ +Name:Infuse with Vitality +ManaCost:B G +Types:Instant +A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | StackDescription$ Until end of turn, {c:Targeted} gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Triggers$ DiesTrigger | Defined$ ParentTarget | SubAbility$ DBGainLife | StackDescription$ None +SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +DeckHas:Ability$LifeGain +Oracle:Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control."\nYou gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/ingenious_mastery.txt b/forge-gui/res/cardsfolder/i/ingenious_mastery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ingenious_mastery.txt rename to forge-gui/res/cardsfolder/i/ingenious_mastery.txt diff --git a/forge-gui/res/cardsfolder/upcoming/inkling_summoning.txt b/forge-gui/res/cardsfolder/i/inkling_summoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/inkling_summoning.txt rename to forge-gui/res/cardsfolder/i/inkling_summoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/inkshield.txt b/forge-gui/res/cardsfolder/i/inkshield.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/inkshield.txt rename to forge-gui/res/cardsfolder/i/inkshield.txt diff --git a/forge-gui/res/cardsfolder/upcoming/inspiring_refrain.txt b/forge-gui/res/cardsfolder/i/inspiring_refrain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/inspiring_refrain.txt rename to forge-gui/res/cardsfolder/i/inspiring_refrain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/introduction_to_annihilation.txt b/forge-gui/res/cardsfolder/i/introduction_to_annihilation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/introduction_to_annihilation.txt rename to forge-gui/res/cardsfolder/i/introduction_to_annihilation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/introduction_to_prophecy.txt b/forge-gui/res/cardsfolder/i/introduction_to_prophecy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/introduction_to_prophecy.txt rename to forge-gui/res/cardsfolder/i/introduction_to_prophecy.txt diff --git a/forge-gui/res/cardsfolder/i/invasive_surgery.txt b/forge-gui/res/cardsfolder/i/invasive_surgery.txt index 0a7974545e5..6b1a6ff270c 100644 --- a/forge-gui/res/cardsfolder/i/invasive_surgery.txt +++ b/forge-gui/res/cardsfolder/i/invasive_surgery.txt @@ -1,11 +1,10 @@ Name:Invasive Surgery ManaCost:U Types:Instant -A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Sorcery | RememberCountered$ True | SubAbility$ ExileYard | SpellDescription$ Counter target sorcery spell. Delirium — If there are four or more card types amongst cards in your graveyard, search the graveyard, hand, and library of that spell's controller for cards with the same name as that spell, exile those cards, then that player shuffles their library. -SVar:ExileYard:DB$ ChangeZone | Condition$ Delirium | Origin$ Graveyard | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInYard | Chooser$ You | Hidden$ True | SubAbility$ ExileHand | StackDescription$ None -SVar:ExileHand:DB$ ChangeZone | Condition$ Delirium | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None -SVar:ExileLib:DB$ ChangeZone | Condition$ Delirium | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInLib | Chooser$ You | Shuffle$ True | StackDescription$ None | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ Counter | Cost$ U | TargetType$ Spell | ValidTgts$ Sorcery | SubAbility$ ExileYard | SpellDescription$ Counter target sorcery spell. Delirium — If there are four or more card types amongst cards in your graveyard, search the graveyard, hand, and library of that spell's controller for cards with the same name as that spell, exile those cards, then that player shuffles their library. +SVar:ExileYard:DB$ ChangeZone | Condition$ Delirium | Origin$ Graveyard | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInYard | Chooser$ You | Hidden$ True | SubAbility$ ExileHand | StackDescription$ None +SVar:ExileHand:DB$ ChangeZone | Condition$ Delirium | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None +SVar:ExileLib:DB$ ChangeZone | Condition$ Delirium | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInLib | Chooser$ You | Shuffle$ True | StackDescription$ None SVar:NumInLib:TargetedController$CardsInLibrary SVar:NumInHand:TargetedController$CardsInHand SVar:NumInYard:TargetedController$CardsInGraveyard diff --git a/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt b/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt index 3d78b06c9bc..4e9c0ddbf11 100644 --- a/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt +++ b/forge-gui/res/cardsfolder/i/iron_heart_chimera.txt @@ -4,7 +4,7 @@ Types:Artifact Creature Chimera PT:2/2 K:Vigilance A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) -SVar:DBPump:DB$ Pump | KW$ Vigilance | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ Vigilance | Defined$ Targeted | Duration$ Permanent #TODO: Ensure that the AI actually uses the ability, and uses it smartly enough (ditto for other similar Chimera creatures). AI:RemoveDeck:All Oracle:Vigilance\nSacrifice Iron-Heart Chimera: Put a +2/+2 counter on target Chimera creature. It gains vigilance. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/i/ironclaw_buzzardiers.txt b/forge-gui/res/cardsfolder/i/ironclaw_buzzardiers.txt index 52eefa71688..446b0ed93c2 100644 --- a/forge-gui/res/cardsfolder/i/ironclaw_buzzardiers.txt +++ b/forge-gui/res/cardsfolder/i/ironclaw_buzzardiers.txt @@ -2,7 +2,6 @@ Name:Ironclaw Buzzardiers ManaCost:2 R Types:Creature Orc Scout PT:2/2 -K:CantBlock Creature.powerGE2:creatures with power 2 or greater +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or greater. A:AB$ Pump | Cost$ R | Defined$ Self | KW$ Flying | SpellDescription$ CARDNAME gains flying until end of turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_buzzardiers.jpg Oracle:Ironclaw Buzzardiers can't block creatures with power 2 or greater.\n{R}: Ironclaw Buzzardiers gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/i/ironclaw_curse.txt b/forge-gui/res/cardsfolder/i/ironclaw_curse.txt index 2cace3f73eb..48b068bc681 100644 --- a/forge-gui/res/cardsfolder/i/ironclaw_curse.txt +++ b/forge-gui/res/cardsfolder/i/ironclaw_curse.txt @@ -3,7 +3,7 @@ ManaCost:R Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ R | ValidTgts$ Creature | AILogic$ Curse -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddToughness$ -1 | AddHiddenKeyword$ CantBlock Creature.powerGEIronclawX:creatures with power equal to or greater than the enchanted creature's toughness | AddSVar$ IronclawX | Description$ Enchanted creature gets -0/-1 and can't block creatures with power equal to or greater than the enchanted creature's toughness. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddToughness$ -1 | Description$ Enchanted creature gets -0/-1 and can't block creatures with power equal to or greater than the enchanted creature's toughness. +S:Mode$ CantBlockBy | ValidAttackerRelative$ Creature.powerGEIronclawX | ValidBlocker$ Creature.EnchantedBy | Description$ Enchanted creature can't block creatures with power equal to or greater than the enchanted creature's toughness. SVar:IronclawX:Count$CardToughness -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_curse.jpg Oracle:Enchant creature\nEnchanted creature gets -0/-1.\nEnchanted creature can't block creatures with power equal to or greater than the enchanted creature's toughness. diff --git a/forge-gui/res/cardsfolder/i/ironclaw_orcs.txt b/forge-gui/res/cardsfolder/i/ironclaw_orcs.txt index ce6ce9807ff..18522be5057 100644 --- a/forge-gui/res/cardsfolder/i/ironclaw_orcs.txt +++ b/forge-gui/res/cardsfolder/i/ironclaw_orcs.txt @@ -2,6 +2,5 @@ Name:Ironclaw Orcs ManaCost:1 R Types:Creature Orc PT:2/2 -K:CantBlock Creature.powerGE2:creatures with power 2 or greater -SVar:Picture:http://www.wizards.com/global/images/magic/general/ironclaw_orcs.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or greater. Oracle:Ironclaw Orcs can't block creatures with power 2 or greater. diff --git a/forge-gui/res/cardsfolder/i/ironscale_hydra.txt b/forge-gui/res/cardsfolder/i/ironscale_hydra.txt index 3afe1ec2196..e550ae82491 100644 --- a/forge-gui/res/cardsfolder/i/ironscale_hydra.txt +++ b/forge-gui/res/cardsfolder/i/ironscale_hydra.txt @@ -2,7 +2,7 @@ Name:Ironscale Hydra ManaCost:3 G G Types:Creature Hydra PT:5/5 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ Counters | Description$ If a creature would deal combat damage to CARDNAME, prevent that damage and put a +1/+1 counter on CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ValidSource$ Creature | IsCombat$ True | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | ExecuteMode$ PerSource | Description$ If a creature would deal combat damage to CARDNAME, prevent that damage and put a +1/+1 counter on CARDNAME. SVar:Counters:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters Oracle:If a creature would deal combat damage to Ironscale Hydra, prevent that damage and put a +1/+1 counter on Ironscale Hydra. diff --git a/forge-gui/res/cardsfolder/i/isolation_zone.txt b/forge-gui/res/cardsfolder/i/isolation_zone.txt index dbb2ca72103..f13a5260faa 100644 --- a/forge-gui/res/cardsfolder/i/isolation_zone.txt +++ b/forge-gui/res/cardsfolder/i/isolation_zone.txt @@ -2,7 +2,7 @@ Name:Isolation Zone ManaCost:2 W W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature or enchantment an opponent controls until CARDNAME leaves the battlefield. (That permanent returns under its owner's control.) -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl,Enchantment.OppCtrl | TgtPrompt$ Select target creature or enchantment an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl,Enchantment.OppCtrl | TgtPrompt$ Select target creature or enchantment an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:When Isolation Zone enters the battlefield, exile target creature or enchantment an opponent controls until Isolation Zone leaves the battlefield. (That permanent returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/i/isperias_skywatch.txt b/forge-gui/res/cardsfolder/i/isperias_skywatch.txt index cddecc49222..f7234690a97 100644 --- a/forge-gui/res/cardsfolder/i/isperias_skywatch.txt +++ b/forge-gui/res/cardsfolder/i/isperias_skywatch.txt @@ -4,7 +4,7 @@ Types:Creature Vedalken Knight PT:3/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) -SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/isperias_skywatch.jpg Oracle:Flying\nWhen Isperia's Skywatch enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/j/jace_vryns_prodigy_jace_telepath_unbound.txt b/forge-gui/res/cardsfolder/j/jace_vryns_prodigy_jace_telepath_unbound.txt index 136f6353d25..e97f88b3d25 100644 --- a/forge-gui/res/cardsfolder/j/jace_vryns_prodigy_jace_telepath_unbound.txt +++ b/forge-gui/res/cardsfolder/j/jace_vryns_prodigy_jace_telepath_unbound.txt @@ -19,7 +19,7 @@ ManaCost:no cost Colors:blue Types:Legendary Planeswalker Jace Loyalty:5 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | IsCurse$ True | UntilYourNextTurn$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Up to one target creature gets -2/-0 until your next turn. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | IsCurse$ True | Duration$ UntilYourNextTurn | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Up to one target creature gets -2/-0 until your next turn. A:AB$ Effect | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | AILogic$ CastFromGraveThisTurn | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | TgtZone$ Graveyard | TgtPrompt$ Select target instant or sorcery card | RememberObjects$ Targeted | StaticAbilities$ Play | ExileOnMoved$ Graveyard | SubAbility$ DBEffect | SpellDescription$ You may cast target instant or sorcery card from your graveyard this turn. If that spell would be put into your graveyard this turn, exile it instead. SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Graveyard | Description$ You may play remembered card. SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | ExileOnMoved$ Stack | ReplacementEffects$ ReplaceGraveyard diff --git a/forge-gui/res/cardsfolder/j/jade_monolith.txt b/forge-gui/res/cardsfolder/j/jade_monolith.txt index ab49b4f9f2c..f97cffd98c3 100644 --- a/forge-gui/res/cardsfolder/j/jade_monolith.txt +++ b/forge-gui/res/cardsfolder/j/jade_monolith.txt @@ -2,7 +2,7 @@ Name:Jade Monolith ManaCost:4 Types:Artifact A:AB$ ChooseSource | Cost$ 1 | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to you instead. -SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ You | Description$ The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to you instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ You | VarType$ Player | SubAbility$ ExileEffect #Zone Change for the source of your choice diff --git a/forge-gui/res/cardsfolder/j/jade_statue.txt b/forge-gui/res/cardsfolder/j/jade_statue.txt index 2fcd784ea43..3d1c471bf14 100644 --- a/forge-gui/res/cardsfolder/j/jade_statue.txt +++ b/forge-gui/res/cardsfolder/j/jade_statue.txt @@ -1,6 +1,6 @@ Name:Jade Statue ManaCost:4 Types:Artifact -A:AB$ Animate | Cost$ 2 | Defined$ Self | Power$ 3 | Toughness$ 6 | Types$ Creature,Artifact,Golem | UntilEndOfCombat$ True | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ CARDNAME becomes a 3/6 Golem artifact creature until end of combat. Activate only during combat. +A:AB$ Animate | Cost$ 2 | Defined$ Self | Power$ 3 | Toughness$ 6 | Types$ Creature,Artifact,Golem | Duration$ UntilEndOfCombat | ActivationPhases$ BeginCombat->EndCombat | SpellDescription$ CARDNAME becomes a 3/6 Golem artifact creature until end of combat. Activate only during combat. SVar:Picture:http://www.wizards.com/global/images/magic/general/jade_statue.jpg Oracle:{2}: Jade Statue becomes a 3/6 Golem artifact creature until end of combat. Activate only during combat. diff --git a/forge-gui/res/cardsfolder/upcoming/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt b/forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt rename to forge-gui/res/cardsfolder/j/jadzi_oracle_of_arcavios_journey_to_the_oracle.txt diff --git a/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt b/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt index 60cd790a8b5..1b1a557688d 100644 --- a/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt +++ b/forge-gui/res/cardsfolder/j/jared_carthalion_true_heir.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMonarch | TriggerDescription$ When CARDNAME enters the battlefield, target opponent becomes the monarch. You can't become the monarch this turn. SVar:TrigMonarch:DB$ BecomeMonarch | ValidTgts$ Opponent | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ You | KW$ You can’t become the monarch this turn. -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | CheckDefinedPlayer$ You.isMonarch | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to NICKNAME while you're the monarch, prevent that damage and put that many +1/+1 counters on it. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | CheckDefinedPlayer$ You.isMonarch | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to NICKNAME while you're the monarch, prevent that damage and put that many +1/+1 counters on it. SVar:Counters:DB$ PutCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ Y SVar:Y:ReplaceCount$DamageAmount DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt b/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt index e658d3a656d..672beaa47b4 100644 --- a/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt +++ b/forge-gui/res/cardsfolder/j/jhoira_of_the_ghitu.txt @@ -3,7 +3,7 @@ ManaCost:1 U R Types:Legendary Creature Human Wizard PT:2/2 A:AB$ PutCounter | Cost$ 2 ExileFromHand<1/Card.nonLand/nonland card> | CostDesc$ {2}, Exile a nonland card from your hand: | RememberCards$ True | Defined$ ExiledCards | CounterType$ TIME | CounterNum$ 4 | SubAbility$ GiveSuspend | TgtZone$ Exile | StackDescription$ Put four time counters on the exiled card. | SpellDescription$ Put four time counters on the exiled card. If it doesn't have suspend, it gains suspend. (At the beginning of your upkeep, remove a time counter from that card. When the last is removed, cast it without paying its mana cost. If it's a creature, it has haste.) -SVar:GiveSuspend:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +SVar:GiveSuspend:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | KW$ Suspend | PumpZone$ Exile | Duration$ Permanent | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/jhoira_of_the_ghitu.jpg diff --git a/forge-gui/res/cardsfolder/j/johan.txt b/forge-gui/res/cardsfolder/j/johan.txt index 996c7df5982..dad735e75e9 100644 --- a/forge-gui/res/cardsfolder/j/johan.txt +++ b/forge-gui/res/cardsfolder/j/johan.txt @@ -3,7 +3,7 @@ ManaCost:3 R G W Types:Legendary Creature Human Wizard PT:5/4 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigCantAttack | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of combat on your turn, you may have CARDNAME gain "CARDNAME can't attack" until end of combat. If you do, attacking doesn't cause creatures you control to tap this combat if CARDNAME is untapped. -SVar:TrigCantAttack:DB$ Pump | Defined$ Self | KW$ CARDNAME can't attack. | UntilEndOfCombat$ True | SubAbility$ DBEffect +SVar:TrigCantAttack:DB$ Pump | Defined$ Self | KW$ CARDNAME can't attack. | Duration$ UntilEndOfCombat | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | StaticAbilities$ STVigilance | ImprintCards$ Self | Duration$ UntilEndOfCombat SVar:STVigilance:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddHiddenKeyword$ Attacking doesn't cause CARDNAME to tap. | CheckSVar$ JohanUntap | Description$ Attacking doesn't cause creatures you control to tap this combat if Johan is untapped. SVar:JohanUntap:Count$Valid Card.IsImprinted+untapped diff --git a/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt b/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt index 26c1b5be828..07b6875bca4 100755 --- a/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt +++ b/forge-gui/res/cardsfolder/j/journey_to_oblivion.txt @@ -3,7 +3,7 @@ ManaCost:4 W Types:Enchantment S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} less to cast for each creature in your party. (Your party consists of up to one each of Cleric, Rogue, Warrior, and Wizard.) T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE SVar:X:Count$Party diff --git a/forge-gui/res/cardsfolder/j/jovens_ferrets.txt b/forge-gui/res/cardsfolder/j/jovens_ferrets.txt index b9eaadbd651..3430ea91677 100644 --- a/forge-gui/res/cardsfolder/j/jovens_ferrets.txt +++ b/forge-gui/res/cardsfolder/j/jovens_ferrets.txt @@ -6,6 +6,6 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ SVar:TrigPump:DB$ Pump | Defined$ Self | NumDef$ 2 T:Mode$ Phase | Phase$ EndCombat | TriggerZones$ Battlefield | Execute$ TrigTapAll | TriggerDescription$ At end of combat, tap all creatures that blocked CARDNAME this turn. They don't untap during their controller's next untap step. SVar:TrigTapAll:DB$ TapAll | ValidCards$ Creature.blockedSource | SubAbility$ TrigPump2 -SVar:TrigPump2:DB$ PumpAll | ValidCards$ Creature.blockedSource | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump2:DB$ PumpAll | ValidCards$ Creature.blockedSource | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/jovens_ferrets.jpg Oracle:Whenever Joven's Ferrets attacks, it gets +0/+2 until end of turn.\nAt end of combat, tap all creatures that blocked Joven's Ferrets this turn. They don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/j/juggernaut.txt b/forge-gui/res/cardsfolder/j/juggernaut.txt index 8e742cd292f..1044abe37f9 100644 --- a/forge-gui/res/cardsfolder/j/juggernaut.txt +++ b/forge-gui/res/cardsfolder/j/juggernaut.txt @@ -3,6 +3,5 @@ ManaCost:4 Types:Artifact Creature Juggernaut PT:5/3 K:CARDNAME attacks each combat if able. -K:CantBeBlockedBy Creature.Wall -SVar:Picture:http://www.wizards.com/global/images/magic/general/juggernaut.jpg -Oracle:Juggernaut attacks each combat if able.\nJuggernaut can't be blocked by Walls. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Wall | Description$ CARDNAME can't be blocked by Walls. +Oracle:Juggernaut attacks each combat if able.\nJuggernaut can't be blocked by Walls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/j/jund.txt b/forge-gui/res/cardsfolder/j/jund.txt index 25dc4e695c4..0d85f07c30a 100644 --- a/forge-gui/res/cardsfolder/j/jund.txt +++ b/forge-gui/res/cardsfolder/j/jund.txt @@ -2,7 +2,7 @@ Name:Jund ManaCost:no cost Types:Plane Alara T:Mode$ SpellCast | ValidCard$ Creature.Black,Creature.Red,Creature.Green | ValidActivatingPlayer$ Player | TriggerZones$ Command | Execute$ DevourPump | TriggerDescription$ Whenever a player casts a black, red, or green creature spell, it gains devour 5. (As the creature enters the battlefield, its controller may sacrifice any number of creatures. The creature enters the battlefield with five times that many +1/+1 counters on it.) -SVar:DevourPump:DB$ Animate | Defined$ TriggeredCard | Keywords$ Devour:5 | Permanent$ True +SVar:DevourPump:DB$ Animate | Defined$ TriggeredCard | Keywords$ Devour:5 | Duration$ Permanent T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, create two 1/1 red Goblin creature tokens. SVar:RolledChaos:DB$ Token | TokenAmount$ 2 | TokenScript$ r_1_1_goblin | LegacyImage$ r 1 1 goblin pc2 | TokenOwner$ You SVar:Picture:http://www.wizards.com/global/images/magic/general/jund.jpg diff --git a/forge-gui/res/cardsfolder/k/kardurs_vicious_return.txt b/forge-gui/res/cardsfolder/k/kardurs_vicious_return.txt index 4e940ef74bb..d05827d79da 100644 --- a/forge-gui/res/cardsfolder/k/kardurs_vicious_return.txt +++ b/forge-gui/res/cardsfolder/k/kardurs_vicious_return.txt @@ -7,7 +7,7 @@ SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | T SVar:DBDiscard:DB$ Discard | Defined$ Player | NumCards$ 1 | Mode$ TgtChoose | SpellDescription$ Each player discards a card. SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | RememberChanged$ True | SubAbility$ DBPutCounter | SpellDescription$ Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. It gains haste until your next turn. SVar:DBPutCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ 1 | Defined$ Remembered | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | UntilYourNextTurn$ True | SubAbility$ DBCleanup +SVar:DBPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ UntilYourNextTurn | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Counters Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — You may sacrifice a creature. When you do, Kardur's Vicious Return deals 3 damage to any target.\nII — Each player discards a card.\nIII — Return target creature card from your graveyard to the battlefield. Put a +1/+1 counter on it. It gains haste until your next turn. diff --git a/forge-gui/res/cardsfolder/k/kargan_intimidator.txt b/forge-gui/res/cardsfolder/k/kargan_intimidator.txt index 44838f413c7..a164ce41778 100755 --- a/forge-gui/res/cardsfolder/k/kargan_intimidator.txt +++ b/forge-gui/res/cardsfolder/k/kargan_intimidator.txt @@ -2,11 +2,11 @@ Name:Kargan Intimidator ManaCost:1 R Types:Creature Human Warrior PT:3/1 -S:Mode$ Continuous | Affected$ Creature.Coward | AddHiddenKeyword$ CantBlock Creature.Warrior:Warriors | Description$ Cowards can't block Warriors. -SVar:PlayMain1:TRUE +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Warrior | ValidBlocker$ Creature.Coward | Description$ Cowards can't block Warriors. A:AB$ Charm | Cost$ 1 | Choices$ Pump,Coward,Trample | ChoiceRestriction$ ThisTurn | CharmNum$ 1 SVar:Pump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | SpellDescription$ CARDNAME gets +1/+1 until end of turn. SVar:Coward:DB$ Animate | ValidTgts$ Creature | TgtPrompt$ Select target creature | Types$ Coward | RemoveCreatureTypes$ True | SpellDescription$ Target creature becomes a Coward until end of turn. SVar:Trample:DB$ Pump | ValidTgts$ Warrior | TgtPrompt$ Select target Warrior | KW$ Trample | SpellDescription$ Target Warrior gains trample until end of turn. DeckHints:Type$Warrior +SVar:PlayMain1:TRUE Oracle:Cowards can't block Warriors.\n{1}: Choose one that hasn't been chosen this turn —\n• Kargan Intimidator gets +1/+1 until end of turn.\n• Target creature becomes a Coward until end of turn.\n• Target Warrior gains trample until end of 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 00dbb72d90a..0e85694be1b 100644 --- a/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt +++ b/forge-gui/res/cardsfolder/k/karn_the_great_creator.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Karn Loyalty:5 S:Mode$ Continuous | Affected$ Artifact.OppCtrl | AddHiddenKeyword$ CARDNAME's activated abilities can't be activated. | Description$ Activated abilities of artifacts your opponents control can't be activated. 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 | UntilYourNextTurn$ True | AILogic$ PTByCMC | SpellDescription$ Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value. +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 | Duration$ UntilYourNextTurn | AILogic$ PTByCMC | SpellDescription$ Until your next turn, up to one target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value. SVar:X:Targeted$CardManaCost 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 choose a face-up artifact card you own in exile. Put that card into your hand. AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/upcoming/karok_wrangler.txt b/forge-gui/res/cardsfolder/k/karok_wrangler.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/karok_wrangler.txt rename to forge-gui/res/cardsfolder/k/karok_wrangler.txt diff --git a/forge-gui/res/cardsfolder/k/karonas_zealot.txt b/forge-gui/res/cardsfolder/k/karonas_zealot.txt index 614369105ad..e74e21c9573 100644 --- a/forge-gui/res/cardsfolder/k/karonas_zealot.txt +++ b/forge-gui/res/cardsfolder/k/karonas_zealot.txt @@ -4,7 +4,7 @@ Types:Creature Human Cleric PT:2/5 K:Morph:3 W W T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ KaronaEffect | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, all damage that would be dealt to it this turn is dealt to target creature instead. -SVar:KaronaEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ ZealotDamage | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield +SVar:KaronaEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ ZealotDamage | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield SVar:ZealotDamage:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ MirrorStrikeDmg | DamageTarget$ Remembered | Description$ All damage that would be dealt to Karona's Zealot this turn is dealt to target creature instead. SVar:MirrorStrikeDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/k/kashi_tribe_elite.txt b/forge-gui/res/cardsfolder/k/kashi_tribe_elite.txt index d69884876fa..f1c41d27477 100644 --- a/forge-gui/res/cardsfolder/k/kashi_tribe_elite.txt +++ b/forge-gui/res/cardsfolder/k/kashi_tribe_elite.txt @@ -5,6 +5,6 @@ PT:2/3 S:Mode$ Continuous | Affected$ Snake.Legendary+YouCtrl | AddKeyword$ Shroud | Description$ Legendary Snakes you control have shroud. (They can't be the targets of spells or abilities.) T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:Legendary Snakes you control have shroud. (They can't be the targets of spells or abilities.)\nWhenever Kashi-Tribe Elite deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/k/kashi_tribe_reaver.txt b/forge-gui/res/cardsfolder/k/kashi_tribe_reaver.txt index 79edd6ec96f..7059d5ef2bb 100644 --- a/forge-gui/res/cardsfolder/k/kashi_tribe_reaver.txt +++ b/forge-gui/res/cardsfolder/k/kashi_tribe_reaver.txt @@ -4,7 +4,7 @@ Types:Creature Snake Warrior PT:3/2 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True A:AB$ Regenerate | Cost$ 1 G | SpellDescription$ Regenerate CARDNAME. SVar:HasCombatEffect:TRUE Oracle:Whenever Kashi-Tribe Reaver deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step.\n{1}{G}: Regenerate Kashi-Tribe Reaver. diff --git a/forge-gui/res/cardsfolder/k/kashi_tribe_warriors.txt b/forge-gui/res/cardsfolder/k/kashi_tribe_warriors.txt index ae82bcf92b5..b17f234a643 100644 --- a/forge-gui/res/cardsfolder/k/kashi_tribe_warriors.txt +++ b/forge-gui/res/cardsfolder/k/kashi_tribe_warriors.txt @@ -4,6 +4,6 @@ Types:Creature Snake Warrior PT:2/4 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:Whenever Kashi-Tribe Warriors deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/kasmina_enigma_sage.txt b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt similarity index 78% rename from forge-gui/res/cardsfolder/upcoming/kasmina_enigma_sage.txt rename to forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt index 1b8959c4f54..17c60b9b9ec 100644 --- a/forge-gui/res/cardsfolder/upcoming/kasmina_enigma_sage.txt +++ b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt @@ -8,7 +8,7 @@ A:AB$ Token | Cost$ SubCounter | Planeswalker$ True | TokenScript$ gu SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. +A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup DeckHints:Type$Instant|Sorcery DeckHas:Ability$Token & Ability$Counters diff --git a/forge-gui/res/cardsfolder/k/kavu_titan.txt b/forge-gui/res/cardsfolder/k/kavu_titan.txt index 09d9cd2bd75..9c24d77bfe8 100644 --- a/forge-gui/res/cardsfolder/k/kavu_titan.txt +++ b/forge-gui/res/cardsfolder/k/kavu_titan.txt @@ -5,7 +5,7 @@ PT:2/2 K:Kicker:2 G K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ Dustwalk | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. -SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True +SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Duration$ Permanent DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_titan.jpg Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nIf Kavu Titan was kicked, it enters the battlefield with three +1/+1 counters on it and with trample. diff --git a/forge-gui/res/cardsfolder/k/kaya_the_inexorable.txt b/forge-gui/res/cardsfolder/k/kaya_the_inexorable.txt index 2691465d73b..2a5978f8121 100644 --- a/forge-gui/res/cardsfolder/k/kaya_the_inexorable.txt +++ b/forge-gui/res/cardsfolder/k/kaya_the_inexorable.txt @@ -3,7 +3,7 @@ ManaCost:3 W B Types:Legendary Planeswalker Kaya Loyalty:5 A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.nonToken | AITgts$ Creature.nonToken+YouCtrl | TgtPrompt$ Select target nontoken creature | TargetMin$ 0 | TargetMax$ 1 | CounterType$ GHOSTFORM | CounterNum$ 1 | SubAbility$ DBAnimate | SpellDescription$ Put a ghostform counter on up to one target nontoken creature. It gains "When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying." -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Permanent$ True | Triggers$ TrigDieExile | StackDescription$ {c:Targeted} gains "When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying." +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Duration$ Permanent | Triggers$ TrigDieExile | StackDescription$ {c:Targeted} gains "When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying." SVar:TrigDieExile:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard,Exile | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When this creature dies or is put into exile, return it to its owner's hand and create a 1/1 white Spirit creature token with flying. SVar:TrigReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ All | Destination$ Hand | SubAbility$ DBToken SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_spirit_flying | TokenOwner$ TriggeredCardController diff --git a/forge-gui/res/cardsfolder/k/kayas_guile.txt b/forge-gui/res/cardsfolder/k/kayas_guile.txt index 99903d4f490..b5d38cbee85 100644 --- a/forge-gui/res/cardsfolder/k/kayas_guile.txt +++ b/forge-gui/res/cardsfolder/k/kayas_guile.txt @@ -4,7 +4,7 @@ ManaCost:1 W B K:Entwine:3 A:SP$ Charm | Cost$ 1 W B | Choices$ DBSac,DBExile,DBSpirit,DBGain | CharmNum$ 2 SVar:DBSac:DB$ Sacrifice | Defined$ Player.Opponent | SacValid$ Creature | SacMessage$ creature | SpellDescription$ Each opponent sacrifices a creature. -SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card.OppCtrl | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all cards from each opponent's graveyard. +SVar:DBExile:DB$ ChangeZoneAll | ChangeType$ Card.OppOwn | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all cards from each opponent's graveyard. SVar:DBSpirit:DB$Token | TokenAmount$ 1 | TokenScript$ wb_1_1_spirit_flying | TokenOwner$ You | LegacyImage$ wb 1 1 spirit mh1 | SpellDescription$ Create a 1/1 white and black Spirit creature token with flying. SVar:DBGain:DB$ GainLife | LifeAmount$ 4 | SpellDescription$ You gain 4 life. DeckHas:Ability$Token & Ability$LifeGain diff --git a/forge-gui/res/cardsfolder/upcoming/keen_duelist.txt b/forge-gui/res/cardsfolder/k/keen_duelist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/keen_duelist.txt rename to forge-gui/res/cardsfolder/k/keen_duelist.txt diff --git a/forge-gui/res/cardsfolder/k/kefnet_the_mindful.txt b/forge-gui/res/cardsfolder/k/kefnet_the_mindful.txt index bc1c1ca861b..9f745e1191e 100644 --- a/forge-gui/res/cardsfolder/k/kefnet_the_mindful.txt +++ b/forge-gui/res/cardsfolder/k/kefnet_the_mindful.txt @@ -7,7 +7,7 @@ K:Indestructible S:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME can't attack or block. | CheckSVar$ X | SVarCompare$ LE6 | Description$ CARDNAME can't attack or block unless you have seven or more cards in hand. SVar:X:Count$InYourHand A:AB$ Draw | Cost$ 3 U | NumCards$ 1 | Defined$ You | SubAbility$ DBChooseCard | SpellDescription$ Draw a card, then you may return a land you control to its owner's hand. -SVar:DBChooseCard:DB$ ChooseCard | Choices$ Land.YouCtrl | Optional$ Yes | ChoiceZone$ Battlefield | Amount$ 1 | SubAbility$ DBChangeZone +SVar:DBChooseCard:DB$ ChooseCard | Choices$ Land.YouCtrl | ChoiceZone$ Battlefield | Amount$ 1 | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/kefnet_the_mindful.jpg diff --git a/forge-gui/res/cardsfolder/k/kefnets_monument.txt b/forge-gui/res/cardsfolder/k/kefnets_monument.txt index 619c91fca73..33f7c2712fb 100644 --- a/forge-gui/res/cardsfolder/k/kefnets_monument.txt +++ b/forge-gui/res/cardsfolder/k/kefnets_monument.txt @@ -3,6 +3,6 @@ ManaCost:3 Types:Legendary Artifact S:Mode$ ReduceCost | ValidCard$ Creature.Blue | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Blue creature spells you cast cost {1} less to cast. T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, target creature an opponent controls doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent DeckNeeds:Color$Blue Oracle:Blue creature spells you cast cost {1} less to cast.\nWhenever you cast a creature spell, target creature an opponent controls doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt b/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt index 02e4b9e2fec..3cb6e82cbce 100644 --- a/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt +++ b/forge-gui/res/cardsfolder/k/keldon_battlewagon.txt @@ -6,10 +6,9 @@ K:Trample K:CARDNAME can't block. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ When CARDNAME attacks, sacrifice it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$Sacrifice | Defined$ Self +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True A:AB$ Pump | Cost$ tapXType<1/Creature> | NumAtt$ +X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the power of the creature tapped this way. SVar:X:Tapped$CardPower AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/keldon_battlewagon.jpg Oracle:Trample\nKeldon Battlewagon can't block.\nWhen Keldon Battlewagon attacks, sacrifice it at end of combat.\nTap an untapped creature you control: Keldon Battlewagon gets +X/+0 until end of turn, where X is the power of the creature tapped this way. diff --git a/forge-gui/res/cardsfolder/upcoming/kelpie_guide.txt b/forge-gui/res/cardsfolder/k/kelpie_guide.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/kelpie_guide.txt rename to forge-gui/res/cardsfolder/k/kelpie_guide.txt diff --git a/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt b/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt index 3bf8a695b61..c1c2e37efd2 100644 --- a/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt +++ b/forge-gui/res/cardsfolder/k/kheru_lich_lord.txt @@ -4,7 +4,7 @@ Types:Creature Zombie Wizard PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChangZone | TriggerDescription$ At the beginning of your upkeep, you may pay {2}{B}. If you do, return a creature card at random from your graveyard to the battlefield. It gains flying, trample, and haste. Exile that card at the beginning of your next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. SVar:TrigChangZone:AB$ ChangeZone | Cost$ 2 B | ChangeType$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | Hidden$ True | Mandatory$ True | AtRandom$ True | RememberChanged$ True | SubAbility$ DBUnearthed -SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | Keywords$ Flying & Trample & Haste | LeaveBattlefield$ Exile | sVars$ KheruMustAttack | Permanent$ True | SubAbility$ DBCleanup | AtEOT$ Exile | StackDescription$ It gains flying, trample, and haste. Exile that card at the beginning of your next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. +SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | Keywords$ Flying & Trample & Haste | LeaveBattlefield$ Exile | sVars$ KheruMustAttack | Duration$ Permanent | SubAbility$ DBCleanup | AtEOT$ Exile | StackDescription$ It gains flying, trample, and haste. Exile that card at the beginning of your next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. SVar:KheruMustAttack:SVar:MustAttack:True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/upcoming/killian_ink_duelist.txt b/forge-gui/res/cardsfolder/k/killian_ink_duelist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/killian_ink_duelist.txt rename to forge-gui/res/cardsfolder/k/killian_ink_duelist.txt diff --git a/forge-gui/res/cardsfolder/k/kiora_bests_the_sea_god.txt b/forge-gui/res/cardsfolder/k/kiora_bests_the_sea_god.txt index 4272d469f55..580f2a82a43 100644 --- a/forge-gui/res/cardsfolder/k/kiora_bests_the_sea_god.txt +++ b/forge-gui/res/cardsfolder/k/kiora_bests_the_sea_god.txt @@ -4,7 +4,7 @@ Types:Enchantment Saga K:Saga:3:TrigToken,TrigTap,TrigGainControl SVar:TrigToken:DB$ Token | TokenScript$ u_8_8_kraken_hexproof | SpellDescription$ Create an 8/8 blue Kraken creature token with hexproof. SVar:TrigTap:DB$ TapAll | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ValidCards$ Permanent.nonLand | SubAbility$ DBPumpAll | SpellDescription$ Tap all nonland permanents target opponent controls. They don't untap during their controllers' next untap step. -SVar:DBPumpAll:DB$ PumpAll | Defined$ Targeted | ValidCards$ Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPumpAll:DB$ PumpAll | Defined$ Targeted | ValidCards$ Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:TrigGainControl:DB$ GainControl | TgtPrompt$ Choose target creature | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | SubAbility$ DBUntap | SpellDescription$ Gain control of target permanent an opponent controls. Untap it. SVar:DBUntap:DB$ Untap | Defined$ Targeted DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/k/kiora_the_crashing_wave.txt b/forge-gui/res/cardsfolder/k/kiora_the_crashing_wave.txt index 5dd6d169c83..e02559889f0 100644 --- a/forge-gui/res/cardsfolder/k/kiora_the_crashing_wave.txt +++ b/forge-gui/res/cardsfolder/k/kiora_the_crashing_wave.txt @@ -2,7 +2,7 @@ Name:Kiora, the Crashing Wave ManaCost:2 G U Types:Legendary Planeswalker Kiora Loyalty:2 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | Planeswalker$ True | KW$ Prevent all damage that would be dealt to and dealt by CARDNAME. | IsCurse$ True | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | Planeswalker$ True | KW$ Prevent all damage that would be dealt to and dealt by CARDNAME. | IsCurse$ True | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls. A:AB$ Draw | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | SubAbility$ DBEffect | SpellDescription$ Draw a card. You may play an additional land this turn. SVar:DBEffect:DB$ Effect | StaticAbilities$ Exploration SVar:Exploration:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | EffectZone$ Command | Description$ You may play an additional land this turn. diff --git a/forge-gui/res/cardsfolder/k/kitesail_freebooter.txt b/forge-gui/res/cardsfolder/k/kitesail_freebooter.txt index 501b915833a..5da95beb316 100644 --- a/forge-gui/res/cardsfolder/k/kitesail_freebooter.txt +++ b/forge-gui/res/cardsfolder/k/kitesail_freebooter.txt @@ -4,6 +4,6 @@ Types:Creature Human Pirate PT:1/2 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand. You choose a noncreature, nonland card from it. Exile that card until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonCreature+nonLand | ChangeNum$ 1 | IsCurse$ True | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | ValidTgts$ Opponent | DefinedPlayer$ Targeted | Chooser$ You | TgtPrompt$ Select target opponent | ChangeType$ Card.nonCreature+nonLand | ChangeNum$ 1 | IsCurse$ True | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:Flying\nWhen Kitesail Freebooter enters the battlefield, target opponent reveals their hand. You choose a noncreature, nonland card from it. Exile that card until Kitesail Freebooter leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/k/kor_castigator.txt b/forge-gui/res/cardsfolder/k/kor_castigator.txt index 8c9554a1602..8264dd3907c 100644 --- a/forge-gui/res/cardsfolder/k/kor_castigator.txt +++ b/forge-gui/res/cardsfolder/k/kor_castigator.txt @@ -2,6 +2,5 @@ Name:Kor Castigator ManaCost:1 W Types:Creature Kor Wizard Ally PT:3/1 -K:CantBeBlockedBy Creature.Eldrazi+Scion -SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_castigator.jpg -Oracle:Kor Castigator can't be blocked by Eldrazi Scions. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Eldrazi+Scion | Description$ CARDNAME can't be blocked by Eldrazi Scions. +Oracle:Kor Castigator can't be blocked by Eldrazi Scions. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kor_hookmaster.txt b/forge-gui/res/cardsfolder/k/kor_hookmaster.txt index e45919b0a2f..1cba013c3d0 100644 --- a/forge-gui/res/cardsfolder/k/kor_hookmaster.txt +++ b/forge-gui/res/cardsfolder/k/kor_hookmaster.txt @@ -4,7 +4,7 @@ Types:Creature Kor Soldier PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/kor_hookmaster.jpg Oracle:When Kor Hookmaster enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/k/kozilek_the_great_distortion.txt b/forge-gui/res/cardsfolder/k/kozilek_the_great_distortion.txt index 1c42ce6af67..216119d18c6 100644 --- a/forge-gui/res/cardsfolder/k/kozilek_the_great_distortion.txt +++ b/forge-gui/res/cardsfolder/k/kozilek_the_great_distortion.txt @@ -7,7 +7,7 @@ SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ Difference SVar:Y:Count$InYourHand SVar:Difference:Number$7/Minus.Y K:Menace -A:AB$ Counter | Cost$ Discard<1/Card.cmcEQX/card with mana value X> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card.cmcEQX | AILogic$ Never | SpellDescription$ Counter target spell with mana value X. -SVar:X:Count$xPaid +A:AB$ Counter | Cost$ Discard<1/Card.cmcEQX/card with mana value X> | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | AILogic$ Never | SpellDescription$ Counter target spell with mana value X. +SVar:X:Targeted$CardManaCost DeckNeeds:Ability$Mana.Colorless Oracle:When you cast this spell, if you have fewer than seven cards in hand, draw cards equal to the difference.\nMenace\nDiscard a card with mana value X: Counter target spell with mana value X. diff --git a/forge-gui/res/cardsfolder/k/kozileks_pathfinder.txt b/forge-gui/res/cardsfolder/k/kozileks_pathfinder.txt index 3b9c2c08e65..f23ab248085 100644 --- a/forge-gui/res/cardsfolder/k/kozileks_pathfinder.txt +++ b/forge-gui/res/cardsfolder/k/kozileks_pathfinder.txt @@ -2,7 +2,7 @@ Name:Kozilek's Pathfinder ManaCost:6 Types:Creature Eldrazi PT:5/5 -A:AB$ Pump | Cost$ C | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +A:AB$ Effect | Cost$ C | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. DeckHints:Ability$Mana.Colorless -SVar:Picture:http://www.wizards.com/global/images/magic/general/kozileks_pathfinder.jpg Oracle:{C}: Target creature can't block Kozilek's Pathfinder this turn. ({C} represents colorless mana.) diff --git a/forge-gui/res/cardsfolder/k/kraken_of_the_straits.txt b/forge-gui/res/cardsfolder/k/kraken_of_the_straits.txt index 1f42fe289f2..d14b1b0cf40 100644 --- a/forge-gui/res/cardsfolder/k/kraken_of_the_straits.txt +++ b/forge-gui/res/cardsfolder/k/kraken_of_the_straits.txt @@ -2,8 +2,7 @@ Name:Kraken of the Straits ManaCost:5 U U Types:Creature Kraken PT:6/6 -K:CantBeBlockedBy Creature.powerLEX +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLEX | Description$ Creatures with power less than the number of Islands you control can't block CARDNAME. SVar:X:Count$TypeYouCtrl.Island SVar:BuffedBy:Island -SVar:Picture:http://www.wizards.com/global/images/magic/general/kraken_of_the_straits.jpg -Oracle:Creatures with power less than the number of Islands you control can't block Kraken of the Straits. +Oracle:Creatures with power less than the number of Islands you control can't block Kraken of the Straits. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/k/kytheon_hero_of_akros_gideon_battle_forged.txt b/forge-gui/res/cardsfolder/k/kytheon_hero_of_akros_gideon_battle_forged.txt index 31cbbf90c9c..62629093d74 100644 --- a/forge-gui/res/cardsfolder/k/kytheon_hero_of_akros_gideon_battle_forged.txt +++ b/forge-gui/res/cardsfolder/k/kytheon_hero_of_akros_gideon_battle_forged.txt @@ -21,7 +21,7 @@ Colors:white Types:Legendary Planeswalker Gideon Loyalty:3 A:AB$ MustAttack | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature.OppCtrl | Defender$ Self | TgtPrompt$ Select target creature an opponent controls | SpellDescription$ Up to one target creature an opponent controls attacks CARDNAME during its controller's next turn if able. -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Indestructible | UntilYourNextTurn$ True | SubAbility$ DBUntap | SpellDescription$ Until your next turn, target creature gains indestructible. Untap that creature. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Indestructible | Duration$ UntilYourNextTurn | SubAbility$ DBUntap | SpellDescription$ Until your next turn, target creature gains indestructible. Untap that creature. SVar:DBUntap:DB$ Untap | Defined$ Targeted A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Defined$ Self | Power$ 4 | Toughness$ 4 | Types$ Creature,Human,Soldier | Keywords$ Indestructible | SubAbility$ DBPrevent | Planeswalker$ True | Ultimate$ True | SpellDescription$ Until end of turn, CARDNAME becomes a 4/4 Human Soldier creature with indestructible that's still a planeswalker. Prevent all damage that would be dealt to him this turn. SVar:DBPrevent:DB$ Pump | Defined$ Self | KW$ Prevent all damage that would be dealt to CARDNAME. diff --git a/forge-gui/res/cardsfolder/l/labyrinth_minotaur.txt b/forge-gui/res/cardsfolder/l/labyrinth_minotaur.txt index 9291a549282..73ea31ac26c 100644 --- a/forge-gui/res/cardsfolder/l/labyrinth_minotaur.txt +++ b/forge-gui/res/cardsfolder/l/labyrinth_minotaur.txt @@ -3,6 +3,6 @@ ManaCost:3 U Types:Creature Minotaur PT:1/4 T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:HasBlockEffect:TRUE Oracle:Whenever Labyrinth Minotaur blocks a creature, that creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/l/lancers_en_kor.txt b/forge-gui/res/cardsfolder/l/lancers_en_kor.txt index 7d7210f27c3..9b2b02ffdf4 100644 --- a/forge-gui/res/cardsfolder/l/lancers_en_kor.txt +++ b/forge-gui/res/cardsfolder/l/lancers_en_kor.txt @@ -3,7 +3,7 @@ ManaCost:3 W W Types:Creature Kor Soldier PT:3/3 K:Trample -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/l/lantern_lit_graveyard.txt b/forge-gui/res/cardsfolder/l/lantern_lit_graveyard.txt index 9252c180003..ec214fb64e0 100644 --- a/forge-gui/res/cardsfolder/l/lantern_lit_graveyard.txt +++ b/forge-gui/res/cardsfolder/l/lantern_lit_graveyard.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ DBStayTapped | SpellDescription$ Add {B}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ DBStayTapped | SpellDescription$ Add {R}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {B} or {R}. Lantern-Lit Graveyard doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/lash_of_malice.txt b/forge-gui/res/cardsfolder/l/lash_of_malice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lash_of_malice.txt rename to forge-gui/res/cardsfolder/l/lash_of_malice.txt diff --git a/forge-gui/res/cardsfolder/l/lavinia_of_the_tenth.txt b/forge-gui/res/cardsfolder/l/lavinia_of_the_tenth.txt index f91136ccfc9..1538b2348a7 100644 --- a/forge-gui/res/cardsfolder/l/lavinia_of_the_tenth.txt +++ b/forge-gui/res/cardsfolder/l/lavinia_of_the_tenth.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Human Soldier PT:4/4 K:Protection from red T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain each nonland permanent your opponents control with mana value 4 or less. -SVar:Detain:DB$ PumpAll | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidCards$ Permanent.OppCtrl+nonLand+cmcLE4 +SVar:Detain:DB$ PumpAll | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidCards$ Permanent.OppCtrl+nonLand+cmcLE4 SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/lavinia_of_the_tenth.jpg Oracle:Protection from red\nWhen Lavinia of the Tenth enters the battlefield, detain each nonland permanent your opponents control with mana value 4 or less. (Until your next turn, those permanents can't attack or block and their activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt b/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt index 9c3918cfdde..ecf740256cf 100644 --- a/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt +++ b/forge-gui/res/cardsfolder/l/lead_belly_chimera.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Chimera PT:2/2 K:Trample A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) -SVar:DBPump:DB$ Pump | KW$ Trample | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ Trample | Defined$ Targeted | Duration$ Permanent AI:RemoveDeck:All Oracle:Trample\nSacrifice Lead-Belly Chimera: Put a +2/+2 counter on target Chimera creature. It gains trample. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/l/lead_golem.txt b/forge-gui/res/cardsfolder/l/lead_golem.txt index d768c1ae98e..1e114d084e8 100644 --- a/forge-gui/res/cardsfolder/l/lead_golem.txt +++ b/forge-gui/res/cardsfolder/l/lead_golem.txt @@ -3,5 +3,5 @@ ManaCost:5 Types:Artifact Creature Golem PT:3/5 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | TriggerDescription$ Whenever CARDNAME attacks, it doesn't untap during its controller's next untap step. -SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:Whenever Lead Golem attacks, it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/leech_fanatic.txt b/forge-gui/res/cardsfolder/l/leech_fanatic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/leech_fanatic.txt rename to forge-gui/res/cardsfolder/l/leech_fanatic.txt diff --git a/forge-gui/res/cardsfolder/l/leeching_licid.txt b/forge-gui/res/cardsfolder/l/leeching_licid.txt index 3a618cfdea9..7d98717a291 100644 --- a/forge-gui/res/cardsfolder/l/leeching_licid.txt +++ b/forge-gui/res/cardsfolder/l/leeching_licid.txt @@ -2,7 +2,7 @@ Name:Leeching Licid ManaCost:1 B Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ B T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ B | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. +A:AB$ Animate | Cost$ B T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ B | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {B} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ At the beginning of the upkeep of enchanted creature's controller, CARDNAME deals 1 damage to that player. diff --git a/forge-gui/res/cardsfolder/l/legion_warboss.txt b/forge-gui/res/cardsfolder/l/legion_warboss.txt index 2e01c3305ab..0002fb98205 100644 --- a/forge-gui/res/cardsfolder/l/legion_warboss.txt +++ b/forge-gui/res/cardsfolder/l/legion_warboss.txt @@ -6,7 +6,7 @@ K:Mentor T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able. SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ r_1_1_goblin | LegacyImage$ r 1 1 goblin grn | RememberTokens$ True | SubAbility$ DBPumpTurn SVar:DBPumpTurn:DB$ Pump | Defined$ Remembered | KW$ Haste | SubAbility$ DBPumpCombat -SVar:DBPumpCombat:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME attacks each combat if able. | UntilEndOfCombat$ True | SubAbility$ DBCleanup +SVar:DBPumpCombat:DB$ Pump | Defined$ Remembered | KW$ HIDDEN CARDNAME attacks each combat if able. | Duration$ UntilEndOfCombat | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Counters & Ability$Token Oracle:Mentor (Whenever this creature attacks, put a +1/+1 counter on target attacking creature with lesser power.)\nAt the beginning of combat on your turn, create a 1/1 red Goblin creature token. That token gains haste until end of turn and attacks this combat if able. diff --git a/forge-gui/res/cardsfolder/upcoming/leonin_lightscribe.txt b/forge-gui/res/cardsfolder/l/leonin_lightscribe.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/leonin_lightscribe.txt rename to forge-gui/res/cardsfolder/l/leonin_lightscribe.txt diff --git a/forge-gui/res/cardsfolder/upcoming/letter_of_acceptance.txt b/forge-gui/res/cardsfolder/l/letter_of_acceptance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/letter_of_acceptance.txt rename to forge-gui/res/cardsfolder/l/letter_of_acceptance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/leyline_invocation.txt b/forge-gui/res/cardsfolder/l/leyline_invocation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/leyline_invocation.txt rename to forge-gui/res/cardsfolder/l/leyline_invocation.txt diff --git a/forge-gui/res/cardsfolder/l/life_matrix.txt b/forge-gui/res/cardsfolder/l/life_matrix.txt index b6abef15d36..fd0fba9922e 100644 --- a/forge-gui/res/cardsfolder/l/life_matrix.txt +++ b/forge-gui/res/cardsfolder/l/life_matrix.txt @@ -2,7 +2,7 @@ Name:Life Matrix ManaCost:4 Types:Artifact A:AB$ PutCounter | Cost$ 4 T | PlayerTurn$ True | ActivationPhases$ Upkeep | CounterType$ MATRIX | CounterNum$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBAnimate | SpellDescription$ Put a matrix counter on target creature and that creature gains "Remove a matrix counter from this creature: Regenerate this creature." -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ Regen | Permanent$ True | SpellDescription$ Activate only during your upkeep. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Abilities$ Regen | Duration$ Permanent | SpellDescription$ Activate only during your upkeep. SVar:Regen:AB$ Regenerate | Cost$ SubCounter<1/MATRIX> | SpellDescription$ Regenerate CARDNAME. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/life_matrix.jpg diff --git a/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt b/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt index e7313e39353..f32f319d405 100644 --- a/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt +++ b/forge-gui/res/cardsfolder/l/lifecraft_awakening.txt @@ -2,7 +2,7 @@ Name:Lifecraft Awakening ManaCost:X G Types:Instant A:SP$ PutCounter | Cost$ X G | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBAnimate | SpellDescription$ Put X +1/+1 counters on target artifact you control. If it isn't a creature or Vehicle, it becomes a 0/0 Construct artifact creature. -SVar:DBAnimate:DB$ Animate | Defined$ Targeted.nonCreature+nonVehicle | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature,Construct | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted.nonCreature+nonVehicle | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature,Construct | Duration$ Permanent SVar:X:Count$xPaid AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lifecraft_awakening.jpg diff --git a/forge-gui/res/cardsfolder/l/lifelace.txt b/forge-gui/res/cardsfolder/l/lifelace.txt index ddee1b78c33..655c7512f1e 100644 --- a/forge-gui/res/cardsfolder/l/lifelace.txt +++ b/forge-gui/res/cardsfolder/l/lifelace.txt @@ -1,7 +1,7 @@ Name:Lifelace ManaCost:G Types:Instant -A:SP$ Animate | Cost$ G | Colors$ Green | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes green. (Mana symbols on that permanent remain unchanged.) +A:SP$ Animate | Cost$ G | Colors$ Green | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes green. (Mana symbols on that permanent remain unchanged.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/lifelace.jpg diff --git a/forge-gui/res/cardsfolder/l/lightform.txt b/forge-gui/res/cardsfolder/l/lightform.txt index f3b259633c3..c0c3d973d0d 100644 --- a/forge-gui/res/cardsfolder/l/lightform.txt +++ b/forge-gui/res/cardsfolder/l/lightform.txt @@ -3,7 +3,7 @@ ManaCost:1 W W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigManifest | TriggerDescription$ When CARDNAME enters the battlefield, it becomes an Aura with enchant creature. Manifest the top card of your library and attach CARDNAME to it. (To manifest a card, put it onto the battlefield face down as a 2/2 creature. You may turn it face up at any time for its mana cost if it's a creature card.) SVar:TrigManifest:DB$ Manifest | Amount$ 1 | Defined$ TopOfLibrary | RememberManifested$ True | SubAbility$ Aurify -SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Permanent$ True | SubAbility$ LightformAttach +SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Duration$ Permanent | SubAbility$ LightformAttach SVar:NewAttach:SP$ Attach | Cost$ 1 W W | ValidTgts$ Creature | AILogic$ Pump SVar:LightformAttach:DB$ Attach | Defined$ Remembered | IsPresent$ Card.Self S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Lifelink & Flying | Description$ Enchanted creature has flying and lifelink. diff --git a/forge-gui/res/cardsfolder/l/lightning_mare.txt b/forge-gui/res/cardsfolder/l/lightning_mare.txt index fcefe51038a..a1e770b519b 100644 --- a/forge-gui/res/cardsfolder/l/lightning_mare.txt +++ b/forge-gui/res/cardsfolder/l/lightning_mare.txt @@ -1,8 +1,8 @@ Name:Lightning Mare ManaCost:R R Types:Creature Elemental Horse +PT:3/1 K:CARDNAME can't be countered. -K:CantBeBlockedBy Creature.Blue +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Blue | Description$ CARDNAME can't be blocked by blue creatures. A:AB$ Pump | Cost$ 1 R | ValidCard$ Card.Self | NumAtt$ +1 | NumDef$ +0 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -Oracle:This spell can't be countered.\nLightning Mare can't be blocked by blue creatures.\n{1}{R}: Lightning Mare gets +1/+0 until end of turn. -PT:3/1 \ No newline at end of file +Oracle:This spell can't be countered.\nLightning Mare can't be blocked by blue creatures.\n{1}{R}: Lightning Mare gets +1/+0 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/l/liliana_deaths_majesty.txt b/forge-gui/res/cardsfolder/l/liliana_deaths_majesty.txt index 049bf3b1816..880617b8044 100644 --- a/forge-gui/res/cardsfolder/l/liliana_deaths_majesty.txt +++ b/forge-gui/res/cardsfolder/l/liliana_deaths_majesty.txt @@ -5,7 +5,7 @@ Loyalty:5 A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You | Planeswalker$ True | SubAbility$ DBMill | SpellDescription$ Create a 2/2 black Zombie creature token. Mill two cards. SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 2 A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | AnimateSubAbility$ Animate | TgtPrompt$ Select target creature card from your graveyard | Planeswalker$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. That creature is a black Zombie in addition to its other colors and types. -SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent A:AB$ DestroyAll | Cost$ SubCounter<7/LOYALTY> | Ultimate$ True | ValidCards$ Creature.nonZombie | Planeswalker$ True | SpellDescription$ Destroy all non-Zombie creatures. DeckHas:Ability$Token & Ability$Graveyard DeckHints:Type$Zombie diff --git a/forge-gui/res/cardsfolder/l/liliana_the_last_hope.txt b/forge-gui/res/cardsfolder/l/liliana_the_last_hope.txt index 6b3a42c6494..f61da264657 100644 --- a/forge-gui/res/cardsfolder/l/liliana_the_last_hope.txt +++ b/forge-gui/res/cardsfolder/l/liliana_the_last_hope.txt @@ -2,9 +2,9 @@ Name:Liliana, the Last Hope ManaCost:1 B B Types:Legendary Planeswalker Liliana Loyalty:3 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | NumDef$ -1 | IsCurse$ True | UntilYourNextTurn$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Up to one target creature gets -2/-1 until your next turn. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | NumDef$ -1 | IsCurse$ True | Duration$ UntilYourNextTurn | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Up to one target creature gets -2/-1 until your next turn. A:AB$ Mill | Cost$ SubCounter<2/LOYALTY> | NumCards$ 2 | AILogic$ LilianaMill | Planeswalker$ True | Defined$ You | SubAbility$ DBChooseCard | SpellDescription$ Mill two cards, then you may return a creature card from your graveyard to your hand. -SVar:DBChooseCard:DB$ ChooseCard | Choices$ Creature.YouOwn | Optional$ Yes | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBChangeZone +SVar:DBChooseCard:DB$ ChooseCard | Choices$ Creature.YouOwn | ChoiceZone$ Graveyard | Amount$ 1 | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Name$ Emblem - Liliana, the Last Hope | Image$ emblem_liliana_the_last_hope | Triggers$ TrigToken | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "At the beginning of your end step, create X 2/2 black Zombie creature tokens, where X is two plus the number of Zombies you control." diff --git a/forge-gui/res/cardsfolder/l/liliana_waker_of_the_dead.txt b/forge-gui/res/cardsfolder/l/liliana_waker_of_the_dead.txt index bd3d8e0ac04..f369402500c 100644 --- a/forge-gui/res/cardsfolder/l/liliana_waker_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/l/liliana_waker_of_the_dead.txt @@ -12,6 +12,6 @@ SVar:X:Count$InYourYard A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Liliana, Waker of the Dead | Image$ emblem_liliana_waker_of_the_dead | Triggers$ EffPhase | Duration$ Permanent | SpellDescription$ You get an emblem with "At the beginning of combat on your turn, put target creature card from a graveyard onto the battlefield under your control. It gains haste." SVar:EffPhase:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ EmblemTrigChangeZone | TriggerDescription$ At the beginning of combat on your turn, put target creature card from a graveyard onto the battlefield under your control. It gains haste. SVar:EmblemTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Haste | Duration$ Permanent DeckHas:Ability$Discard & Ability$Graveyard Oracle:[+1]: Each player discards a card. Each opponent who can't loses 3 life.\n[−3]: Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard.\n[−7]: You get an emblem with "At the beginning of combat on your turn, put target creature card from a graveyard onto the battlefield under your control. It gains haste." diff --git a/forge-gui/res/cardsfolder/l/lim_dul_the_necromancer.txt b/forge-gui/res/cardsfolder/l/lim_dul_the_necromancer.txt index fdd952745e3..99f31542030 100644 --- a/forge-gui/res/cardsfolder/l/lim_dul_the_necromancer.txt +++ b/forge-gui/res/cardsfolder/l/lim_dul_the_necromancer.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Human Wizard PT:4/4 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | TriggerZones$ Battlefield | Execute$ TrigReturn | OptionalDecider$ You | TriggerDescription$ Whenever a creature an opponent controls dies, you may pay {1}{B}. If you do, return that card to the battlefield under your control. If it's a creature, it's a Zombie in addition to its other creature types. SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | Defined$ TriggeredNewCardLKICopy | AnimateSubAbility$ Animate -SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Permanent$ True | ConditionDefined$ Remembered | ConditionPresent$ Creature +SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Zombie | Duration$ Permanent | ConditionDefined$ Remembered | ConditionPresent$ Creature A:AB$ Regenerate | ValidTgts$ Zombie | TgtPrompt$ Select target Zombie | Cost$ 1 B | SpellDescription$ Regenerate target Zombie. Oracle:Whenever a creature an opponent controls dies, you may pay {1}{B}. If you do, return that card to the battlefield under your control. If it's a creature, it's a Zombie in addition to its other creature types.\n{1}{B}: Regenerate target Zombie. diff --git a/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt b/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt index 2844c99de3e..a8c6cf6ec31 100755 --- a/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt +++ b/forge-gui/res/cardsfolder/l/linvala_shield_of_sea_gate.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Angel Wizard PT:3/3 K:Flying T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | CheckSVar$ X | SVarCompare$ EQ4 | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, if you have a full party, choose target nonland permanent an opponent controls. Until your next turn, it can't attack or block, and its activated abilities can't be activated. -SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | AILogic$ DetainNonLand +SVar:TrigPump:DB$ Pump | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | AILogic$ DetainNonLand A:AB$ GenericChoice | Cost$ Sac<1/CARDNAME> | Choices$ PumpHexproof,PumpIndestructible | StackDescription$ {p:You} chooses hexproof or indestructible. Creatures {p:You} controls gain that ability until end of turn. | SpellDescription$ Choose hexproof or indestructible. Creatures you control gain that ability until end of turn. SVar:PumpHexproof:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Hexproof | SpellDescription$ Hexproof SVar:PumpIndestructible:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Indestructible diff --git a/forge-gui/res/cardsfolder/l/long_finned_skywhale.txt b/forge-gui/res/cardsfolder/l/long_finned_skywhale.txt index 542cbb9f21f..c6d6f31b61c 100644 --- a/forge-gui/res/cardsfolder/l/long_finned_skywhale.txt +++ b/forge-gui/res/cardsfolder/l/long_finned_skywhale.txt @@ -3,6 +3,5 @@ ManaCost:2 U U Types:Creature Whale PT:4/3 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/long_finned_skywhale.jpg -Oracle:Flying\nLong-Finned Skywhale can block only creatures with flying. \ No newline at end of file +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. +Oracle:Flying\nLong-Finned Skywhale can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/lorehold_apprentice.txt b/forge-gui/res/cardsfolder/l/lorehold_apprentice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lorehold_apprentice.txt rename to forge-gui/res/cardsfolder/l/lorehold_apprentice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lorehold_campus.txt b/forge-gui/res/cardsfolder/l/lorehold_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lorehold_campus.txt rename to forge-gui/res/cardsfolder/l/lorehold_campus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lorehold_command.txt b/forge-gui/res/cardsfolder/l/lorehold_command.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lorehold_command.txt rename to forge-gui/res/cardsfolder/l/lorehold_command.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lorehold_excavation.txt b/forge-gui/res/cardsfolder/l/lorehold_excavation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lorehold_excavation.txt rename to forge-gui/res/cardsfolder/l/lorehold_excavation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/lorehold_pledgemage.txt b/forge-gui/res/cardsfolder/l/lorehold_pledgemage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/lorehold_pledgemage.txt rename to forge-gui/res/cardsfolder/l/lorehold_pledgemage.txt diff --git a/forge-gui/res/cardsfolder/l/lorthos_the_tidemaker.txt b/forge-gui/res/cardsfolder/l/lorthos_the_tidemaker.txt index 107f47f374a..43aab905902 100644 --- a/forge-gui/res/cardsfolder/l/lorthos_the_tidemaker.txt +++ b/forge-gui/res/cardsfolder/l/lorthos_the_tidemaker.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Octopus PT:8/8 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME attacks, you may pay {8}. If you do, tap up to eight target permanents. Those permanents don't untap during their controllers' next untap steps. SVar:TrigTap:AB$ Tap | Cost$ 8 | ValidTgts$ Permanent | TargetMin$ 0 | TargetMax$ 8 | TgtPrompt$ Select target permanent | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. SVar:Picture:http://www.wizards.com/global/images/magic/general/lorthos_the_tidemaker.jpg Oracle:Whenever Lorthos, the Tidemaker attacks, you may pay {8}. If you do, tap up to eight target permanents. Those permanents don't untap during their controllers' next untap steps. diff --git a/forge-gui/res/cardsfolder/upcoming/losheel_clockwork_scholar.txt b/forge-gui/res/cardsfolder/l/losheel_clockwork_scholar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/losheel_clockwork_scholar.txt rename to forge-gui/res/cardsfolder/l/losheel_clockwork_scholar.txt diff --git a/forge-gui/res/cardsfolder/l/lukka_coppercoat_outcast.txt b/forge-gui/res/cardsfolder/l/lukka_coppercoat_outcast.txt index 6fd67a62a0b..715e2f5f562 100755 --- a/forge-gui/res/cardsfolder/l/lukka_coppercoat_outcast.txt +++ b/forge-gui/res/cardsfolder/l/lukka_coppercoat_outcast.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Lukka Loyalty:5 A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 3 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Exile the top three cards of your library. Creature cards exiled this way gain "You may cast this card from exile as long as you control a Lukka planeswalker." SVar:DBRepeat:DB$ RepeatEach | UseImprinted$ True | RepeatSubAbility$ DBAnimate | RepeatCards$ Creature.IsRemembered | Zone$ Exile | SubAbility$ DBCleanup -SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | staticAbilities$ STMayPlay | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Imprinted | staticAbilities$ STMayPlay | Duration$ Permanent SVar:STMayPlay:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Exile | EffectZone$ Exile | MayPlay$ True | IsPresent$ Planeswalker.Lukka+YouCtrl | Description$ You may cast this card from exile as long as you control a Lukka planeswalker. A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBDigUntil | RememberChanged$ True | StackDescription$ SpellDescription | SpellDescription$ Exile target creature you control, then reveal cards from the top of your library until you reveal a creature card with higher mana value. Put that card onto the battlefield and the rest on the bottom of your library in a random order. SVar:DBDigUntil:DB$ DigUntil | Valid$ Creature.cmcGEX | ValidDescription$ creature card with higher mana value | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RestRandomOrder$ True | SubAbility$ DBCleanup | StackDescription$ None diff --git a/forge-gui/res/cardsfolder/l/luminate_primordial.txt b/forge-gui/res/cardsfolder/l/luminate_primordial.txt index 60c2c96dec1..ea085ef761c 100644 --- a/forge-gui/res/cardsfolder/l/luminate_primordial.txt +++ b/forge-gui/res/cardsfolder/l/luminate_primordial.txt @@ -8,6 +8,6 @@ SVar:ExileOneEach:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Va SVar:LoopTgts:DB$ RepeatEach | RepeatSubAbility$ GiveLifeEach | DefinedCards$ Targeted SVar:GiveLifeEach:DB$ GainLife | Defined$ RememberedController | LifeAmount$ TgtPower SVar:OneEach:PlayerCountOpponents$Amount -SVar:TgtPower:Remembered$CardPower +SVar:TgtPower:RememberedLKI$CardPower SVar:Picture:http://www.wizards.com/global/images/magic/general/luminate_primordial.jpg Oracle:Vigilance\nWhen Luminate Primordial enters the battlefield, for each opponent, exile up to one target creature that player controls and that player gains life equal to its power. diff --git a/forge-gui/res/cardsfolder/l/lurking_evil.txt b/forge-gui/res/cardsfolder/l/lurking_evil.txt index 7056fd2dc34..ec360c36694 100644 --- a/forge-gui/res/cardsfolder/l/lurking_evil.txt +++ b/forge-gui/res/cardsfolder/l/lurking_evil.txt @@ -1,7 +1,7 @@ Name:Lurking Evil ManaCost:B B B Types:Enchantment -A:AB$ Animate | Cost$ PayLife | Types$ Creature,Horror | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveCardTypes$ True | Permanent$ True | CostDesc$ Pay half your life, rounded up: | SpellDescription$ CARDNAME becomes a 4/4 Horror creature with flying. +A:AB$ Animate | Cost$ PayLife | Types$ Creature,Horror | Power$ 4 | Toughness$ 4 | Keywords$ Flying | RemoveCardTypes$ True | Duration$ Permanent | CostDesc$ Pay half your life, rounded up: | SpellDescription$ CARDNAME becomes a 4/4 Horror creature with flying. SVar:X:Count$YourLifeTotal/HalfUp AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_evil.jpg diff --git a/forge-gui/res/cardsfolder/l/lurking_jackals.txt b/forge-gui/res/cardsfolder/l/lurking_jackals.txt index c7583493b7d..45311b60341 100644 --- a/forge-gui/res/cardsfolder/l/lurking_jackals.txt +++ b/forge-gui/res/cardsfolder/l/lurking_jackals.txt @@ -2,6 +2,6 @@ Name:Lurking Jackals ManaCost:B Types:Enchantment T:Mode$ Always | LifeTotal$ OpponentSmallest | LifeAmount$ LE10 | TriggerZones$ Battlefield | Execute$ TrigLurkingJackalsAnimate | IsPresent$ Card.Self+Enchantment | ResolvingCheck$ IsPresent | TriggerDescription$ When an opponent has 10 or less life, if CARDNAME is an enchantment, CARDNAME becomes a 3/2 Jackal creature. -SVar:TrigLurkingJackalsAnimate:DB$ Animate | Types$ Creature,Jackal | Power$ 3 | Toughness$ 2 | RemoveCardTypes$ True | Permanent$ True +SVar:TrigLurkingJackalsAnimate:DB$ Animate | Types$ Creature,Jackal | Power$ 3 | Toughness$ 2 | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_jackals.jpg Oracle:When an opponent has 10 or less life, if Lurking Jackals is an enchantment, it becomes a 3/2 Jackal creature. diff --git a/forge-gui/res/cardsfolder/l/lurking_skirge.txt b/forge-gui/res/cardsfolder/l/lurking_skirge.txt index 9ee4d32430f..1c07f73387d 100644 --- a/forge-gui/res/cardsfolder/l/lurking_skirge.txt +++ b/forge-gui/res/cardsfolder/l/lurking_skirge.txt @@ -2,6 +2,6 @@ Name:Lurking Skirge ManaCost:1 B Types:Enchantment T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | ValidCard$ Creature.OppOwn | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is an enchantment, CARDNAME becomes a 3/2 Imp creature with flying. -SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Imp | Keywords$ Flying | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ 3 | Toughness$ 2 | Types$ Creature,Imp | Keywords$ Flying | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/lurking_skirge.jpg Oracle:When a creature is put into an opponent's graveyard from the battlefield, if Lurking Skirge is an enchantment, Lurking Skirge becomes a 3/2 Imp creature with flying. diff --git a/forge-gui/res/cardsfolder/l/lyev_decree.txt b/forge-gui/res/cardsfolder/l/lyev_decree.txt index 6bf29206682..18ae893f40d 100644 --- a/forge-gui/res/cardsfolder/l/lyev_decree.txt +++ b/forge-gui/res/cardsfolder/l/lyev_decree.txt @@ -1,6 +1,6 @@ Name:Lyev Decree ManaCost:1 W Types:Sorcery -A:SP$ Pump | Cost$ 1 W | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | UntilYourNextTurn$ True | SpellDescription$ Detain up to two target creatures your opponents control. (Until your next turn, those permanents can't attack or block and their activated abilities can't be activated.) +A:SP$ Pump | Cost$ 1 W | TargetMin$ 0 | TargetMax$ 2 | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. | Duration$ UntilYourNextTurn | SpellDescription$ Detain up to two target creatures your opponents control. (Until your next turn, those permanents can't attack or block and their activated abilities can't be activated.) SVar:Picture:http://www.wizards.com/global/images/magic/general/lyev_decree.jpg Oracle:Detain up to two target creatures your opponents control. (Until your next turn, those creatures can't attack or block and their activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/l/lyev_skyknight.txt b/forge-gui/res/cardsfolder/l/lyev_skyknight.txt index a7f5c9418f6..5b355af4090 100644 --- a/forge-gui/res/cardsfolder/l/lyev_skyknight.txt +++ b/forge-gui/res/cardsfolder/l/lyev_skyknight.txt @@ -4,7 +4,7 @@ Types:Creature Human Knight PT:3/1 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain target nonland permanent an opponent controls. (Until your next turn, that permanent can't attack or block and its activated abilities can't be activated.) -SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | AILogic$ DetainNonLand +SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | AILogic$ DetainNonLand SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/lyev_skyknight.jpg Oracle:Flying\nWhen Lyev Skyknight enters the battlefield, detain target nonland permanent an opponent controls. (Until your next turn, that permanent can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/m/ma_chao_western_warrior.txt b/forge-gui/res/cardsfolder/m/ma_chao_western_warrior.txt index e3850f80a01..c6704b6d188 100644 --- a/forge-gui/res/cardsfolder/m/ma_chao_western_warrior.txt +++ b/forge-gui/res/cardsfolder/m/ma_chao_western_warrior.txt @@ -4,5 +4,5 @@ Types:Legendary Creature Human Soldier Warrior PT:3/3 K:Horsemanship T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, it's can't be blocked this combat. -SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | UntilEndOfCombat$ True +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | Duration$ UntilEndOfCombat Oracle:Horsemanship (This creature can't be blocked except by creatures with horsemanship.)\nWhenever Ma Chao, Western Warrior attacks alone, it can't be blocked this combat. diff --git a/forge-gui/res/cardsfolder/m/maelstrom_djinn.txt b/forge-gui/res/cardsfolder/m/maelstrom_djinn.txt index 15f3fde31db..4c72f6ca905 100644 --- a/forge-gui/res/cardsfolder/m/maelstrom_djinn.txt +++ b/forge-gui/res/cardsfolder/m/maelstrom_djinn.txt @@ -6,6 +6,6 @@ K:Flying K:Morph:2 U T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDjinnVanishing | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, put two time counters on it and it gains vanishing. SVar:TrigDjinnVanishing:DB$ PutCounter | CounterType$ TIME | CounterNum$ 2 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Vanishing:2 | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Vanishing:2 | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/maelstrom_djinn.jpg Oracle:Flying\nMorph {2}{U} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Maelstrom Djinn is turned face up, put two time counters on it and it gains vanishing. (At the beginning of your upkeep, remove a time counter from it. When the last is removed, sacrifice it.) diff --git a/forge-gui/res/cardsfolder/upcoming/maelstrom_muse.txt b/forge-gui/res/cardsfolder/m/maelstrom_muse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/maelstrom_muse.txt rename to forge-gui/res/cardsfolder/m/maelstrom_muse.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mage_duel.txt b/forge-gui/res/cardsfolder/m/mage_duel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mage_duel.txt rename to forge-gui/res/cardsfolder/m/mage_duel.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mage_hunter.txt b/forge-gui/res/cardsfolder/m/mage_hunter.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mage_hunter.txt rename to forge-gui/res/cardsfolder/m/mage_hunter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mage_hunters_onslaught.txt b/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt similarity index 90% rename from forge-gui/res/cardsfolder/upcoming/mage_hunters_onslaught.txt rename to forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt index e224ad539cc..5e744635671 100644 --- a/forge-gui/res/cardsfolder/upcoming/mage_hunters_onslaught.txt +++ b/forge-gui/res/cardsfolder/m/mage_hunters_onslaught.txt @@ -1,7 +1,7 @@ Name:Mage Hunters' Onslaught ManaCost:2 B B Types:Sorcery -A:SP$ Destroy | Cost$ 1 B B | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | SubAbility$ DBEffect | SpellDescription$ Destroy target creature or planeswalker. +A:SP$ Destroy | Cost$ 2 B B | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | SubAbility$ DBEffect | SpellDescription$ Destroy target creature or planeswalker. SVar:DBEffect:DB$ Effect | Triggers$ TrigBlocking SVar:TrigBlocking:Mode$ AttackerBlocked | Execute$ TrigLoseLife | TriggerDescription$ Whenever a creature blocks this turn, its controller loses 1 life. SVar:TrigLoseLife:DB$ LoseLife | Defined$ TriggeredBlockerController | LifeAmount$ 1 diff --git a/forge-gui/res/cardsfolder/m/magical_hack.txt b/forge-gui/res/cardsfolder/m/magical_hack.txt index 41dfa8a5073..0c2884dc527 100644 --- a/forge-gui/res/cardsfolder/m/magical_hack.txt +++ b/forge-gui/res/cardsfolder/m/magical_hack.txt @@ -1,7 +1,7 @@ Name:Magical Hack ManaCost:U Types:Instant -A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (For example, you may change "swampwalk" to "plainswalk." This effect lasts indefinitely.) +A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Duration$ Permanent | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (For example, you may change "swampwalk" to "plainswalk." This effect lasts indefinitely.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/magical_hack.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/magma_opus.txt b/forge-gui/res/cardsfolder/m/magma_opus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/magma_opus.txt rename to forge-gui/res/cardsfolder/m/magma_opus.txt diff --git a/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt b/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt index 9d9213632a0..deff61e3991 100644 --- a/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt +++ b/forge-gui/res/cardsfolder/m/magus_of_the_scroll.txt @@ -2,10 +2,9 @@ Name:Magus of the Scroll ManaCost:R Types:Creature Human Wizard PT:1/1 -A:AB$ NameCard | Cost$ 3 T | Defined$ You | SubAbility$ DBReveal | SpellDescription$ Choose a card name, then reveal a card at random from your hand. If that card has the chosen name, CARDNAME deals 2 damage to any target. +A:AB$ NameCard | Cost$ 3 T | Defined$ You | SubAbility$ DBReveal | AILogic$ CursedScroll | SpellDescription$ Choose a card name, then reveal a card at random from your hand. If that card has the chosen name, CARDNAME deals 2 damage to any target. SVar:DBReveal:DB$ Reveal | Random$ True | RememberRevealed$ True | Defined$ You | SubAbility$ DBDamage SVar:DBDamage:DB$ DealDamage | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | ConditionDefined$ Remembered | ConditionPresent$ Card.NamedCard | ConditionCompare$ EQ1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/magus_of_the_scroll.jpg +SVar:PreferredHandSize:1 Oracle:{3}, {T}: Choose a card name, then reveal a card at random from your hand. If that card has the chosen name, Magus of the Scroll deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/make_your_mark.txt b/forge-gui/res/cardsfolder/m/make_your_mark.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/make_your_mark.txt rename to forge-gui/res/cardsfolder/m/make_your_mark.txt diff --git a/forge-gui/res/cardsfolder/m/mana_reflection.txt b/forge-gui/res/cardsfolder/m/mana_reflection.txt index 04ebe0d17df..1bc8429723d 100644 --- a/forge-gui/res/cardsfolder/m/mana_reflection.txt +++ b/forge-gui/res/cardsfolder/m/mana_reflection.txt @@ -1,6 +1,6 @@ Name:Mana Reflection ManaCost:4 G G Types:Enchantment -R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidPlayer$ You | ValidCard$ Permanent | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceTwice | Description$ If you tap a permanent for mana, it produces twice as much of that mana instead. +R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidActivator$ You | ValidCard$ Permanent | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceTwice | Description$ If you tap a permanent for mana, it produces twice as much of that mana instead. SVar:ProduceTwice:DB$ ReplaceMana | ReplaceAmount$ 2 Oracle:If you tap a permanent for mana, it produces twice as much of that mana instead. diff --git a/forge-gui/res/cardsfolder/m/mana_skimmer.txt b/forge-gui/res/cardsfolder/m/mana_skimmer.txt index ee2a0ccf091..6d00a94c982 100644 --- a/forge-gui/res/cardsfolder/m/mana_skimmer.txt +++ b/forge-gui/res/cardsfolder/m/mana_skimmer.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TapTarget | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage to a player, tap target land that player controls. That land doesn't untap during its controller's next untap step. SVar:TapTarget:DB$ Tap | ValidTgts$ Land | TargetsWithDefinedController$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/mana_skimmer.jpg Oracle:Flying\nWhenever Mana Skimmer deals damage to a player, tap target land that player controls. That land doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/m/mana_vapors.txt b/forge-gui/res/cardsfolder/m/mana_vapors.txt index 59858a491d4..72652ca9ab1 100644 --- a/forge-gui/res/cardsfolder/m/mana_vapors.txt +++ b/forge-gui/res/cardsfolder/m/mana_vapors.txt @@ -1,7 +1,7 @@ Name:Mana Vapors ManaCost:1 U Types:Sorcery -A:SP$ PumpAll | Cost$ 1 U | ValidTgts$ Player | IsCurse$ True | ValidCards$ Land.TargetedPlayerCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SpellDescription$ Lands target player controls don't untap during their next untap step. +A:SP$ PumpAll | Cost$ 1 U | ValidTgts$ Player | IsCurse$ True | ValidCards$ Land.TargetedPlayerCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SpellDescription$ Lands target player controls don't untap during their next untap step. #TODO: the AI doesn't really target the opponent with the tapped lands in a multiplayer game (not necessarily, anyway). Could use improvement before this card is marked AI playable. SVar:NeedsToPlay:Land.OppCtrl+tapped AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/manifestation_sage.txt b/forge-gui/res/cardsfolder/m/manifestation_sage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/manifestation_sage.txt rename to forge-gui/res/cardsfolder/m/manifestation_sage.txt diff --git a/forge-gui/res/cardsfolder/m/manta_ray.txt b/forge-gui/res/cardsfolder/m/manta_ray.txt index 60560e87ae9..c0f7fdf34e6 100644 --- a/forge-gui/res/cardsfolder/m/manta_ray.txt +++ b/forge-gui/res/cardsfolder/m/manta_ray.txt @@ -3,9 +3,8 @@ ManaCost:1 U U Types:Creature Fish PT:3/3 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. -K:CantBeBlockedBy Creature.nonBlue +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonBlue | Description$ CARDNAME can't be blocked except by blue creatures. T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Island.YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no Islands, sacrifice CARDNAME. SVar:TrigSac:DB$Sacrifice | Defined$ Self SVar:NeedsToPlay:Island.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/manta_ray.jpg -Oracle:Manta Ray can't attack unless defending player controls an Island.\nManta Ray can't be blocked except by blue creatures.\nWhen you control no Islands, sacrifice Manta Ray. +Oracle:Manta Ray can't attack unless defending player controls an Island.\nManta Ray can't be blocked except by blue creatures.\nWhen you control no Islands, sacrifice Manta Ray. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt b/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt index 1b2e223b77d..94c657ac507 100644 --- a/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt +++ b/forge-gui/res/cardsfolder/m/mardu_blazebringer.txt @@ -5,8 +5,7 @@ PT:4/4 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ When CARDNAME attacks or blocks, sacrifice it at end of combat. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$ Sacrifice | Defined$ Self +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/mardu_blazebringer.jpg Oracle:When Mardu Blazebringer attacks or blocks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/upcoming/marshland_bloodcaster.txt b/forge-gui/res/cardsfolder/m/marshland_bloodcaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/marshland_bloodcaster.txt rename to forge-gui/res/cardsfolder/m/marshland_bloodcaster.txt diff --git a/forge-gui/res/cardsfolder/m/martial_law.txt b/forge-gui/res/cardsfolder/m/martial_law.txt index 748b57c6fe8..d7b290186ab 100644 --- a/forge-gui/res/cardsfolder/m/martial_law.txt +++ b/forge-gui/res/cardsfolder/m/martial_law.txt @@ -2,5 +2,5 @@ Name:Martial Law ManaCost:2 W W Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ Detain | TriggerDescription$ At the beginning of your upkeep, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) -SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. Oracle:At the beginning of your upkeep, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/m/martyrdom.txt b/forge-gui/res/cardsfolder/m/martyrdom.txt index 426bc74ccc1..7c86d17580e 100644 --- a/forge-gui/res/cardsfolder/m/martyrdom.txt +++ b/forge-gui/res/cardsfolder/m/martyrdom.txt @@ -2,7 +2,7 @@ Name:Martyrdom ManaCost:1 W W Types:Instant A:SP$ Animate | Cost$ 1 W W | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Abilities$ Martyr | sVars$ DamageEvent,DamageEventDmg,IsCreature | StackDescription$ Until end of turn, {c:Targeted} gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." | SpellDescription$ Until end of turn, target creature you control gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." Only you may activate this ability. -SVar:Martyr:AB$ Effect | Name$ Martyrdom Effect | Cost$ 0 | Activator$ Player.IsRemembered | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage from | Amount$ 1 | ReplacementEffects$ DamageEvent | Duration$ HostLeavesOrEOT | RememberObjects$ You,Targeted | ImprintCards$ Self | ExileOnMoved$ Battlefield | StackDescription$ The next 1 damage that would be dealt to {c:Targeted}{p:Targeted} this turn is dealt to {c:Self} instead. | SpellDescription$ The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to CARDNAME instead. +SVar:Martyr:AB$ Effect | Name$ Martyrdom Effect | Cost$ 0 | Activator$ Player.IsRemembered | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage from | Amount$ 1 | ReplacementEffects$ DamageEvent | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ You,Targeted | ImprintCards$ Self | ExileOnMoved$ Battlefield | StackDescription$ The next 1 damage that would be dealt to {c:Targeted}{p:Targeted} this turn is dealt to {c:Self} instead. | SpellDescription$ The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to CARDNAME instead. SVar:DamageEvent:Event$ DamageDone | IsPresent$ Card.IsImprinted+Creature | ValidTarget$ Player.IsRemembered,Card.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ Imprinted | Description$ The next 1 damage that would be dealt to this target this turn is dealt to EFFECTSOURCE instead. SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ Imprinted Oracle:Until end of turn, target creature you control gains "{0}: The next 1 damage that would be dealt to target creature, planeswalker, or player this turn is dealt to this creature instead." Only you may activate this ability. diff --git a/forge-gui/res/cardsfolder/upcoming/mascot_exhibition.txt b/forge-gui/res/cardsfolder/m/mascot_exhibition.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mascot_exhibition.txt rename to forge-gui/res/cardsfolder/m/mascot_exhibition.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mascot_interception.txt b/forge-gui/res/cardsfolder/m/mascot_interception.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mascot_interception.txt rename to forge-gui/res/cardsfolder/m/mascot_interception.txt diff --git a/forge-gui/res/cardsfolder/m/mass_diminish.txt b/forge-gui/res/cardsfolder/m/mass_diminish.txt index ec0281d5902..549d6a39cce 100644 --- a/forge-gui/res/cardsfolder/m/mass_diminish.txt +++ b/forge-gui/res/cardsfolder/m/mass_diminish.txt @@ -1,6 +1,6 @@ Name:Mass Diminish ManaCost:1 U Types:Sorcery -A:SP$ AnimateAll | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | Power$ 1 | Toughness$ 1 | IsCurse$ True | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, creatures target player controls have base power and toughness 1/1. +A:SP$ AnimateAll | Cost$ 1 U | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | Power$ 1 | Toughness$ 1 | IsCurse$ True | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures target player controls have base power and toughness 1/1. K:Flashback:3 U Oracle:Until your next turn, creatures target player controls have base power and toughness 1/1.\nFlashback {3}{U} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/m/master_biomancer.txt b/forge-gui/res/cardsfolder/m/master_biomancer.txt index f39f6ec741e..4003f5fb372 100644 --- a/forge-gui/res/cardsfolder/m/master_biomancer.txt +++ b/forge-gui/res/cardsfolder/m/master_biomancer.txt @@ -4,7 +4,7 @@ Types:Creature Elf Wizard PT:2/4 K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBAnimate | SpellDescription$ Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to CARDNAME's power and as a Mutant in addition to its other types. -SVar:DBAnimate:DB$ Animate | Types$ Mutant | Permanent$ True | Defined$ ReplacedCard +SVar:DBAnimate:DB$ Animate | Types$ Mutant | Duration$ Permanent | Defined$ ReplacedCard SVar:X:Count$CardPower DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/master_biomancer.jpg diff --git a/forge-gui/res/cardsfolder/m/master_of_cruelties.txt b/forge-gui/res/cardsfolder/m/master_of_cruelties.txt index b66f2838428..2287da73400 100644 --- a/forge-gui/res/cardsfolder/m/master_of_cruelties.txt +++ b/forge-gui/res/cardsfolder/m/master_of_cruelties.txt @@ -7,6 +7,6 @@ K:Deathtouch K:CARDNAME can only attack alone. T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | ValidDefender$ Player | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks a player and isn't blocked, that player's life total becomes 1. CARDNAME assigns no combat damage this combat. SVar:TrigDamage:DB$ SetLife | Defined$ TriggeredDefender | LifeAmount$ 1 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage | UntilEndOfCombat$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME assigns no combat damage | Duration$ UntilEndOfCombat SVar:MustBeBlocked:True Oracle:First strike, deathtouch\nMaster of Cruelties can only attack alone.\nWhenever Master of Cruelties attacks a player and isn't blocked, that player's life total becomes 1. Master of Cruelties assigns no combat damage this combat. diff --git a/forge-gui/res/cardsfolder/upcoming/master_symmetrist.txt b/forge-gui/res/cardsfolder/m/master_symmetrist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/master_symmetrist.txt rename to forge-gui/res/cardsfolder/m/master_symmetrist.txt diff --git a/forge-gui/res/cardsfolder/m/matsu_tribe_birdstalker.txt b/forge-gui/res/cardsfolder/m/matsu_tribe_birdstalker.txt index 16cafc337ce..3a74b73b5b6 100644 --- a/forge-gui/res/cardsfolder/m/matsu_tribe_birdstalker.txt +++ b/forge-gui/res/cardsfolder/m/matsu_tribe_birdstalker.txt @@ -4,7 +4,7 @@ Types:Creature Snake Warrior Archer PT:2/2 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True A:AB$ Pump | Cost$ G | KW$ Reach | Defined$ Self | SpellDescription$ CARDNAME gains reach until end of turn. (It can block creatures with flying.) SVar:HasCombatEffect:TRUE Oracle:Whenever Matsu-Tribe Birdstalker deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step.\n{G}: Matsu-Tribe Birdstalker gains reach until end of turn. (It can block creatures with flying.) diff --git a/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt b/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt index 66fabaec30f..c883365c9cd 100644 --- a/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt +++ b/forge-gui/res/cardsfolder/m/matsu_tribe_decoy.txt @@ -5,7 +5,7 @@ PT:1/3 A:AB$ MustBlock | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ AllowNonLethal | SpellDescription$ Target creature blocks CARDNAME this turn if able. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/matsu_tribe_decoy.jpg Oracle:{2}{G}: Target creature blocks Matsu-Tribe Decoy this turn if able.\nWhenever Matsu-Tribe Decoy deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/m/matsu_tribe_sniper.txt b/forge-gui/res/cardsfolder/m/matsu_tribe_sniper.txt index 266a11b16d7..2a2e18ed13b 100644 --- a/forge-gui/res/cardsfolder/m/matsu_tribe_sniper.txt +++ b/forge-gui/res/cardsfolder/m/matsu_tribe_sniper.txt @@ -5,6 +5,6 @@ PT:1/1 A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target creature with flying. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:{T}: Matsu-Tribe Sniper deals 1 damage to target creature with flying.\nWhenever Matsu-Tribe Sniper deals damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/mavinda_students_advocate.txt b/forge-gui/res/cardsfolder/m/mavinda_students_advocate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mavinda_students_advocate.txt rename to forge-gui/res/cardsfolder/m/mavinda_students_advocate.txt diff --git a/forge-gui/res/cardsfolder/m/memnarch.txt b/forge-gui/res/cardsfolder/m/memnarch.txt index d15cc21303a..4fe48dd5d1a 100644 --- a/forge-gui/res/cardsfolder/m/memnarch.txt +++ b/forge-gui/res/cardsfolder/m/memnarch.txt @@ -2,7 +2,7 @@ Name:Memnarch ManaCost:7 Types:Legendary Artifact Creature Wizard PT:4/5 -A:AB$ Animate | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | Permanent$ True | SpellDescription$ Target permanent becomes an artifact in addition to its other types. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ 1 U U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Types$ Artifact | Duration$ Permanent | SpellDescription$ Target permanent becomes an artifact in addition to its other types. (This effect lasts indefinitely.) A:AB$ GainControl | Cost$ 3 U | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Gain control of target artifact. (This effect lasts indefinitely.) AI:RemoveDeck:Random SVar:Picture:http://resources.wizards.com/magic/cards/dst/en-us/card51054.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/mentors_guidance.txt b/forge-gui/res/cardsfolder/m/mentors_guidance.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mentors_guidance.txt rename to forge-gui/res/cardsfolder/m/mentors_guidance.txt diff --git a/forge-gui/res/cardsfolder/m/merchant_raiders.txt b/forge-gui/res/cardsfolder/m/merchant_raiders.txt index 6ac4873ae23..0bae1de1472 100755 --- a/forge-gui/res/cardsfolder/m/merchant_raiders.txt +++ b/forge-gui/res/cardsfolder/m/merchant_raiders.txt @@ -4,7 +4,7 @@ Types:Creature Human Pirate PT:2/4 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self,Pirate.Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME or another Pirate enters the battlefield under your control, tap up to one target creature. That creature doesn't untap during its controller's untap step for as long as you control CARDNAME. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilLoseControlOfHost$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost SVar:PlayMain1:TRUE DeckHints:Type$Pirate Oracle:Whenever Merchant Raiders or another Pirate enters the battlefield under your control, tap up to one target creature. That creature doesn't untap during its controller's untap step for as long as you control Merchant Raiders. diff --git a/forge-gui/res/cardsfolder/m/mercurial_kite.txt b/forge-gui/res/cardsfolder/m/mercurial_kite.txt index 1fa7e43fcc9..7c349edae9f 100644 --- a/forge-gui/res/cardsfolder/m/mercurial_kite.txt +++ b/forge-gui/res/cardsfolder/m/mercurial_kite.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:Flying\nWhenever Mercurial Kite deals combat damage to a creature, tap that creature. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/mercurial_transformation.txt b/forge-gui/res/cardsfolder/m/mercurial_transformation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mercurial_transformation.txt rename to forge-gui/res/cardsfolder/m/mercurial_transformation.txt diff --git a/forge-gui/res/cardsfolder/m/metamorphic_alteration.txt b/forge-gui/res/cardsfolder/m/metamorphic_alteration.txt index 33f4c43c7e5..f7fcfad0ed3 100644 --- a/forge-gui/res/cardsfolder/m/metamorphic_alteration.txt +++ b/forge-gui/res/cardsfolder/m/metamorphic_alteration.txt @@ -4,8 +4,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature K:ETBReplacement:Other:ChooseCreature -SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SpellDescription$ As CARDNAME enters the battlefield, choose a creature. -T:Mode$ ChangesZone | ValidCard$ Card.Self | Static$ True | Origin$ Any | Destination$ Battlefield | Execute$ DBClone | TriggerDescription$ Enchanted creature is a copy of the chosen creature. -SVar:DBClone:DB$ Clone | Defined$ ChosenCard | CloneTarget$ Enchanted | Duration$ UntilUnattached | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Mandatory$ True | Choices$ Creature.Other | SpellDescription$ As CARDNAME enters the battlefield, choose a creature. +T:Mode$ Attached | ValidSource$ Card.Self | Static$ True | Execute$ DBClone | TriggerDescription$ Enchanted creature is a copy of the chosen creature. +SVar:DBClone:DB$ Clone | Defined$ ChosenCard | CloneTarget$ Enchanted | Duration$ UntilUnattached Oracle:Enchant creature\nAs Metamorphic Alteration enters the battlefield, choose a creature.\nEnchanted creature is a copy of the chosen creature. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/metathran_transport.txt b/forge-gui/res/cardsfolder/m/metathran_transport.txt index ad50eb38ffd..095a45b9b73 100644 --- a/forge-gui/res/cardsfolder/m/metathran_transport.txt +++ b/forge-gui/res/cardsfolder/m/metathran_transport.txt @@ -3,8 +3,7 @@ ManaCost:1 U U Types:Creature Metathran PT:1/3 K:Flying -K:CantBeBlockedBy Creature.Blue +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Blue | Description$ CARDNAME can't be blocked by blue creatures. A:AB$ Animate | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | SpellDescription$ Target creature becomes blue until end of turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/metathran_transport.jpg -Oracle:Flying\nMetathran Transport can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. +Oracle:Flying\nMetathran Transport can't be blocked by blue creatures.\n{U}: Target creature becomes blue until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/mila_crafty_companion_lukka_wayward_bonder.txt b/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt similarity index 98% rename from forge-gui/res/cardsfolder/upcoming/mila_crafty_companion_lukka_wayward_bonder.txt rename to forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt index 782ee488255..eee9feca0f6 100644 --- a/forge-gui/res/cardsfolder/upcoming/mila_crafty_companion_lukka_wayward_bonder.txt +++ b/forge-gui/res/cardsfolder/m/mila_crafty_companion_lukka_wayward_bonder.txt @@ -19,7 +19,7 @@ A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBDraw2 SVar:DBDraw2:DB$ Draw | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | StackDescription$ None | SubAbility$ DBCleanup A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouCtrl | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Lukka, Wayward Bonder | Image$ emblem_lukka_wayward_bonder | Triggers$ LukkaCreatureETB | SVars$ LukkaDmg | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever a creature enters the battlefield under your control, it deals damage equal to its power to any target." SVar:LukkaCreatureETB:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | TriggerZones$ Command | Execute$ LukkaDmg | TriggerDescription$ Whenever a creature enters the battlefield under your control, it deals damage equal to its power to any target. SVar:LukkaDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | DamageSource$ TriggeredCard diff --git a/forge-gui/res/cardsfolder/m/mimic_vat.txt b/forge-gui/res/cardsfolder/m/mimic_vat.txt index 412dc353d7b..3589c429be7 100644 --- a/forge-gui/res/cardsfolder/m/mimic_vat.txt +++ b/forge-gui/res/cardsfolder/m/mimic_vat.txt @@ -2,8 +2,8 @@ Name:Mimic Vat ManaCost:3 Types:Artifact T:Mode$ ChangesZone | ValidCard$ Creature.nonToken | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerZones$ Battlefield | TriggerDescription$ Imprint — Whenever a nontoken creature dies, you may exile that card. If you do, return each other card exiled with CARDNAME to its owner's graveyard. -SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ Imprinted | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | SubAbility$ DBExile +SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Graveyard | Defined$ Imprinted | SubAbility$ DBCleanup | ConditionPresent$ Card.inRealZone Graveyard | ConditionDefined$ TriggeredNewCardLKICopy | ConditionCompare$ EQ1 +SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | SubAbility$ DBExile | ConditionPresent$ Card.inRealZone Graveyard | ConditionDefined$ TriggeredNewCardLKICopy | ConditionCompare$ EQ1 SVar:DBExile:DB$ ChangeZone | Imprint$ True | Origin$ Graveyard | Destination$ Exile | Defined$ TriggeredNewCardLKICopy | AILogic$ MimicVat A:AB$ CopyPermanent | Cost$ 3 T | Defined$ Imprinted.ExiledWithSource | Choices$ Card | PumpKeywords$ Haste | AtEOT$ Exile | AILogic$ MimicVat | SpellDescription$ Create a token that's a copy of a card exiled with CARDNAME. It gains haste. Exile it at the beginning of the next end step. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsImprinted+ExiledWithSource | Execute$ DBForget diff --git a/forge-gui/res/cardsfolder/m/mind_bend.txt b/forge-gui/res/cardsfolder/m/mind_bend.txt index ec9ea948105..1820a912281 100644 --- a/forge-gui/res/cardsfolder/m/mind_bend.txt +++ b/forge-gui/res/cardsfolder/m/mind_bend.txt @@ -2,8 +2,8 @@ Name:Mind Bend ManaCost:U Types:Instant A:SP$ GenericChoice | Cost$ U | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent | Choices$ ChangeColor,ChangeType | Defined$ You | SpellDescription$ Change the text of target permanent by replacing all instances of one color word with another or one basic land type with another. (For example, you may change "nonblack creature" to "nongreen creature" or "forestwalk" to "islandwalk." This effect lasts indefinitely.) -SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change color -SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change type +SVar:ChangeColor:DB$ ChangeText | Defined$ ParentTarget | ChangeColorWord$ Choose Choose | Duration$ Permanent | SpellDescription$ Change color +SVar:ChangeType:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Duration$ Permanent | SpellDescription$ Change type AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/mind_bend.jpg diff --git a/forge-gui/res/cardsfolder/m/mindbender_spores.txt b/forge-gui/res/cardsfolder/m/mindbender_spores.txt index 07618c1c925..e1f5dd46349 100644 --- a/forge-gui/res/cardsfolder/m/mindbender_spores.txt +++ b/forge-gui/res/cardsfolder/m/mindbender_spores.txt @@ -6,7 +6,7 @@ K:Defender K:Flying T:Mode$ AttackerBlocked | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ AddSpores | TriggerDescription$ Whenever CARDNAME blocks a creature, put four fungus counters on that creature. The creature gains "This creature doesn't untap during your untap step if it has a fungus counter on it" and "At the beginning of your upkeep, remove a fungus counter from this creature." SVar:AddSpores:DB$ PutCounter | CounterType$ FUNGUS | CounterNum$ 4 | Defined$ TriggeredAttackerLKICopy | SubAbility$ AddFungalEffects -SVar:AddFungalEffects:DB$ Animate | Defined$ TriggeredAttacker | staticAbilities$ FungalFunk | Triggers$ TrigSporeUpkeep | sVars$ LoseSpores | Permanent$ True +SVar:AddFungalEffects:DB$ Animate | Defined$ TriggeredAttacker | staticAbilities$ FungalFunk | Triggers$ TrigSporeUpkeep | sVars$ LoseSpores | Duration$ Permanent SVar:FungalFunk:Mode$ Continuous | Affected$ Card.Self+counters_GE1_FUNGUS | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ CARDNAME doesn't untap during your untap step if it has a fungus counter on it. SVar:TrigSporeUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ LoseSpores | TriggerDescription$ At the beginning of your upkeep, remove a fungus counter from CARDNAME. SVar:LoseSpores:DB$ RemoveCounter | CounterType$ FUNGUS | CounterNum$ 1 diff --git a/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt b/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt index 158d8eb9f3a..37105ea4536 100644 --- a/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt +++ b/forge-gui/res/cardsfolder/m/mirrodin_besieged.txt @@ -3,10 +3,10 @@ ManaCost:2 U Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Mirran or Phyrexian.Mirran - Whenever you cast an artifact spell, create a 1/1 colorless Myr artifact creature token. Phyrexian - At the beginning of your end step, draw a card, then discard a card. Then if there are fifteen or more artifact cards in your graveyard, target opponent loses the game. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Mirran,Phyrexian | Defined$ You | SetChosenMode$ True | AILogic$ Mirran | ShowChoice$ ExceptSelf -SVar:Mirran:DB$ Animate | Defined$ Self | Triggers$ MirranTrigger | Permanent$ True | SpellDescription$ Mirran +SVar:Mirran:DB$ Animate | Defined$ Self | Triggers$ MirranTrigger | Duration$ Permanent | SpellDescription$ Mirran SVar:MirranTrigger:Mode$ SpellCast | ValidCard$ Artifact | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you cast an artifact spell, create a 1/1 colorless Myr artifact creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_a_myr | TokenOwner$ You | LegacyImage$ c 1 1 a myr mh1 -SVar:Phyrexian:DB$ Animate | Defined$ Self | Triggers$ TrigEnd | Permanent$ True | SpellDescription$ Phyrexian +SVar:Phyrexian:DB$ Animate | Defined$ Self | Triggers$ TrigEnd | Duration$ Permanent | SpellDescription$ Phyrexian SVar:TrigEnd:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ Filter | TriggerDescription$ At the beginning of your end step, draw a card, then discard a card. Then if there are fifteen or more artifact cards in your graveyard, target opponent loses the game. SVar:Filter:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 | SubAbility$ DBLose diff --git a/forge-gui/res/cardsfolder/m/mishras_groundbreaker.txt b/forge-gui/res/cardsfolder/m/mishras_groundbreaker.txt index 0cb44472314..c423cdd1bca 100644 --- a/forge-gui/res/cardsfolder/m/mishras_groundbreaker.txt +++ b/forge-gui/res/cardsfolder/m/mishras_groundbreaker.txt @@ -1,6 +1,6 @@ Name:Mishra's Groundbreaker ManaCost:4 Types:Artifact -A:AB$ Animate | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Artifact,Creature | Permanent$ True | SpellDescription$ Target land becomes a 3/3 artifact creature that's still a land. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 3 | Toughness$ 3 | Types$ Artifact,Creature | Duration$ Permanent | SpellDescription$ Target land becomes a 3/3 artifact creature that's still a land. (This effect lasts indefinitely.) SVar:Picture:http://www.wizards.com/global/images/magic/general/mishras_groundbreaker.jpg Oracle:{T}, Sacrifice Mishra's Groundbreaker: Target land becomes a 3/3 artifact creature that's still a land. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/m/misstep.txt b/forge-gui/res/cardsfolder/m/misstep.txt index 1a6a429cf71..ffda497cb68 100644 --- a/forge-gui/res/cardsfolder/m/misstep.txt +++ b/forge-gui/res/cardsfolder/m/misstep.txt @@ -1,6 +1,6 @@ Name:Misstep ManaCost:1 U Types:Sorcery -A:SP$ PumpAll | Cost$ 1 U | ValidTgts$ Player | IsCurse$ True | ValidCards$ Creature.TargetedPlayerCtrl | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | SpellDescription$ Creatures target player controls don't untap during that player's next untap step. +A:SP$ PumpAll | Cost$ 1 U | ValidTgts$ Player | IsCurse$ True | ValidCards$ Creature.TargetedPlayerCtrl | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. | SpellDescription$ Creatures target player controls don't untap during that player's next untap step. SVar:Picture:http://www.wizards.com/global/images/magic/general/misstep.jpg Oracle:Creatures target player controls don't untap during that player's next untap step. diff --git a/forge-gui/res/cardsfolder/m/mist_dragon.txt b/forge-gui/res/cardsfolder/m/mist_dragon.txt index 8407242489d..f328cbe0885 100644 --- a/forge-gui/res/cardsfolder/m/mist_dragon.txt +++ b/forge-gui/res/cardsfolder/m/mist_dragon.txt @@ -2,8 +2,8 @@ Name:Mist Dragon ManaCost:4 U U Types:Creature Dragon PT:4/4 -A:AB$ Pump | Cost$ 0 | Defined$ Self | KW$ Flying | Permanent$ True | SpellDescription$ CARDNAME gains flying. (This effect lasts indefinitely.) -A:AB$ Debuff | Cost$ 0 | Defined$ Self | Keywords$ Flying | Permanent$ True | SpellDescription$ CARDNAME loses flying. (This effect lasts indefinitely.) +A:AB$ Pump | Cost$ 0 | Defined$ Self | KW$ Flying | Duration$ Permanent | SpellDescription$ CARDNAME gains flying. (This effect lasts indefinitely.) +A:AB$ Debuff | Cost$ 0 | Defined$ Self | Keywords$ Flying | Duration$ Permanent | SpellDescription$ CARDNAME loses flying. (This effect lasts indefinitely.) A:AB$ Phases | Cost$ 3 U U | Defined$ Self | SpellDescription$ CARDNAME phases out. #TODO: the AI will currently not make Mist Dragon lose flying if it's threatened by something that targets a flying creature, might be improved. Otherwise the AI uses this card in full. SVar:Picture:http://www.wizards.com/global/images/magic/general/mist_dragon.jpg diff --git a/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt b/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt index 0d37e66a1fc..25293f6761d 100644 --- a/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt +++ b/forge-gui/res/cardsfolder/m/mist_of_stagnation.txt @@ -3,7 +3,7 @@ ManaCost:3 U U Types:Enchantment S:Mode$ Continuous | Affected$ Permanent | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Permanents don't untap during their controllers' untap steps. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of each player's upkeep, that player chooses a permanent for each card in their graveyard, then untaps those permanents. -SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Choices$ Permanent.ActivePlayerCtrl | ChoiceTitle$ Choose a permanent to untap | RememberChosen$ True | AILogic$ Untap | SubAbility$ DBUntap +SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredPlayer | Amount$ X | Mandatory$ True | Choices$ Permanent.ActivePlayerCtrl | ChoiceTitle$ Choose a permanent to untap | RememberChosen$ True | AILogic$ Untap | SubAbility$ DBUntap SVar:DBUntap:DB$ UntapAll | ValidCards$ Permanent.IsRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidGraveyard Card.ActivePlayerCtrl diff --git a/forge-gui/res/cardsfolder/m/mogg_hollows.txt b/forge-gui/res/cardsfolder/m/mogg_hollows.txt index 26f800ac13a..8ca8a96be1a 100644 --- a/forge-gui/res/cardsfolder/m/mogg_hollows.txt +++ b/forge-gui/res/cardsfolder/m/mogg_hollows.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent SVar:Picture:http://magiccards.info/scans/en/br/45.jpg Oracle:{T}: Add {C}.\n{T}: Add {R} or {G}. Mogg Hollows doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/moldering_karok.txt b/forge-gui/res/cardsfolder/m/moldering_karok.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/moldering_karok.txt rename to forge-gui/res/cardsfolder/m/moldering_karok.txt diff --git a/forge-gui/res/cardsfolder/m/molten_sentry.txt b/forge-gui/res/cardsfolder/m/molten_sentry.txt index 2e5583a5d9c..8d63502716d 100644 --- a/forge-gui/res/cardsfolder/m/molten_sentry.txt +++ b/forge-gui/res/cardsfolder/m/molten_sentry.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:*/* K:ETBReplacement:Other:TrigFlip SVar:TrigFlip:DB$ FlipACoin | NoCall$ True | HeadsSubAbility$ DBAttacker | TailsSubAbility$ DBDefender | SpellDescription$ As Molten Sentry enters the battlefield, flip a coin. If the coin comes up heads, Molten Sentry enters the battlefield as a 5/2 creature with haste. If it comes up tails, Molten Sentry enters the battlefield as a 2/5 creature with defender. -SVar:DBAttacker:DB$ Animate | Defined$ Self | Power$ 5 | Toughness$ 2 | Types$ Creature | Keywords$ Haste | Permanent$ True -SVar:DBDefender:DB$ Animate | Defined$ Self | Power$ 2 | Toughness$ 5 | Types$ Creature | Keywords$ Defender | Permanent$ True +SVar:DBAttacker:DB$ Animate | Defined$ Self | Power$ 5 | Toughness$ 2 | Types$ Creature | Keywords$ Haste | Duration$ Permanent +SVar:DBDefender:DB$ Animate | Defined$ Self | Power$ 2 | Toughness$ 5 | Types$ Creature | Keywords$ Defender | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/molten_sentry.jpg Oracle:As Molten Sentry enters the battlefield, flip a coin. If the coin comes up heads, Molten Sentry enters the battlefield as a 5/2 creature with haste. If it comes up tails, Molten Sentry enters the battlefield as a 2/5 creature with defender. diff --git a/forge-gui/res/cardsfolder/m/monastery_siege.txt b/forge-gui/res/cardsfolder/m/monastery_siege.txt index a3adb2960d2..952c090a307 100644 --- a/forge-gui/res/cardsfolder/m/monastery_siege.txt +++ b/forge-gui/res/cardsfolder/m/monastery_siege.txt @@ -3,11 +3,11 @@ ManaCost:2 U Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Khans or Dragons. Khans — At the beginning of your draw step, draw an additional card, then discard a card. Dragons — Spells your opponents cast that target you or a permanent you control cost {2} more to cast. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Khans,Dragons | Defined$ You | SetChosenMode$ True | AILogic$ Khans | ShowChoice$ ExceptSelf -SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Permanent$ True | SpellDescription$ Khans +SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Duration$ Permanent | SpellDescription$ Khans SVar:KhansTrigger:Mode$ Phase | Phase$ Draw | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ Filter | TriggerDescription$ At the beginning of your draw step, draw an additional card, then discard a card. SVar:Filter:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 -SVar:Dragons:DB$ Animate | Defined$ Self | staticAbilities$ DragonsST | Permanent$ True | SpellDescription$ Dragons +SVar:Dragons:DB$ Animate | Defined$ Self | staticAbilities$ DragonsST | Duration$ Permanent | SpellDescription$ Dragons SVar:DragonsST:Mode$ RaiseCost | ValidTarget$ You,Card.YouCtrl | Activator$ Opponent | Type$ Spell | Amount$ 2 | Description$ Spells your opponents cast that target you or a permanent you control cost {2} more to cast. SVar:Picture:http://www.wizards.com/global/images/magic/general/monasterz_siege.jpg Oracle:As Monastery Siege enters the battlefield, choose Khans or Dragons.\n• Khans — At the beginning of your draw step, draw an additional card, then discard a card.\n• Dragons — Spells your opponents cast that target you or a permanent you control cost {2} more to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/monologue_tax.txt b/forge-gui/res/cardsfolder/m/monologue_tax.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/monologue_tax.txt rename to forge-gui/res/cardsfolder/m/monologue_tax.txt diff --git a/forge-gui/res/cardsfolder/m/monomania.txt b/forge-gui/res/cardsfolder/m/monomania.txt index 76b8feda902..b56d349cc94 100644 --- a/forge-gui/res/cardsfolder/m/monomania.txt +++ b/forge-gui/res/cardsfolder/m/monomania.txt @@ -1,7 +1,7 @@ Name:Monomania ManaCost:3 B B Types:Sorcery -A:SP$ ChooseCard | Cost$ 3 B B | ValidTgts$ Player | Amount$ 1 | Choices$ Card | SubAbility$ DBDiscard | RememberChosen$ True | AILogic$ AtLeast2 | TargetControls$ True | ChoiceZone$ Hand | SpellDescription$ Target player chooses a card in their hand and discards the rest. +A:SP$ ChooseCard | Cost$ 3 B B | ValidTgts$ Player | Mandatory$ True | Choices$ Card | SubAbility$ DBDiscard | RememberChosen$ True | AILogic$ AtLeast2 | TargetControls$ True | ChoiceZone$ Hand | SpellDescription$ Target player chooses a card in their hand and discards the rest. SVar:DBDiscard:DB$ Discard | Defined$ Targeted | Mode$ NotRemembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/monomania.jpg diff --git a/forge-gui/res/cardsfolder/m/moonlace.txt b/forge-gui/res/cardsfolder/m/moonlace.txt index 094807f4378..506bf2ace05 100644 --- a/forge-gui/res/cardsfolder/m/moonlace.txt +++ b/forge-gui/res/cardsfolder/m/moonlace.txt @@ -1,7 +1,7 @@ Name:Moonlace ManaCost:U Types:Instant -A:SP$ Animate | Cost$ U | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes colorless. +A:SP$ Animate | Cost$ U | Colors$ Colorless | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes colorless. AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/moonlace.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/mortality_spear.txt b/forge-gui/res/cardsfolder/m/mortality_spear.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/mortality_spear.txt rename to forge-gui/res/cardsfolder/m/mortality_spear.txt diff --git a/forge-gui/res/cardsfolder/m/mu_yanling_celestial_wind.txt b/forge-gui/res/cardsfolder/m/mu_yanling_celestial_wind.txt index 08001bbe58d..d8843c791fe 100644 --- a/forge-gui/res/cardsfolder/m/mu_yanling_celestial_wind.txt +++ b/forge-gui/res/cardsfolder/m/mu_yanling_celestial_wind.txt @@ -2,7 +2,7 @@ Name:Mu Yanling, Celestial Wind ManaCost:4 U U Types:Legendary Planeswalker Yanling Loyalty:5 -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -5 | IsCurse$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, up to one target creature gets -5/-0. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumAtt$ -5 | IsCurse$ True | TargetMin$ 0 | TargetMax$ 1 | ValidTgts$ Creature | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, up to one target creature gets -5/-0. A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 2 | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return up to two target creatures to their owners' hands. A:AB$ PumpAll | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Creature.withFlying+YouCtrl | NumAtt$ +5 | NumDef$ +5 | SpellDescription$ Creatures you control with flying get +5/+5 until end of turn. Oracle:[+1]: Until your next turn, up to one target creature gets -5/-0.\n[−3]: Return up to two target creatures to their owners' hands.\n[−7]: Creatures you control with flying get +5/+5 until end of turn. diff --git a/forge-gui/res/cardsfolder/m/mu_yanling_sky_dancer.txt b/forge-gui/res/cardsfolder/m/mu_yanling_sky_dancer.txt index 680c8b145ff..6c793af387f 100644 --- a/forge-gui/res/cardsfolder/m/mu_yanling_sky_dancer.txt +++ b/forge-gui/res/cardsfolder/m/mu_yanling_sky_dancer.txt @@ -2,8 +2,8 @@ Name:Mu Yanling, Sky Dancer ManaCost:1 U U Types:Legendary Planeswalker Yanling Loyalty:2 -A:AB$ Pump | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1 | UntilYourNextTurn$ True | SubAbility$ DBDebuff | SpellDescription$ Until your next turn, up to one target creature gets -2/-0 and loses flying. -SVar:DBDebuff:DB$ Debuff | Defined$ Targeted | Keywords$ Flying | UntilYourNextTurn$ True +A:AB$ Pump | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | NumAtt$ -2 | IsCurse$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | TargetMin$ 0 | TargetMax$ 1 | Duration$ UntilYourNextTurn | SubAbility$ DBDebuff | SpellDescription$ Until your next turn, up to one target creature gets -2/-0 and loses flying. +SVar:DBDebuff:DB$ Debuff | Defined$ Targeted | Keywords$ Flying | Duration$ UntilYourNextTurn A:AB$ Token | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ u_4_4_elemental_bird_flying | TokenOwner$ You | LegacyImage$ u 4 4 elemental bird flying m20 | SpellDescription$ Create a 4/4 blue Elemental Bird creature token with flying. A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | AIlogic$ Always | Stackable$ False | Name$ Emblem - Mu Yanling, Sky Dancer | Image$ emblem_mu_yanling_sky_dancer | Duration$ Permanent | StaticAbilities$ STDraw | SpellDescription$ You get an emblem with "Islands you control have '{T}: Draw a card.'" SVar:STDraw:Mode$ Continuous | EffectZone$ Command | Affected$ Island.YouCtrl | AddAbility$ AnimateIsland | Description$ Islands you control have "{T}: Draw a card". diff --git a/forge-gui/res/cardsfolder/m/mudbrawler_raiders.txt b/forge-gui/res/cardsfolder/m/mudbrawler_raiders.txt index 32211b184d3..3d7c5dc9aaf 100644 --- a/forge-gui/res/cardsfolder/m/mudbrawler_raiders.txt +++ b/forge-gui/res/cardsfolder/m/mudbrawler_raiders.txt @@ -2,6 +2,5 @@ Name:Mudbrawler Raiders ManaCost:2 RG RG Types:Creature Goblin Warrior PT:3/3 -K:CantBeBlockedBy Creature.Blue -SVar:Picture:http://www.wizards.com/global/images/magic/general/mudbrawler_raiders.jpg -Oracle:Mudbrawler Raiders can't be blocked by blue creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Blue | Description$ CARDNAME can't be blocked by blue creatures. +Oracle:Mudbrawler Raiders can't be blocked by blue creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/multiple_choice.txt b/forge-gui/res/cardsfolder/m/multiple_choice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/multiple_choice.txt rename to forge-gui/res/cardsfolder/m/multiple_choice.txt diff --git a/forge-gui/res/cardsfolder/m/murasa.txt b/forge-gui/res/cardsfolder/m/murasa.txt index 8f23f708f9b..2b320583755 100644 --- a/forge-gui/res/cardsfolder/m/murasa.txt +++ b/forge-gui/res/cardsfolder/m/murasa.txt @@ -4,7 +4,7 @@ Types:Plane Zendikar T:Mode$ ChangesZone | ValidCard$ Creature.nonToken | Origin$ Any | Destination$ Battlefield | TriggerZones$ Command | Execute$ TrigRamp | OptionalDecider$ TriggeredCardController | TriggerDescription$ Whenever a nontoken creature enters the battlefield, its controller may search their library for a basic land card, put it onto the battlefield tapped, then shuffle. SVar:TrigRamp:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | DefinedPlayer$ TriggeredCardController | ShuffleNonMandatory$ True T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, target land becomes a 4/4 creature that's still a land. -SVar:RolledChaos:DB$ Animate | ValidTgts$ Land | Power$ 4 | Toughness$ 4 | Types$ Creature | Permanent$ True +SVar:RolledChaos:DB$ Animate | ValidTgts$ Land | Power$ 4 | Toughness$ 4 | Types$ Creature | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/murasa.jpg SVar:AIRollPlanarDieParams:Mode$ Always Oracle:Whenever a nontoken creature enters the battlefield, its controller may search their library for a basic land card, put it onto the battlefield tapped, then shuffle.\nWhenever you roll {CHAOS}, target land becomes a 4/4 creature that's still a land. diff --git a/forge-gui/res/cardsfolder/m/murk_dwellers.txt b/forge-gui/res/cardsfolder/m/murk_dwellers.txt index 9db39d4c2a0..afa7bab2fa9 100644 --- a/forge-gui/res/cardsfolder/m/murk_dwellers.txt +++ b/forge-gui/res/cardsfolder/m/murk_dwellers.txt @@ -3,5 +3,5 @@ ManaCost:3 B Types:Creature Zombie PT:2/2 T:Mode$ AttackerUnblocked | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks and isn't blocked, it gets +2/+0 until end of combat. -SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +2 | UntilEndOfCombat$ True +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ +2 | Duration$ UntilEndOfCombat Oracle:Whenever Murk Dwellers attacks and isn't blocked, it gets +2/+0 until end of combat. diff --git a/forge-gui/res/cardsfolder/upcoming/muse_vortex.txt b/forge-gui/res/cardsfolder/m/muse_vortex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/muse_vortex.txt rename to forge-gui/res/cardsfolder/m/muse_vortex.txt diff --git a/forge-gui/res/cardsfolder/m/musician.txt b/forge-gui/res/cardsfolder/m/musician.txt index e99a1651171..707fcd3d8e6 100644 --- a/forge-gui/res/cardsfolder/m/musician.txt +++ b/forge-gui/res/cardsfolder/m/musician.txt @@ -4,7 +4,7 @@ Types:Creature Human Wizard PT:1/3 K:Cumulative upkeep:1 A:AB$ PutCounter | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | CounterType$ MUSIC | CounterNum$ 1 | SubAbility$ PayThePiper | SpellDescription$ Put a music counter on target creature. If it doesn't have "At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it," it gains that ability. -SVar:PayThePiper:DB$ Animate | Defined$ Targeted | Permanent$ True | Keywords$ At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | Triggers$ TrigMusicianPay | sVars$ MusiciansSpite,MusicX | ConditionDefined$ Targeted | ConditionPresent$ Card.withoutAt the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | ConditionCompare$ GE1 +SVar:PayThePiper:DB$ Animate | Defined$ Targeted | Duration$ Permanent | Keywords$ At the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | Triggers$ TrigMusicianPay | sVars$ MusiciansSpite,MusicX | ConditionDefined$ Targeted | ConditionPresent$ Card.withoutAt the beginning of your upkeep, destroy this creature unless you pay {1} for each music counter on it | ConditionCompare$ GE1 #The keyword added does nothing itself other than create a keyword string to check against in the conditional SVar:TrigMusicianPay:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ MusiciansSpite | Secondary$ True | TriggerDescription$ At the beginning of your upkeep, destroy this creature unless you pay 1 for each music counter on it. SVar:MusiciansSpite:DB$ Destroy | Defined$ Self | UnlessCost$ MusicX | UnlessPayer$ You diff --git a/forge-gui/res/cardsfolder/m/mutiny.txt b/forge-gui/res/cardsfolder/m/mutiny.txt index 45ca72f5c1d..04501e24088 100644 --- a/forge-gui/res/cardsfolder/m/mutiny.txt +++ b/forge-gui/res/cardsfolder/m/mutiny.txt @@ -5,5 +5,5 @@ A:SP$ Pump | Cost$ R | ValidTgts$ Creature.OppCtrl | AILogic$ PowerDmg | TgtProm SVar:MutinyDamage:DB$ DealDamage | ValidTgts$ Creature.OppCtrl | TargetUnique$ True | AILogic$ PowerDmg | NumDmg$ X | DamageSource$ ParentTarget SVar:X:ParentTargeted$CardPower SVar:Picture:http://www.wizards.com/global/images/magic/general/mutiny.jpg -//Not perfect yet, there seems to be no check whether the creature's controller is the same? +//TODO Not perfect yet, there seems to be no check whether the creature's controller is the same? Oracle:Target creature an opponent controls deals damage equal to its power to another target creature that player controls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/m/mythos_of_vadrok.txt b/forge-gui/res/cardsfolder/m/mythos_of_vadrok.txt index a32b0640564..7f4dacf84c0 100644 --- a/forge-gui/res/cardsfolder/m/mythos_of_vadrok.txt +++ b/forge-gui/res/cardsfolder/m/mythos_of_vadrok.txt @@ -2,5 +2,5 @@ Name:Mythos of Vadrok ManaCost:2 R R Types:Sorcery A:SP$ DealDamage | Cost$ 2 R R | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select any number of target creatures or planeswalkers to distribute damage to | NumDmg$ 5 | TargetMin$ 1 | TargetMax$ 5 | DividedAsYouChoose$ 5 | SubAbility$ DBPump | StackDescription$ SpellDescription | SpellDescription$ CARDNAME deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers. If {W}{U} was spent to cast this spell, until your next turn, those permanents can't attack or block and their activated abilities can't be activated. -SVar:DBPump:DB$ Pump | Defined$ Targeted | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | ConditionManaSpent$ W U | StackDescription$ None +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ UntilYourNextTurn | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | ConditionManaSpent$ W U | StackDescription$ None Oracle:Mythos of Vadrok deals 5 damage divided as you choose among any number of target creatures and/or planeswalkers. If {W}{U} was spent to cast this spell, until your next turn, those permanents can't attack or block and their activated abilities can't be activated. diff --git a/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt b/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt index 4c784a36def..037d7ade476 100644 --- a/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt +++ b/forge-gui/res/cardsfolder/n/nahiri_the_harbinger.txt @@ -7,7 +7,7 @@ SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Enchantment,Artifact.tapped,Creature.tapped | TgtPrompt$ Select target enchantment, tapped artifact, or tapped creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target enchantment, tapped artifact, or tapped creature. A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact,Creature | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ DBPump | SpellDescription$ Search your library for an artifact or creature card, put it onto the battlefield, then shuffle. It gains haste. Return it to your hand at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Permanent$ True | AtEOT$ Hand | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Duration$ Permanent | AtEOT$ Hand | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Discard SVar:Picture:http://www.wizards.com/global/images/magic/general/nahiri_the_harbinger.jpg diff --git a/forge-gui/res/cardsfolder/n/natures_blessing.txt b/forge-gui/res/cardsfolder/n/natures_blessing.txt index b3271e1113f..1e4d40fda09 100644 --- a/forge-gui/res/cardsfolder/n/natures_blessing.txt +++ b/forge-gui/res/cardsfolder/n/natures_blessing.txt @@ -3,9 +3,9 @@ ManaCost:2 G W Types:Enchantment A:AB$ GenericChoice | Cost$ G W Discard<1/Card> | ValidTgts$ Creature | Defined$ You | Choices$ DBPutCounter,DBBanding,DBFirstStrike,DBTrample | SpellDescription$ Put a +1/+1 counter on target creature or that creature gains banding, first strike, or trample. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. -SVar:DBBanding:DB$ Pump | Defined$ Targeted | KW$ Banding | Permanent$ True | SpellDescription$ Target creature gains Banding -SVar:DBFirstStrike:DB$ Pump | Defined$ Targeted | KW$ First Strike | Permanent$ True | SpellDescription$ Target creature gains First Strike -SVar:DBTrample:DB$ Pump | Defined$ Targeted | KW$ Trample | Permanent$ True | SpellDescription$ Target creature gains Trample +SVar:DBBanding:DB$ Pump | Defined$ Targeted | KW$ Banding | Duration$ Permanent | SpellDescription$ Target creature gains Banding +SVar:DBFirstStrike:DB$ Pump | Defined$ Targeted | KW$ First Strike | Duration$ Permanent | SpellDescription$ Target creature gains First Strike +SVar:DBTrample:DB$ Pump | Defined$ Targeted | KW$ Trample | Duration$ Permanent | SpellDescription$ Target creature gains Trample AI:RemoveDeck:All SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/natures_blessing.jpg diff --git a/forge-gui/res/cardsfolder/n/naya_soulbeast.txt b/forge-gui/res/cardsfolder/n/naya_soulbeast.txt index b962a79ca6e..ef587395942 100644 --- a/forge-gui/res/cardsfolder/n/naya_soulbeast.txt +++ b/forge-gui/res/cardsfolder/n/naya_soulbeast.txt @@ -2,15 +2,14 @@ Name:Naya Soulbeast ManaCost:6 G G Types:Creature Beast PT:0/0 -K:Trample -T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ Trample +T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When you cast this spell, each player reveals the top card of their library. SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBReveal SVar:DBReveal:DB$ Dig | Defined$ Player.IsRemembered | DigNum$ 1 | Reveal$ True | NoMove$ True | RememberRevealed$ True -R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ SoulbestETB | Secondary$ True | Description$ CARDNAME enters the battlefield with X +1/+1 counters on it, where X is the total mana value of all cards revealed this way. -SVar:SoulbestETB:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard | SubAbility$ SoulbestCounters -SVar:SoulbestCounters:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup +K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with X +1/+1 counters on it, where X is the total mana value of all cards revealed this way. +SVar:X:Remembered$SumCMC +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBCleanup | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Remembered$CardManaCost +K:Trample AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/naya_soulbeast.jpg +DeckHas:Ability$Counters Oracle:When you cast this spell, each player reveals the top card of their library. Naya Soulbeast enters the battlefield with X +1/+1 counters on it, where X is the total mana value of all cards revealed this way.\nTrample diff --git a/forge-gui/res/cardsfolder/n/necravolver.txt b/forge-gui/res/cardsfolder/n/necravolver.txt index 2d5d3109f73..01dc999cc82 100644 --- a/forge-gui/res/cardsfolder/n/necravolver.txt +++ b/forge-gui/res/cardsfolder/n/necravolver.txt @@ -6,9 +6,9 @@ K:Kicker:1 G:W K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverStomp | SpellDescription$ If CARDNAME was kicked with its {1}{G} kicker, it enters the battlefield with two +1/+1 counters on it and with trample. -SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True +SVar:VolverStomp:DB$ Animate | Defined$ Self | Keywords$ Trample | Duration$ Permanent SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {W} kicker, it enters the battlefield with a +1/+1 counter on it and with "Whenever CARDNAME deals damage, you gain that much life." -SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Permanent$ True +SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Duration$ Permanent SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX SVar:VolverX:TriggerCount$DamageAmount diff --git a/forge-gui/res/cardsfolder/upcoming/necroblossom_snarl.txt b/forge-gui/res/cardsfolder/n/necroblossom_snarl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/necroblossom_snarl.txt rename to forge-gui/res/cardsfolder/n/necroblossom_snarl.txt diff --git a/forge-gui/res/cardsfolder/n/necromancy.txt b/forge-gui/res/cardsfolder/n/necromancy.txt index ed8612cbcf6..b736fee6097 100644 --- a/forge-gui/res/cardsfolder/n/necromancy.txt +++ b/forge-gui/res/cardsfolder/n/necromancy.txt @@ -4,7 +4,7 @@ Types:Enchantment K:MayFlashSac T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RaiseDead | TriggerDescription$ When CARDNAME enters the battlefield, if it's on the battlefield, it becomes an Aura with "enchant creature put onto the battlefield with CARDNAME." Put target creature card from a graveyard onto the battlefield under your control and attach CARDNAME to it SVar:RaiseDead:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | RememberChanged$ True | TgtPrompt$ Select target creature card in a graveyard | ValidTgts$ Creature | ChangeNum$ 1 | SubAbility$ Aurify -SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | Permanent$ True | SubAbility$ NecromAttach +SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature put onto the battlefield with CARDNAME | Duration$ Permanent | SubAbility$ NecromAttach SVar:NewAttach:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature.IsRemembered | AILogic$ Pump SVar:NecromAttach:DB$ Attach | Defined$ Remembered T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigSac | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, enchanted permanent's controller sacrifices it. diff --git a/forge-gui/res/cardsfolder/n/necromantic_selection.txt b/forge-gui/res/cardsfolder/n/necromantic_selection.txt index 777556b2fd4..1b0dba47240 100644 --- a/forge-gui/res/cardsfolder/n/necromantic_selection.txt +++ b/forge-gui/res/cardsfolder/n/necromantic_selection.txt @@ -5,7 +5,7 @@ A:SP$ DestroyAll | Cost$ 4 B B B | ValidCards$ Creature | RememberDestroyed$ Tru SVar:TrigImprint:DB$ Pump | ImprintCards$ Remembered | SubAbility$ DBClearRemember | StackDescription$ None SVar:DBClearRemember:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBReturn SVar:DBReturn:DB$ ChangeZone | ChangeType$ Creature.nonToken+IsImprinted | ChangeNum$ 1 | Hidden$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | AnimateSubAbility$ DBZombify | SubAbility$ DBCleanup -SVar:DBZombify:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:DBZombify:DB$ Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | StackDescription$ None Oracle:Destroy all creatures, then return a creature card put into a graveyard this way to the battlefield under your control. It's a black Zombie in addition to its other colors and types. Exile Necromantic Selection. diff --git a/forge-gui/res/cardsfolder/upcoming/necrotic_fumes.txt b/forge-gui/res/cardsfolder/n/necrotic_fumes.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/necrotic_fumes.txt rename to forge-gui/res/cardsfolder/n/necrotic_fumes.txt diff --git a/forge-gui/res/cardsfolder/upcoming/needlethorn_drake.txt b/forge-gui/res/cardsfolder/n/needlethorn_drake.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/needlethorn_drake.txt rename to forge-gui/res/cardsfolder/n/needlethorn_drake.txt diff --git a/forge-gui/res/cardsfolder/n/neko_te.txt b/forge-gui/res/cardsfolder/n/neko_te.txt index b463a86ca26..f4ba6188ab0 100644 --- a/forge-gui/res/cardsfolder/n/neko_te.txt +++ b/forge-gui/res/cardsfolder/n/neko_te.txt @@ -4,7 +4,7 @@ Types:Artifact Equipment K:Equip:2 T:Mode$ DamageDone | ValidSource$ Card.EquippedBy | ValidTarget$ Creature | Execute$ TrigNekoTeTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals damage to a creature, tap that creature. That creature doesn't untap during its controller's untap step for as long as CARDNAME remains on the battlefield. SVar:TrigNekoTeTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBNekoTeAnimate -SVar:DBNekoTeAnimate:DB$ Animate | Defined$ TriggeredTarget | HiddenKeywords$ CARDNAME doesn't untap during your untap step. | UntilHostLeavesPlay$ True +SVar:DBNekoTeAnimate:DB$ Animate | Defined$ TriggeredTarget | HiddenKeywords$ CARDNAME doesn't untap during your untap step. | Duration$ UntilHostLeavesPlay T:Mode$ DamageDone | ValidSource$ Card.EquippedBy | ValidTarget$ Player | Execute$ TrigNekoTeLoseLife | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals damage to a player, that player loses 1 life. SVar:TrigNekoTeLoseLife:DB$ LoseLife | LifeAmount$ 1 | Defined$ TriggeredTarget SVar:Picture:http://www.wizards.com/global/images/magic/general/neko_te.jpg diff --git a/forge-gui/res/cardsfolder/n/new_blood.txt b/forge-gui/res/cardsfolder/n/new_blood.txt index 405e3f1b67f..0c35a1e33a8 100644 --- a/forge-gui/res/cardsfolder/n/new_blood.txt +++ b/forge-gui/res/cardsfolder/n/new_blood.txt @@ -2,7 +2,7 @@ Name:New Blood ManaCost:2 B B Types:Sorcery A:SP$ GainControl | Cost$ 2 B B tapXType<1/Vampire> | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBChangeText | SpellDescription$ Gain control of target creature. Change the text of that creature by replacing all instances of one creature type with Vampire. -SVar:DBChangeText:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseCreatureType Vampire | Permanent$ True +SVar:DBChangeText:DB$ ChangeText | Defined$ ParentTarget | ChangeTypeWord$ ChooseCreatureType Vampire | Duration$ Permanent DeckHints:Type$Vampire SVar:Picture:http://www.wizards.com/global/images/magic/general/new_blood.jpg Oracle:As an additional cost to cast this spell, tap an untapped Vampire you control.\nGain control of target creature. Change the text of that creature by replacing all instances of one creature type with Vampire. diff --git a/forge-gui/res/cardsfolder/n/new_prahv_guildmage.txt b/forge-gui/res/cardsfolder/n/new_prahv_guildmage.txt index 997dc784c1a..070e5caaed0 100644 --- a/forge-gui/res/cardsfolder/n/new_prahv_guildmage.txt +++ b/forge-gui/res/cardsfolder/n/new_prahv_guildmage.txt @@ -3,6 +3,6 @@ ManaCost:W U Types:Creature Human Wizard PT:2/2 A:AB$ Pump | Cost$ W U | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Flying | SpellDescription$ Target creature gains flying until end of turn. -A:AB$ Pump | Cost$ 3 W U | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent your opponent controls to detain. | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | AILogic$ DetainNonLand | SpellDescription$ Detain target nonland permanent an opponent controls. (Until your next turn, that permanent can't attack or block and its activated abilities can't be activated.) +A:AB$ Pump | Cost$ 3 W U | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent your opponent controls to detain. | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | AILogic$ DetainNonLand | SpellDescription$ Detain target nonland permanent an opponent controls. (Until your next turn, that permanent can't attack or block and its activated abilities can't be activated.) SVar:Picture:http://www.wizards.com/global/images/magic/general/new_prahv_guildmage.jpg Oracle:{W}{U}: Target creature gains flying until end of turn.\n{3}{W}{U}: Detain target nonland permanent an opponent controls. (Until your next turn, that permanent can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt b/forge-gui/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt index 5ef3a0cb5a9..f53192013cc 100644 --- a/forge-gui/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt +++ b/forge-gui/res/cardsfolder/n/nezumi_graverobber_nighteyes_the_desecrator.txt @@ -2,11 +2,10 @@ Name:Nezumi Graverobber ManaCost:1 B Types:Creature Rat Rogue PT:2/1 -A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | SubAbility$ DBFlip | SpellDescription$ Exile target card from an opponent's graveyard. If no cards are in that graveyard, flip CARDNAME. -SVar:DBFlip:DB$SetState | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | Mode$ Flip -SVar:X:Count$InOppYard +A:AB$ ChangeZone | Cost$ 1 B | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card.OppOwn | TgtPrompt$ Select target card in an opponent's graveyard | SubAbility$ DBFlip | SpellDescription$ Exile target card from an opponent's graveyard. If no cards are in that graveyard, flip CARDNAME. +SVar:DBFlip:DB$ SetState | Defined$ Self | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | Mode$ Flip +SVar:X:Count$ValidGraveyard Card.TargetedControllerCtrl AlternateMode:Flip -SVar:Picture:http://www.wizards.com/global/images/magic/general/nezumi_graverobber.jpg Oracle:{1}{B}: Exile target card from an opponent's graveyard. If no cards are in that graveyard, flip Nezumi Graverobber. ALTERNATE @@ -16,6 +15,5 @@ ManaCost:1 B Colors:black Types:Legendary Creature Rat Wizard PT:4/2 -A:AB$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature. | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. -SVar:Picture:http://www.wizards.com/global/images/magic/general/nighteyes_the_desecrator.jpg +A:AB$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature card in a graveyard | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. Oracle:{4}{B}: Put target creature card from a graveyard onto the battlefield under your control. diff --git a/forge-gui/res/cardsfolder/n/niblis_of_frost.txt b/forge-gui/res/cardsfolder/n/niblis_of_frost.txt index c0623f7cbb1..1fe44fea6dd 100644 --- a/forge-gui/res/cardsfolder/n/niblis_of_frost.txt +++ b/forge-gui/res/cardsfolder/n/niblis_of_frost.txt @@ -6,7 +6,7 @@ K:Flying K:Prowess T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever you cast an instant or sorcery spell, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:BuffedBy:Instant,Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/niblis_of_frost.jpg Oracle:Flying\nProwess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nWhenever you cast an instant or sorcery spell, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/nils_discipline_enforcer.txt b/forge-gui/res/cardsfolder/n/nils_discipline_enforcer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/nils_discipline_enforcer.txt rename to forge-gui/res/cardsfolder/n/nils_discipline_enforcer.txt diff --git a/forge-gui/res/cardsfolder/n/nine_lives.txt b/forge-gui/res/cardsfolder/n/nine_lives.txt index 529537187af..0d9710345e0 100644 --- a/forge-gui/res/cardsfolder/n/nine_lives.txt +++ b/forge-gui/res/cardsfolder/n/nine_lives.txt @@ -2,7 +2,7 @@ Name:Nine Lives ManaCost:1 W W Types:Enchantment K:Hexproof -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card,Emblem | ValidTarget$ You | PreventionEffect$ True | ReplaceWith$ AddCounters | Description$ If a source would deal damage to you, prevent that damage and put an incarnation counter on CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card,Emblem | ValidTarget$ You | PreventionEffect$ True | ReplaceWith$ AddCounters | AlwaysReplace$ True | ExecuteMode$ PerSource | Description$ If a source would deal damage to you, prevent that damage and put an incarnation counter on CARDNAME. SVar:AddCounters:DB$ PutCounter | Defined$ Self | CounterType$ INCARNATION | CounterNum$ 1 T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Card.Self+counters_GE9_INCARNATION | Execute$ TrigExile | TriggerDescription$ When there are nine or more incarnation counters on CARDNAME, exile it. SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ Self diff --git a/forge-gui/res/cardsfolder/n/nissa_vastwood_seer_nissa_sage_animist.txt b/forge-gui/res/cardsfolder/n/nissa_vastwood_seer_nissa_sage_animist.txt index cc4473cd156..458d6e349da 100644 --- a/forge-gui/res/cardsfolder/n/nissa_vastwood_seer_nissa_sage_animist.txt +++ b/forge-gui/res/cardsfolder/n/nissa_vastwood_seer_nissa_sage_animist.txt @@ -22,7 +22,7 @@ Loyalty:3 A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 1 | Reveal$ True | ChangeNum$ All | ChangeValid$ Land | DestinationZone$ Battlefield | DestinationZone2$ Hand | SpellDescription$ Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand. A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | LegacyImage$ ashaya the awoken world ori | TokenScript$ ashaya_the_awoken_world | TokenOwner$ You | SpellDescription$ Create Ashaya, the Awoken World, a legendary 4/4 green Elemental creature token. A:AB$ Untap | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Land | TgtPrompt$ Choose target land | TargetMin$ 0 | TargetMax$ 6 | RememberTargets$ True | SubAbility$ DBAnimate | SpellDescription$ Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 6 | Toughness$ 6 | Types$ Creature,Elemental | Permanent$ True | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 6 | Toughness$ 6 | Types$ Creature,Elemental | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/nissa_sage_animist.jpg Oracle:[+1]: Reveal the top card of your library. If it's a land card, put it onto the battlefield. Otherwise, put it into your hand.\n[−2]: Create Ashaya, the Awoken World, a legendary 4/4 green Elemental creature token.\n[−7]: Untap up to six target lands. They become 6/6 Elemental creatures. They're still lands. diff --git a/forge-gui/res/cardsfolder/n/nissa_vital_force.txt b/forge-gui/res/cardsfolder/n/nissa_vital_force.txt index 1dd0503b36e..340f3940512 100644 --- a/forge-gui/res/cardsfolder/n/nissa_vital_force.txt +++ b/forge-gui/res/cardsfolder/n/nissa_vital_force.txt @@ -3,7 +3,7 @@ ManaCost:3 G G Types:Legendary Planeswalker Nissa Loyalty:5 A:AB$ Untap | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | SubAbility$ DBAnimate | SpellDescription$ Untap target land you control. Until your next turn, it becomes a 5/5 Elemental creature with haste. It's still a land. -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 5 | Toughness$ 5 | Types$ Creature,Elemental | UntilYourNextTurn$ True | Keywords$ Haste +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 5 | Toughness$ 5 | Types$ Creature,Elemental | Duration$ UntilYourNextTurn | Keywords$ Haste A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target permanent card in your graveyard | ValidTgts$ Permanent.YouCtrl | SpellDescription$ Return target permanent card from your graveyard to your hand. A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Nissa, Vital Force | Image$ emblem_nissa_vital_force | Triggers$ TrigDraw | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever a land enters the battlefield under your control, you may draw a card." SVar:TrigDraw:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ DBDraw | OptionalDecider$ You | TriggerZones$ Command | TriggerDescription$ Whenever a land enters the battlefield under your control, you may draw a card. diff --git a/forge-gui/res/cardsfolder/n/nissa_who_shakes_the_world.txt b/forge-gui/res/cardsfolder/n/nissa_who_shakes_the_world.txt index 14f8cc4173d..1c21feda48d 100644 --- a/forge-gui/res/cardsfolder/n/nissa_who_shakes_the_world.txt +++ b/forge-gui/res/cardsfolder/n/nissa_who_shakes_the_world.txt @@ -6,7 +6,7 @@ T:Mode$ TapsForMana | ValidCard$ Forest | Activator$ You | Execute$ TrigMana | T SVar:TrigMana:DB$ Mana | Produced$ G | Amount$ 1 A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | CounterType$ P1P1 | CounterNum$ 3 | ValidTgts$ Land.nonCreature+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target noncreature land you control | SubAbility$ DBUntap | SpellDescription$ Put three +1/+1 counters on up to one target noncreature land you control. Untap it. It becomes a 0/0 Elemental creature with vigilance and haste that's still a land. SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Vigilance & Haste | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Vigilance & Haste | Duration$ Permanent A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Name$ Emblem - Nissa, Who Shakes the World | Image$ emblem_nissa_who_shakes_the_world | Duration$ Permanent | Stackable$ False | Planeswalker$ True | Ultimate$ True | StaticAbilities$ STIndestructible | SubAbility$ DBChangeZone | SpellDescription$ You get an emblem with "Lands you control have indestructible." Search your library for any number of Forest cards, put them onto the battlefield tapped, then shuffle. SVar:STIndestructible:Mode$ Continuous | EffectZone$ Command | Affected$ Land.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible | Description$ Lands you control have indestructible. SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ XFetch | Tapped$ True | StackDescription$ Search your library for any number of Forest cards, put them onto the battlefield tapped, then shuffle. diff --git a/forge-gui/res/cardsfolder/n/nissa_worldwaker.txt b/forge-gui/res/cardsfolder/n/nissa_worldwaker.txt index 9c1b77fda09..b0cf047eb95 100644 --- a/forge-gui/res/cardsfolder/n/nissa_worldwaker.txt +++ b/forge-gui/res/cardsfolder/n/nissa_worldwaker.txt @@ -2,10 +2,10 @@ Name:Nissa, Worldwaker ManaCost:3 G G Types:Legendary Planeswalker Nissa Loyalty:3 -A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Permanent$ True | Keywords$ Trample | SpellDescription$ Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Duration$ Permanent | Keywords$ Trample | SpellDescription$ Target land you control becomes a 4/4 Elemental creature with trample. It's still a land. A:AB$ Untap | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Forest | TgtPrompt$ Choose target forest | TargetMin$ 0 | TargetMax$ 4 | Planeswalker$ True | SpellDescription$ Untap up to four target Forests. A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ XFetch | Planeswalker$ True | Ultimate$ True | StackDescription$ SpellDescription | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Search your library for any number of basic land cards, put them onto the battlefield, then shuffle. Those lands become 4/4 Elemental creatures with trample. They're still lands. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Permanent$ True | Keywords$ Trample | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental | Duration$ Permanent | Keywords$ Trample | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:XFetch:Count$ValidLibrary Land.Basic+YouCtrl SVar:Picture:http://www.wizards.com/global/images/magic/general/nissa_worldwaker.jpg diff --git a/forge-gui/res/cardsfolder/n/noggle_bandit.txt b/forge-gui/res/cardsfolder/n/noggle_bandit.txt index 30b3d43874a..1139bf1c155 100644 --- a/forge-gui/res/cardsfolder/n/noggle_bandit.txt +++ b/forge-gui/res/cardsfolder/n/noggle_bandit.txt @@ -2,6 +2,5 @@ Name:Noggle Bandit ManaCost:1 UR UR Types:Creature Noggle Rogue PT:2/2 -K:CantBeBlockedBy Creature.withoutDefender -SVar:Picture:http://www.wizards.com/global/images/magic/general/noggle_bandit.jpg -Oracle:Noggle Bandit can't be blocked except by creatures with defender. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutDefender | Description$ CARDNAME can't be blocked except by creatures with defender. +Oracle:Noggle Bandit can't be blocked except by creatures with defender. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/n/nomads_en_kor.txt b/forge-gui/res/cardsfolder/n/nomads_en_kor.txt index 0a3a7d56481..05fc862d40a 100644 --- a/forge-gui/res/cardsfolder/n/nomads_en_kor.txt +++ b/forge-gui/res/cardsfolder/n/nomads_en_kor.txt @@ -2,7 +2,7 @@ Name:Nomads en-Kor ManaCost:W Types:Creature Kor Nomad Soldier PT:1/1 -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/n/nothing_can_stop_me_now.txt b/forge-gui/res/cardsfolder/n/nothing_can_stop_me_now.txt index 6a16399dad8..b8e0046aa6d 100644 --- a/forge-gui/res/cardsfolder/n/nothing_can_stop_me_now.txt +++ b/forge-gui/res/cardsfolder/n/nothing_can_stop_me_now.txt @@ -2,9 +2,9 @@ Name:Nothing Can Stop Me Now ManaCost:no cost Types:Ongoing Scheme Text:(An ongoing scheme remains face up until it's abandoned.) -S:Mode$ PreventDamage | EffectZone$ Command | Target$ You | Source$ Card.OppCtrl | Amount$ 1 | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. +R:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 T:Mode$ Phase | Phase$ End of Turn | CheckSVar$ X | SVarCompare$ GE5 | TriggerZones$ Command | Execute$ Abandon | TriggerDescription$ At the beginning of each end step, if you've been dealt 5 or more damage this turn, abandon this scheme. SVar:Abandon:AB$ Abandon | Cost$ 0 SVar:X:Count$YourDamageThisTurn -SVar:Picture:https://downloads.cardforge.org/images/cards/ARC/Nothing Can Stop Me Now.full.jpg Oracle:(An ongoing scheme remains face up until it's abandoned.)\nIf a source an opponent controls would deal damage to you, prevent 1 of that damage.\nAt the beginning of each end step, if you've been dealt 5 or more damage this turn, abandon this scheme. diff --git a/forge-gui/res/cardsfolder/n/nova_pentacle.txt b/forge-gui/res/cardsfolder/n/nova_pentacle.txt index fa73bfbe8ae..ffa22361092 100644 --- a/forge-gui/res/cardsfolder/n/nova_pentacle.txt +++ b/forge-gui/res/cardsfolder/n/nova_pentacle.txt @@ -2,7 +2,7 @@ Name:Nova Pentacle ManaCost: 4 Types:Artifact A:AB$ ChooseSource | Cost$ 3 T | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead. -SVar:DBEffect:DB$ Effect | TargetingPlayer$ Player.Opponent | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 | AILogic$ RedirectFromOppToCreature +SVar:DBEffect:DB$ Effect | TargetingPlayer$ Player.Opponent | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 | AILogic$ RedirectFromOppToCreature SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ You | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ Remembered | Description$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to target creature of an opponent's choice instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card | SubAbility$ ExileEffect #Zone Change for the source of your choice diff --git a/forge-gui/res/cardsfolder/n/novellamental.txt b/forge-gui/res/cardsfolder/n/novellamental.txt index 4d4d1fbab42..670f008b852 100644 --- a/forge-gui/res/cardsfolder/n/novellamental.txt +++ b/forge-gui/res/cardsfolder/n/novellamental.txt @@ -1,7 +1,7 @@ Name:Novellamental ManaCost:1 U Types:Creature Elemental -K:Flying -K:CARDNAME can block only creatures with flying. -Oracle:Flying\nNovellamental can block only creatures with flying. PT:2/1 +K:Flying +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. +Oracle:Flying\nNovellamental can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/novice_dissector.txt b/forge-gui/res/cardsfolder/n/novice_dissector.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/novice_dissector.txt rename to forge-gui/res/cardsfolder/n/novice_dissector.txt diff --git a/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt b/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt index e5f0991f55c..e5f00c5e6ce 100644 --- a/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt +++ b/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Merfolk Ally PT:4/4 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent SVar:BuffedBy:Instant,Sorcery SVar:Picture:http://www.wizards.com/global/images/magic/general/noyan_dar_roil_shaper.jpg Oracle:Whenever you cast an instant or sorcery spell, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/cardsfolder/n/nurturing_licid.txt b/forge-gui/res/cardsfolder/n/nurturing_licid.txt index a7ed9f2d568..151635494f6 100644 --- a/forge-gui/res/cardsfolder/n/nurturing_licid.txt +++ b/forge-gui/res/cardsfolder/n/nurturing_licid.txt @@ -2,7 +2,7 @@ Name:Nurturing Licid ManaCost:1 G Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ G | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. +A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ G | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature A:AB$ Regenerate | Cost$ G | Defined$ Enchanted | SpellDescription$ Regenerate enchanted creature. diff --git a/forge-gui/res/cardsfolder/n/nyx_infusion.txt b/forge-gui/res/cardsfolder/n/nyx_infusion.txt index 9b23360c302..5c54ed1e08e 100644 --- a/forge-gui/res/cardsfolder/n/nyx_infusion.txt +++ b/forge-gui/res/cardsfolder/n/nyx_infusion.txt @@ -2,8 +2,7 @@ Name:Nyx Infusion ManaCost:2 B Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Curse | AITgts$ Creature.nonEnchantment+OppCtrl +A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Enchantment S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Enchantment | AddPower$ 2 | AddToughness$ 2 | Description$ Enchanted creature gets +2/+2 as long as it's an enchantment. Otherwise, it gets -2/-2. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonEnchantment | AddPower$ -2 | AddToughness$ -2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/nyx_infusion.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+2 as long as it's an enchantment. Otherwise, it gets -2/-2. diff --git a/forge-gui/res/cardsfolder/n/nyxathid.txt b/forge-gui/res/cardsfolder/n/nyxathid.txt index 3f9041af772..91666f61c3f 100644 --- a/forge-gui/res/cardsfolder/n/nyxathid.txt +++ b/forge-gui/res/cardsfolder/n/nyxathid.txt @@ -6,7 +6,6 @@ K:ETBReplacement:Other:ChooseP SVar:ChooseP:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | AILogic$ Curse | SpellDescription$ As CARDNAME enters the battlefield, choose an opponent. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ -X | AddToughness$ -X | Description$ CARDNAME gets -1/-1 for each card in the chosen player's hand. SVar:X:Count$InChosenHand -SVar:NeedsToPlayVar:Z LE5 -SVar:Z:Count$InOppHand -SVar:Picture:http://www.wizards.com/global/images/magic/general/nyxathid.jpg +SVar:NeedsToPlayVar:Z GE1 +SVar:Z:PlayerCountPropertyOpponent$HasPropertyHasCardsInHand_Card_LE5 Oracle:As Nyxathid enters the battlefield, choose an opponent.\nNyxathid gets -1/-1 for each card in the chosen player's hand. diff --git a/forge-gui/res/cardsfolder/n/nyxbloom_ancient.txt b/forge-gui/res/cardsfolder/n/nyxbloom_ancient.txt index 6186b559ecf..1537e062d68 100755 --- a/forge-gui/res/cardsfolder/n/nyxbloom_ancient.txt +++ b/forge-gui/res/cardsfolder/n/nyxbloom_ancient.txt @@ -3,6 +3,6 @@ ManaCost:4 G G G Types:Enchantment Creature Elemental PT:5/5 K:Trample -R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidCard$ Permanent.YouCtrl | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceThrice | Description$ If you tap a permanent for mana, it produces three times as much of that mana instead. +R:Event$ ProduceMana | ActiveZones$ Battlefield | ValidActivator$ You | ValidCard$ Permanent | ValidAbility$ Activated.hasTapCost | ReplaceWith$ ProduceThrice | Description$ If you tap a permanent for mana, it produces three times as much of that mana instead. SVar:ProduceThrice:DB$ ReplaceMana | ReplaceAmount$ 3 Oracle:Trample\nIf you tap a permanent for mana, it produces three times as much of that mana instead. diff --git a/forge-gui/res/cardsfolder/o/oathsworn_knight.txt b/forge-gui/res/cardsfolder/o/oathsworn_knight.txt index f526385b4da..cd9def7b58c 100644 --- a/forge-gui/res/cardsfolder/o/oathsworn_knight.txt +++ b/forge-gui/res/cardsfolder/o/oathsworn_knight.txt @@ -4,7 +4,7 @@ Types:Creature Human Knight PT:0/0 K:etbCounter:P1P1:4 K:CARDNAME attacks each combat if able. -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from it. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from it. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters Oracle:Oathsworn Knight enters the battlefield with four +1/+1 counters on it.\nOathsworn Knight attacks each combat if able.\nIf damage would be dealt to Oathsworn Knight while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from it. diff --git a/forge-gui/res/cardsfolder/o/obzedat_ghost_council.txt b/forge-gui/res/cardsfolder/o/obzedat_ghost_council.txt index a2980455e67..e6de883d1ec 100644 --- a/forge-gui/res/cardsfolder/o/obzedat_ghost_council.txt +++ b/forge-gui/res/cardsfolder/o/obzedat_ghost_council.txt @@ -10,7 +10,7 @@ SVar:TrigExile:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destinatio SVar:DBDelaytrig:DB$ Effect | Name$ Obzedat Effect | Triggers$ TrigEOT | RememberObjects$ Self | Duration$ Permanent SVar:TrigEOT:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ ObzedatReturn | TriggerDescription$ Return CARDNAME to the battlefield under it's owner's control. It gains haste. SVar:ObzedatReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ ObzedatPump -SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Permanent$ True | SubAbility$ ObzedatCleanup +SVar:ObzedatPump:DB$ Pump | Defined$ Remembered | KW$ Haste | Duration$ Permanent | SubAbility$ ObzedatCleanup SVar:ObzedatCleanup:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/obzedat_ghost_council.jpg Oracle:When Obzedat, Ghost Council enters the battlefield, target opponent loses 2 life and you gain 2 life.\nAt the beginning of your end step, you may exile Obzedat. If you do, return it to the battlefield under its owner's control at the beginning of your next upkeep. It gains haste. diff --git a/forge-gui/res/cardsfolder/upcoming/octavia_living_thesis.txt b/forge-gui/res/cardsfolder/o/octavia_living_thesis.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/octavia_living_thesis.txt rename to forge-gui/res/cardsfolder/o/octavia_living_thesis.txt diff --git a/forge-gui/res/cardsfolder/upcoming/oggyar_battle_seer.txt b/forge-gui/res/cardsfolder/o/oggyar_battle_seer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oggyar_battle_seer.txt rename to forge-gui/res/cardsfolder/o/oggyar_battle_seer.txt diff --git a/forge-gui/res/cardsfolder/o/ojutai_soul_of_winter.txt b/forge-gui/res/cardsfolder/o/ojutai_soul_of_winter.txt index af34ce1f96f..f2d30c5fd5c 100644 --- a/forge-gui/res/cardsfolder/o/ojutai_soul_of_winter.txt +++ b/forge-gui/res/cardsfolder/o/ojutai_soul_of_winter.txt @@ -6,7 +6,7 @@ K:Flying K:Vigilance T:Mode$ Attacks | ValidCard$ Dragon.YouCtrl | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever a Dragon you control attacks, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target permanent. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. SVar:HasAttackEffect:TRUE DeckHints:Type$Dragon SVar:Picture:http://www.wizards.com/global/images/magic/general/ojutai_soul_of_winter.jpg diff --git a/forge-gui/res/cardsfolder/o/ojutais_breath.txt b/forge-gui/res/cardsfolder/o/ojutais_breath.txt index 0a07b58b320..f4ddb28c8f0 100644 --- a/forge-gui/res/cardsfolder/o/ojutais_breath.txt +++ b/forge-gui/res/cardsfolder/o/ojutais_breath.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Instant K:Rebound A:SP$ Tap | Cost$ 2 U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/ojutais_breath.jpg Oracle:Tap target creature. It doesn't untap during its controller's next untap step.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/o/oko_thief_of_crowns.txt b/forge-gui/res/cardsfolder/o/oko_thief_of_crowns.txt index 794f49ce8a2..c9bf110725b 100644 --- a/forge-gui/res/cardsfolder/o/oko_thief_of_crowns.txt +++ b/forge-gui/res/cardsfolder/o/oko_thief_of_crowns.txt @@ -3,7 +3,7 @@ ManaCost:1 G U Types:Legendary Planeswalker Oko Loyalty:4 A:AB$ Token | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | SpellDescription$ Create a Food token. -A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Creature,Elk | RemoveCreatureTypes$ True | RemoveCardTypes$ True | Permanent$ True | SpellDescription$ Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact,Creature | TgtPrompt$ Select target artifact or creature | Power$ 3 | Toughness$ 3 | RemoveAllAbilities$ True | Colors$ Green | OverwriteColors$ True | Types$ Creature,Elk | RemoveCreatureTypes$ True | RemoveCardTypes$ True | Duration$ Permanent | SpellDescription$ Target artifact or creature loses all abilities and becomes a green Elk creature with base power and toughness 3/3. A:AB$ Pump | Cost$ SubCounter<5/LOYALTY> | Planeswalker$ True | Ultimate$ True | AITgts$ Artifact.YouCtrl+cmcLE1 | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Choose target artifact or creature you control | SubAbility$ OkoExchange | SpellDescription$ Exchange control of target artifact or creature you control and target creature an opponent controls with power 3 or less. SVar:OkoExchange:DB$ ExchangeControl | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl+powerLE3 | TgtPrompt$ Choose target creature an opponent controls with power 3 or less DeckHas:Ability$Token & Ability$LifeGain & Ability$Food diff --git a/forge-gui/res/cardsfolder/o/old_growth_troll.txt b/forge-gui/res/cardsfolder/o/old_growth_troll.txt index 0386423bb14..a53b072b259 100644 --- a/forge-gui/res/cardsfolder/o/old_growth_troll.txt +++ b/forge-gui/res/cardsfolder/o/old_growth_troll.txt @@ -5,7 +5,7 @@ PT:4/4 K:Trample T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self+Creature | TriggerController$ TriggeredCardController | Execute$ DBReturn | TriggerDescription$ When CARDNAME dies, if it was a creature. return it to the battlefield. It's an Aura enchantment with enchant Forest you control and “Enchanted Forest has ‘{T}: When CARDNAME dies, if it was a creature, return it to the battlefield. It's an Aura enchantment with enchant Forest you control and "Enchanted Forest has '{T}: Add {G}{G}' and '{1}, {T}, Sacrifice this land: Create a tapped 4/4 green Troll Warrior creature token with trample.'" SVar:DBReturn:DB$ ChangeZone | Defined$ TriggeredNewCardLKICopy | Origin$ Graveyard | Destination$ Battlefield | AnimateSubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveAllAbilities$ True | Keywords$ Enchant Forest you control | Abilities$ SPAttach | staticAbilities$ STAura | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveAllAbilities$ True | Keywords$ Enchant Forest you control | Abilities$ SPAttach | staticAbilities$ STAura | Duration$ Permanent SVar:STAura:Mode$ Continuous | Affected$ Land.EnchantedBy | AddAbility$ ABMana & ABToken | Description$ Enchanted Forest has ‘{T}: Add {G}{G}’ and ‘{1}, {T}, Sacrifice this land: Create a tapped 4/4 green Troll Warrior creature token with trample.’ SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Forest.YouCtrl | AILogic$ Pump SVar:ABMana:AB$ Mana | Cost$ T | Produced$ G | Amount$ 2 | SpellDescription$ Add {G}{G}. diff --git a/forge-gui/res/cardsfolder/o/olivia_mobilized_for_war.txt b/forge-gui/res/cardsfolder/o/olivia_mobilized_for_war.txt index 064b84a9c6c..97a3b678fce 100644 --- a/forge-gui/res/cardsfolder/o/olivia_mobilized_for_war.txt +++ b/forge-gui/res/cardsfolder/o/olivia_mobilized_for_war.txt @@ -7,7 +7,7 @@ T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Any | Destinat SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$PutCounter | Defined$ TriggeredCardLKICopy | CounterType$ P1P1 | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ TriggeredCard | KW$ Haste | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ TriggeredCard | Types$ Vampire | Permanent$ True | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBAnimate:DB$ Animate | Defined$ TriggeredCard | Types$ Vampire | Duration$ Permanent | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/olivia_mobilized_for_war.jpg Oracle:Flying\nWhenever another creature enters the battlefield under your control, you may discard a card. If you do, put a +1/+1 counter on that creature, it gains haste until end of turn, and it becomes a Vampire in addition to its other types. diff --git a/forge-gui/res/cardsfolder/o/olivia_voldaren.txt b/forge-gui/res/cardsfolder/o/olivia_voldaren.txt index 4ac68f73651..c3c6e8fdd13 100644 --- a/forge-gui/res/cardsfolder/o/olivia_voldaren.txt +++ b/forge-gui/res/cardsfolder/o/olivia_voldaren.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Vampire PT:3/3 K:Flying A:AB$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.Other | NumDmg$ 1 | SubAbility$ Animate | SpellDescription$ CARDNAME deas 1 damage to another target creature. That creature becomes a Vampire in addition to its other types. Put a +1/+1 counter on CARDNAME. -SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Permanent$ True | SubAbility$ PutCounter +SVar:Animate:DB$Animate | Defined$ Targeted | Types$ Vampire | Duration$ Permanent | SubAbility$ PutCounter SVar:PutCounter:DB$PutCounter | CounterType$ P1P1 | CounterNum$ 1 A:AB$ GainControl | Cost$ 3 B B | ValidTgts$ Creature.Vampire | TgtPrompt$ Select target Vampire | LoseControl$ LeavesPlay,LoseControl | SpellDescription$ Gain control of target vampire for as long as you control CARDNAME. SVar:Picture:http://www.wizards.com/global/images/magic/general/olivia_voldaren.jpg diff --git a/forge-gui/res/cardsfolder/o/on_thin_ice.txt b/forge-gui/res/cardsfolder/o/on_thin_ice.txt index fba752549f0..d3a9378cbc2 100644 --- a/forge-gui/res/cardsfolder/o/on_thin_ice.txt +++ b/forge-gui/res/cardsfolder/o/on_thin_ice.txt @@ -4,7 +4,7 @@ Types:Snow Enchantment Aura K:Enchant snow land you control A:SP$ Attach | Cost$ W | ValidTgts$ Land.Snow+YouCtrl | TgtPrompt$ Select target snow land you control | AILogic$ Pump T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlay:Creature.OppCtrl DeckHints:Type$Snow diff --git a/forge-gui/res/cardsfolder/o/opal_acrolith.txt b/forge-gui/res/cardsfolder/o/opal_acrolith.txt index 5dc02fae54d..fe92787a47e 100644 --- a/forge-gui/res/cardsfolder/o/opal_acrolith.txt +++ b/forge-gui/res/cardsfolder/o/opal_acrolith.txt @@ -2,8 +2,8 @@ Name:Opal Acrolith ManaCost:2 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/4 Soldier creature. -A:AB$ Animate | Cost$ 0 | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Permanent$ True | SpellDescription$ CARDNAME becomes an enchantment. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 4 | Types$ Creature,Soldier | RemoveCardTypes$ True | Permanent$ True +A:AB$ Animate | Cost$ 0 | Defined$ Self | Types$ Enchantment | RemoveCardTypes$ True | Duration$ Permanent | SpellDescription$ CARDNAME becomes an enchantment. +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 4 | Types$ Creature,Soldier | RemoveCardTypes$ True | Duration$ Permanent AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_acrolith.jpg Oracle:Whenever an opponent casts a creature spell, if Opal Acrolith is an enchantment, Opal Acrolith becomes a 2/4 Soldier creature.\n{0}: Opal Acrolith becomes an enchantment. diff --git a/forge-gui/res/cardsfolder/o/opal_archangel.txt b/forge-gui/res/cardsfolder/o/opal_archangel.txt index 9de95dd2bb9..8e9405d64d6 100644 --- a/forge-gui/res/cardsfolder/o/opal_archangel.txt +++ b/forge-gui/res/cardsfolder/o/opal_archangel.txt @@ -2,6 +2,6 @@ Name:Opal Archangel ManaCost:4 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 5/5 Angel creature with flying and vigilance. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 5 | Keywords$ Flying & Vigilance | Types$ Creature,Angel | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 5 | Toughness$ 5 | Keywords$ Flying & Vigilance | Types$ Creature,Angel | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_archangel.jpg Oracle:When an opponent casts a creature spell, if Opal Archangel is an enchantment, Opal Archangel becomes a 5/5 Angel creature with flying and vigilance. diff --git a/forge-gui/res/cardsfolder/o/opal_avenger.txt b/forge-gui/res/cardsfolder/o/opal_avenger.txt index 9916889f5e9..83a7a6bcd80 100644 --- a/forge-gui/res/cardsfolder/o/opal_avenger.txt +++ b/forge-gui/res/cardsfolder/o/opal_avenger.txt @@ -2,6 +2,6 @@ Name:Opal Avenger ManaCost:2 W Types:Enchantment T:Mode$ Always | LifeTotal$ You | LifeAmount$ LE10 | TriggerZones$ Battlefield | Execute$ TrigOpalAvengerAnimate | IsPresent$ Card.Self+Enchantment | ResolvingCheck$ IsPresent | TriggerDescription$ When you have 10 or less life, if CARDNAME is an enchantment, CARDNAME becomes a 3/5 Soldier creature. -SVar:TrigOpalAvengerAnimate:DB$ Animate | Types$ Creature,Soldier | Power$ 3 | Toughness$ 5 | RemoveCardTypes$ True | Permanent$ True +SVar:TrigOpalAvengerAnimate:DB$ Animate | Types$ Creature,Soldier | Power$ 3 | Toughness$ 5 | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_avenger.jpg Oracle:When you have 10 or less life, if Opal Avenger is an enchantment, Opal Avenger becomes a 3/5 Soldier creature. diff --git a/forge-gui/res/cardsfolder/o/opal_caryatid.txt b/forge-gui/res/cardsfolder/o/opal_caryatid.txt index 59c6bd9e4a1..a4a7a559b8d 100644 --- a/forge-gui/res/cardsfolder/o/opal_caryatid.txt +++ b/forge-gui/res/cardsfolder/o/opal_caryatid.txt @@ -2,6 +2,6 @@ Name:Opal Caryatid ManaCost:W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/2 Soldier creature. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Soldier | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Soldier | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_caryatid.jpg Oracle:When an opponent casts a creature spell, if Opal Caryatid is an enchantment, Opal Caryatid becomes a 2/2 Soldier creature. diff --git a/forge-gui/res/cardsfolder/o/opal_champion.txt b/forge-gui/res/cardsfolder/o/opal_champion.txt index dcb23572af4..1e5a7215148 100644 --- a/forge-gui/res/cardsfolder/o/opal_champion.txt +++ b/forge-gui/res/cardsfolder/o/opal_champion.txt @@ -2,6 +2,6 @@ Name:Opal Champion ManaCost:2 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment| Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Knight creature with first strike. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ First Strike | Types$ Creature,Knight | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ First Strike | Types$ Creature,Knight | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_champion.jpg Oracle:When an opponent casts a creature spell, if Opal Champion is an enchantment, Opal Champion becomes a 3/3 Knight creature with first strike. diff --git a/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt b/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt index 77cdcc35ff2..6e486a6f989 100644 --- a/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt +++ b/forge-gui/res/cardsfolder/o/opal_eye_kondas_yojimbo.txt @@ -5,13 +5,12 @@ PT:1/4 K:Defender K:Bushido:1 A:AB$ ChooseSource | Cost$ T | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage this turn, that damage is dealt to CARDNAME instead. -SVar:DBEffect:DB$ Effect | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 -SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ You | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ EffectSource | Description$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to EFFECTSOURCE instead. +SVar:DBEffect:DB$ Effect | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 +SVar:SelflessDamage:Event$ DamageDone | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ EffectSource | Description$ The next time a source of your choice would deal damage to you this turn, that damage is dealt to EFFECTSOURCE instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource | VarType$ Card | SubAbility$ ExileEffect SVar:OutOfSight:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Defined$ ChosenCard | Execute$ ExileEffect | Static$ True SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile | Static$ True SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True A:AB$ PreventDamage | Cost$ 1 W | Defined$ Self | Amount$ 1 | SpellDescription$ Prevent the next 1 damage that would be dealt to CARDNAME this turn. AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_eye_kondas_yojimbo.jpg Oracle:Defender (This creature can't attack.)\nBushido 1 (Whenever this creature blocks or becomes blocked, it gets +1/+1 until end of turn.)\n{T}: The next time a source of your choice would deal damage this turn, that damage is dealt to Opal-Eye, Konda's Yojimbo instead.\n{1}{W}: Prevent the next 1 damage that would be dealt to Opal-Eye this turn. diff --git a/forge-gui/res/cardsfolder/o/opal_gargoyle.txt b/forge-gui/res/cardsfolder/o/opal_gargoyle.txt index 483a7c8a319..a3d23670f61 100644 --- a/forge-gui/res/cardsfolder/o/opal_gargoyle.txt +++ b/forge-gui/res/cardsfolder/o/opal_gargoyle.txt @@ -2,6 +2,6 @@ Name:Opal Gargoyle ManaCost:1 W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 2/2 Gargoyle creature with flying. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Gargoyle | Keywords$ Flying | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 2 | Toughness$ 2 | Types$ Creature,Gargoyle | Keywords$ Flying | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_gargoyle.jpg Oracle:When an opponent casts a creature spell, if Opal Gargoyle is an enchantment, Opal Gargoyle becomes a 2/2 Gargoyle creature with flying. diff --git a/forge-gui/res/cardsfolder/o/opal_guardian.txt b/forge-gui/res/cardsfolder/o/opal_guardian.txt index c1f83d8bff3..a0d9683b1d8 100644 --- a/forge-gui/res/cardsfolder/o/opal_guardian.txt +++ b/forge-gui/res/cardsfolder/o/opal_guardian.txt @@ -2,6 +2,6 @@ Name:Opal Guardian ManaCost:W W W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/4 Gargoyle creature with flying and protection from red. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Gargoyle | Keywords$ Flying & Protection from red | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 4 | Types$ Creature,Gargoyle | Keywords$ Flying & Protection from red | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_guardian.jpg Oracle:When an opponent casts a creature spell, if Opal Guardian is an enchantment, Opal Guardian becomes a 3/4 Gargoyle creature with flying and protection from red. diff --git a/forge-gui/res/cardsfolder/o/opal_titan.txt b/forge-gui/res/cardsfolder/o/opal_titan.txt index e049870e00f..376660a5c4e 100644 --- a/forge-gui/res/cardsfolder/o/opal_titan.txt +++ b/forge-gui/res/cardsfolder/o/opal_titan.txt @@ -2,11 +2,11 @@ Name:Opal Titan ManaCost:2 W W Types:Enchantment T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ Opponent | Execute$ TrigOpalTitanAnimate | IsPresent$ Card.Self+Enchantment | TriggerZones$ Battlefield | TriggerDescription$ When an opponent casts a creature spell, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Giant creature with protection from each of that spell's colors. -SVar:TrigOpalTitanAnimate:DB$ Animate | Defined$ Self | Types$ Creature,Giant | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBOpalTitanProtectionWhite | Permanent$ True -SVar:DBOpalTitanProtectionWhite:DB$ Protection | Gains$ white | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.White | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionBlue | Permanent$ True -SVar:DBOpalTitanProtectionBlue:DB$ Protection | Gains$ blue | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Blue | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionBlack | Permanent$ True -SVar:DBOpalTitanProtectionBlack:DB$ Protection | Gains$ black | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Black | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionGreen | Permanent$ True -SVar:DBOpalTitanProtectionGreen:DB$ Protection | Gains$ green | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Green | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionRed | Permanent$ True -SVar:DBOpalTitanProtectionRed:DB$ Protection | Gains$ red | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Red | ConditionCompare$ GE1 | Permanent$ True +SVar:TrigOpalTitanAnimate:DB$ Animate | Defined$ Self | Types$ Creature,Giant | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Duration$ Permanent | SubAbility$ DBOpalTitanProtectionWhite | Duration$ Permanent +SVar:DBOpalTitanProtectionWhite:DB$ Protection | Gains$ white | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.White | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionBlue | Duration$ Permanent +SVar:DBOpalTitanProtectionBlue:DB$ Protection | Gains$ blue | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Blue | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionBlack | Duration$ Permanent +SVar:DBOpalTitanProtectionBlack:DB$ Protection | Gains$ black | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Black | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionGreen | Duration$ Permanent +SVar:DBOpalTitanProtectionGreen:DB$ Protection | Gains$ green | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Green | ConditionCompare$ GE1 | SubAbility$ DBOpalTitanProtectionRed | Duration$ Permanent +SVar:DBOpalTitanProtectionRed:DB$ Protection | Gains$ red | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Red | ConditionCompare$ GE1 | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/opal_titan.jpg Oracle:When an opponent casts a creature spell, if Opal Titan is an enchantment, Opal Titan becomes a 4/4 Giant creature with protection from each of that spell's colors. diff --git a/forge-gui/res/cardsfolder/o/opportunistic_dragon.txt b/forge-gui/res/cardsfolder/o/opportunistic_dragon.txt index 31f4b0caccd..c06cce82df3 100644 --- a/forge-gui/res/cardsfolder/o/opportunistic_dragon.txt +++ b/forge-gui/res/cardsfolder/o/opportunistic_dragon.txt @@ -5,5 +5,5 @@ PT:4/3 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When CARDNAME enters the battlefield, choose target Human or artifact an opponent controls. For as long as CARDNAME remains on the battlefield, gain control of that permanent, it loses all abilities, and it can't attack or block. SVar:TrigGainControl:DB$ GainControl | ValidTgts$ Human.OppCtrl,Artifact.OppCtrl | TgtPrompt$ Select target Human or artifact an opponent controls | LoseControl$ LeavesPlay | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Defined$ Targeted | HiddenKeywords$ CARDNAME can't attack or block. | RemoveAllAbilities$ True | UntilHostLeavesPlay$ True +SVar:DBPump:DB$ Animate | Defined$ Targeted | HiddenKeywords$ CARDNAME can't attack or block. | RemoveAllAbilities$ True | Duration$ UntilHostLeavesPlay Oracle:Flying\nWhen Opportunistic Dragon enters the battlefield, choose target Human or artifact an opponent controls. For as long as Opportunistic Dragon remains on the battlefield, gain control of that permanent, it loses all abilities, and it can't attack or block. diff --git a/forge-gui/res/cardsfolder/o/oracles_attendants.txt b/forge-gui/res/cardsfolder/o/oracles_attendants.txt index 0854e4bad86..a2371e7a6fa 100644 --- a/forge-gui/res/cardsfolder/o/oracles_attendants.txt +++ b/forge-gui/res/cardsfolder/o/oracles_attendants.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Human Soldier PT:1/5 A:AB$ ChooseSource | Cost$ T | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ All damage that would be dealt to target creature this turn by a source of your choice is dealt to CARDNAME instead. -SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ EffectSource | Description$ The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to EFFECTSOURCE instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource | VarType$ Card #Zone Change for the source of your choice diff --git a/forge-gui/res/cardsfolder/o/orbs_of_warding.txt b/forge-gui/res/cardsfolder/o/orbs_of_warding.txt index 84a45e8acdf..8dfcf5c7499 100644 --- a/forge-gui/res/cardsfolder/o/orbs_of_warding.txt +++ b/forge-gui/res/cardsfolder/o/orbs_of_warding.txt @@ -2,6 +2,6 @@ Name:Orbs of Warding ManaCost:5 Types:Artifact S:Mode$ Continuous | Affected$ You | AddKeyword$ Hexproof | Description$ You have hexproof. (You can't be the target of spells or abilities your opponents control.) -S:Mode$ PreventDamage | Target$ You | Source$ Creature.inZoneBattlefield | Amount$ 1 | Description$ If a creature would deal damage to you, prevent 1 of that damage. -SVar:Picture:http://www.wizards.com/global/images/magic/general/orbs_of_warding.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Creature.inZoneBattlefield | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a creature would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:You have hexproof. (You can't be the target of spells or abilities your opponents control.)\nIf a creature would deal damage to you, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/o/orchard_spirit.txt b/forge-gui/res/cardsfolder/o/orchard_spirit.txt index 8b6f1dcae09..53e849eb131 100644 --- a/forge-gui/res/cardsfolder/o/orchard_spirit.txt +++ b/forge-gui/res/cardsfolder/o/orchard_spirit.txt @@ -2,6 +2,5 @@ Name:Orchard Spirit ManaCost:2 G Types:Creature Spirit PT:2/2 -K:CantBeBlockedBy Creature.withoutFlying+withoutReach -SVar:Picture:http://www.wizards.com/global/images/magic/general/orchard_spirit.jpg -Oracle:Orchard Spirit can't be blocked except by creatures with flying or reach. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying+withoutReach | Description$ CARDNAME can't be blocked except by creatures with flying or reach. +Oracle:Orchard Spirit can't be blocked except by creatures with flying or reach. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/orcish_farmer.txt b/forge-gui/res/cardsfolder/o/orcish_farmer.txt index 769fc3e99ca..4666dd9eb6e 100644 --- a/forge-gui/res/cardsfolder/o/orcish_farmer.txt +++ b/forge-gui/res/cardsfolder/o/orcish_farmer.txt @@ -2,7 +2,7 @@ Name:Orcish Farmer ManaCost:1 R R Types:Creature Orc PT:2/2 -A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | UntilControllerNextUntap$ True | SpellDescription$ Target land becomes a Swamp until its controller's next untap step. +A:AB$ Animate | Cost$ T | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Swamp | RemoveLandTypes$ True | Duration$ UntilControllerNextUntap | SpellDescription$ Target land becomes a Swamp until its controller's next untap step. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_farmer.jpg Oracle:{T}: Target land becomes a Swamp until its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/o/orcish_veteran.txt b/forge-gui/res/cardsfolder/o/orcish_veteran.txt index 90c9cb2caa8..24eb49db2b2 100644 --- a/forge-gui/res/cardsfolder/o/orcish_veteran.txt +++ b/forge-gui/res/cardsfolder/o/orcish_veteran.txt @@ -2,7 +2,6 @@ Name:Orcish Veteran ManaCost:2 R Types:Creature Orc PT:2/2 -K:CantBlock Creature.White+powerGE2:white creatures with power 2 or greater +S:Mode$ CantBlockBy | ValidAttacker$ Creature.White+powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block white creatures with power 2 or greater. A:AB$ Pump | Cost$ R | Defined$ Self | KW$ First Strike | SpellDescription$ CARDNAME gains first strike until end of turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/orcish_veteran.jpg Oracle:Orcish Veteran can't block white creatures with power 2 or greater.\n{R}: Orcish Veteran gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/o/orgg.txt b/forge-gui/res/cardsfolder/o/orgg.txt index 123d60777a3..f6a98dd2f60 100644 --- a/forge-gui/res/cardsfolder/o/orgg.txt +++ b/forge-gui/res/cardsfolder/o/orgg.txt @@ -4,6 +4,5 @@ Types:Creature Orgg PT:6/6 K:Trample S:Mode$ CantAttack | ValidCard$ Card.Self | IfDefenderControls$ Creature.untapped+powerGE3 | Description$ CARDNAME can't attack if defending player controls an untapped creature with power 3 or greater. -K:CantBlock Creature.powerGE3:creatures with power 3 or greater -SVar:Picture:http://www.wizards.com/global/images/magic/general/orgg.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE3 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 3 or greater. Oracle:Trample\nOrgg can't attack if defending player controls an untapped creature with power 3 or greater.\nOrgg can't block creatures with power 3 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/oriq_loremage.txt b/forge-gui/res/cardsfolder/o/oriq_loremage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oriq_loremage.txt rename to forge-gui/res/cardsfolder/o/oriq_loremage.txt diff --git a/forge-gui/res/cardsfolder/o/orochi_ranger.txt b/forge-gui/res/cardsfolder/o/orochi_ranger.txt index 423c58adb7f..1153b2a7b51 100644 --- a/forge-gui/res/cardsfolder/o/orochi_ranger.txt +++ b/forge-gui/res/cardsfolder/o/orochi_ranger.txt @@ -4,6 +4,6 @@ Types:Creature Snake Warrior PT:2/1 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. SVar:TrigTap:DB$Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:Whenever Orochi Ranger deals combat damage to a creature, tap that creature and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/osgir_the_reconstructor.txt b/forge-gui/res/cardsfolder/o/osgir_the_reconstructor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/osgir_the_reconstructor.txt rename to forge-gui/res/cardsfolder/o/osgir_the_reconstructor.txt diff --git a/forge-gui/res/cardsfolder/o/otarian_juggernaut.txt b/forge-gui/res/cardsfolder/o/otarian_juggernaut.txt index 82f9f6915e8..f3a7b1fe3e7 100644 --- a/forge-gui/res/cardsfolder/o/otarian_juggernaut.txt +++ b/forge-gui/res/cardsfolder/o/otarian_juggernaut.txt @@ -2,7 +2,7 @@ Name:Otarian Juggernaut ManaCost:4 Types:Artifact Creature Juggernaut PT:2/3 -K:CantBeBlockedBy Creature.Wall +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Wall | Description$ CARDNAME can't be blocked by Walls. S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | AddKeyword$ CARDNAME attacks each combat if able. | Condition$ Threshold | Description$ Threshold — As long as seven or more cards are in your graveyard, CARDNAME gets +3/+0 and attacks each combat if able. SVar:Picture:http://www.wizards.com/global/images/magic/general/otarian_juggernaut.jpg Oracle:Otarian Juggernaut can't be blocked by Walls.\nThreshold — As long as seven or more cards are in your graveyard, Otarian Juggernaut gets +3/+0 and attacks each combat if able. diff --git a/forge-gui/res/cardsfolder/o/outland_boar.txt b/forge-gui/res/cardsfolder/o/outland_boar.txt index 599148d4bdf..2dc02a53e42 100644 --- a/forge-gui/res/cardsfolder/o/outland_boar.txt +++ b/forge-gui/res/cardsfolder/o/outland_boar.txt @@ -2,6 +2,5 @@ Name:Outland Boar ManaCost:2 R G Types:Creature Boar PT:4/4 -K:CantBeBlockedBy Creature.powerLE2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/outland_boar.jpg -Oracle:Outland Boar can't be blocked by creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +Oracle:Outland Boar can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/o/outpost_siege.txt b/forge-gui/res/cardsfolder/o/outpost_siege.txt index 64a5574c41c..4d26d40ad10 100644 --- a/forge-gui/res/cardsfolder/o/outpost_siege.txt +++ b/forge-gui/res/cardsfolder/o/outpost_siege.txt @@ -3,13 +3,13 @@ ManaCost:3 R Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Khans or Dragons. Khans — At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card. Dragons — Whenever a creature you control leaves the battlefield, CARDNAME deals 1 damage to any target. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Khans,Dragons | Defined$ You | SetChosenMode$ True | AILogic$ Khans | ShowChoice$ ExceptSelf -SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Permanent$ True | SpellDescription$ Khans +SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Duration$ Permanent | SpellDescription$ Khans SVar:KhansTrigger:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ PseudoDraw | TriggerDescription$ At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card. SVar:PseudoDraw:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Play | SubAbility$ DBCleanup | ExileOnMoved$ Exile SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Permanent$ True | SpellDescription$ Dragons +SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Duration$ Permanent | SpellDescription$ Dragons SVar:DragonsTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ SmallBurnination | TriggerDescription$ Whenever a creature you control leaves the battlefield, CARDNAME deals 1 damage to any target. SVar:SmallBurnination:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 Oracle:As Outpost Siege enters the battlefield, choose Khans or Dragons.\n• Khans — At the beginning of your upkeep, exile the top card of your library. Until end of turn, you may play that card.\n• Dragons — Whenever a creature you control leaves the battlefield, Outpost Siege deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/o/outrider_en_kor.txt b/forge-gui/res/cardsfolder/o/outrider_en_kor.txt index 9eb1420afbd..b25b71a2bd8 100644 --- a/forge-gui/res/cardsfolder/o/outrider_en_kor.txt +++ b/forge-gui/res/cardsfolder/o/outrider_en_kor.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Creature Kor Rebel Knight PT:2/2 K:Flanking -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/overgrown_arch.txt b/forge-gui/res/cardsfolder/o/overgrown_arch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/overgrown_arch.txt rename to forge-gui/res/cardsfolder/o/overgrown_arch.txt diff --git a/forge-gui/res/cardsfolder/o/overgrown_tomb.txt b/forge-gui/res/cardsfolder/o/overgrown_tomb.txt index 6dacd5e532f..991068edb34 100644 --- a/forge-gui/res/cardsfolder/o/overgrown_tomb.txt +++ b/forge-gui/res/cardsfolder/o/overgrown_tomb.txt @@ -2,6 +2,5 @@ Name:Overgrown Tomb ManaCost:no cost Types:Land Swamp Forest K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89072.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {B} or {G}.)\nAs Overgrown Tomb enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/upcoming/oversimplify.txt b/forge-gui/res/cardsfolder/o/oversimplify.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/oversimplify.txt rename to forge-gui/res/cardsfolder/o/oversimplify.txt diff --git a/forge-gui/res/cardsfolder/upcoming/owlin_shieldmage.txt b/forge-gui/res/cardsfolder/o/owlin_shieldmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/owlin_shieldmage.txt rename to forge-gui/res/cardsfolder/o/owlin_shieldmage.txt diff --git a/forge-gui/res/cardsfolder/p/palace_siege.txt b/forge-gui/res/cardsfolder/p/palace_siege.txt index f9a00f42a54..fcc6cd6286d 100644 --- a/forge-gui/res/cardsfolder/p/palace_siege.txt +++ b/forge-gui/res/cardsfolder/p/palace_siege.txt @@ -3,10 +3,10 @@ ManaCost:3 B B Types:Enchantment T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ SiegeChoice | Static$ True | TriggerDescription$ As CARDNAME enters the battlefield, choose Khans or Dragons. Khans — At the beginning of your upkeep, return target creature card from your graveyard to your hand. Dragons — At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life. SVar:SiegeChoice:DB$ GenericChoice | Choices$ Khans,Dragons | Defined$ You | SetChosenMode$ True | AILogic$ Dragons | ShowChoice$ ExceptSelf -SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Permanent$ True | SpellDescription$ Khans +SVar:Khans:DB$ Animate | Defined$ Self | Triggers$ KhansTrigger | Duration$ Permanent | SpellDescription$ Khans SVar:KhansTrigger:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ RaiseDead | TriggerDescription$ At the beginning of your upkeep, return target creature card from your graveyard to your hand. SVar:RaiseDead:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl -SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Permanent$ True | SpellDescription$ Dragons +SVar:Dragons:DB$ Animate | Defined$ Self | Triggers$ DragonsTrigger | Duration$ Permanent | SpellDescription$ Dragons SVar:DragonsTrigger:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ SyphonLife | TriggerDescription$ At the beginning of your upkeep, each opponent loses 2 life and you gain 2 life. SVar:SyphonLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 diff --git a/forge-gui/res/cardsfolder/upcoming/paradox_zone.txt b/forge-gui/res/cardsfolder/p/paradox_zone.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/paradox_zone.txt rename to forge-gui/res/cardsfolder/p/paradox_zone.txt diff --git a/forge-gui/res/cardsfolder/p/parallax_tide.txt b/forge-gui/res/cardsfolder/p/parallax_tide.txt index 682b32be76c..d2d70665dea 100644 --- a/forge-gui/res/cardsfolder/p/parallax_tide.txt +++ b/forge-gui/res/cardsfolder/p/parallax_tide.txt @@ -2,11 +2,10 @@ Name:Parallax Tide ManaCost:2 U U Types:Enchantment K:Fading:5 -A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Land | TgtPrompt$ Select target land | Imprint$ True | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target land. +A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Land | TgtPrompt$ Select target land | ImprintTargets$ True | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target land. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, each player returns to the battlefield all cards they own exiled with CARDNAME. -SVar:TrigReturn:DB$ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:PlayMain1:TRUE AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_tide.jpg Oracle:Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Parallax Tide: Exile target land.\nWhen Parallax Tide leaves the battlefield, each player returns to the battlefield all cards they own exiled with Parallax Tide. diff --git a/forge-gui/res/cardsfolder/p/parallax_wave.txt b/forge-gui/res/cardsfolder/p/parallax_wave.txt index eb087bdc4b1..90b26def03f 100644 --- a/forge-gui/res/cardsfolder/p/parallax_wave.txt +++ b/forge-gui/res/cardsfolder/p/parallax_wave.txt @@ -2,11 +2,10 @@ Name:Parallax Wave ManaCost:2 W W Types:Enchantment K:Fading:5 -A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | Imprint$ True | SpellDescription$ Exile target creature. +A:AB$ ChangeZone | Cost$ SubCounter<1/FADE> | ValidTgts$ Creature | TgtPrompt$ Select target creature | ImprintTargets$ True | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME leaves the battlefield, each player returns to the battlefield all cards they own exiled with CARDNAME. SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True SVar:PlayMain1:TRUE AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/parallax_wave.jpg Oracle:Fading 5 (This enchantment enters the battlefield with five fade counters on it. At the beginning of your upkeep, remove a fade counter from it. If you can't, sacrifice it.)\nRemove a fade counter from Parallax Wave: Exile target creature.\nWhen Parallax Wave leaves the battlefield, each player returns to the battlefield all cards they own exiled with Parallax Wave. diff --git a/forge-gui/res/cardsfolder/p/pay_no_heed.txt b/forge-gui/res/cardsfolder/p/pay_no_heed.txt index 5c493124044..473094818a2 100644 --- a/forge-gui/res/cardsfolder/p/pay_no_heed.txt +++ b/forge-gui/res/cardsfolder/p/pay_no_heed.txt @@ -3,7 +3,6 @@ ManaCost:W Types:Instant A:SP$ ChooseSource | Cost$ W | Choices$ Card | RememberChosen$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all damage the source would deal this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | Description$ Prevent all damage the source would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/pay_no_heed.jpg Oracle:Prevent all damage a source of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/p/permafrost_trap.txt b/forge-gui/res/cardsfolder/p/permafrost_trap.txt index 0a4ea1c8905..7cada5d5e1f 100644 --- a/forge-gui/res/cardsfolder/p/permafrost_trap.txt +++ b/forge-gui/res/cardsfolder/p/permafrost_trap.txt @@ -3,6 +3,6 @@ ManaCost:2 U U Types:Instant Trap SVar:AltCost:Cost$ U | CheckSVar$ GreenCreats | Description$ If an opponent had a green creature enter the battlefield under their control this turn, you may pay {U} rather than pay this spell's mana cost. A:SP$ Tap | Cost$ 2 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | StackDescription$ {c:Targeted} don't untap during {p:TargetedController}'s next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | StackDescription$ {c:Targeted} don't untap during {p:TargetedController}'s next untap step. SVar:GreenCreats:Count$ThisTurnEntered_Battlefield_Creature.Green+OppCtrl Oracle:If an opponent had a green creature enter the battlefield under their control this turn, you may pay {U} rather than pay this spell's mana cost.\nTap up to two target creatures. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/perplexing_test.txt b/forge-gui/res/cardsfolder/p/perplexing_test.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/perplexing_test.txt rename to forge-gui/res/cardsfolder/p/perplexing_test.txt diff --git a/forge-gui/res/cardsfolder/p/personal_incarnation.txt b/forge-gui/res/cardsfolder/p/personal_incarnation.txt index 8d08bf6fe05..7b13d15ae8f 100644 --- a/forge-gui/res/cardsfolder/p/personal_incarnation.txt +++ b/forge-gui/res/cardsfolder/p/personal_incarnation.txt @@ -2,7 +2,7 @@ Name:Personal Incarnation ManaCost:3 W W W Types:Creature Avatar Incarnation PT:6/6 -A:AB$ Effect | Cost$ 0 | Activator$ Player.Owner | Name$ Personal Incarnation Redirection | ReplacementEffects$ RedirectDamage | Duration$ HostLeavesOrEOT | EffectOwner$ CardOwner | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to its owner instead. Only CARDNAME's owner may activate this ability. +A:AB$ Effect | Cost$ 0 | Activator$ Player.Owner | Name$ Personal Incarnation Redirection | ReplacementEffects$ RedirectDamage | Duration$ UntilHostLeavesPlayOrEOT | EffectOwner$ CardOwner | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to its owner instead. Only CARDNAME's owner may activate this ability. SVar:RedirectDamage:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ RedirectDmg | DamageTarget$ You | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to its owner instead. Only EFFECTSOURCE's owner may activate this ability. SVar:RedirectDmg:DB$ ReplaceSplitDamage | DamageTarget$ You T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigLoseLife | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, its owner loses half their life, rounded up. diff --git a/forge-gui/res/cardsfolder/upcoming/pest_infestation.txt b/forge-gui/res/cardsfolder/p/pest_infestation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pest_infestation.txt rename to forge-gui/res/cardsfolder/p/pest_infestation.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pest_summoning.txt b/forge-gui/res/cardsfolder/p/pest_summoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pest_summoning.txt rename to forge-gui/res/cardsfolder/p/pest_summoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pestilent_cauldron_restorative_burst.txt b/forge-gui/res/cardsfolder/p/pestilent_cauldron_restorative_burst.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pestilent_cauldron_restorative_burst.txt rename to forge-gui/res/cardsfolder/p/pestilent_cauldron_restorative_burst.txt diff --git a/forge-gui/res/cardsfolder/p/phantom_centaur.txt b/forge-gui/res/cardsfolder/p/phantom_centaur.txt index e859cde415f..57f7b8637ed 100644 --- a/forge-gui/res/cardsfolder/p/phantom_centaur.txt +++ b/forge-gui/res/cardsfolder/p/phantom_centaur.txt @@ -4,7 +4,6 @@ Types:Creature Centaur Spirit PT:2/0 K:Protection from black K:etbCounter:P1P1:3 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_centaur.jpg Oracle:Protection from black\nPhantom Centaur enters the battlefield with three +1/+1 counters on it.\nIf damage would be dealt to Phantom Centaur, prevent that damage. Remove a +1/+1 counter from Phantom Centaur. diff --git a/forge-gui/res/cardsfolder/p/phantom_flock.txt b/forge-gui/res/cardsfolder/p/phantom_flock.txt index 351baf0cf04..1bc6d2c89fd 100644 --- a/forge-gui/res/cardsfolder/p/phantom_flock.txt +++ b/forge-gui/res/cardsfolder/p/phantom_flock.txt @@ -4,7 +4,6 @@ Types:Creature Bird Soldier Spirit PT:0/0 K:Flying K:etbCounter:P1P1:3 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_flock.jpg Oracle:Flying\nPhantom Flock enters the battlefield with three +1/+1 counters on it.\nIf damage would be dealt to Phantom Flock, prevent that damage. Remove a +1/+1 counter from Phantom Flock. diff --git a/forge-gui/res/cardsfolder/p/phantom_nantuko.txt b/forge-gui/res/cardsfolder/p/phantom_nantuko.txt index b7b9cc23627..2ff560f8ab3 100644 --- a/forge-gui/res/cardsfolder/p/phantom_nantuko.txt +++ b/forge-gui/res/cardsfolder/p/phantom_nantuko.txt @@ -4,8 +4,7 @@ Types:Creature Insect Spirit PT:0/0 K:Trample K:etbCounter:P1P1:2 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 A:AB$ PutCounter | Cost$ T | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_nantuko.jpg Oracle:Trample\nPhantom Nantuko enters the battlefield with two +1/+1 counters on it.\nIf damage would be dealt to Phantom Nantuko, prevent that damage. Remove a +1/+1 counter from Phantom Nantuko.\n{T}: Put a +1/+1 counter on Phantom Nantuko. diff --git a/forge-gui/res/cardsfolder/p/phantom_nishoba.txt b/forge-gui/res/cardsfolder/p/phantom_nishoba.txt index 27ebcdff3b6..ad1c3dee3d4 100644 --- a/forge-gui/res/cardsfolder/p/phantom_nishoba.txt +++ b/forge-gui/res/cardsfolder/p/phantom_nishoba.txt @@ -7,8 +7,7 @@ K:Trample T:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ TrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:TrigGain:DB$ GainLife | Defined$ You | LifeAmount$ X SVar:X:TriggerCount$DamageAmount -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:HasCombatEffect:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_nishoba.jpg Oracle:Trample\nPhantom Nishoba enters the battlefield with seven +1/+1 counters on it.\nWhenever Phantom Nishoba deals damage, you gain that much life.\nIf damage would be dealt to Phantom Nishoba, prevent that damage. Remove a +1/+1 counter from Phantom Nishoba. diff --git a/forge-gui/res/cardsfolder/p/phantom_nomad.txt b/forge-gui/res/cardsfolder/p/phantom_nomad.txt index 41db97ff96f..7c709ca6bd6 100644 --- a/forge-gui/res/cardsfolder/p/phantom_nomad.txt +++ b/forge-gui/res/cardsfolder/p/phantom_nomad.txt @@ -3,13 +3,6 @@ ManaCost:1 W Types:Creature Spirit Nomad PT:0/0 K:etbCounter:P1P1:2 -T:Mode$ Phase | Static$ True | Phase$ First Strike Damage | Execute$ DBCleanup -T:Mode$ Phase | Static$ True | Phase$ EndCombat | Execute$ DBCleanup -R:Event$ DamageDone | IsCombat$ True | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCountersInCombat | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -R:Event$ DamageDone | IsCombat$ False | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Secondary$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. -SVar:DBRemoveCountersInCombat:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ConditionCheckSVar$ TimesFlagged | ConditionSVarCompare$ EQ0 | SubAbility$ DBFlagRemoveCounters -SVar:DBFlagRemoveCounters:DB$ StoreSVar | SVar$ TimesFlagged | Type$ CountSVar | Expression$ TimesFlagged/Plus.1 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:TimesFlagged:Number$0 -SVar:DBCleanup:DB$ StoreSVar | SVar$ TimesFlagged | Type$ Number | Expression$ 0 Oracle:Phantom Nomad enters the battlefield with two +1/+1 counters on it.\nIf damage would be dealt to Phantom Nomad, prevent that damage. Remove a +1/+1 counter from Phantom Nomad. diff --git a/forge-gui/res/cardsfolder/p/phantom_tiger.txt b/forge-gui/res/cardsfolder/p/phantom_tiger.txt index 0dafc27dd7e..4dab264a06f 100644 --- a/forge-gui/res/cardsfolder/p/phantom_tiger.txt +++ b/forge-gui/res/cardsfolder/p/phantom_tiger.txt @@ -3,7 +3,6 @@ ManaCost:2 G Types:Creature Cat Spirit PT:1/0 K:etbCounter:P1P1:2 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_tiger.jpg Oracle:Phantom Tiger enters the battlefield with two +1/+1 counters on it.\nIf damage would be dealt to Phantom Tiger, prevent that damage. Remove a +1/+1 counter from Phantom Tiger. diff --git a/forge-gui/res/cardsfolder/p/phantom_wurm.txt b/forge-gui/res/cardsfolder/p/phantom_wurm.txt index 39e2ee2ccf4..dfcc4a5e878 100644 --- a/forge-gui/res/cardsfolder/p/phantom_wurm.txt +++ b/forge-gui/res/cardsfolder/p/phantom_wurm.txt @@ -3,7 +3,6 @@ ManaCost:4 G G Types:Creature Wurm Spirit PT:2/0 K:etbCounter:P1P1:4 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/phantom_wurm.jpg Oracle:Phantom Wurm enters the battlefield with four +1/+1 counters on it.\nIf damage would be dealt to Phantom Wurm, prevent that damage. Remove a +1/+1 counter from Phantom Wurm. diff --git a/forge-gui/res/cardsfolder/p/phthisis.txt b/forge-gui/res/cardsfolder/p/phthisis.txt index f834c811375..315fff4579c 100644 --- a/forge-gui/res/cardsfolder/p/phthisis.txt +++ b/forge-gui/res/cardsfolder/p/phthisis.txt @@ -2,9 +2,9 @@ Name:Phthisis ManaCost:3 B B B B Types:Sorcery K:Suspend:5:1 B -A:SP$ Destroy | Cost$ 3 B B B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | RememberLKI$ True | SubAbility$ DBLoseLife | SpellDescription$ Destroy target creature. Its controller loses life equal to its power plus its toughness. +A:SP$ Destroy | Cost$ 3 B B B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | SubAbility$ DBLoseLife | SpellDescription$ Destroy target creature. Its controller loses life equal to its power plus its toughness. SVar:DBLoseLife:DB$ LoseLife | Defined$ TargetedController | LifeAmount$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:RememberedLKI$CardSumPT +SVar:X:TargetedLKI$CardSumPT SVar:Picture:http://www.wizards.com/global/images/magic/general/phthisis.jpg Oracle:Destroy target creature. Its controller loses life equal to its power plus its toughness.\nSuspend 5—{1}{B} (Rather than cast this card from your hand, you may pay {1}{B} and exile it with five time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/p/phylactery_lich.txt b/forge-gui/res/cardsfolder/p/phylactery_lich.txt index 704f26ae557..71bc5d5c3e5 100644 --- a/forge-gui/res/cardsfolder/p/phylactery_lich.txt +++ b/forge-gui/res/cardsfolder/p/phylactery_lich.txt @@ -4,7 +4,7 @@ Types:Creature Zombie PT:5/5 K:Indestructible K:ETBReplacement:Other:TrigChooseArtifact -SVar:TrigChooseArtifact:DB$ ChooseCard | Choices$ Artifact.YouCtrl | RememberChosen$ True | SubAbility$ DBPutCounter | AILogic$ Phylactery | SpellDescription$ As CARDNAME enters the battlefield, put a phylactery counter on an artifact you control. +SVar:TrigChooseArtifact:DB$ ChooseCard | Choices$ Artifact.YouCtrl | Mandatory$ True | RememberChosen$ True | SubAbility$ DBPutCounter | AILogic$ Phylactery | SpellDescription$ As CARDNAME enters the battlefield, put a phylactery counter on an artifact you control. SVar:DBPutCounter:DB$ PutCounter | CounterType$ PHYLACTERY | CounterNum$ 1 | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True T:Mode$ Always | TriggerZones$ Battlefield | IsPresent$ Permanent.counters_GE1_PHYLACTERY+YouCtrl | PresentCompare$ EQ0 | Execute$ TrigSac | TriggerDescription$ When you control no permanents with phylactery counters on them, sacrifice CARDNAME. @@ -12,5 +12,4 @@ SVar:TrigSac:DB$Sacrifice | Defined$ Self AI:RemoveDeck:Random DeckHints:Type$Artifact SVar:NeedsToPlay:Artifact.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/phylactery_lich.jpg Oracle:Indestructible\nAs Phylactery Lich enters the battlefield, put a phylactery counter on an artifact you control.\nWhen you control no permanents with phylactery counters on them, sacrifice Phylactery Lich. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_boon.txt b/forge-gui/res/cardsfolder/p/phyrexian_boon.txt index 5b1c331d595..31d2fafb52e 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_boon.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_boon.txt @@ -2,9 +2,7 @@ Name:Phyrexian Boon ManaCost:2 B Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ Pump +A:SP$ Attach | Cost$ 2 B | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Card.Black S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Black | AddPower$ 2 | AddToughness$ 1 | Description$ Enchanted creature gets +2/+1 as long as it's black. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonBlack | AddPower$ -1 | AddToughness$ -2 | Description$ Otherwise, it gets -1/-2. -AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/phyrexian_boon.jpg Oracle:Enchant creature\nEnchanted creature gets +2/+1 as long as it's black. Otherwise, it gets -1/-2. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt b/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt index 795cfaec2e8..db088fb5cf4 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_gremlins.txt @@ -4,7 +4,7 @@ Types:Creature Gremlin PT:1/1 K:You may choose not to untap CARDNAME during your untap step. A:AB$ Tap | Cost$ T | ValidTgts$ Artifact | RememberTapped$ True | AlwaysRemember$ True | SpellDescription$ Tap target artifact. It doesn't untap during its controller's untap step for as long as CARDNAME remains tapped. | StackDescription$ SpellDescription -S:Mode$ Continuous | Affected$ Creature.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. +S:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. T:Mode$ Untaps | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ ClearRemembered | Static$ True SVar:ClearRemembered:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/phyrexian_scriptures.txt b/forge-gui/res/cardsfolder/p/phyrexian_scriptures.txt index a8e29a408bb..6774ab8daf6 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_scriptures.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_scriptures.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Enchantment Saga K:Saga:3:DBPutCounter,DBDestroyAll,DBChangeZoneAll SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBAnimate | SpellDescription$ Put a +1/+1 counter on up to one target creature. That creature becomes an artifact in addition to its other types. -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Artifact | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Artifact | Duration$ Permanent SVar:DBDestroyAll:DB$ DestroyAll | ValidCards$ Creature.nonArtifact | SpellDescription$ Destroy all nonartifact creatures. SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.OppCtrl | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile all cards from all opponents' graveyards. SVar:NeedsToPlay:Creature.YouCtrl diff --git a/forge-gui/res/cardsfolder/upcoming/pigment_storm.txt b/forge-gui/res/cardsfolder/p/pigment_storm.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pigment_storm.txt rename to forge-gui/res/cardsfolder/p/pigment_storm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pilgrim_of_the_ages.txt b/forge-gui/res/cardsfolder/p/pilgrim_of_the_ages.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pilgrim_of_the_ages.txt rename to forge-gui/res/cardsfolder/p/pilgrim_of_the_ages.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pillardrop_rescuer.txt b/forge-gui/res/cardsfolder/p/pillardrop_rescuer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pillardrop_rescuer.txt rename to forge-gui/res/cardsfolder/p/pillardrop_rescuer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/pillardrop_warden.txt b/forge-gui/res/cardsfolder/p/pillardrop_warden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pillardrop_warden.txt rename to forge-gui/res/cardsfolder/p/pillardrop_warden.txt diff --git a/forge-gui/res/cardsfolder/p/pinecrest_ridge.txt b/forge-gui/res/cardsfolder/p/pinecrest_ridge.txt index 931e53fbec0..58a4f507a38 100644 --- a/forge-gui/res/cardsfolder/p/pinecrest_ridge.txt +++ b/forge-gui/res/cardsfolder/p/pinecrest_ridge.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ R | SubAbility$ DBStayTapped | SpellDescription$ Add {R}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ DBStayTapped | SpellDescription$ Add {G}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {R} or {G}. Pinecrest Ridge doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/p/plague_mare.txt b/forge-gui/res/cardsfolder/p/plague_mare.txt index 754cb903f6c..b6dd724025f 100644 --- a/forge-gui/res/cardsfolder/p/plague_mare.txt +++ b/forge-gui/res/cardsfolder/p/plague_mare.txt @@ -2,7 +2,7 @@ Name:Plague Mare ManaCost:1 B B Types:Creature Nightmare Horse PT:2/2 -K:CantBeBlockedBy Creature.White +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.White | Description$ CARDNAME can't be blocked by white creatures. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPumpAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures your opponents control get -1/-1 until end of turn. SVar:TrigPumpAll:DB$ PumpAll | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True Oracle:Plague Mare can't be blocked by white creatures.\nWhen Plague Mare enters the battlefield, creatures your opponents control get -1/-1 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/plague_of_vermin.txt b/forge-gui/res/cardsfolder/p/plague_of_vermin.txt new file mode 100644 index 00000000000..c124f930313 --- /dev/null +++ b/forge-gui/res/cardsfolder/p/plague_of_vermin.txt @@ -0,0 +1,24 @@ +Name:Plague of Vermin +ManaCost:6 B +Types:Sorcery +A:SP$ Effect | Cost$ 6 B | Name$ Plague of Vermin Life Paid | EffectOwner$ Player | ImprintOnHost$ True | Mutable$ True | Duration$ Permanent | SubAbility$ DBRepeat | StackDescription$ SpellDescription | SpellDescription$ Starting with you, each player may pay any amount of life. Repeat this process until no one pays life. Each player creates a 1/1 black Rat creature token for each 1 life they paid this way. +SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ DBResetCheck | RepeatCheckSVar$ NumPlayerGiveup | RepeatSVarCompare$ LTTotalPlayer | SubAbility$ DBRepeatToken +SVar:DBResetCheck:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBRepeatChoice +SVar:DBRepeatChoice:DB$ RepeatEach | StartingWithActivator$ True | RepeatSubAbility$ DBChoice | RepeatPlayers$ Player +SVar:DBChoice:DB$ ChooseNumber | Defined$ Player.IsRemembered | Max$ LifeTotal | AILogic$ Vermin | ListTitle$ Pay Any Amount of Life | SubAbility$ DBCheckPaid +SVar:DBCheckPaid:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBStore +SVar:DBStore:DB$ PutCounter | Defined$ Imprinted.namedPlague of Vermin Life Paid+OwnedBy Player.IsRemembered | CounterNum$ X | Placer$ Player.IsRemembered | CounterType$ PLAGUE | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | UnlessCost$ PayLife | UnlessPayer$ Player.IsRemembered | UnlessSwitched$ True | UnlessResolveSubs$ WhenNotPaid | SubAbility$ DBGiveUp | SpellDescription$ You may pay any amount of life. +SVar:DBGiveUp:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ CountSVar | Expression$ NumPlayerGiveup/Plus.1 | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 +SVar:DBRepeatToken:DB$ RepeatEach | StartingWithActivator$ True | RepeatSubAbility$ DBToken | RepeatPlayers$ Player | SubAbility$ DBFinalReset +SVar:DBToken:DB$ Token | TokenAmount$ LifePaidAmount | TokenScript$ b_1_1_rat | TokenOwner$ Player.IsRemembered | StackDescription$ None | SubAbility$ DBRestoreImmutable +SVar:DBRestoreImmutable:DB$ Animate | Defined$ Imprinted.namedPlague of Vermin Life Paid+OwnedBy Player.IsRemembered | Duration$ Permanent | Immutable$ True +SVar:DBFinalReset:DB$ StoreSVar | SVar$ NumPlayerGiveup | Type$ Number | Expression$ 0 | SubAbility$ DBExileEffect +SVar:DBExileEffect:DB$ ChangeZone | Defined$ Imprinted | Origin$ Command | Destination$ Exile | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:NumPlayerGiveup:Number$0 +SVar:TotalPlayer:PlayerCountPlayers$Amount +SVar:LifeTotal:PlayerCountRemembered$LifeTotal +SVar:LifePaidAmount:ImprintedLKI$FilterControlledByRemembered_CardCounters.PLAGUE +SVar:X:Count$ChosenNumber +AI:RemoveDeck:Random +Oracle:Starting with you, each player may pay any amount of life. Repeat this process until no one pays life. Each player creates a 1/1 black Rat creature token for each 1 life they paid this way. diff --git a/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt b/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt index 51e0b4a9797..0083964dacb 100644 --- a/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt +++ b/forge-gui/res/cardsfolder/p/planeswalkers_mischief.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ Reveal | Cost$ 3 U | Random$ True | RememberRevealed$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent to reveal a card | SorcerySpeed$ True | SubAbility$ DBChangeZone | SpellDescription$ Target opponent reveals a card at random from their hand. If it's an instant or sorcery card, exile it. You may cast it without paying its mana cost for as long as it remains exiled. At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. Activate only as a sorcery. SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Instant.IsRemembered,Sorcery.IsRemembered | Origin$ Hand | Destination$ Exile | SubAbility$ DBForgetOther SVar:DBForgetOther:DB$ Cleanup | ClearRemembered$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ MischiefPlay | Triggers$ TrigEOT,TrigChangesZone | RememberObjects$ Remembered | Permanent$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBEffect:DB$ Effect | StaticAbilities$ MischiefPlay | Triggers$ TrigEOT,TrigChangesZone | RememberObjects$ Remembered | Duration$ Permanent | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MischiefPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+OppOwn | AffectedZone$ Exile | Description$ You may cast a card without paying its mana cost as long as it remains exiled. SVar:TrigEOT:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ MischiefReturn | TriggerDescription$ At the beginning of the next end step, if you haven't cast it, return it to its owner's hand. diff --git a/forge-gui/res/cardsfolder/p/plated_pegasus.txt b/forge-gui/res/cardsfolder/p/plated_pegasus.txt index 9929068ed00..7fc148732cf 100644 --- a/forge-gui/res/cardsfolder/p/plated_pegasus.txt +++ b/forge-gui/res/cardsfolder/p/plated_pegasus.txt @@ -4,6 +4,6 @@ Types:Creature Pegasus PT:1/2 K:Flash K:Flying -S:Mode$ PreventDamage | Target$ Permanent,Player | Source$ Spell | Amount$ 1 | Description$ If a spell would deal damage to a permanent or player, prevent 1 damage that spell would deal to that permanent or player. -SVar:Picture:http://www.wizards.com/global/images/magic/general/plated_pegasus.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Spell | ValidTarget$ Permanent,Player | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a spell would deal damage to a permanent or player, prevent 1 damage that spell would deal to that permanent or player. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying\nIf a spell would deal damage to a permanent or player, prevent 1 damage that spell would deal to that permanent or player. diff --git a/forge-gui/res/cardsfolder/upcoming/plumb_the_forbidden.txt b/forge-gui/res/cardsfolder/p/plumb_the_forbidden.txt similarity index 90% rename from forge-gui/res/cardsfolder/upcoming/plumb_the_forbidden.txt rename to forge-gui/res/cardsfolder/p/plumb_the_forbidden.txt index eca4c941907..7461c68c2d9 100644 --- a/forge-gui/res/cardsfolder/upcoming/plumb_the_forbidden.txt +++ b/forge-gui/res/cardsfolder/p/plumb_the_forbidden.txt @@ -3,7 +3,7 @@ ManaCost:1 B Types:Instant T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigCopy | CheckSVar$ X | TriggerDescription$ As an additional cost to cast this spell, you may sacrifice one or more creatures. When you do, copy this spell for each creature sacrificed this way. SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ X -A:SP$ Draw | Cost$ 1 B Sac | SubAbility$ DBLoseLife | CostDesc$ | SpellDescription$ You draw a cards and you lose 1 life. +A:SP$ Draw | Cost$ 1 B Sac | SubAbility$ DBLoseLife | CostDesc$ | SpellDescription$ You draw a card and you lose 1 life. SVar:DBLoseLife:DB$LoseLife | LifeAmount$ 1 SVar:X:Count$xPaid Oracle:As an additional cost to cast this spell, you may sacrifice one or more creatures. When you do, copy this spell for each creature sacrificed this way.\nYou draw a card and you lose 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/poets_quill.txt b/forge-gui/res/cardsfolder/p/poets_quill.txt similarity index 96% rename from forge-gui/res/cardsfolder/upcoming/poets_quill.txt rename to forge-gui/res/cardsfolder/p/poets_quill.txt index 2a7625fb525..84b5e8eb258 100644 --- a/forge-gui/res/cardsfolder/upcoming/poets_quill.txt +++ b/forge-gui/res/cardsfolder/p/poets_quill.txt @@ -1,6 +1,6 @@ Name:Poet's Quill ManaCost:1 B -Types:Artifact — Equipment +Types:Artifact Equipment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLearn | TriggerDescription$ When CARDNAME enters the battlefield, learn. (You may reveal a Lesson card you own from outside the game and put it into your hand, or discard a card to draw a card.) SVar:TrigLearn:DB$ Learn S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Lifelink | Description$ Equipped creature gets +1/+1 and has lifelink. diff --git a/forge-gui/res/cardsfolder/p/pollen_lullaby.txt b/forge-gui/res/cardsfolder/p/pollen_lullaby.txt index 62c6103ed7d..a6d9d60d81c 100644 --- a/forge-gui/res/cardsfolder/p/pollen_lullaby.txt +++ b/forge-gui/res/cardsfolder/p/pollen_lullaby.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Instant A:SP$ Fog | Cost$ 1 W | SubAbility$ DBClash | SpellDescription$ Prevent all combat damage that would be dealt this turn. Clash with an opponent. If you win, creatures that player controls don't untap during the player's next untap step. SVar:DBClash:DB$Clash | WinSubAbility$ DBPumpAll | RememberClasher$ True | SubAbility$ DBCleanup -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.RememberedPlayerCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.RememberedPlayerCtrl | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/pollen_lullaby.jpg Oracle:Prevent all combat damage that would be dealt this turn. Clash with an opponent. If you win, creatures that player controls don't untap during the player's next untap step. (Each clashing player reveals the top card of their library, then puts that card on the top or bottom. A player wins if their card had a higher mana value.) diff --git a/forge-gui/res/cardsfolder/p/polukranos_unchained.txt b/forge-gui/res/cardsfolder/p/polukranos_unchained.txt index 27d03f240da..cdfdc52bb3c 100644 --- a/forge-gui/res/cardsfolder/p/polukranos_unchained.txt +++ b/forge-gui/res/cardsfolder/p/polukranos_unchained.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Zombie Hydra PT:0/0 K:etbCounter:P1P1:X:nocondition:CARDNAME enters the battlefield with six +1/+1 counters on it. It escapes with twelve +1/+1 counters on it instead. SVar:X:Count$Escaped.12.6 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from CARDNAME. SVar:Counters:DB$ RemoveCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ Y SVar:Y:ReplaceCount$DamageAmount A:AB$ Fight | Cost$ 1 B G | Defined$ Self | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | SpellDescription$ CARDNAME fights another target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/pop_quiz.txt b/forge-gui/res/cardsfolder/p/pop_quiz.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/pop_quiz.txt rename to forge-gui/res/cardsfolder/p/pop_quiz.txt diff --git a/forge-gui/res/cardsfolder/p/postmortem_lunge.txt b/forge-gui/res/cardsfolder/p/postmortem_lunge.txt index a7913f05d41..629f6c21740 100644 --- a/forge-gui/res/cardsfolder/p/postmortem_lunge.txt +++ b/forge-gui/res/cardsfolder/p/postmortem_lunge.txt @@ -2,7 +2,7 @@ Name:Postmortem Lunge ManaCost:X PB Types:Sorcery A:SP$ ChangeZone | Cost$ X PB | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcEQX | TgtPrompt$ Choose target creature with mana value equal to X. | SubAbility$ DBHaste | AILogic$ BeforeCombat | SpellDescription$ Return target creature card with mana value X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. -SVar:DBHaste:DB$ Animate | Defined$ Targeted | Keywords$ Haste | Permanent$ True | AtEOT$ Exile +SVar:DBHaste:DB$ Animate | Defined$ Targeted | Keywords$ Haste | Duration$ Permanent | AtEOT$ Exile SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:({B/P} can be paid with either {B} or 2 life.)\nReturn target creature card with mana value X from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/pouncing_kavu.txt b/forge-gui/res/cardsfolder/p/pouncing_kavu.txt index a21c508bf68..1e7ce281206 100644 --- a/forge-gui/res/cardsfolder/p/pouncing_kavu.txt +++ b/forge-gui/res/cardsfolder/p/pouncing_kavu.txt @@ -6,6 +6,6 @@ K:Kicker:2 R K:First Strike T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ PounceAdvantage | Static$ True | TriggerDescription$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with haste. SVar:PounceAdvantage:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ PounceAmbush -SVar:PounceAmbush:DB$ Pump | Defined$ Self | KW$ Haste | Permanent$ True +SVar:PounceAmbush:DB$ Pump | Defined$ Self | KW$ Haste | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/pouncing_kavu.jpg Oracle:Kicker {2}{R} (You may pay an additional {2}{R} as you cast this spell.)\nFirst strike\nIf Pouncing Kavu was kicked, it enters the battlefield with two +1/+1 counters on it and with haste. diff --git a/forge-gui/res/cardsfolder/p/pouncing_wurm.txt b/forge-gui/res/cardsfolder/p/pouncing_wurm.txt index 415fc1e8bca..3ecff0bc1f2 100644 --- a/forge-gui/res/cardsfolder/p/pouncing_wurm.txt +++ b/forge-gui/res/cardsfolder/p/pouncing_wurm.txt @@ -5,6 +5,6 @@ PT:3/3 K:Kicker:2 G T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ TrigPut | Static$ True | TriggerDescription$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with haste. SVar:TrigPut:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Haste | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Haste | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/pouncing_wurm.jpg Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nIf Pouncing Wurm was kicked, it enters the battlefield with three +1/+1 counters on it and with haste. diff --git a/forge-gui/res/cardsfolder/p/power_leak.txt b/forge-gui/res/cardsfolder/p/power_leak.txt index 5a741c8c2f4..046cd4e6203 100644 --- a/forge-gui/res/cardsfolder/p/power_leak.txt +++ b/forge-gui/res/cardsfolder/p/power_leak.txt @@ -4,12 +4,12 @@ Types:Enchantment Aura K:Enchant enchantment A:SP$ Attach | Cost$ 1 U | ValidTgts$ Enchantment | AILogic$ Curse T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ EnchantedController | Execute$ DBPay | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of the upkeep of enchanted enchantment's controller, that player may pay any amount of mana. CARDNAME deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. -S:Mode$ PreventDamage | Target$ EnchantedController | Source$ Card.Self | Amount$ PaidAmount | Secondary$ True +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.Self | ReplaceWith$ DBReplace | PreventionEffect$ True | Secondary$ True +SVar:DBReplace:DB$ ReplaceDamage | Amount$ PaidAmount SVar:DBPay:DB$ ChooseNumber | Defined$ EnchantedController | ChooseAnyNumber$ True | ListTitle$ Pay Any Mana | AILogic$ PowerLeakMaxMana.2 | SubAbility$ DBStore SVar:DBStore:DB$ StoreSVar | SVar$ PaidAmount | Type$ CountSVar | Expression$ X | UnlessCost$ X | UnlessPayer$ EnchantedController | UnlessSwitched$ True | SubAbility$ DBDmg SVar:DBDmg:DB$ DealDamage | Defined$ EnchantedController | NumDmg$ 2 | SubAbility$ DBReset | StackDescription$ None SVar:DBReset:DB$ StoreSVar | SVar$ PaidAmount | Type$ Number | Expression$ 0 SVar:X:Count$ChosenNumber SVar:PaidAmount:Number$0 -SVar:Picture:http://www.wizards.com/global/images/magic/general/power_leak.jpg Oracle:Enchant enchantment\nAt the beginning of the upkeep of enchanted enchantment's controller, that player may pay any amount of mana. Power Leak deals 2 damage to that player. Prevent X of that damage, where X is the amount of mana that player paid this way. diff --git a/forge-gui/res/cardsfolder/upcoming/practical_research.txt b/forge-gui/res/cardsfolder/p/practical_research.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/practical_research.txt rename to forge-gui/res/cardsfolder/p/practical_research.txt diff --git a/forge-gui/res/cardsfolder/p/prahv.txt b/forge-gui/res/cardsfolder/p/prahv.txt index 9580fd60579..91c184cc6a1 100644 --- a/forge-gui/res/cardsfolder/p/prahv.txt +++ b/forge-gui/res/cardsfolder/p/prahv.txt @@ -1,13 +1,10 @@ Name:Prahv ManaCost:no cost Types:Plane Ravnica -S:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.YouCtrl | CheckSVar$ CheckThisTurnCast | Description$ If you cast a spell this turn, you can't attack with creatures. -SVar:CheckThisTurnCast:Count$ThisTurnCast_Card.YouCtrl -S:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ You | CheckSVar$ CheckThisTurnAttacked | Description$ If you attacked with creatures this turn, you can't cast spells. -SVar:CheckThisTurnAttacked:Count$AttackersDeclared +S:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.ControlledBy You.castSpellThisTurn | Description$ If you cast a spell this turn, you can't attack with creatures. +S:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card | Caster$ You.attackedWithCreaturesThisTurn | Description$ If you attacked with creatures this turn, you can't cast spells. T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, you gain life equal to the number of cards in your hand. SVar:RolledChaos:DB$ GainLife | LifeAmount$ PrahvX | Defined$ You SVar:PrahvX:Count$InYourHand SVar:AIRollPlanarDieParams:Mode$ Always | CardsInHandGE$ 2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/prahv.jpg Oracle:If you cast a spell this turn, you can't attack with creatures.\nIf you attacked with creatures this turn, you can't cast spells.\nWhenever you roll {CHAOS}, you gain life equal to the number of cards in your hand. diff --git a/forge-gui/res/cardsfolder/p/prahv_spires_of_order.txt b/forge-gui/res/cardsfolder/p/prahv_spires_of_order.txt index 3b78e0e764f..369e871a81b 100644 --- a/forge-gui/res/cardsfolder/p/prahv_spires_of_order.txt +++ b/forge-gui/res/cardsfolder/p/prahv_spires_of_order.txt @@ -4,7 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ ChooseSource | Cost$ 4 W U T | Choices$ Card | RememberChosen$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all damage the chosen source would deal this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | Description$ Prevent all damage the chosen source would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/prahv_spires_of_order.jpg Oracle:{T}: Add {C}.\n{4}{W}{U}, {T}: Prevent all damage a source of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/p/press_for_answers.txt b/forge-gui/res/cardsfolder/p/press_for_answers.txt index d68e1d23d8f..aac0a22adff 100644 --- a/forge-gui/res/cardsfolder/p/press_for_answers.txt +++ b/forge-gui/res/cardsfolder/p/press_for_answers.txt @@ -2,7 +2,7 @@ Name:Press for Answers ManaCost:1 U Types:Sorcery A:SP$ Tap | Cost$ 1 U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBInvestigate +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBInvestigate SVar:DBInvestigate:DB$ Investigate DeckHas:Ability$Investigate Oracle:Tap target creature. It doesn't untap during its controller's next untap step.\nInvestigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/p/primal_clay.txt b/forge-gui/res/cardsfolder/p/primal_clay.txt index 5f149ce3b5b..0a894d17df0 100644 --- a/forge-gui/res/cardsfolder/p/primal_clay.txt +++ b/forge-gui/res/cardsfolder/p/primal_clay.txt @@ -4,9 +4,9 @@ Types:Artifact Creature Shapeshifter PT:*/* K:ETBReplacement:Other:MoldChoice SVar:MoldChoice:DB$ GenericChoice | Defined$ You | Choices$ GroundMold,AirMold,WallMold | SpellDescription$ As CARDNAME enters the battlefield, it becomes your choice of a 3/3 artifact creature, a 2/2 artifact creature with flying, or a 1/6 Wall artifact creature with defender in addition to its other types. -SVar:GroundMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME is 3/3 -SVar:AirMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying -SVar:WallMold:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 1 | Toughness$ 6 | Types$ Wall | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender and is a wall in addition to its other types +SVar:GroundMold:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME is 3/3 +SVar:AirMold:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying +SVar:WallMold:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 1 | Toughness$ 6 | Types$ Wall | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender and is a wall in addition to its other types AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/4e/en-us/card2065.jpg Oracle:As Primal Clay enters the battlefield, it becomes your choice of a 3/3 artifact creature, a 2/2 artifact creature with flying, or a 1/6 Wall artifact creature with defender in addition to its other types. (A creature with defender can't attack.) diff --git a/forge-gui/res/cardsfolder/p/primal_plasma.txt b/forge-gui/res/cardsfolder/p/primal_plasma.txt index dca9c1b421d..693885e5ae6 100644 --- a/forge-gui/res/cardsfolder/p/primal_plasma.txt +++ b/forge-gui/res/cardsfolder/p/primal_plasma.txt @@ -4,9 +4,9 @@ Types:Creature Elemental Shapeshifter PT:*/* R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ PlasmaChoice | Description$ As CARDNAME enters the battlefield, it becomes your choice of a 3/3 creature, a 2/2 creature with flying, or a 1/6 creature with defender. SVar:PlasmaChoice:DB$ GenericChoice | Defined$ You | Choices$ GroundPlasma,AirPlasma,WallPlasma -SVar:GroundPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME is 3/3 | SubAbility$ DBMove -SVar:AirPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying | SubAbility$ DBMove -SVar:WallPlasma:DB$ Animate | Defined$ Self | Permanent$ True | Power$ 1 | Toughness$ 6 | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender | SubAbility$ DBMove +SVar:GroundPlasma:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME is 3/3 | SubAbility$ DBMove +SVar:AirPlasma:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 2 | Toughness$ 2 | Keywords$ Flying | SpellDescription$ CARDNAME is 2/2 with flying | SubAbility$ DBMove +SVar:WallPlasma:DB$ Animate | Defined$ Self | Duration$ Permanent | Power$ 1 | Toughness$ 6 | Keywords$ Defender | SpellDescription$ CARDNAME is 1/6 with defender | SubAbility$ DBMove SVar:DBMove:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ All | Destination$ Battlefield AI:RemoveDeck:All SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card124757.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/prismari_apprentice.txt b/forge-gui/res/cardsfolder/p/prismari_apprentice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prismari_apprentice.txt rename to forge-gui/res/cardsfolder/p/prismari_apprentice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prismari_campus.txt b/forge-gui/res/cardsfolder/p/prismari_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prismari_campus.txt rename to forge-gui/res/cardsfolder/p/prismari_campus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prismari_command.txt b/forge-gui/res/cardsfolder/p/prismari_command.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prismari_command.txt rename to forge-gui/res/cardsfolder/p/prismari_command.txt diff --git a/forge-gui/res/cardsfolder/upcoming/prismari_pledgemage.txt b/forge-gui/res/cardsfolder/p/prismari_pledgemage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/prismari_pledgemage.txt rename to forge-gui/res/cardsfolder/p/prismari_pledgemage.txt diff --git a/forge-gui/res/cardsfolder/p/prismatic_lace.txt b/forge-gui/res/cardsfolder/p/prismatic_lace.txt index 9bddfd020e4..fb3e710f57e 100644 --- a/forge-gui/res/cardsfolder/p/prismatic_lace.txt +++ b/forge-gui/res/cardsfolder/p/prismatic_lace.txt @@ -2,7 +2,7 @@ Name:Prismatic Lace ManaCost:U Types:Instant A:SP$ ChooseColor | Cost$ U | Defined$ You | OrColors$ True | SubAbility$ Animate | SpellDescription$ Target permanent becomes the color or colors of your choice. (This effect lasts indefinitely.) -SVar:Animate:DB$ Animate | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True +SVar:Animate:DB$ Animate | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Colors$ ChosenColor | OverwriteColors$ True | Duration$ Permanent AI:RemoveDeck:All AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/prismatic_lace.jpg diff --git a/forge-gui/res/cardsfolder/p/prison_barricade.txt b/forge-gui/res/cardsfolder/p/prison_barricade.txt index 80f84a3a4d6..aa709709026 100644 --- a/forge-gui/res/cardsfolder/p/prison_barricade.txt +++ b/forge-gui/res/cardsfolder/p/prison_barricade.txt @@ -6,6 +6,6 @@ K:Defender K:Kicker:1 W T:Mode$ ChangesZone | ValidCard$ Card.Self+kicked | Origin$ Any | Destination$ Battlefield | Execute$ BarricadePumped | Static$ True | TriggerDescription$ If CARDNAME was kicked, it enters the battlefield with a +1/+1 counter on it and with "CARDNAME can attack as though it didn't have defender." SVar:BarricadePumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ PrisonAttack -SVar:PrisonAttack:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | Permanent$ True +SVar:PrisonAttack:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME can attack as though it didn't have defender. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/prison_barricade.jpg Oracle:Defender (This creature can't attack.)\nKicker {1}{W} (You may pay an additional {1}{W} as you cast this spell.)\nIf Prison Barricade was kicked, it enters the battlefield with a +1/+1 counter on it and with "Prison Barricade can attack as though it didn't have defender." diff --git a/forge-gui/res/cardsfolder/p/prison_realm.txt b/forge-gui/res/cardsfolder/p/prison_realm.txt index cf02976d900..665dab26ea4 100644 --- a/forge-gui/res/cardsfolder/p/prison_realm.txt +++ b/forge-gui/res/cardsfolder/p/prison_realm.txt @@ -2,7 +2,7 @@ Name:Prison Realm ManaCost:2 W Types: Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature or planeswalker an opponent controls until CARDNAME leaves the battlefield. | SpellDescription$ When CARDNAME enters the battlefield, exile target creature or planeswalker an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigScry | TriggerDescription$ When CARDNAME enters the battlefield, scry 1. SVar:TrigScry:DB$ Scry | ScryNum$ 1 diff --git a/forge-gui/res/cardsfolder/upcoming/professor_of_symbology.txt b/forge-gui/res/cardsfolder/p/professor_of_symbology.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/professor_of_symbology.txt rename to forge-gui/res/cardsfolder/p/professor_of_symbology.txt diff --git a/forge-gui/res/cardsfolder/upcoming/professor_of_zoomancy.txt b/forge-gui/res/cardsfolder/p/professor_of_zoomancy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/professor_of_zoomancy.txt rename to forge-gui/res/cardsfolder/p/professor_of_zoomancy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/professor_onyx.txt b/forge-gui/res/cardsfolder/p/professor_onyx.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/professor_onyx.txt rename to forge-gui/res/cardsfolder/p/professor_onyx.txt diff --git a/forge-gui/res/cardsfolder/upcoming/professors_warning.txt b/forge-gui/res/cardsfolder/p/professors_warning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/professors_warning.txt rename to forge-gui/res/cardsfolder/p/professors_warning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/promise_of_loyalty.txt b/forge-gui/res/cardsfolder/p/promise_of_loyalty.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/promise_of_loyalty.txt rename to forge-gui/res/cardsfolder/p/promise_of_loyalty.txt diff --git a/forge-gui/res/cardsfolder/upcoming/promising_duskmage.txt b/forge-gui/res/cardsfolder/p/promising_duskmage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/promising_duskmage.txt rename to forge-gui/res/cardsfolder/p/promising_duskmage.txt diff --git a/forge-gui/res/cardsfolder/p/protean_hydra.txt b/forge-gui/res/cardsfolder/p/protean_hydra.txt index 90a87adf05e..8c726619df0 100644 --- a/forge-gui/res/cardsfolder/p/protean_hydra.txt +++ b/forge-gui/res/cardsfolder/p/protean_hydra.txt @@ -4,7 +4,7 @@ Types:Creature Hydra PT:0/0 K:etbCounter:P1P1:X SVar:X:Count$xPaid -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage and remove that many +1/+1 counters from it. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage and remove that many +1/+1 counters from it. SVar:Counters:DB$ RemoveCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ Y SVar:Y:ReplaceCount$DamageAmount T:Mode$ CounterRemoved | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ ProteanPutCounter | TriggerDescription$ Whenever a +1/+1 counter is removed from CARDNAME, put two +1/+1 counters on it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/p/protection_of_the_hekma.txt b/forge-gui/res/cardsfolder/p/protection_of_the_hekma.txt index bf63586bb1a..7cf5d53f363 100644 --- a/forge-gui/res/cardsfolder/p/protection_of_the_hekma.txt +++ b/forge-gui/res/cardsfolder/p/protection_of_the_hekma.txt @@ -1,6 +1,6 @@ Name:Protection of the Hekma ManaCost:4 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.OppCtrl | Amount$ 1 | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. -SVar:Picture:http://www.wizards.com/global/images/magic/general/protection_of_the_hekma.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source an opponent controls would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:If a source an opponent controls would deal damage to you, prevent 1 of that damage. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/proteus_machine.txt b/forge-gui/res/cardsfolder/p/proteus_machine.txt index 518437ec0ea..b4bb0af1a35 100644 --- a/forge-gui/res/cardsfolder/p/proteus_machine.txt +++ b/forge-gui/res/cardsfolder/p/proteus_machine.txt @@ -5,6 +5,6 @@ PT:2/2 K:Morph:0 T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, it becomes the creature type of your choice. (This effect lasts indefinitely.) SVar:TrigChoose:DB$ ChooseType | Cost$ 1 | Defined$ You | Type$ Creature | SubAbility$ DBAnimate | AILogic$ MostProminentInComputerDeck -SVar:DBAnimate:DB$ Animate | Defined$ Self | Types$ ChosenType | RemoveCreatureTypes$ True | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Self | Types$ ChosenType | RemoveCreatureTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/proteus_machine.jpg Oracle:Morph {0} (You may cast this card face down as a 2/2 creature for {3}. Turn it face up any time for its morph cost.)\nWhen Proteus Machine is turned face up, it becomes the creature type of your choice. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/p/prowling_nightstalker.txt b/forge-gui/res/cardsfolder/p/prowling_nightstalker.txt index 0e7f8287b27..4f9e0cb06df 100644 --- a/forge-gui/res/cardsfolder/p/prowling_nightstalker.txt +++ b/forge-gui/res/cardsfolder/p/prowling_nightstalker.txt @@ -2,6 +2,5 @@ Name:Prowling Nightstalker ManaCost:3 B Types:Creature Nightstalker PT:2/2 -K:CantBeBlockedBy Creature.nonBlack -SVar:Picture:http://www.wizards.com/global/images/magic/general/prowling_nightstalker.jpg -Oracle:Prowling Nightstalker can't be blocked except by black creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonBlack | Description$ CARDNAME can't be blocked except by black creatures. +Oracle:Prowling Nightstalker can't be blocked except by black creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/p/psychic_miasma.txt b/forge-gui/res/cardsfolder/p/psychic_miasma.txt index a44780932f7..240586cad3e 100644 --- a/forge-gui/res/cardsfolder/p/psychic_miasma.txt +++ b/forge-gui/res/cardsfolder/p/psychic_miasma.txt @@ -1,10 +1,7 @@ Name:Psychic Miasma ManaCost:1 B Types:Sorcery -#You can not clear a remembered object from a card on the stack, so this card is cleaned beforehand. -A:SP$ Pump | Cost$ 1 B | SubAbility$ DBCleanup | Static$ True -SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBChangeZone | SpellDescription$ Target player discards a card. If a land card is discarded this way, return CARDNAME to its owner's hand. -SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand | Hidden$ True | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ EQ1 -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBDiscard -SVar:Picture:http://www.wizards.com/global/images/magic/general/psychic_miasma.jpg +A:SP$ Discard | Cost$ 1 B | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBChangeZone | SpellDescription$ Target player discards a card. If a land card is discarded this way, return CARDNAME to its owner's hand. +SVar:DBChangeZone:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand | Hidden$ True | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ EQ1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Target player discards a card. If a land card is discarded this way, return Psychic Miasma to its owner's hand. diff --git a/forge-gui/res/cardsfolder/p/puppeteer_clique.txt b/forge-gui/res/cardsfolder/p/puppeteer_clique.txt index 72eaf602a54..7cb3be4dfdf 100644 --- a/forge-gui/res/cardsfolder/p/puppeteer_clique.txt +++ b/forge-gui/res/cardsfolder/p/puppeteer_clique.txt @@ -6,7 +6,7 @@ K:Flying K:Persist T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, put target creature card from an opponent's graveyard onto the battlefield under your control. It gains haste. At the beginning of your next end step, exile it. SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Creature.OppOwn | TgtPrompt$ Select target creature from an opponent's graveyard | RememberChanged$ True | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:ALWAYS SVar:Picture:http://www.wizards.com/global/images/magic/general/puppeteer_clique.jpg diff --git a/forge-gui/res/cardsfolder/p/purelace.txt b/forge-gui/res/cardsfolder/p/purelace.txt index 055e16d49a4..b03cd0d9004 100644 --- a/forge-gui/res/cardsfolder/p/purelace.txt +++ b/forge-gui/res/cardsfolder/p/purelace.txt @@ -1,7 +1,7 @@ Name:Purelace ManaCost:W Types:Instant -A:SP$ Animate | Cost$ W | Colors$ White | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes white. (Mana symbols on that permanent remain unchanged.) +A:SP$ Animate | Cost$ W | Colors$ White | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes white. (Mana symbols on that permanent remain unchanged.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/purelace.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/quandrix_apprentice.txt b/forge-gui/res/cardsfolder/q/quandrix_apprentice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quandrix_apprentice.txt rename to forge-gui/res/cardsfolder/q/quandrix_apprentice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quandrix_campus.txt b/forge-gui/res/cardsfolder/q/quandrix_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quandrix_campus.txt rename to forge-gui/res/cardsfolder/q/quandrix_campus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quandrix_command.txt b/forge-gui/res/cardsfolder/q/quandrix_command.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quandrix_command.txt rename to forge-gui/res/cardsfolder/q/quandrix_command.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quandrix_cultivator.txt b/forge-gui/res/cardsfolder/q/quandrix_cultivator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quandrix_cultivator.txt rename to forge-gui/res/cardsfolder/q/quandrix_cultivator.txt diff --git a/forge-gui/res/cardsfolder/upcoming/quandrix_pledgemage.txt b/forge-gui/res/cardsfolder/q/quandrix_pledgemage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quandrix_pledgemage.txt rename to forge-gui/res/cardsfolder/q/quandrix_pledgemage.txt diff --git a/forge-gui/res/cardsfolder/q/quarantine_field.txt b/forge-gui/res/cardsfolder/q/quarantine_field.txt index cb15083eac3..339f699b104 100644 --- a/forge-gui/res/cardsfolder/q/quarantine_field.txt +++ b/forge-gui/res/cardsfolder/q/quarantine_field.txt @@ -4,7 +4,7 @@ Types:Enchantment K:etbCounter:ISOLATION:X SVar:X:Count$xPaid T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, for each isolation counter on it, exile up to one target nonland permanent an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ Y | TgtPrompt$ Select target nonland permanent an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TargetMin$ 0 | TargetMax$ Y | TgtPrompt$ Select target nonland permanent an opponent controls | Duration$ UntilHostLeavesPlay SVar:Y:Count$CardCounters.ISOLATION SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE diff --git a/forge-gui/res/cardsfolder/q/quash.txt b/forge-gui/res/cardsfolder/q/quash.txt index 7f44f0adab4..73d5dbd7467 100644 --- a/forge-gui/res/cardsfolder/q/quash.txt +++ b/forge-gui/res/cardsfolder/q/quash.txt @@ -1,12 +1,10 @@ Name:Quash ManaCost:2 U U Types:Instant -A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | ValidTgts$ Instant,Sorcery | RememberCountered$ True | ForgetOtherTargets$ True | SubAbility$ ExileYard | SpellDescription$ Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. -SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ Remembered.sameName | SubAbility$ ExileHand | StackDescription$ None -SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None -SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | SubAbility$ DBCleanup | StackDescription$ None +A:SP$ Counter | Cost$ 2 U U | TargetType$ Spell | ValidTgts$ Instant,Sorcery | SubAbility$ ExileYard | SpellDescription$ Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. +SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ TargetedCard.sameName | SubAbility$ ExileHand | StackDescription$ None +SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None +SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | StackDescription$ None SVar:NumInHand:TargetedController$CardsInHand SVar:NumInLib:TargetedController$CardsInLibrary -SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True -SVar:Picture:http://www.wizards.com/global/images/magic/general/quash.jpg Oracle:Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles. diff --git a/forge-gui/res/cardsfolder/q/queen_of_ice_rage_of_winter.txt b/forge-gui/res/cardsfolder/q/queen_of_ice_rage_of_winter.txt index a878e41c1f3..8a2a92aa2da 100644 --- a/forge-gui/res/cardsfolder/q/queen_of_ice_rage_of_winter.txt +++ b/forge-gui/res/cardsfolder/q/queen_of_ice_rage_of_winter.txt @@ -4,7 +4,7 @@ Types:Creature Human Noble Wizard PT:2/3 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals combat damage to a creature, tap that creature. It doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredTarget | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredTarget | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True SVar:HasCombatEffect:TRUE Oracle:Whenever Queen of Ice deals combat damage to a creature, tap that creature. It doesn't untap during its controller's next untap step. AlternateMode:Adventure @@ -15,5 +15,5 @@ Name:Rage of Winter ManaCost:1 U Types:Sorcery Adventure A:SP$ Tap | Cost$ 1 U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. (Then exile this card. You may cast the creature later from exile.) -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True Oracle:Tap target creature. It doesn't untap during its controller's next untap step. (Then exile this card. You may cast the creature later from exile.) diff --git a/forge-gui/res/cardsfolder/q/questing_beast.txt b/forge-gui/res/cardsfolder/q/questing_beast.txt index 7798cb5b444..09b3f9edeb6 100644 --- a/forge-gui/res/cardsfolder/q/questing_beast.txt +++ b/forge-gui/res/cardsfolder/q/questing_beast.txt @@ -5,7 +5,7 @@ PT:4/4 K:Vigilance K:Deathtouch K:Haste -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. S:Mode$ CantPreventDamage | IsCombat$ True | ValidSource$ Creature.YouCtrl | Description$ Combat damage that would be dealt by creatures you control can't be prevented. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | CombatDamage$ True | TriggerZones$ Battlefield | Execute$ MoreDamage | TriggerDescription$ Whenever CARDNAME deals combat damage to an opponent, it deals that much damage to target planeswalker that player controls. SVar:MoreDamage:DB$ DealDamage | ValidTgts$ Planeswalker.ControlledBy TriggeredTarget | TgtPrompt$ Select target planeswalker that player controls | NumDmg$ X diff --git a/forge-gui/res/cardsfolder/q/quickening_licid.txt b/forge-gui/res/cardsfolder/q/quickening_licid.txt index beacf259168..ee87aad82e8 100644 --- a/forge-gui/res/cardsfolder/q/quickening_licid.txt +++ b/forge-gui/res/cardsfolder/q/quickening_licid.txt @@ -2,7 +2,7 @@ Name:Quickening Licid ManaCost:1 W Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ W | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. +A:AB$ Animate | Cost$ W T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ W | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {W} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ First Strike | Description$ Enchanted creature has first strike. diff --git a/forge-gui/res/cardsfolder/q/quicksmith_rebel.txt b/forge-gui/res/cardsfolder/q/quicksmith_rebel.txt index 625b28d8177..a91f63caae6 100644 --- a/forge-gui/res/cardsfolder/q/quicksmith_rebel.txt +++ b/forge-gui/res/cardsfolder/q/quicksmith_rebel.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Creature Human Artificer PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, target artifact you control gains "{T}: This artifact deals 2 damage to any target" for as long as you control CARDNAME. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Abilities$ ABDealDamage | UntilLoseControlOfHost$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Abilities$ ABDealDamage | Duration$ UntilLoseControlOfHost SVar:ABDealDamage:AB$DealDamage | Cost$ T | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksmith_rebel.jpg diff --git a/forge-gui/res/cardsfolder/q/quicksmith_spy.txt b/forge-gui/res/cardsfolder/q/quicksmith_spy.txt index b45d2d02516..07b898cbe75 100644 --- a/forge-gui/res/cardsfolder/q/quicksmith_spy.txt +++ b/forge-gui/res/cardsfolder/q/quicksmith_spy.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Creature Human Artificer PT:2/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, target artifact you control gains "{T}: Draw a card" for as long as you control CARDNAME. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Abilities$ ABDraw | UntilLoseControlOfHost$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Abilities$ ABDraw | Duration$ UntilLoseControlOfHost SVar:ABDraw:AB$Draw | Cost$ T | NumCards$ 1 | SpellDescription$ Draw a card. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/quicksmith_spy.jpg diff --git a/forge-gui/res/cardsfolder/q/quiet_contemplation.txt b/forge-gui/res/cardsfolder/q/quiet_contemplation.txt index 3a98110ccbf..8e5f4f56712 100644 --- a/forge-gui/res/cardsfolder/q/quiet_contemplation.txt +++ b/forge-gui/res/cardsfolder/q/quiet_contemplation.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTap | OptionalDecider$ You | TriggerDescription$ Whenever you cast a noncreature spell, you may pay {1}. If you do, tap target creature an opponent controls. It doesn't untap during its controller's next untap step. SVar:TrigTap:AB$ Tap | Cost$ 1 | ValidTgts$ Creature.OppCtrl | SubAbility$ DBPump | TgtPrompt$ Select target creature an opponent controls. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:BuffedBy:Card.nonCreature+nonLand SVar:Picture:http://www.wizards.com/global/images/magic/general/quiet_contemplation.jpg Oracle:Whenever you cast a noncreature spell, you may pay {1}. If you do, tap target creature an opponent controls and it doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/quintorius_field_historian.txt b/forge-gui/res/cardsfolder/q/quintorius_field_historian.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/quintorius_field_historian.txt rename to forge-gui/res/cardsfolder/q/quintorius_field_historian.txt diff --git a/forge-gui/res/cardsfolder/q/quirion_druid.txt b/forge-gui/res/cardsfolder/q/quirion_druid.txt index 2eb00cc6365..1e16b57b5da 100644 --- a/forge-gui/res/cardsfolder/q/quirion_druid.txt +++ b/forge-gui/res/cardsfolder/q/quirion_druid.txt @@ -2,6 +2,6 @@ Name:Quirion Druid ManaCost:2 G Types:Creature Elf Druid PT:1/2 -A:AB$ Animate | Cost$ G T | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Colors$ Green | Types$ Creature | Permanent$ True | SpellDescription$ Target land becomes a 2/2 green creature that's still a land. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ G T | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Colors$ Green | Types$ Creature | Duration$ Permanent | SpellDescription$ Target land becomes a 2/2 green creature that's still a land. (This effect lasts indefinitely.) SVar:Picture:http://www.wizards.com/global/images/magic/general/quirion_druid.jpg Oracle:{G}, {T}: Target land becomes a 2/2 green creature that's still a land. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_performer.txt b/forge-gui/res/cardsfolder/r/radiant_performer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/radiant_performer.txt rename to forge-gui/res/cardsfolder/r/radiant_performer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/radiant_scrollwielder.txt b/forge-gui/res/cardsfolder/r/radiant_scrollwielder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/radiant_scrollwielder.txt rename to forge-gui/res/cardsfolder/r/radiant_scrollwielder.txt diff --git a/forge-gui/res/cardsfolder/r/rageform.txt b/forge-gui/res/cardsfolder/r/rageform.txt index 4e0a627ec3d..30ef9a72ef8 100644 --- a/forge-gui/res/cardsfolder/r/rageform.txt +++ b/forge-gui/res/cardsfolder/r/rageform.txt @@ -3,7 +3,7 @@ ManaCost:2 R R Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigManifest | TriggerDescription$ When CARDNAME enters the battlefield, it becomes an Aura with enchant creature. Manifest the top card of your library and attach CARDNAME to it. (To manifest a card, put it onto the battlefield face down as a 2/2 creature. You may turn it face up at any time for its mana cost if it's a creature card.) SVar:TrigManifest:DB$ Manifest | Amount$ 1 | Defined$ TopOfLibrary | RememberManifested$ True | SubAbility$ Aurify -SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Permanent$ True | SubAbility$ RageformAttach +SVar:Aurify:DB$ Animate | IsPresent$ Card.Self | Types$ Aura | OverwriteSpells$ True | Abilities$ NewAttach | Keywords$ Enchant creature | Duration$ Permanent | SubAbility$ RageformAttach SVar:NewAttach:SP$ Attach | Cost$ 2 R R | ValidTgts$ Creature | AILogic$ Pump SVar:RageformAttach:DB$ Attach | Defined$ Remembered | IsPresent$ Card.Self S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Double Strike | Description$ Enchanted creature has double strike. diff --git a/forge-gui/res/cardsfolder/r/raging_river.txt b/forge-gui/res/cardsfolder/r/raging_river.txt index 17d4c626219..4091cb62b91 100644 --- a/forge-gui/res/cardsfolder/r/raging_river.txt +++ b/forge-gui/res/cardsfolder/r/raging_river.txt @@ -7,14 +7,14 @@ SVar:DBDefLeftEffect:DB$ Effect | EffectOwner$ Remembered | Name$ Raging River L SVar:DBDefRightEffect:DB$ Effect | EffectOwner$ Remembered | Name$ Raging River Right | StaticAbilities$ DBCantBlock | ImprintOnHost$ True | Mutable$ True | Duration$ UntilEndOfCombat | SubAbility$ DBDefLeftRight SVar:DBCantBlock:Mode$ CantBlockBy | ValidAttacker$ Creature.IsRemembered | ValidBlocker$ Creature.withoutFlying+IsNotImprinted+YouCtrl | EffectZone$ Command SVar:DBDefLeftRight:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | ValidCards$ Creature.withoutFlying+RememberedPlayerCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBDefLeftPile | UnchosenPile$ DBDefRightPile | AILogic$ Random | SubAbility$ DBClearImprinted -SVar:DBDefLeftPile:DB$ Animate | Defined$ Imprinted.namedRaging River Left | ImprintCards$ Remembered | Permanent$ True | SubAbility$ DBLeftPump -SVar:DBDefRightPile:DB$ Animate | Defined$ Imprinted.namedRaging River Right | ImprintCards$ Remembered | Permanent$ True | SubAbility$ DBRightPump +SVar:DBDefLeftPile:DB$ Animate | Defined$ Imprinted.namedRaging River Left | ImprintCards$ Remembered | Duration$ Permanent | SubAbility$ DBLeftPump +SVar:DBDefRightPile:DB$ Animate | Defined$ Imprinted.namedRaging River Right | ImprintCards$ Remembered | Duration$ Permanent | SubAbility$ DBRightPump SVar:DBClearImprinted:DB$ Cleanup | ClearImprinted$ True SVar:DBAtkLeftRight:DB$ TwoPiles | Defined$ You | Separator$ You | ValidCards$ Creature.attacking+YouCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBAtkLeftPile | UnchosenPile$ DBAtkRightPile | AILogic$ Random | SubAbility$ DBCleanup -SVar:DBAtkLeftPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Left | RememberObjects$ RememberedCard | Permanent$ True | Immutable$ True | SubAbility$ DBLeftPump -SVar:DBAtkRightPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Right | RememberObjects$ RememberedCard | Permanent$ True | Immutable$ True | SubAbility$ DBRightPump -SVar:DBLeftPump:DB$ Pump | Defined$ Remembered | KW$ "Left" pile | UntilEndOfCombat$ True -SVar:DBRightPump:DB$ Pump | Defined$ Remembered | KW$ "Right" pile | UntilEndOfCombat$ True +SVar:DBAtkLeftPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Left | RememberObjects$ RememberedCard | Duration$ Permanent | Immutable$ True | SubAbility$ DBLeftPump +SVar:DBAtkRightPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Right | RememberObjects$ RememberedCard | Duration$ Permanent | Immutable$ True | SubAbility$ DBRightPump +SVar:DBLeftPump:DB$ Pump | Defined$ Remembered | KW$ "Left" pile | Duration$ UntilEndOfCombat +SVar:DBRightPump:DB$ Pump | Defined$ Remembered | KW$ "Right" pile | Duration$ UntilEndOfCombat SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE Oracle:Whenever one or more creatures you control attack, each defending player divides all creatures without flying they control into a "left" pile and a "right" pile. Then, for each attacking creature you control, choose "left" or "right." That creature can't be blocked this combat except by creatures with flying and creatures in a pile with the chosen label. diff --git a/forge-gui/res/cardsfolder/r/rakavolver.txt b/forge-gui/res/cardsfolder/r/rakavolver.txt index 789ba8dafde..182349ab1b8 100644 --- a/forge-gui/res/cardsfolder/r/rakavolver.txt +++ b/forge-gui/res/cardsfolder/r/rakavolver.txt @@ -6,12 +6,12 @@ K:Kicker:1 W:U K:ETBReplacement:Other:VolverStrength:Mandatory::Card.Self+kicked 1 K:ETBReplacement:Other:VolverPumped:Mandatory::Card.Self+kicked 2 SVar:VolverStrength:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | ETB$ True | SubAbility$ VolverLife | SpellDescription$ If CARDNAME was kicked with its {1}{W} kicker, it enters the battlefield with two +1/+1 counters on it and with "Whenever CARDNAME deals damage, you gain that much life." -SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Permanent$ True +SVar:VolverLife:DB$ Animate | Defined$ Self | Triggers$ PseudoLifelink | sVars$ VolverTrigGain,VolverX | Duration$ Permanent SVar:PseudoLifelink:Mode$ DamageDealtOnce | ValidSource$ Card.Self | Execute$ VolverTrigGain | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals damage, you gain that much life. SVar:VolverTrigGain:DB$ GainLife | Defined$ You | LifeAmount$ VolverX SVar:VolverX:TriggerCount$DamageAmount SVar:VolverPumped:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | ETB$ True | SubAbility$ VolverLaunch | SpellDescription$ If CARDNAME was kicked with its {U} kicker, it enters the battlefield with a +1/+1 counter on it and with flying. -SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Permanent$ True +SVar:VolverLaunch:DB$ Animate | Defined$ Self | Keywords$ Flying | Duration$ Permanent AI:RemoveDeck:Random DeckNeeds:Color$White|Blue DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/r/rally_the_righteous.txt b/forge-gui/res/cardsfolder/r/rally_the_righteous.txt index 63c50c56f81..dd3d32d234c 100644 --- a/forge-gui/res/cardsfolder/r/rally_the_righteous.txt +++ b/forge-gui/res/cardsfolder/r/rally_the_righteous.txt @@ -1,9 +1,7 @@ Name:Rally the Righteous ManaCost:1 R W Types:Instant -A:SP$ Pump | Cost$ 1 R W | ValidTgts$ Creature | Radiance$ True | RememberTargets$ True | NumAtt$ 2 | SubAbility$ DBUntap | SpellDescription$ Radiance — Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. -SVar:DBUntap:DB$ UntapAll | ValidCards$ Creature.SharesColorWith Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ Untap | Cost$ 1 R W | ValidTgts$ Creature | Radiance$ True | SubAbility$ DBPump | SpellDescription$ Radiance — Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. +SVar:DBPump:DB$ Pump | Defined$ ParentTarget | Radiance$ True | NumAtt$ 2 AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/rally_the_righteous.jpg Oracle:Radiance — Untap target creature and each other creature that shares a color with it. Those creatures get +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/r/rampart_crawler.txt b/forge-gui/res/cardsfolder/r/rampart_crawler.txt index 5cea96a250e..d86431af492 100644 --- a/forge-gui/res/cardsfolder/r/rampart_crawler.txt +++ b/forge-gui/res/cardsfolder/r/rampart_crawler.txt @@ -2,6 +2,5 @@ Name:Rampart Crawler ManaCost:B Types:Creature Lizard Mercenary PT:1/1 -K:CantBeBlockedBy Creature.Wall -SVar:Picture:http://www.wizards.com/global/images/magic/general/rampart_crawler.jpg -Oracle:Rampart Crawler can't be blocked by Walls. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Wall | Description$ CARDNAME can't be blocked by Walls. +Oracle:Rampart Crawler can't be blocked by Walls. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/ravenous_slime.txt b/forge-gui/res/cardsfolder/r/ravenous_slime.txt index b9dc60a7f7b..ade2b8efc2f 100644 --- a/forge-gui/res/cardsfolder/r/ravenous_slime.txt +++ b/forge-gui/res/cardsfolder/r/ravenous_slime.txt @@ -2,9 +2,9 @@ Name:Ravenous Slime ManaCost:2 G Types:Creature Ooze PT:1/1 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. R:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | Destination$ Graveyard | ValidLKI$ Creature.OppCtrl | ReplaceWith$ Exile | Description$ If a creature an opponent controls would die, instead exile it and put a number of +1/+1 counters equal to that creature's power on CARDNAME. SVar:Exile:DB$ ChangeZone | Defined$ ReplacedCard | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | Defined$ Self SVar:X:ReplacedCardLKI$CardPower -Oracle:Ravenous Slime can't be blocked by creatures with power 2 or less.\nIf a creature an opponent controls would die, instead exile it and put a number of +1/+1 counters equal to that creature's power on Ravenous Slime. +Oracle:Ravenous Slime can't be blocked by creatures with power 2 or less.\nIf a creature an opponent controls would die, instead exile it and put a number of +1/+1 counters equal to that creature's power on Ravenous Slime. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/ravens_run_dragoon.txt b/forge-gui/res/cardsfolder/r/ravens_run_dragoon.txt index 651fa74f084..d7e89a02529 100644 --- a/forge-gui/res/cardsfolder/r/ravens_run_dragoon.txt +++ b/forge-gui/res/cardsfolder/r/ravens_run_dragoon.txt @@ -2,6 +2,5 @@ Name:Raven's Run Dragoon ManaCost:2 GW GW Types:Creature Elf Knight PT:3/3 -K:CantBeBlockedBy Creature.Black -SVar:Picture:http://www.wizards.com/global/images/magic/general/ravens_run_dragoon.jpg -Oracle:Raven's Run Dragoon can't be blocked by black creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Black | Description$ CARDNAME can't be blocked by black creatures. +Oracle:Raven's Run Dragoon can't be blocked by black creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/raving_dead.txt b/forge-gui/res/cardsfolder/r/raving_dead.txt index 41733a46ff4..d4a24455921 100644 --- a/forge-gui/res/cardsfolder/r/raving_dead.txt +++ b/forge-gui/res/cardsfolder/r/raving_dead.txt @@ -5,7 +5,7 @@ PT:2/6 K:Deathtouch T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose an opponent at random. CARDNAME attacks that player this combat if able. SVar:TrigChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Random$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | UntilEndOfCombat$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | Duration$ UntilEndOfCombat T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigLoseLifeOpp | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player loses half their life, rounded down. SVar:TrigLoseLifeOpp:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ RavingXOpp SVar:RavingXOpp:TriggeredTarget$LifeTotal/HalfDown diff --git a/forge-gui/res/cardsfolder/upcoming/reckless_amplimancer.txt b/forge-gui/res/cardsfolder/r/reckless_amplimancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reckless_amplimancer.txt rename to forge-gui/res/cardsfolder/r/reckless_amplimancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reconstruct_history.txt b/forge-gui/res/cardsfolder/r/reconstruct_history.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reconstruct_history.txt rename to forge-gui/res/cardsfolder/r/reconstruct_history.txt diff --git a/forge-gui/res/cardsfolder/r/reduce_rubble.txt b/forge-gui/res/cardsfolder/r/reduce_rubble.txt index d7e12854c43..f804bbeee7c 100644 --- a/forge-gui/res/cardsfolder/r/reduce_rubble.txt +++ b/forge-gui/res/cardsfolder/r/reduce_rubble.txt @@ -12,5 +12,5 @@ Name:Rubble ManaCost:2 R Types:Sorcery K:Aftermath -A:SP$ Pump | Cost$ 2 R | ValidTgts$ Land | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target land | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Up to three target lands don't untap during their controller's next untap step. +A:SP$ Pump | Cost$ 2 R | ValidTgts$ Land | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target land | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True | SpellDescription$ Up to three target lands don't untap during their controller's next untap step. Oracle:Aftermath (Cast this spell only from your graveyard. Then exile it.)\nUp to three target lands don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/reduce_to_memory.txt b/forge-gui/res/cardsfolder/r/reduce_to_memory.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reduce_to_memory.txt rename to forge-gui/res/cardsfolder/r/reduce_to_memory.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reflective_golem.txt b/forge-gui/res/cardsfolder/r/reflective_golem.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reflective_golem.txt rename to forge-gui/res/cardsfolder/r/reflective_golem.txt diff --git a/forge-gui/res/cardsfolder/r/refraction_trap.txt b/forge-gui/res/cardsfolder/r/refraction_trap.txt new file mode 100644 index 00000000000..4a5a76fe006 --- /dev/null +++ b/forge-gui/res/cardsfolder/r/refraction_trap.txt @@ -0,0 +1,15 @@ +Name:Refraction Trap +ManaCost:3 W +Types:Instant Trap +SVar:AltCost:Cost$ W | CheckSVar$ X | SVarCompare$ GE1 | Description$ If an opponent cast a red instant or sorcery spell this turn, you may pay {W} rather than pay this spell's mana cost. +A:SP$ ChooseSource | Cost$ 3 W | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | StackDescription$ SpellDescription | SpellDescription$ Prevent the next 3 damage that a source of your choice would deal to you and/or permanents you control this turn. If damage is prevented this way, CARDNAME deals that much damage to any target. +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to deal prevented damage to | ReplacementEffects$ ReDamage | RememberObjects$ Targeted | SubAbility$ DBCleanup +SVar:ReDamage:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Permanent.YouCtrl | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ PreventDamage | PreventionEffect$ NextN | Description$ Prevent the next 3 damage that a source of your choice would deal to you and/or permanents you control this turn. If damage is prevented this way, EFFECTSOURCE deals that much damage to any target. +SVar:PreventDamage:DB$ ReplaceDamage | Amount$ ShieldAmount | DivideShield$ True | SubAbility$ DBDealDamage +SVar:DBDealDamage:DB$ DealDamage | NumDmg$ Y | Defined$ Remembered | DamageSource$ EffectSource +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +SVar:X:Count$ThisTurnCast_Instant.Red+OppCtrl,Sorcery.Red+OppCtrl +SVar:ShieldAmount:Number$3 +SVar:Y:ReplaceCount$DamageAmount +AI:RemoveDeck:All +Oracle:If an opponent cast a red instant or sorcery spell this turn, you may pay {W} rather than pay this spell's mana cost.\nPrevent the next 3 damage that a source of your choice would deal to you and/or permanents you control this turn. If damage is prevented this way, Refraction Trap deals that much damage to any target. diff --git a/forge-gui/res/cardsfolder/r/reidane_god_of_the_worthy_valkmira_protectors_shield.txt b/forge-gui/res/cardsfolder/r/reidane_god_of_the_worthy_valkmira_protectors_shield.txt index 0f1c8c3a9b8..1ab4396a1c5 100644 --- a/forge-gui/res/cardsfolder/r/reidane_god_of_the_worthy_valkmira_protectors_shield.txt +++ b/forge-gui/res/cardsfolder/r/reidane_god_of_the_worthy_valkmira_protectors_shield.txt @@ -15,7 +15,8 @@ ALTERNATE Name:Valkmira, Protector's Shield ManaCost:3 W Types:Legendary Artifact -S:Mode$ PreventDamage | Target$ You,Permanent.YouCtrl | ValidSource$ Card.OppCtrl | Amount$ 1 | Description$ If a source an opponent controls would deal damage to you or a permanent you control, prevent 1 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You,Permanent.YouCtrl | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source an opponent controls would deal damage to you or a permanent you control, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 T:Mode$ BecomesTarget | ValidSource$ Card.OppCtrl | ValidTarget$ You,Permanent.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever you or another permanent you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {1}. SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSourceSA | UnlessCost$ 1 | UnlessPayer$ TriggeredSourceSAController Oracle:If a source an opponent controls would deal damage to you or a permanent you control, prevent 1 of that damage.\nWhenever you or another permanent you control becomes the target of a spell or ability an opponent controls, counter that spell or ability unless its controller pays {1}. diff --git a/forge-gui/res/cardsfolder/upcoming/reinterpret.txt b/forge-gui/res/cardsfolder/r/reinterpret.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reinterpret.txt rename to forge-gui/res/cardsfolder/r/reinterpret.txt diff --git a/forge-gui/res/cardsfolder/upcoming/reject.txt b/forge-gui/res/cardsfolder/r/reject.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/reject.txt rename to forge-gui/res/cardsfolder/r/reject.txt diff --git a/forge-gui/res/cardsfolder/upcoming/relic_sloth.txt b/forge-gui/res/cardsfolder/r/relic_sloth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/relic_sloth.txt rename to forge-gui/res/cardsfolder/r/relic_sloth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/replication_technique.txt b/forge-gui/res/cardsfolder/r/replication_technique.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/replication_technique.txt rename to forge-gui/res/cardsfolder/r/replication_technique.txt diff --git a/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt b/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt index 20d4ef46e86..114304e8aad 100644 --- a/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt +++ b/forge-gui/res/cardsfolder/r/rescue_from_the_underworld.txt @@ -1,7 +1,7 @@ Name:Rescue from the Underworld ManaCost:4 B Types:Instant -A:SP$ DelayedTrigger | Cost$ 4 B Sac<1/Creature> | ValidTgts$ Creature.YouOwn | TgtZone$ Graveyard | TgtPrompt$ Choose target creature card in your graveyard | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ MoveToPlay | TriggerDescription$ Return that card and the sacrificed card to the battlefield under your control at the beginning of your next upkeep. | RememberObjects$ Targeted,Sacrificed | SubAbility$ DBExile | SpellDescription$ Choose target creature card in your graveyard. Return that card and the sacrificed card to the battlefield under your control at the beginning of your next upkeep. Exile CARDNAME. +A:SP$ DelayedTrigger | Cost$ 4 B Sac<1/Creature> | ValidTgts$ Creature.YouOwn | TgtZone$ Graveyard | TgtPrompt$ Choose target creature card in your graveyard | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ MoveToPlay | TriggerDescription$ Return that card and the sacrificed card to the battlefield under your control at the beginning of your next upkeep. | RememberObjects$ Targeted,SacrificedCards | SubAbility$ DBExile | SpellDescription$ Choose target creature card in your graveyard. Return that card and the sacrificed card to the battlefield under your control at the beginning of your next upkeep. Exile CARDNAME. SVar:MoveToPlay:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ DelayTriggerRememberedLKI | GainControl$ True SVar:DBExile:DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/resculpt.txt b/forge-gui/res/cardsfolder/r/resculpt.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/resculpt.txt rename to forge-gui/res/cardsfolder/r/resculpt.txt diff --git a/forge-gui/res/cardsfolder/r/restore_balance.txt b/forge-gui/res/cardsfolder/r/restore_balance.txt index 36ddd910d27..569c7ec675d 100644 --- a/forge-gui/res/cardsfolder/r/restore_balance.txt +++ b/forge-gui/res/cardsfolder/r/restore_balance.txt @@ -3,7 +3,7 @@ ManaCost:no cost Types:Sorcery Colors:white K:Suspend:6:W -A:SP$ Balance | Cost$ 1 W | Valid$ Land | AILogic$ BalanceCreaturesAndLands | SubAbility$ BalanceCreatures | SpellDescription$ Each player chooses a number of lands they control equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players discard cards and sacrifice creatures the same way. | ActivationLimit$ 0 +A:SP$ Balance | Cost$ 0 | Valid$ Land | AILogic$ BalanceCreaturesAndLands | SubAbility$ BalanceCreatures | SpellDescription$ Each player chooses a number of lands they control equal to the number of lands controlled by the player who controls the fewest, then sacrifices the rest. Players discard cards and sacrifice creatures the same way. | ActivationLimit$ 0 SVar:BalanceCreatures:DB$ Balance | Valid$ Creature | SubAbility$ BalanceHands SVar:BalanceHands:DB$ Balance | Zone$ Hand AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/r/retribution.txt b/forge-gui/res/cardsfolder/r/retribution.txt index b01728fa39d..c8e6e26d83a 100644 --- a/forge-gui/res/cardsfolder/r/retribution.txt +++ b/forge-gui/res/cardsfolder/r/retribution.txt @@ -2,7 +2,7 @@ Name:Retribution ManaCost:2 R R Types:Sorcery A:SP$ Pump | Cost$ 2 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select two target creature an opponent controls | TargetMin$ 2 | TargetMax$ 2 | TargetsFromSingleZone$ True | IsCurse$ True | RememberTargets$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Choose two target creatures an opponent controls. That player chooses and sacrifices one of those creatures. Put a -1/-1 counter on the other. -SVar:DBChoose:DB$ ChooseCard | Defined$ TargetedController | Amount$ 1 | Choices$ Creature.IsRemembered | ChoiceTitle$ Choose one to sacrifice | ForgetChosen$ True | AILogic$ WorstCard | SubAbility$ DBSac | StackDescription$ None +SVar:DBChoose:DB$ ChooseCard | Defined$ TargetedController | Mandatory$ True | Choices$ Creature.IsRemembered | ChoiceTitle$ Choose one to sacrifice | ForgetChosen$ True | AILogic$ WorstCard | SubAbility$ DBSac | StackDescription$ None SVar:DBSac:DB$ Destroy | Defined$ ChosenCard | Sacrifice$ True | SubAbility$ DBPutCounter | StackDescription$ None SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ M1M1 | CounterNum$ 1 | StackDescription$ None | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/retriever_phoenix.txt b/forge-gui/res/cardsfolder/r/retriever_phoenix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/retriever_phoenix.txt rename to forge-gui/res/cardsfolder/r/retriever_phoenix.txt diff --git a/forge-gui/res/cardsfolder/upcoming/returned_pastcaller.txt b/forge-gui/res/cardsfolder/r/returned_pastcaller.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/returned_pastcaller.txt rename to forge-gui/res/cardsfolder/r/returned_pastcaller.txt diff --git a/forge-gui/res/cardsfolder/r/reveka_wizard_savant.txt b/forge-gui/res/cardsfolder/r/reveka_wizard_savant.txt index 45a397ec7e1..48617f09466 100644 --- a/forge-gui/res/cardsfolder/r/reveka_wizard_savant.txt +++ b/forge-gui/res/cardsfolder/r/reveka_wizard_savant.txt @@ -3,5 +3,5 @@ ManaCost:2 U U Types:Legendary Creature Dwarf Wizard PT:0/1 A:AB$ DealDamage | Cost$ T | NumDmg$ 2 | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select target creature or player | SubAbility$ DBPump | SpellDescription$ CARDNAME deals 2 damage to any target and doesn't untap during your next untap step. -SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Reveka, Wizard Savant deals 2 damage to any target and doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/revival_experiment.txt b/forge-gui/res/cardsfolder/r/revival_experiment.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/revival_experiment.txt rename to forge-gui/res/cardsfolder/r/revival_experiment.txt diff --git a/forge-gui/res/cardsfolder/r/riding_the_dilu_horse.txt b/forge-gui/res/cardsfolder/r/riding_the_dilu_horse.txt index bb364d79c7f..d440554690d 100644 --- a/forge-gui/res/cardsfolder/r/riding_the_dilu_horse.txt +++ b/forge-gui/res/cardsfolder/r/riding_the_dilu_horse.txt @@ -1,6 +1,6 @@ Name:Riding the Dilu Horse ManaCost:2 G Types:Sorcery -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Horsemanship | Permanent$ True | SpellDescription$ Target creature gets +2/+2 and gains horsemanship. (It can't be blocked except by creatures with horsemanship. This effect lasts indefinitely.) +A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | NumDef$ +2 | KW$ Horsemanship | Duration$ Permanent | SpellDescription$ Target creature gets +2/+2 and gains horsemanship. (It can't be blocked except by creatures with horsemanship. This effect lasts indefinitely.) SVar:Picture:http://www.wizards.com/global/images/magic/general/riding_the_dilu_horse.jpg Oracle:Target creature gets +2/+2 and gains horsemanship. (It can't be blocked except by creatures with horsemanship. This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/upcoming/rionya_fire_dancer.txt b/forge-gui/res/cardsfolder/r/rionya_fire_dancer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rionya_fire_dancer.txt rename to forge-gui/res/cardsfolder/r/rionya_fire_dancer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rip_apart.txt b/forge-gui/res/cardsfolder/r/rip_apart.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rip_apart.txt rename to forge-gui/res/cardsfolder/r/rip_apart.txt diff --git a/forge-gui/res/cardsfolder/r/riptide_mangler.txt b/forge-gui/res/cardsfolder/r/riptide_mangler.txt index f532f6533f4..772a116c60a 100644 --- a/forge-gui/res/cardsfolder/r/riptide_mangler.txt +++ b/forge-gui/res/cardsfolder/r/riptide_mangler.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Beast PT:0/3 A:AB$ Pump | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target Creature | SubAbility$ DBChangePower | StackDescription$ None | SpellDescription$ Change CARDNAME's base power to target creature's power. (This effect lasts indefinitely.) -SVar:DBChangePower:DB$ Animate | Defined$ Self | Power$ X | Permanent$ True +SVar:DBChangePower:DB$ Animate | Defined$ Self | Power$ X | Duration$ Permanent SVar:X:Targeted$CardPower AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/riptide_mangler.jpg diff --git a/forge-gui/res/cardsfolder/r/rise_from_the_grave.txt b/forge-gui/res/cardsfolder/r/rise_from_the_grave.txt index 3a0886fbacd..4082cbc092a 100644 --- a/forge-gui/res/cardsfolder/r/rise_from_the_grave.txt +++ b/forge-gui/res/cardsfolder/r/rise_from_the_grave.txt @@ -2,5 +2,5 @@ Name:Rise from the Grave ManaCost:4 B Types:Sorcery A:SP$ ChangeZone | Cost$ 4 B | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | TgtPrompt$ Choose target creature card in a graveyard | ValidTgts$ Creature | AnimateSubAbility$ Animate | SpellDescription$ Put target creature card from a graveyard onto the battlefield under your control. That creature is a black Zombie in addition to its other colors and types. -SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Permanent$ True +SVar:Animate:DB$Animate | Defined$ Remembered | Types$ Zombie | Colors$ Black | Duration$ Permanent Oracle:Put target creature card from a graveyard onto the battlefield under your control. That creature is a black Zombie in addition to its other colors and types. diff --git a/forge-gui/res/cardsfolder/upcoming/rise_of_extus.txt b/forge-gui/res/cardsfolder/r/rise_of_extus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rise_of_extus.txt rename to forge-gui/res/cardsfolder/r/rise_of_extus.txt diff --git a/forge-gui/res/cardsfolder/r/rishadan_airship.txt b/forge-gui/res/cardsfolder/r/rishadan_airship.txt index 5e211585b51..7469119bb29 100644 --- a/forge-gui/res/cardsfolder/r/rishadan_airship.txt +++ b/forge-gui/res/cardsfolder/r/rishadan_airship.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Human Pirate PT:3/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_airship.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nRishadan Airship can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/r/rishadan_brigand.txt b/forge-gui/res/cardsfolder/r/rishadan_brigand.txt index 4bb741df72c..af46a0b1f5b 100644 --- a/forge-gui/res/cardsfolder/r/rishadan_brigand.txt +++ b/forge-gui/res/cardsfolder/r/rishadan_brigand.txt @@ -3,11 +3,10 @@ ManaCost:4 U Types:Creature Human Pirate PT:3/2 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ RepeatEachOpp | TriggerDescription$ When CARDNAME enters the battlefield, each opponent sacrifices a permanent unless they pay {3}. SVar:RepeatEachOpp:DB$ RepeatEach | RepeatPlayers$ Player.Opponent | RepeatSubAbility$ TrigSac SVar:TrigSac:DB$ Sacrifice | Defined$ Remembered | SacValid$ Permanent | SacMessage$ Permanent | UnlessCost$ 3 | UnlessPayer$ Remembered SVar:NeedsToPlayVar:Z LE2 SVar:Z:Count$Valid Card.canProduceMana+OppCtrl+untapped -SVar:Picture:http://www.wizards.com/global/images/magic/general/rishadan_brigand.jpg Oracle:Flying\nWhen Rishadan Brigand enters the battlefield, each opponent sacrifices a permanent unless they pay {3}.\nRishadan Brigand can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/r/riths_charm.txt b/forge-gui/res/cardsfolder/r/riths_charm.txt index db7a89f72c9..30751309977 100644 --- a/forge-gui/res/cardsfolder/r/riths_charm.txt +++ b/forge-gui/res/cardsfolder/r/riths_charm.txt @@ -6,8 +6,7 @@ SVar:Bash:DB$ Destroy | ValidTgts$ Land.nonBasic | TgtPrompt$ Select target nonb SVar:Token:DB$ Token | TokenAmount$ 3 | TokenScript$ g_1_1_saproling | TokenOwner$ You | LegacyImage$ g 1 1 saproling pls | SpellDescription$ Create three 1/1 green Saproling creature tokens. SVar:Prevent:DB$ ChooseSource | Choices$ Card | RememberChosen$ True | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ Prevent all damage a source of your choice would deal this turn. SVar:DBEffect:DB$ Effect | ReplacementEffects$ RPreventNextFromSource | RememberObjects$ Remembered | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 -SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | PreventionEffect$ True | Description$ Prevent all damage the source would deal this turn. +SVar:RPreventNextFromSource:Event$ DamageDone | ValidSource$ Card.IsRemembered | Prevent$ True | Description$ Prevent all damage the source would deal this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Token -SVar:Picture:http://www.wizards.com/global/images/magic/general/riths_charm.jpg Oracle:Choose one —\n• Destroy target nonbasic land.\n• Create three 1/1 green Saproling creature tokens.\n• Prevent all damage a source of your choice would deal this turn. diff --git a/forge-gui/res/cardsfolder/r/river_darter.txt b/forge-gui/res/cardsfolder/r/river_darter.txt index 98bbcf7f88c..0be89ca8df9 100644 --- a/forge-gui/res/cardsfolder/r/river_darter.txt +++ b/forge-gui/res/cardsfolder/r/river_darter.txt @@ -2,6 +2,5 @@ Name:River Darter ManaCost:2 U Types:Creature Merfolk Warrior PT:2/3 -K:CantBeBlockedBy Creature.Dinosaur -SVar:Picture:http://www.wizards.com/global/images/magic/general/river_darter.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Dinosaur | Description$ CARDNAME can't be blocked by Dinosaurs. Oracle:River Darter can't be blocked by Dinosaurs. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/robber_of_the_rich.txt b/forge-gui/res/cardsfolder/r/robber_of_the_rich.txt index b68d4cf32c6..d2b762e432e 100644 --- a/forge-gui/res/cardsfolder/r/robber_of_the_rich.txt +++ b/forge-gui/res/cardsfolder/r/robber_of_the_rich.txt @@ -11,5 +11,5 @@ SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | Effect SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$ValidHand Card.DefenderCtrl SVar:Y:Count$InYourHand -SVar:Z:Count$CreaturesAttackedThisTurn_Rogue +SVar:Z:Count$CreaturesAttackedThisTurn Creature.Rogue Oracle:Reach, haste\nWhenever Robber of the Rich attacks, if defending player has more cards in hand than you, exile the top card of their library. During any turn you attacked with a Rogue, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. diff --git a/forge-gui/res/cardsfolder/r/rock_hydra.txt b/forge-gui/res/cardsfolder/r/rock_hydra.txt index 2a00827a721..43e02fc758c 100644 --- a/forge-gui/res/cardsfolder/r/rock_hydra.txt +++ b/forge-gui/res/cardsfolder/r/rock_hydra.txt @@ -7,7 +7,7 @@ A:AB$ PreventDamage | Cost$ R | Defined$ Self | Amount$ 1 | SpellDescription$ Pr A:AB$ PutCounter | Cost$ R R R | ActivationPhases$ Upkeep | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on CARDNAME. Activate only during your upkeep. T:Mode$ DamageDone | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ RemoveCtrsTrig | Static$ True SVar:RemoveCtrsTrig:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ NumDmgTrig -R:Event$ DamageDone | ValidTarget$ Card.Self | ActiveZones$ Battlefield | ReplaceWith$ ReplaceDamage | PreventionEffect$ True | Description$ For each 1 damage that would be dealt to CARDNAME, if it has a +1/+1 counter on it, remove a +1/+1 counter from it and prevent that 1 damage. +R:Event$ DamageDone | ValidTarget$ Card.Self | ActiveZones$ Battlefield | ReplaceWith$ ReplaceDamage | PreventionEffect$ True | AlwaysReplace$ True | Description$ For each 1 damage that would be dealt to CARDNAME, if it has a +1/+1 counter on it, remove a +1/+1 counter from it and prevent that 1 damage. SVar:RemoveCtrsRepl:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ NumDmg SVar:ReplaceDamage:DB$ ReplaceEffect | DamageTarget$ Self | VarName$ DamageAmount | VarValue$ Z | ConditionCheckSVar$ Z | ConditionSVarCompare$ GE1 | SubAbility$ RemoveCtrsRepl SVar:NumDmg:ReplaceCount$DamageAmount @@ -16,5 +16,4 @@ SVar:X:Count$xPaid SVar:Y:Count$CardCounters.P1P1 SVar:Z:SVar$NumDmg/Minus.Y AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/rock_hydra.jpg Oracle:Rock Hydra enters the battlefield with X +1/+1 counters on it.\nFor each 1 damage that would be dealt to Rock Hydra, if it has a +1/+1 counter on it, remove a +1/+1 counter from it and prevent that 1 damage.\n{R}: Prevent the next 1 damage that would be dealt to Rock Hydra this turn.\n{R}{R}{R}: Put a +1/+1 counter on Rock Hydra. Activate only during your upkeep. diff --git a/forge-gui/res/cardsfolder/upcoming/rootha_mercurial_artist.txt b/forge-gui/res/cardsfolder/r/rootha_mercurial_artist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rootha_mercurial_artist.txt rename to forge-gui/res/cardsfolder/r/rootha_mercurial_artist.txt diff --git a/forge-gui/res/cardsfolder/r/rootwater_depths.txt b/forge-gui/res/cardsfolder/r/rootwater_depths.txt index 4afad4deeae..ff68f381f09 100644 --- a/forge-gui/res/cardsfolder/r/rootwater_depths.txt +++ b/forge-gui/res/cardsfolder/r/rootwater_depths.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {U} or {B}. Rootwater Depths doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/r/rot_hulk.txt b/forge-gui/res/cardsfolder/r/rot_hulk.txt index 6d4c3462fb0..bd587833afe 100644 --- a/forge-gui/res/cardsfolder/r/rot_hulk.txt +++ b/forge-gui/res/cardsfolder/r/rot_hulk.txt @@ -4,6 +4,6 @@ Types:Creature Zombie PT:5/5 K:Menace T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. -SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.Zombie | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target Zombie card | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Card.Zombie+YouCtrl | TargetMin$ 0 | TargetMax$ X | TgtPrompt$ Select target Zombie card | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. SVar:X:PlayerCountOpponents$Amount Oracle:Menace\nWhen Rot Hulk enters the battlefield, return up to X target Zombie cards from your graveyard to the battlefield, where X is the number of opponents you have. diff --git a/forge-gui/res/cardsfolder/upcoming/rousing_refrain.txt b/forge-gui/res/cardsfolder/r/rousing_refrain.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rousing_refrain.txt rename to forge-gui/res/cardsfolder/r/rousing_refrain.txt diff --git a/forge-gui/res/cardsfolder/upcoming/rowan_scholar_of_sparks_will_scholar_of_frost.txt b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt similarity index 84% rename from forge-gui/res/cardsfolder/upcoming/rowan_scholar_of_sparks_will_scholar_of_frost.txt rename to forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt index 2cc5a2dd09b..db2e3c7a657 100644 --- a/forge-gui/res/cardsfolder/upcoming/rowan_scholar_of_sparks_will_scholar_of_frost.txt +++ b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt @@ -20,9 +20,9 @@ ManaCost:4 U Types:Legendary Planeswalker Will Loyalty:4 S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Instant and sorcery spells you cast cost {1} less to cast. -A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 0 | Toughness$ 2 | UntilYourNextTurn$ True | SpellDescription$ Up to one target creature has base power and toughness 0/2 until your next turn. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 0 | Toughness$ 2 | Duration$ UntilYourNextTurn | SpellDescription$ Up to one target creature has base power and toughness 0/2 until your next turn. A:AB$ Draw | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | NumCards$ 3 | SpellDescription$ Draw three cards. -A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. +A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBCleanup | ChangeZoneTables$ True SVar:DBToken:DB$ Token | TokenScript$ ur_4_4_elemental | TokenOwner$ ImprintedController SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/r/rubblebelt_runner.txt b/forge-gui/res/cardsfolder/r/rubblebelt_runner.txt index d493c2a3385..b2249f6e05c 100644 --- a/forge-gui/res/cardsfolder/r/rubblebelt_runner.txt +++ b/forge-gui/res/cardsfolder/r/rubblebelt_runner.txt @@ -2,5 +2,5 @@ Name:Rubblebelt Runner ManaCost:1 R G Types:Creature Viashino Warrior PT:3/3 -K:CantBeBlockedBy Creature.token -Oracle:Rubblebelt Runner can't be blocked by creature tokens. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Saproling | Description$ CARDNAME can't be blocked by creature tokens. +Oracle:Rubblebelt Runner can't be blocked by creature tokens. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/r/ruhan_of_the_fomori.txt b/forge-gui/res/cardsfolder/r/ruhan_of_the_fomori.txt index 830bc75b0ae..82fef24e204 100644 --- a/forge-gui/res/cardsfolder/r/ruhan_of_the_fomori.txt +++ b/forge-gui/res/cardsfolder/r/ruhan_of_the_fomori.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Giant Warrior PT:7/7 T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose an opponent at random. CARDNAME attacks that player this combat if able. SVar:TrigChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Random$ True | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | UntilEndOfCombat$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | Duration$ UntilEndOfCombat SVar:Picture:http://www.wizards.com/global/images/magic/general/ruhan_of_the_fomori.jpg Oracle:At the beginning of combat on your turn, choose an opponent at random. Ruhan of the Fomori attacks that player this combat if able. diff --git a/forge-gui/res/cardsfolder/upcoming/ruin_grinder.txt b/forge-gui/res/cardsfolder/r/ruin_grinder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ruin_grinder.txt rename to forge-gui/res/cardsfolder/r/ruin_grinder.txt diff --git a/forge-gui/res/cardsfolder/r/runaway_carriage.txt b/forge-gui/res/cardsfolder/r/runaway_carriage.txt index 405edf35591..e157bd07062 100644 --- a/forge-gui/res/cardsfolder/r/runaway_carriage.txt +++ b/forge-gui/res/cardsfolder/r/runaway_carriage.txt @@ -5,8 +5,7 @@ PT:5/6 K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | Secondary$ True | TriggerDescription$ Whenever CARDNAME attacks or blocks, sacrifice it at end of combat. -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$Sacrifice | Defined$ Self +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | RememberObjects$ Self | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/runaway_carriage.jpg Oracle:Trample\nWhen Runaway Carriage attacks or blocks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/r/rush_of_ice.txt b/forge-gui/res/cardsfolder/r/rush_of_ice.txt index 60be64767e9..ea057bc8924 100644 --- a/forge-gui/res/cardsfolder/r/rush_of_ice.txt +++ b/forge-gui/res/cardsfolder/r/rush_of_ice.txt @@ -2,7 +2,7 @@ Name:Rush of Ice ManaCost:U Types:Sorcery A:SP$ Tap | Cost$ U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent K:Awaken:3:4 U SVar:Picture:http://www.wizards.com/global/images/magic/general/rush_of_ice.jpg Oracle:Tap target creature. It doesn't untap during its controller's next untap step.\nAwaken 3—{4}{U} (If you cast this spell for {4}{U}, also put three +1/+1 counters on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land.) diff --git a/forge-gui/res/cardsfolder/upcoming/rushed_rebirth.txt b/forge-gui/res/cardsfolder/r/rushed_rebirth.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/rushed_rebirth.txt rename to forge-gui/res/cardsfolder/r/rushed_rebirth.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ruxa_patient_professor.txt b/forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/ruxa_patient_professor.txt rename to forge-gui/res/cardsfolder/r/ruxa_patient_professor.txt diff --git a/forge-gui/res/cardsfolder/s/sacred_foundry.txt b/forge-gui/res/cardsfolder/s/sacred_foundry.txt index 2aa8f1a3a96..1a1b05b7470 100644 --- a/forge-gui/res/cardsfolder/s/sacred_foundry.txt +++ b/forge-gui/res/cardsfolder/s/sacred_foundry.txt @@ -2,6 +2,5 @@ Name:Sacred Foundry ManaCost:no cost Types:Land Mountain Plains K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89066.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {R} or {W}.)\nAs Sacred Foundry enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/s/sacred_knight.txt b/forge-gui/res/cardsfolder/s/sacred_knight.txt index eae30d8deb6..fdf24af382d 100644 --- a/forge-gui/res/cardsfolder/s/sacred_knight.txt +++ b/forge-gui/res/cardsfolder/s/sacred_knight.txt @@ -2,6 +2,5 @@ Name:Sacred Knight ManaCost:3 W Types:Creature Human Knight PT:3/2 -K:CantBeBlockedBy Creature.Black,Creature.Red -SVar:Picture:http://www.wizards.com/global/images/magic/general/sacred_knight.jpg -Oracle:Sacred Knight can't be blocked by black and/or red creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Black,Creature.Red | Description$ CARDNAME can't be blocked by black and/or red creatures. +Oracle:Sacred Knight can't be blocked by black and/or red creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sakashimas_will.txt b/forge-gui/res/cardsfolder/s/sakashimas_will.txt index a2e779059c9..0aea368f132 100755 --- a/forge-gui/res/cardsfolder/s/sakashimas_will.txt +++ b/forge-gui/res/cardsfolder/s/sakashimas_will.txt @@ -2,10 +2,10 @@ Name:Sakashima's Will ManaCost:3 U Types:Sorcery A:SP$ Charm | Cost$ 3 U | MinCharmNum$ 1 | CharmNum$ X | Choices$ DBControl,DBImprint | AdditionalDescription$ If you control a commander as you cast this spell, you may choose both. -SVar:DBControl:DB$ ChooseCard | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Amount$ 1 | Choices$ Creature.TargetedPlayerCtrl | ChoiceTitle$ Choose a creature you control | SubAbility$ DBGainControl | AILogic$ WorstCard | SpellDescription$ Target opponent chooses a creature they control. You gain control of it. +SVar:DBControl:DB$ ChooseCard | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Mandatory$ True | Choices$ Creature.TargetedPlayerCtrl | ChoiceTitle$ Choose a creature you control | SubAbility$ DBGainControl | AILogic$ WorstCard | SpellDescription$ Target opponent chooses a creature they control. You gain control of it. SVar:DBGainControl:DB$ GainControl | Defined$ ChosenCard | NewController$ You | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True -SVar:DBImprint:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.YouCtrl | ChoiceTitle$ Choose a creature you control | RememberChosen$ True | SubAbility$ MassClone | AILogic$ BestCard | SpellDescription$ Choose a creature you control. Each other creature you control becomes a copy of that creature until end of turn. +SVar:DBImprint:DB$ ChooseCard | Defined$ You | Mandatory$ True | Choices$ Creature.YouCtrl | ChoiceTitle$ Choose a creature you control | RememberChosen$ True | SubAbility$ MassClone | AILogic$ BestCard | SpellDescription$ Choose a creature you control. Each other creature you control becomes a copy of that creature until end of turn. SVar:MassClone:DB$ RepeatEach | UseImprinted$ True | RepeatCards$ Card.Creature+IsNotRemembered+YouCtrl | RepeatSubAbility$ DBCopy | SubAbility$ DBCleanup SVar:DBCopy:DB$ Clone | Defined$ Remembered | CloneTarget$ Imprinted | Duration$ UntilEndOfTurn SVar:X:Count$Compare Y GE1.2.1 diff --git a/forge-gui/res/cardsfolder/s/samite_alchemist.txt b/forge-gui/res/cardsfolder/s/samite_alchemist.txt index 6299948229e..fe027ac68e4 100644 --- a/forge-gui/res/cardsfolder/s/samite_alchemist.txt +++ b/forge-gui/res/cardsfolder/s/samite_alchemist.txt @@ -4,5 +4,5 @@ Types:Creature Human Cleric PT:0/2 A:AB$ PreventDamage | Cost$ W W T | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | Amount$ 4 | SubAbility$ DBTap | SpellDescription$ Prevent the next 4 damage that would be dealt this turn to target creature you control. Tap that creature. It doesn't untap during your next untap step. SVar:DBTap:DB$ Tap | Defined$ Targeted | SubAbility$ DBStayTapped -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Targeted | Permanent$ True | IsCurse$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Targeted | Duration$ Permanent | IsCurse$ True Oracle:{W}{W}, {T}: Prevent the next 4 damage that would be dealt this turn to target creature you control. Tap that creature. It doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/scholarship_sponsor.txt b/forge-gui/res/cardsfolder/s/scholarship_sponsor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scholarship_sponsor.txt rename to forge-gui/res/cardsfolder/s/scholarship_sponsor.txt diff --git a/forge-gui/res/cardsfolder/s/scrapskin_drake.txt b/forge-gui/res/cardsfolder/s/scrapskin_drake.txt index 51729f8acff..51e820e4fbf 100644 --- a/forge-gui/res/cardsfolder/s/scrapskin_drake.txt +++ b/forge-gui/res/cardsfolder/s/scrapskin_drake.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Zombie Drake PT:2/3 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/scrapskin_drake.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nScrapskin Drake can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/s/screeching_griffin.txt b/forge-gui/res/cardsfolder/s/screeching_griffin.txt index 8b7d7545e55..d006bc65f6c 100644 --- a/forge-gui/res/cardsfolder/s/screeching_griffin.txt +++ b/forge-gui/res/cardsfolder/s/screeching_griffin.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Griffin PT:2/2 K:Flying -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | IsCurse$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. -SVar:Picture:http://www.wizards.com/global/images/magic/general/screeching_griffin.jpg +A:AB$ Effect | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. Oracle:Flying\n{R}: Target creature can't block Screeching Griffin this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/scurrid_colony.txt b/forge-gui/res/cardsfolder/s/scurrid_colony.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/scurrid_colony.txt rename to forge-gui/res/cardsfolder/s/scurrid_colony.txt diff --git a/forge-gui/res/cardsfolder/s/scuttling_doom_engine.txt b/forge-gui/res/cardsfolder/s/scuttling_doom_engine.txt index c7e3d029850..0be83f5d671 100644 --- a/forge-gui/res/cardsfolder/s/scuttling_doom_engine.txt +++ b/forge-gui/res/cardsfolder/s/scuttling_doom_engine.txt @@ -2,8 +2,7 @@ Name:Scuttling Doom Engine ManaCost:6 Types:Artifact Creature Construct PT:6/6 -K:CantBeBlockedBy Creature.powerLE2 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 6 damage to target opponent or planeswalker. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | NumDmg$ 6 -SVar:Picture:http://www.wizards.com/global/images/magic/general/scuttling_doom_engine.jpg Oracle:Scuttling Doom Engine can't be blocked by creatures with power 2 or less.\nWhen Scuttling Doom Engine dies, it deals 6 damage to target opponent or planeswalker. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt b/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt index e1a35223b6e..7bfa0f2d5eb 100644 --- a/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt +++ b/forge-gui/res/cardsfolder/s/sea_gate_restoration_sea_gate_reborn.txt @@ -14,6 +14,6 @@ Name:Sea Gate, Reborn ManaCost:no cost Types:Land K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. Oracle:As Sea Gate, Reborn enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped.\n{T}: Add {U}. diff --git a/forge-gui/res/cardsfolder/s/sea_legs.txt b/forge-gui/res/cardsfolder/s/sea_legs.txt index ab1af8d4b84..6b0d665fad5 100644 --- a/forge-gui/res/cardsfolder/s/sea_legs.txt +++ b/forge-gui/res/cardsfolder/s/sea_legs.txt @@ -3,9 +3,8 @@ ManaCost:U Types:Enchantment Aura K:Flash K:Enchant creature -A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ SpecificCard +A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Pirate S:Mode$ Continuous | Affected$ Creature.EnchantedBy+Pirate | AddToughness$ 2 | Description$ Enchanted creature gets +0/+2 as long as it's a Pirate. Otherwise, it gets -2/-0. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonPirate | AddPower$ -2 DeckNeeds:Type$Pirate -SVar:Picture:http://www.wizards.com/global/images/magic/general/sea_legs.jpg Oracle:Flash\nEnchant creature\nEnchanted creature gets +0/+2 as long as it's a Pirate. Otherwise, it gets -2/-0. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/seal_away.txt b/forge-gui/res/cardsfolder/s/seal_away.txt index a785876a1fb..2e70925ca33 100644 --- a/forge-gui/res/cardsfolder/s/seal_away.txt +++ b/forge-gui/res/cardsfolder/s/seal_away.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target tapped creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.tapped+OppCtrl | TgtPrompt$ Select target tapped creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.tapped+OppCtrl | TgtPrompt$ Select target tapped creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:Flash\nWhen Seal Away enters the battlefield, exile target tapped creature an opponent controls until Seal Away leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt b/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt index d2e2e273c4b..89b47554c84 100644 --- a/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt +++ b/forge-gui/res/cardsfolder/s/seal_of_the_guildpact.txt @@ -3,7 +3,7 @@ ManaCost:5 Types:Artifact K:ETBReplacement:Other:ChooseColors SVar:ChooseColors:DB$ ChooseColor | Defined$ You | TwoColors$ True | AILogic$ MostProminentDualInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose two colors. -S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ Col | Description$ Each spell you cast costs {1} less to cast for each of the chosen colors it is. +S:Mode$ ReduceCost | ValidCard$ Card | Type$ Spell | Activator$ You | Amount$ Col | Relative$ True | Description$ Each spell you cast costs {1} less to cast for each of the chosen colors it is. SVar:Col:Count$HasNumChosenColors.Self AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/seal_of_the_guildpact.jpg diff --git a/forge-gui/res/cardsfolder/s/sealock_monster.txt b/forge-gui/res/cardsfolder/s/sealock_monster.txt index a1d0e4d2371..54607f037f9 100644 --- a/forge-gui/res/cardsfolder/s/sealock_monster.txt +++ b/forge-gui/res/cardsfolder/s/sealock_monster.txt @@ -5,7 +5,7 @@ PT:5/5 S:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. K:Monstrosity:3:5 U U T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME becomes monstrous, target land becomes an Island in addition to its other types. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | AITgts$ Land.OppCtrl | Types$ Island | Permanent$ True | IsCurse$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | AITgts$ Land.OppCtrl | Types$ Island | Duration$ Permanent | IsCurse$ True DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/sealock_monster.jpg Oracle:Sealock Monster can't attack unless defending player controls an Island.\n{5}{U}{U}: Monstrosity 3. (If this creature isn't monstrous, put three +1/+1 counters on it and it becomes monstrous.)\nWhen Sealock Monster becomes monstrous, target land becomes an Island in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/secret_rendezvous.txt b/forge-gui/res/cardsfolder/s/secret_rendezvous.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/secret_rendezvous.txt rename to forge-gui/res/cardsfolder/s/secret_rendezvous.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sedgemoor_witch.txt b/forge-gui/res/cardsfolder/s/sedgemoor_witch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sedgemoor_witch.txt rename to forge-gui/res/cardsfolder/s/sedgemoor_witch.txt diff --git a/forge-gui/res/cardsfolder/s/sekki_seasons_guide.txt b/forge-gui/res/cardsfolder/s/sekki_seasons_guide.txt index dd24ce5d801..b990ee7be10 100644 --- a/forge-gui/res/cardsfolder/s/sekki_seasons_guide.txt +++ b/forge-gui/res/cardsfolder/s/sekki_seasons_guide.txt @@ -3,10 +3,9 @@ ManaCost:5 G G G Types:Legendary Creature Spirit PT:0/0 K:etbCounter:P1P1:8 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ SekkiCounters | PreventionEffect$ True | Description$ If damage would be dealt to Sekki, prevent that damage, remove that many +1/+1 counters from Sekki, and create that many 1/1 colorless Spirit creature tokens. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ SekkiCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to Sekki, prevent that damage, remove that many +1/+1 counters from Sekki, and create that many 1/1 colorless Spirit creature tokens. SVar:SekkiCounters:DB$ RemoveCounter | CounterType$ P1P1 | CounterNum$ SekkiX | SubAbility$ DBSekkiToken SVar:DBSekkiToken:DB$ Token | TokenAmount$ SekkiX | TokenScript$ c_1_1_spirit | LegacyImage$ c 1 1 spirit sok A:AB$ ChangeZone | Cost$ Sac<8/Spirit> | Defined$ Self | ActivationZone$ Graveyard | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return Sekki from your graveyard to the battlefield. SVar:SekkiX:ReplaceCount$DamageAmount -SVar:Picture:http://www.wizards.com/global/images/magic/general/sekki_seasons_guide.jpg Oracle:Sekki, Seasons' Guide enters the battlefield with eight +1/+1 counters on it.\nIf damage would be dealt to Sekki, prevent that damage, remove that many +1/+1 counters from Sekki, and create that many 1/1 colorless Spirit creature tokens.\nSacrifice eight Spirits: Return Sekki from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/selfless_glyphweaver_deadly_vanity.txt b/forge-gui/res/cardsfolder/s/selfless_glyphweaver_deadly_vanity.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/selfless_glyphweaver_deadly_vanity.txt rename to forge-gui/res/cardsfolder/s/selfless_glyphweaver_deadly_vanity.txt diff --git a/forge-gui/res/cardsfolder/upcoming/semesters_end.txt b/forge-gui/res/cardsfolder/s/semesters_end.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/semesters_end.txt rename to forge-gui/res/cardsfolder/s/semesters_end.txt diff --git a/forge-gui/res/cardsfolder/s/send_to_sleep.txt b/forge-gui/res/cardsfolder/s/send_to_sleep.txt index 9c8e5b7d904..732b5012974 100644 --- a/forge-gui/res/cardsfolder/s/send_to_sleep.txt +++ b/forge-gui/res/cardsfolder/s/send_to_sleep.txt @@ -2,7 +2,7 @@ Name:Send to Sleep ManaCost:1 U Types:Instant A:SP$ Tap | Cost$ 1 U | TgtPrompt$ Select up to two target creatures | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures.Spell mastery — If there are two or more instant and/or sorcery cards in your graveyard, those creatures don't untap during their controllers' next untap steps. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE2 | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn SVar:Picture:http://www.wizards.com/global/images/magic/general/send_to_sleep.jpg Oracle:Tap up to two target creatures.\nSpell mastery — If there are two or more instant and/or sorcery cards in your graveyard, those creatures don't untap during their controllers' next untap steps. diff --git a/forge-gui/res/cardsfolder/s/sensei_golden_tail.txt b/forge-gui/res/cardsfolder/s/sensei_golden_tail.txt index 12abd28f85e..dac07124e4f 100644 --- a/forge-gui/res/cardsfolder/s/sensei_golden_tail.txt +++ b/forge-gui/res/cardsfolder/s/sensei_golden_tail.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Fox Samurai PT:2/1 K:Bushido:1 A:AB$ PutCounter | Cost$ 1 W T | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ TRAINING | CounterNum$ 1 | SorcerySpeed$ True | SubAbility$ DBAnimate | SpellDescription$ Put a training counter on target creature. That creature gains bushido 1 and becomes a Samurai in addition to its other creature types. Activate only as a sorcery. -SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Samurai | Keywords$ Bushido:1 | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ Targeted | Types$ Samurai | Keywords$ Bushido:1 | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/sensei_golden_tail.jpg Oracle:Bushido 1 (Whenever this creature blocks or becomes blocked, it gets +1/+1 until end of turn.)\n{1}{W}, {T}: Put a training counter on target creature. That creature gains bushido 1 and becomes a Samurai in addition to its other creature types. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/s/sentinel.txt b/forge-gui/res/cardsfolder/s/sentinel.txt index a80ca408891..b3cc517e209 100644 --- a/forge-gui/res/cardsfolder/s/sentinel.txt +++ b/forge-gui/res/cardsfolder/s/sentinel.txt @@ -3,7 +3,7 @@ ManaCost:4 Types:Artifact Creature Shapeshifter PT:1/1 A:AB$ Pump | Cost$ 0 | ValidTgts$ Creature.blockedBySource,Creature.blockingSource | TgtPrompt$ Select target creature blocking or being blocked by this creature | SubAbility$ DBAnimate | StackDescription$ None | SpellDescription$ Change CARDNAME's base toughness to 1 plus the power of target creature blocking or blocked by CARDNAME. (This effect lasts indefinitely.) -SVar:DBAnimate:DB$ Animate | Defined$ Self | Toughness$ X | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ Self | Toughness$ X | Duration$ Permanent SVar:X:Targeted$CardPower/Plus.1 AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sentinel.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/sequence_engine.txt b/forge-gui/res/cardsfolder/s/sequence_engine.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sequence_engine.txt rename to forge-gui/res/cardsfolder/s/sequence_engine.txt diff --git a/forge-gui/res/cardsfolder/s/serene_master.txt b/forge-gui/res/cardsfolder/s/serene_master.txt index 9d6911c2328..07adad5c3c6 100644 --- a/forge-gui/res/cardsfolder/s/serene_master.txt +++ b/forge-gui/res/cardsfolder/s/serene_master.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Human Monk PT:0/2 T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ TrigExchangePower | TriggerDescription$ Whenever CARDNAME blocks, exchange its power and the power of target creature it's blocking until end of combat. -SVar:TrigExchangePower:DB$ ExchangePower | ValidTgts$ Creature.blockedBySource | TgtPrompt$ Select target creature it's blocking | Defined$ Self | UntilEndOfCombat$ True +SVar:TrigExchangePower:DB$ ExchangePower | ValidTgts$ Creature.blockedBySource | TgtPrompt$ Select target creature it's blocking | Defined$ Self | Duration$ UntilEndOfCombat AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/serene_master.jpg Oracle:Whenever Serene Master blocks, exchange its power and the power of target creature it's blocking until end of combat. diff --git a/forge-gui/res/cardsfolder/upcoming/serpentine_curve.txt b/forge-gui/res/cardsfolder/s/serpentine_curve.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/serpentine_curve.txt rename to forge-gui/res/cardsfolder/s/serpentine_curve.txt diff --git a/forge-gui/res/cardsfolder/s/serras_boon.txt b/forge-gui/res/cardsfolder/s/serras_boon.txt index 458a084cf09..16d448c7f55 100644 --- a/forge-gui/res/cardsfolder/s/serras_boon.txt +++ b/forge-gui/res/cardsfolder/s/serras_boon.txt @@ -2,9 +2,7 @@ Name:Serra's Boon ManaCost:2 W Types:Enchantment Aura K:Enchant creature -A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ Pump +A:SP$ Attach | Cost$ 2 W | ValidTgts$ Creature | AILogic$ SpecificCard | AIValid$ Card.White S:Mode$ Continuous | Affected$ Creature.EnchantedBy+White | AddPower$ 1 | AddToughness$ 2 | Description$ Enchanted creature gets +1/+2 as long as it's white. S:Mode$ Continuous | Affected$ Creature.EnchantedBy+nonWhite | AddPower$ -2 | AddToughness$ -1 | Description$ Otherwise, it gets -2/-1. -AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/serras_boon.jpg Oracle:Enchant creature\nEnchanted creature gets +1/+2 as long as it's white. Otherwise, it gets -2/-1. diff --git a/forge-gui/res/cardsfolder/s/sewers_of_estark.txt b/forge-gui/res/cardsfolder/s/sewers_of_estark.txt index 23e5e1229db..bc7847865bc 100644 --- a/forge-gui/res/cardsfolder/s/sewers_of_estark.txt +++ b/forge-gui/res/cardsfolder/s/sewers_of_estark.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Instant A:SP$ Pump | Cost$ 2 B B | TgtPrompt$ Select target creature | ValidTgts$ Creature | RememberObjects$ Targeted | StackDescription$ SpellDescription | SubAbility$ DBPump | SpellDescription$ Choose target creature. If it's attacking, it can't be blocked this turn. If it's blocking, prevent all combat damage that would be dealt this combat by it and each creature it's blocking. SVar:DBPump:DB$ Pump | Defined$ Remembered | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | KW$ HIDDEN Unblockable | SubAbility$ DBPumpAll | StackDescription$ None -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsRemembered,Creature.isBlockedByRemembered | StackDescription$ None | UntilEndOfCombat$ True | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.IsRemembered,Creature.isBlockedByRemembered | StackDescription$ None | Duration$ UntilEndOfCombat | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | ConditionCheckSVar$ Y | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$Cleanup | ClearRemembered$ True SVar:X:Count$Valid Creature.IsRemembered+attacking SVar:Y:Count$Valid Creature.IsRemembered+blocking diff --git a/forge-gui/res/cardsfolder/s/shacklegeist.txt b/forge-gui/res/cardsfolder/s/shacklegeist.txt index ee439793deb..57779803409 100644 --- a/forge-gui/res/cardsfolder/s/shacklegeist.txt +++ b/forge-gui/res/cardsfolder/s/shacklegeist.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Spirit PT:2/2 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. A:AB$ Tap | Cost$ tapXType<2/Spirit> | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | SpellDescription$ Tap target creature you don't control. DeckHints:Type$Spirit Oracle:Flying\nShacklegeist can block only creatures with flying.\nTap two untapped Spirits you control: Tap target creature you don't control. diff --git a/forge-gui/res/cardsfolder/upcoming/shadewing_laureate.txt b/forge-gui/res/cardsfolder/s/shadewing_laureate.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shadewing_laureate.txt rename to forge-gui/res/cardsfolder/s/shadewing_laureate.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shadrix_silverquill.txt b/forge-gui/res/cardsfolder/s/shadrix_silverquill.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shadrix_silverquill.txt rename to forge-gui/res/cardsfolder/s/shadrix_silverquill.txt diff --git a/forge-gui/res/cardsfolder/upcoming/shaile_dean_of_radiance_embrose_dean_of_shadow.txt b/forge-gui/res/cardsfolder/s/shaile_dean_of_radiance_embrose_dean_of_shadow.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shaile_dean_of_radiance_embrose_dean_of_shadow.txt rename to forge-gui/res/cardsfolder/s/shaile_dean_of_radiance_embrose_dean_of_shadow.txt diff --git a/forge-gui/res/cardsfolder/s/shaman_en_kor.txt b/forge-gui/res/cardsfolder/s/shaman_en_kor.txt index 291564b6e79..cb23bd72a78 100644 --- a/forge-gui/res/cardsfolder/s/shaman_en_kor.txt +++ b/forge-gui/res/cardsfolder/s/shaman_en_kor.txt @@ -2,11 +2,11 @@ Name:Shaman en-Kor ManaCost:1 W Types:Creature Kor Cleric Shaman PT:1/2 -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered A:AB$ ChooseSource | Cost$ 1 W | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBEffect | SpellDescription$ The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to CARDNAME instead. -SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage from | ReplacementEffects$ SelflessDamage | Triggers$ OutOfSight | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card,Emblem | ConditionCompare$ GE1 SVar:SelflessDamage:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SelflessDmg | DamageTarget$ EffectSource | Description$ The next time a source of your choice would deal damage to target creature this turn, that damage is dealt to EFFECTSOURCE instead. SVar:SelflessDmg:DB$ ReplaceEffect | VarName$ Affected | VarValue$ EffectSource | VarType$ Card | SubAbility$ ExileEffect #Zone Change for the source of your choice diff --git a/forge-gui/res/cardsfolder/s/shared_animosity.txt b/forge-gui/res/cardsfolder/s/shared_animosity.txt index 136d086f9f8..123b32ac746 100644 --- a/forge-gui/res/cardsfolder/s/shared_animosity.txt +++ b/forge-gui/res/cardsfolder/s/shared_animosity.txt @@ -2,9 +2,7 @@ Name:Shared Animosity ManaCost:2 R Types:Enchantment T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ AnimosityPump | TriggerDescription$ Whenever a creature you control attacks, it gets +1/+0 until end of turn for each other attacking creature that shares a creature type with it. -SVar:AnimosityPump:DB$ Pump | RememberObjects$ TriggeredAttacker | SubAbility$ AnimosityPump2 -SVar:AnimosityPump2:DB$ Pump | Defined$ Remembered | NumAtt$ X | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$Valid Creature.attacking+IsNotRemembered+sharesCreatureTypeWith Remembered +SVar:AnimosityPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ X +SVar:X:Count$Valid Creature.attacking+NotTriggeredAttacker+sharesCreatureTypeWith TriggeredAttacker AI:RemoveDeck:Random Oracle:Whenever a creature you control attacks, it gets +1/+0 until end of turn for each other attacking creature that shares a creature type with it. diff --git a/forge-gui/res/cardsfolder/s/sharktocrab.txt b/forge-gui/res/cardsfolder/s/sharktocrab.txt index 22647ca4571..6cd1fc94199 100644 --- a/forge-gui/res/cardsfolder/s/sharktocrab.txt +++ b/forge-gui/res/cardsfolder/s/sharktocrab.txt @@ -6,6 +6,6 @@ K:Adapt:1:2 G U DeckHas:Ability$Counters T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigTap | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:HasAttackEffect:TRUE Oracle:{2}{G}{U}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counters are put on Sharktocrab, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt b/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt index 9c688eb2584..7543e70ad2c 100644 --- a/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt +++ b/forge-gui/res/cardsfolder/s/shatterskull_smashing_shatterskull_the_hammer_pass.txt @@ -14,6 +14,6 @@ Name:Shatterskull, the Hammer Pass ManaCost:no cost Types:Land K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. Oracle:As Shatterskull, the Hammer Pass enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped.\n{T}: Add {R}. diff --git a/forge-gui/res/cardsfolder/s/shield_dancer.txt b/forge-gui/res/cardsfolder/s/shield_dancer.txt index 14be14392a4..d6bb9d88471 100644 --- a/forge-gui/res/cardsfolder/s/shield_dancer.txt +++ b/forge-gui/res/cardsfolder/s/shield_dancer.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Creature Human Rebel PT:1/3 A:AB$ Effect | Cost$ 2 W | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | IsCurse$ True | ReplacementEffects$ DamageShielded | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | AILogic$ Fog | SpellDescription$ The next time target attacking creature would deal combat damage to CARDNAME this turn, that creature deals that damage to itself instead. -SVar:DamageShielded:Event$ DamageDone | IsCombat$ True | ValidSource$ Card.IsRemembered | ValidTarget$ Card.EffectSource | ReplaceWith$ DmgSelf | Description$ The next time the targeted attacking creature would deal combat damage to EFFECTSOURCE this turn, that creature deals that damage to itself instead. +SVar:DamageShielded:Event$ DamageDone | IsCombat$ True | ValidSource$ Card.IsRemembered | ValidTarget$ Card.EffectSource | ReplaceWith$ DmgSelf | DamageTarget$ Remembered | Description$ The next time the targeted attacking creature would deal combat damage to EFFECTSOURCE this turn, that creature deals that damage to itself instead. SVar:DmgSelf:DB$ ReplaceEffect | VarName$ Affected | VarValue$ Remembered | VarType$ Card | SubAbility$ ExileEffect SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/s/shield_mare.txt b/forge-gui/res/cardsfolder/s/shield_mare.txt index 72b0ea46e53..9cc92ee1d8f 100644 --- a/forge-gui/res/cardsfolder/s/shield_mare.txt +++ b/forge-gui/res/cardsfolder/s/shield_mare.txt @@ -1,9 +1,9 @@ Name:Shield Mare ManaCost:1 W W Types:Creature Horse -K:CantBeBlockedBy Creature.Red +PT:2/3 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Red | Description$ CARDNAME can't be blocked by red creatures. T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ DBGainLife | TriggerDescription$ When CARDNAME enters the battlefield or becomes the target of a spell or ability an opponent controls, you gain 3 life. T:Mode$ BecomesTarget | ValidTarget$ Card.Self | ValidSource$ Card.OppCtrl | TriggerZones$ Battlefield | Execute$ DBGainLife | TriggerDescription$ When CARDNAME enters the battlefield or becomes the target of a spell or ability an opponent controls, you gain 3 life. SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 -Oracle:Shield Mare can't be blocked by red creatures.\nWhen Shield Mare enters the battlefield or becomes the target of a spell or ability an opponent controls, you gain 3 life. -PT:2/3 +Oracle:Shield Mare can't be blocked by red creatures.\nWhen Shield Mare enters the battlefield or becomes the target of a spell or ability an opponent controls, you gain 3 life. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/shield_of_the_avatar.txt b/forge-gui/res/cardsfolder/s/shield_of_the_avatar.txt index bbe2435e15d..f38f6ab614d 100644 --- a/forge-gui/res/cardsfolder/s/shield_of_the_avatar.txt +++ b/forge-gui/res/cardsfolder/s/shield_of_the_avatar.txt @@ -2,8 +2,8 @@ Name:Shield of the Avatar ManaCost:1 Types:Artifact Equipment K:Equip:2 -S:Mode$ PreventDamage | Target$ Creature.EquippedBy | Amount$ X | Description$ If a source would deal damage to equipped creature, prevent X of that damage, where X is the number of creatures you control. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Creature.EquippedBy | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to equipped creature, prevent X of that damage, where X is the number of creatures you control. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ X SVar:X:Count$Valid Creature.YouCtrl SVar:BuffedBy:Creature -SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_the_avatar.jpg Oracle:If a source would deal damage to equipped creature, prevent X of that damage, where X is the number of creatures you control.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/s/shield_of_the_realm.txt b/forge-gui/res/cardsfolder/s/shield_of_the_realm.txt index 453c51c4dbe..6d47a4f0101 100644 --- a/forge-gui/res/cardsfolder/s/shield_of_the_realm.txt +++ b/forge-gui/res/cardsfolder/s/shield_of_the_realm.txt @@ -2,5 +2,6 @@ Name:Shield of the Realm ManaCost:2 Types:Artifact Equipment K:Equip:1 -S:Mode$ PreventDamage | Target$ Creature.EquippedBy | Amount$ 2 | Description$ If a source would deal damage to equipped creature, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Creature.EquippedBy | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to equipped creature, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 Oracle:If a source would deal damage to equipped creature, prevent 2 of that damage.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/s/shield_of_the_righteous.txt b/forge-gui/res/cardsfolder/s/shield_of_the_righteous.txt index 5119847ce2b..6607d09f398 100644 --- a/forge-gui/res/cardsfolder/s/shield_of_the_righteous.txt +++ b/forge-gui/res/cardsfolder/s/shield_of_the_righteous.txt @@ -4,6 +4,6 @@ Types:Artifact Equipment K:Equip:2 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddToughness$ 2 | AddKeyword$ Vigilance | Description$ Equipped creature gets +0/+2 and has vigilance. T:Mode$ AttackerBlocked | ValidBlocker$ Card.EquippedBy | Execute$ TrigPump | TriggerDescription$ Whenever equipped creature blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/shield_of_the_righteous.jpg Oracle:Equipped creature gets +0/+2 and has vigilance.\nWhenever equipped creature blocks a creature, that creature doesn't untap during its controller's next untap step.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/shineshadow_snarl.txt b/forge-gui/res/cardsfolder/s/shineshadow_snarl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/shineshadow_snarl.txt rename to forge-gui/res/cardsfolder/s/shineshadow_snarl.txt diff --git a/forge-gui/res/cardsfolder/s/shining_shoal.txt b/forge-gui/res/cardsfolder/s/shining_shoal.txt new file mode 100644 index 00000000000..ad146dbae5b --- /dev/null +++ b/forge-gui/res/cardsfolder/s/shining_shoal.txt @@ -0,0 +1,16 @@ +Name:Shining Shoal +ManaCost:X W W +Types:Instant Arcane +SVar:AltCost:Cost$ ExileFromHand<1/Card.White+Other/white card> | Description$ You may exile a white card with mana value X from your hand rather than pay this spell's mana cost. +A:SP$ ChooseSource | Cost$ X W W | Choices$ Card,Emblem | AILogic$ NeedsPrevention | SubAbility$ DBStoreSVar | StackDescription$ SpellDescription | SpellDescription$ The next X damage that a source of your choice would deal to you and/or creatures you control this turn is dealt to any target instead. +SVar:DBStoreSVar:DB$ StoreSVar | SVar$ ShieldAmount | Type$ Calculate | Expression$ Z | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect damage to | ReplacementEffects$ ReDamage | RememberObjects$ Targeted | SubAbility$ DBCleanup +SVar:ReDamage:Event$ DamageDone | ActiveZones$ Command | ValidTarget$ You,Creature.YouCtrl | ValidSource$ Card.ChosenCard,Emblem.ChosenCard | ReplaceWith$ SplitDamage | DamageTarget$ Remembered | Description$ The next X damage that a source of your choice would deal to you and/or creatures you control this turn is dealt to any target instead. +SVar:SplitDamage:DB$ ReplaceSplitDamage | DamageTarget$ Remembered | VarName$ ShieldAmount | DivideShield$ True +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +SVar:X:Count$xPaid +SVar:Y:Exiled$CardManaCost +SVar:Z:SVar$Y/Plus.X +SVar:ShieldAmount:Number$0 +AI:RemoveDeck:All +Oracle:You may exile a white card with mana value X from your hand rather than pay this spell's mana cost.\nThe next X damage that a source of your choice would deal to you and/or creatures you control this turn is dealt to any target instead. diff --git a/forge-gui/res/cardsfolder/s/shipbreaker_kraken.txt b/forge-gui/res/cardsfolder/s/shipbreaker_kraken.txt index ca25f91a8fd..5ac646c6738 100644 --- a/forge-gui/res/cardsfolder/s/shipbreaker_kraken.txt +++ b/forge-gui/res/cardsfolder/s/shipbreaker_kraken.txt @@ -5,7 +5,7 @@ PT:6/6 K:Monstrosity:4:6 U U T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ When CARDNAME becomes monstrous, tap up to four target creatures. Those creatures don't untap during their controllers' untap steps for as long as you control CARDNAME. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 4 | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilLoseControlOfHost$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost DeckHas:Ability$Counters SVar:Picture:http://www.wizards.com/global/images/magic/general/shipbreaker_kraken.jpg Oracle:{6}{U}{U}: Monstrosity 4. (If this creature isn't monstrous, put four +1/+1 counters on it and it becomes monstrous.)\nWhen Shipbreaker Kraken becomes monstrous, tap up to four target creatures. Those creatures don't untap during their controllers' untap steps for as long as you control Shipbreaker Kraken. diff --git a/forge-gui/res/cardsfolder/upcoming/show_of_confidence.txt b/forge-gui/res/cardsfolder/s/show_of_confidence.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/show_of_confidence.txt rename to forge-gui/res/cardsfolder/s/show_of_confidence.txt diff --git a/forge-gui/res/cardsfolder/s/shrewd_hatchling.txt b/forge-gui/res/cardsfolder/s/shrewd_hatchling.txt index d36d60f1504..a99f98f722e 100644 --- a/forge-gui/res/cardsfolder/s/shrewd_hatchling.txt +++ b/forge-gui/res/cardsfolder/s/shrewd_hatchling.txt @@ -3,10 +3,10 @@ ManaCost:3 UR Types:Creature Elemental PT:6/6 K:etbCounter:M1M1:4 -A:AB$ Pump | Cost$ UR | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +A:AB$ Effect | Cost$ UR | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. T:Mode$ SpellCast | ValidCard$ Card.Red | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a red spell, remove a -1/-1 counter from CARDNAME. T:Mode$ SpellCast | ValidCard$ Card.Blue | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRemoveCounter | TriggerDescription$ Whenever you cast a blue spell, remove a -1/-1 counter from CARDNAME. SVar:TrigRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ M1M1 | CounterNum$ 1 SVar:BuffedBy:Card.Red,Card.Blue -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrewd_hatchling.jpg Oracle:Shrewd Hatchling enters the battlefield with four -1/-1 counters on it.\n{U/R}: Target creature can't block Shrewd Hatchling this turn.\nWhenever you cast a blue spell, remove a -1/-1 counter from Shrewd Hatchling.\nWhenever you cast a red spell, remove a -1/-1 counter from Shrewd Hatchling. diff --git a/forge-gui/res/cardsfolder/s/shrill_howler_howling_chorus.txt b/forge-gui/res/cardsfolder/s/shrill_howler_howling_chorus.txt index fcf957d7cd2..3a737d8bfd2 100644 --- a/forge-gui/res/cardsfolder/s/shrill_howler_howling_chorus.txt +++ b/forge-gui/res/cardsfolder/s/shrill_howler_howling_chorus.txt @@ -2,9 +2,9 @@ Name:Shrill Howler ManaCost:2 G Types:Creature Werewolf Horror PT:3/1 -K:Creatures with power less than CARDNAME's power can't block it. -A:AB$SetState | Cost$ 5 G | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME. -SVar:Picture:http://www.wizards.com/global/images/magic/general/shrill_howler.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower +A:AB$ SetState | Cost$ 5 G | Defined$ Self | Mode$ Transform | SpellDescription$ Transform CARDNAME. AlternateMode:DoubleFaced DeckHints:Type$Eldrazi|Horror DeckHas:Ability$Token @@ -16,9 +16,8 @@ Name:Howling Chorus ManaCost:no cost Types:Creature Eldrazi Werewolf PT:3/5 -K:Creatures with power less than CARDNAME's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, create a 3/2 colorless Eldrazi Horror creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_3_2_eldrazi_horror | TokenOwner$ You | LegacyImage$ c 3 2 eldrazi horror emn -SVar:Picture:http://www.wizards.com/global/images/magic/general/howling_chorus.jpg -Oracle:Creatures with power less than Howling Chorus's power can't block it.\nWhenever Howling Chorus deals combat damage to a player, create a 3/2 colorless Eldrazi Horror creature token. - +Oracle:Creatures with power less than Howling Chorus's power can't block it.\nWhenever Howling Chorus deals combat damage to a player, create a 3/2 colorless Eldrazi Horror creature token. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/shyft.txt b/forge-gui/res/cardsfolder/s/shyft.txt index 8f7d52813e3..c692c3164c9 100644 --- a/forge-gui/res/cardsfolder/s/shyft.txt +++ b/forge-gui/res/cardsfolder/s/shyft.txt @@ -4,6 +4,6 @@ Types:Creature Shapeshifter PT:4/2 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigColor | TriggerDescription$ At the beginning of your upkeep, you may have CARDNAME become the color or colors of your choice. (This effect lasts indefinitely.) SVar:TrigColor:DB$ ChooseColor | Defined$ You | OrColors$ True | SubAbility$ Animate -SVar:Animate:DB$ Animate | Defined$ Self | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True +SVar:Animate:DB$ Animate | Defined$ Self | Colors$ ChosenColor | OverwriteColors$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/shyft.jpg Oracle:At the beginning of your upkeep, you may have Shyft become the color or colors of your choice. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/s/sidar_kondo_of_jamuraa.txt b/forge-gui/res/cardsfolder/s/sidar_kondo_of_jamuraa.txt index a9c29dee7c6..cef7d01d71b 100644 --- a/forge-gui/res/cardsfolder/s/sidar_kondo_of_jamuraa.txt +++ b/forge-gui/res/cardsfolder/s/sidar_kondo_of_jamuraa.txt @@ -3,7 +3,6 @@ ManaCost:2 G W Types:Legendary Creature Human Knight PT:2/5 K:Flanking -S:Mode$ Continuous | Affected$ Creature.withoutFlying+withoutReach+OppCtrl | AddHiddenKeyword$ CantBlock Creature.powerLE2:creatures with power 2 or less | Description$ Creatures your opponents control without flying or reach can't block creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerLE2 | ValidBlocker$ Creature.withoutFlying+withoutReach+OppCtrl | Description$ Creatures your opponents control without flying or reach can't block creatures with power 2 or less. K:Partner -SVar:Picture:http://www.wizards.com/global/images/magic/general/sidar_kondo_of_jamuraa.jpg -Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\nCreatures your opponents control without flying or reach can't block creatures with power 2 or less.\nPartner (You can have two commanders if both have partner.) \ No newline at end of file +Oracle:Flanking (Whenever a creature without flanking blocks this creature, the blocking creature gets -1/-1 until end of turn.)\nCreatures your opponents control without flying or reach can't block creatures with power 2 or less.\nPartner (You can have two commanders if both have partner.) diff --git a/forge-gui/res/cardsfolder/s/siege_of_towers.txt b/forge-gui/res/cardsfolder/s/siege_of_towers.txt index 87b2fe87e5a..190d0f978cc 100644 --- a/forge-gui/res/cardsfolder/s/siege_of_towers.txt +++ b/forge-gui/res/cardsfolder/s/siege_of_towers.txt @@ -2,6 +2,6 @@ Name:Siege of Towers ManaCost:1 R Types:Sorcery K:Replicate:1 R -A:SP$ Animate | Cost$ 1 R | ValidTgts$ Mountain | Power$ 3 | Toughness$ 1 | Types$ Creature | Permanent$ True | SpellDescription$ Target Mountain becomes a 3/1 creature. It's still a land. +A:SP$ Animate | Cost$ 1 R | ValidTgts$ Mountain | Power$ 3 | Toughness$ 1 | Types$ Creature | Duration$ Permanent | SpellDescription$ Target Mountain becomes a 3/1 creature. It's still a land. SVar:Picture:http://www.wizards.com/global/images/magic/general/siege_of_towers.jpg Oracle:Replicate {1}{R} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.)\nTarget Mountain becomes a 3/1 creature. It's still a land. diff --git a/forge-gui/res/cardsfolder/s/signal_pest.txt b/forge-gui/res/cardsfolder/s/signal_pest.txt index 0cddd3ba6cf..eeef904c732 100644 --- a/forge-gui/res/cardsfolder/s/signal_pest.txt +++ b/forge-gui/res/cardsfolder/s/signal_pest.txt @@ -3,6 +3,5 @@ ManaCost:1 Types:Artifact Creature Pest PT:0/1 K:Battle cry -K:CantBeBlockedBy Creature.withoutFlying+withoutReach -SVar:Picture:http://www.wizards.com/global/images/magic/general/signal_pest.jpg -Oracle:Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)\nSignal Pest can't be blocked except by creatures with flying or reach. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying+withoutReach | Description$ CARDNAME can't be blocked except by creatures with flying or reach. +Oracle:Battle cry (Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn.)\nSignal Pest can't be blocked except by creatures with flying or reach. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sigrid_god_favored.txt b/forge-gui/res/cardsfolder/s/sigrid_god_favored.txt index a13af1f3281..f28bcfffd5a 100644 --- a/forge-gui/res/cardsfolder/s/sigrid_god_favored.txt +++ b/forge-gui/res/cardsfolder/s/sigrid_god_favored.txt @@ -6,6 +6,6 @@ K:Flash K:First Strike K:Protection:Creature.God:Protection from God creatures T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target attacking or blocking creature until NICKNAME leaves the battlefield. -SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.attacking,Creature.blocking | AITgts$ Creature.OppCtrl+attacking,Creature.OppCtrl+blocking | TgtPrompt$ Select target attacking or blocking creature | TargetMin$ 0 | TargetMax$ 1 | UntilHostLeavesPlay$ True | AILogic$ ExileCombatThreat +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.attacking,Creature.blocking | AITgts$ Creature.OppCtrl+attacking,Creature.OppCtrl+blocking | TgtPrompt$ Select target attacking or blocking creature | TargetMin$ 0 | TargetMax$ 1 | Duration$ UntilHostLeavesPlay | AILogic$ ExileCombatThreat SVar:AmbushAI:True Oracle:Flash\nFirst strike, protection from God creatures\nWhen Sigrid, God-Favored enters the battlefield, exile up to one target attacking or blocking creature until Sigrid leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/s/silhana_ledgewalker.txt b/forge-gui/res/cardsfolder/s/silhana_ledgewalker.txt index 0c9979954f2..10925f2532a 100644 --- a/forge-gui/res/cardsfolder/s/silhana_ledgewalker.txt +++ b/forge-gui/res/cardsfolder/s/silhana_ledgewalker.txt @@ -2,7 +2,6 @@ Name:Silhana Ledgewalker ManaCost:1 G Types:Creature Elf Rogue PT:1/1 -K:CantBeBlockedBy Creature.withoutFlying K:Hexproof -SVar:Picture:http://www.wizards.com/global/images/magic/general/silhana_ledgewalker.jpg -Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nSilhana Ledgewalker can't be blocked except by creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying | Description$ CARDNAME can't be blocked except by creatures with flying. +Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nSilhana Ledgewalker can't be blocked except by creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/silkwrap.txt b/forge-gui/res/cardsfolder/s/silkwrap.txt index 2e130fdc530..bfe049e0bb1 100644 --- a/forge-gui/res/cardsfolder/s/silkwrap.txt +++ b/forge-gui/res/cardsfolder/s/silkwrap.txt @@ -2,7 +2,7 @@ Name:Silkwrap ManaCost:1 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature with mana value 3 or less an opponent controls until CARDNAME leaves the battlefield. (That creature returns under its owner's control.) -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.cmcLE3+OppCtrl | TgtPrompt$ Select target creature with mana value 3 or less an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.cmcLE3+OppCtrl | TgtPrompt$ Select target creature with mana value 3 or less an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:NeedsToPlay:Creature.cmcLE3+OppCtrl Oracle:When Silkwrap enters the battlefield, exile target creature with mana value 3 or less an opponent controls until Silkwrap leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/s/silumgar_assassin.txt b/forge-gui/res/cardsfolder/s/silumgar_assassin.txt index 4abdf58d7e7..f485b57651c 100644 --- a/forge-gui/res/cardsfolder/s/silumgar_assassin.txt +++ b/forge-gui/res/cardsfolder/s/silumgar_assassin.txt @@ -3,7 +3,8 @@ ManaCost:1 B Types:Creature Human Assassin PT:2/1 K:Megamorph:2 B -K:Creatures with power greater than CARDNAME's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGTX | Description$ Creatures with power greater than CARDNAME's power can't block it. +SVar:X:Count$CardPower T:Mode$ TurnFaceUp | ValidCard$ Card.Self | Execute$ TrigDestroy | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME is turned face up, destroy target creature with power 3 or less an opponent controls. SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.powerLE3+OppCtrl | TgtPrompt$ Select target creature with power 3 or less an opponent controls. SVar:Picture:http://www.wizards.com/global/images/magic/general/silumgar_assassin.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/silverquill_apprentice.txt b/forge-gui/res/cardsfolder/s/silverquill_apprentice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silverquill_apprentice.txt rename to forge-gui/res/cardsfolder/s/silverquill_apprentice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silverquill_campus.txt b/forge-gui/res/cardsfolder/s/silverquill_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silverquill_campus.txt rename to forge-gui/res/cardsfolder/s/silverquill_campus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silverquill_command.txt b/forge-gui/res/cardsfolder/s/silverquill_command.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silverquill_command.txt rename to forge-gui/res/cardsfolder/s/silverquill_command.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silverquill_pledgemage.txt b/forge-gui/res/cardsfolder/s/silverquill_pledgemage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silverquill_pledgemage.txt rename to forge-gui/res/cardsfolder/s/silverquill_pledgemage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/silverquill_silencer.txt b/forge-gui/res/cardsfolder/s/silverquill_silencer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/silverquill_silencer.txt rename to forge-gui/res/cardsfolder/s/silverquill_silencer.txt diff --git a/forge-gui/res/cardsfolder/s/skarrgan_pit_skulk.txt b/forge-gui/res/cardsfolder/s/skarrgan_pit_skulk.txt index 1397cd4bb31..5cb37a36846 100644 --- a/forge-gui/res/cardsfolder/s/skarrgan_pit_skulk.txt +++ b/forge-gui/res/cardsfolder/s/skarrgan_pit_skulk.txt @@ -3,6 +3,6 @@ ManaCost:G Types:Creature Human Warrior PT:1/1 K:Bloodthirst:1 -K:Creatures with power less than CARDNAME's power can't block it. -SVar:Picture:http://www.wizards.com/global/images/magic/general/skarrgan_pit_skulk.jpg -Oracle:Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)\nCreatures with power less than Skarrgan Pit-Skulk's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower +Oracle:Bloodthirst 1 (If an opponent was dealt damage this turn, this creature enters the battlefield with a +1/+1 counter on it.)\nCreatures with power less than Skarrgan Pit-Skulk's power can't block it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/skilled_animator.txt b/forge-gui/res/cardsfolder/s/skilled_animator.txt index b96090f7e67..74ea08bdb52 100644 --- a/forge-gui/res/cardsfolder/s/skilled_animator.txt +++ b/forge-gui/res/cardsfolder/s/skilled_animator.txt @@ -2,7 +2,7 @@ Name:Skilled Animator ManaCost:2 U Types:Creature Human Artificer T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, target artifact you control becomes an artifact creature with base power and toughness 5/5 for as long as CARDNAME remains on the battlefield. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact,Creature | UntilHostLeavesPlay$ True +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact,Creature | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE Oracle:When Skilled Animator enters the battlefield, target artifact you control becomes an artifact creature with base power and toughness 5/5 for as long as Skilled Animator remains on the battlefield. PT:1/3 \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/skirk_shaman.txt b/forge-gui/res/cardsfolder/s/skirk_shaman.txt index 319a6b0d28f..059b0c65ced 100644 --- a/forge-gui/res/cardsfolder/s/skirk_shaman.txt +++ b/forge-gui/res/cardsfolder/s/skirk_shaman.txt @@ -2,6 +2,5 @@ Name:Skirk Shaman ManaCost:1 R R Types:Creature Goblin Shaman PT:2/2 -K:CantBeBlockedBy Creature.nonArtifact+nonRed -SVar:Picture:http://resources.wizards.com/magic/cards/plc/en-us/card131011.jpg -Oracle:Skirk Shaman can't be blocked except by artifact creatures and/or red creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.nonArtifact+nonRed | Description$ CARDNAME can't be blocked except by artifact creatures and/or red creatures. +Oracle:Skirk Shaman can't be blocked except by artifact creatures and/or red creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/skyfire_kirin.txt b/forge-gui/res/cardsfolder/s/skyfire_kirin.txt index ad4bcb03039..6397c064c41 100644 --- a/forge-gui/res/cardsfolder/s/skyfire_kirin.txt +++ b/forge-gui/res/cardsfolder/s/skyfire_kirin.txt @@ -5,7 +5,7 @@ PT:3/3 K:Flying T:Mode$ SpellCast | ValidCard$ Spirit,Arcane | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ Whenever you cast a Spirit or Arcane spell, you may gain control of target creature with that spell's mana value until end of turn. SVar:TrigChange:DB$ GainControl | ValidTgts$ Creature.cmcEQX | TgtPrompt$ Select target creature | LoseControl$ EOT | NewController$ You -SVar:X:Count$TriggeredCardManaCost +SVar:X:TriggerCount$CastSACMC DeckHints:Type$Spirit|Arcane SVar:Picture:http://www.wizards.com/global/images/magic/general/skyfire_kirin.jpg Oracle:Flying\nWhenever you cast a Spirit or Arcane spell, you may gain control of target creature with that spell's mana value until end of turn. diff --git a/forge-gui/res/cardsfolder/s/skyline_cascade.txt b/forge-gui/res/cardsfolder/s/skyline_cascade.txt index 5991ba9884a..8c4536b5b8b 100644 --- a/forge-gui/res/cardsfolder/s/skyline_cascade.txt +++ b/forge-gui/res/cardsfolder/s/skyline_cascade.txt @@ -3,6 +3,6 @@ ManaCost:no cost Types:Land K:CARDNAME enters the battlefield tapped. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ When CARDNAME enters the battlefield, target creature an opponent controls doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. Oracle:Skyline Cascade enters the battlefield tapped.\nWhen Skyline Cascade enters the battlefield, target creature an opponent controls doesn't untap during its controller's next untap step.\n{T}: Add {U}. diff --git a/forge-gui/res/cardsfolder/s/skywinder_drake.txt b/forge-gui/res/cardsfolder/s/skywinder_drake.txt index 059afefb7b6..e3030991196 100644 --- a/forge-gui/res/cardsfolder/s/skywinder_drake.txt +++ b/forge-gui/res/cardsfolder/s/skywinder_drake.txt @@ -3,6 +3,5 @@ ManaCost:2 U Types:Creature Drake PT:3/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/skywinder_drake.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nSkywinder Drake can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/s/sleep.txt b/forge-gui/res/cardsfolder/s/sleep.txt index 906a079d6bd..9273ada403b 100644 --- a/forge-gui/res/cardsfolder/s/sleep.txt +++ b/forge-gui/res/cardsfolder/s/sleep.txt @@ -2,5 +2,5 @@ Name:Sleep ManaCost:2 U U Types:Sorcery A:SP$ TapAll | Cost$ 2 U U | ValidTgts$ Player | TgtPrompt$ Select target player | ValidCards$ Creature | SubAbility$ DBPumpAll | SpellDescription$ Tap all creatures target player controls. Those creatures don't untap during that player's next untap step. -SVar:DBPumpAll:DB$ PumpAll | Defined$ Targeted | ValidCards$ Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPumpAll:DB$ PumpAll | Defined$ Targeted | ValidCards$ Creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent Oracle:Tap all creatures target player controls. Those creatures don't untap during that player's next untap step. diff --git a/forge-gui/res/cardsfolder/s/sleep_of_the_dead.txt b/forge-gui/res/cardsfolder/s/sleep_of_the_dead.txt index 0a532310a3d..01f8f05440c 100644 --- a/forge-gui/res/cardsfolder/s/sleep_of_the_dead.txt +++ b/forge-gui/res/cardsfolder/s/sleep_of_the_dead.txt @@ -2,7 +2,7 @@ Name:Sleep of the Dead ManaCost:U Types:Sorcery A:SP$ Tap | Cost$ U | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent K:Escape:2 U ExileFromGrave<3/Card.Other/other> SVar:AIPreference:ExileFromGraveCost$Card.YouOwn+Other+inZoneGraveyard Oracle:Tap target creature. It doesn't untap during its controller's next untap step.\nEscape—{2}{U}, Exile three other cards from your graveyard. (You may cast this card from your graveyard for its escape cost.) diff --git a/forge-gui/res/cardsfolder/s/sleeper_dart.txt b/forge-gui/res/cardsfolder/s/sleeper_dart.txt index fe465e01231..18ceff13a15 100755 --- a/forge-gui/res/cardsfolder/s/sleeper_dart.txt +++ b/forge-gui/res/cardsfolder/s/sleeper_dart.txt @@ -3,5 +3,5 @@ ManaCost:2 Types:Artifact T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. +A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. Oracle:When Sleeper Dart enters the battlefield, draw a card.\n{T}, Sacrifice Sleeper Dart: Target creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/s/sleight_of_mind.txt b/forge-gui/res/cardsfolder/s/sleight_of_mind.txt index 70395eb6baa..9364b7d4c53 100644 --- a/forge-gui/res/cardsfolder/s/sleight_of_mind.txt +++ b/forge-gui/res/cardsfolder/s/sleight_of_mind.txt @@ -1,7 +1,7 @@ Name:Sleight of Mind ManaCost:U Types:Instant -A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Permanent$ True | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (For example, you may change "target black spell" to "target blue spell." This effect lasts indefinitely.) +A:SP$ ChangeText | Cost$ U | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | Duration$ Permanent | ChangeColorWord$ Choose Choose | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (For example, you may change "target black spell" to "target blue spell." This effect lasts indefinitely.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/alter_reality.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/sly_instigator.txt b/forge-gui/res/cardsfolder/s/sly_instigator.txt similarity index 62% rename from forge-gui/res/cardsfolder/upcoming/sly_instigator.txt rename to forge-gui/res/cardsfolder/s/sly_instigator.txt index aad1a8c0fb4..28b0731cf0f 100644 --- a/forge-gui/res/cardsfolder/upcoming/sly_instigator.txt +++ b/forge-gui/res/cardsfolder/s/sly_instigator.txt @@ -2,6 +2,6 @@ Name:Sly Instigator ManaCost:3 U Types:Creature Human Wizard PT:2/4 -A:AB$ Pump | Cost$ U T | ValidTgts$ Creature.OppCtrl | UntilYourNextTurn$ True | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SubAbility$ DBGoad | SpellDescription$ Target creature can't be blocked this turn. +A:AB$ Pump | Cost$ U T | ValidTgts$ Creature.OppCtrl | Duration$ UntilYourNextTurn | TgtPrompt$ Select target creature | KW$ HIDDEN Unblockable | SubAbility$ DBGoad | SpellDescription$ Target creature can't be blocked this turn. SVar:DBGoad:DB$ Goad | Defined$ Targeted | SpellDescription$ Goad that creature. Oracle:{U}, {T}: Until your next turn, target creature an opponent controls can't be blocked. Goad that creature. (Until your next turn, that creature attacks each combat if able and attacks a player other than you if able.) diff --git a/forge-gui/res/cardsfolder/s/sneak_attack.txt b/forge-gui/res/cardsfolder/s/sneak_attack.txt index 9307a79b52e..60f1723fadd 100644 --- a/forge-gui/res/cardsfolder/s/sneak_attack.txt +++ b/forge-gui/res/cardsfolder/s/sneak_attack.txt @@ -2,7 +2,7 @@ Name:Sneak Attack ManaCost:3 R Types:Enchantment A:AB$ ChangeZone | Cost$ R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | AILogic$ BeforeCombat | SpellDescription$ You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice the creature at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:NonStackingEffect:True AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/s/sneaky_homunculus.txt b/forge-gui/res/cardsfolder/s/sneaky_homunculus.txt index a3843b656db..520977ff9ba 100644 --- a/forge-gui/res/cardsfolder/s/sneaky_homunculus.txt +++ b/forge-gui/res/cardsfolder/s/sneaky_homunculus.txt @@ -2,7 +2,6 @@ Name:Sneaky Homunculus ManaCost:1 U Types:Creature Homunculus Illusion PT:1/1 -K:CantBeBlockedBy Creature.powerGE2 -K:CantBlock Creature.powerGE2:creatures with power 2 or greater -SVar:Picture:http://www.wizards.com/global/images/magic/general/sneaky_homunculus.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block or be blocked by creatures with power 2 or greater. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerGE2 | Secondary$ True | Description$ CARDNAME can't block or be blocked by creatures with power 2 or greater. Oracle:Sneaky Homunculus can't block or be blocked by creatures with power 2 or greater. diff --git a/forge-gui/res/cardsfolder/upcoming/snow_day.txt b/forge-gui/res/cardsfolder/s/snow_day.txt similarity index 86% rename from forge-gui/res/cardsfolder/upcoming/snow_day.txt rename to forge-gui/res/cardsfolder/s/snow_day.txt index 3e426898782..43c78da6ede 100644 --- a/forge-gui/res/cardsfolder/upcoming/snow_day.txt +++ b/forge-gui/res/cardsfolder/s/snow_day.txt @@ -2,7 +2,7 @@ Name:Snow Day ManaCost:4 U U Types:Instant A:SP$ Tap | Cost$ 4 U U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose up to two target creatures | ValidTgts$ Creature | SubAbility$ TrigPump | StackDescription$ SpellDescription | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ Draw | StackDescription$ None +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ Draw | StackDescription$ None SVar:Draw:DB$ Draw | Defined$ You | NumCards$ 2 | SubAbility$ Discard SVar:Discard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose Oracle:Tap up to two target creatures. Those creatures don't untap during their controller's next untap step.\nDraw two cards, then discard a card. diff --git a/forge-gui/res/cardsfolder/upcoming/solve_the_equation.txt b/forge-gui/res/cardsfolder/s/solve_the_equation.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/solve_the_equation.txt rename to forge-gui/res/cardsfolder/s/solve_the_equation.txt diff --git a/forge-gui/res/cardsfolder/s/somnophore.txt b/forge-gui/res/cardsfolder/s/somnophore.txt index 06f26e824d0..f08673c0ca4 100644 --- a/forge-gui/res/cardsfolder/s/somnophore.txt +++ b/forge-gui/res/cardsfolder/s/somnophore.txt @@ -5,6 +5,6 @@ PT:2/2 K:Flying T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME deals damage to a player, tap target creature that player controls. That creature doesn't untap during its controller's untap step for as long as CARDNAME remains on the battlefield. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature | TargetsWithDefinedController$ TriggeredTarget | SubAbility$ DBSomnophoreAnimate -SVar:DBSomnophoreAnimate:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilHostLeavesPlay$ True +SVar:DBSomnophoreAnimate:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilHostLeavesPlay SVar:Picture:http://www.wizards.com/global/images/magic/general/somnophore.jpg Oracle:Flying\nWhenever Somnophore deals damage to a player, tap target creature that player controls. That creature doesn't untap during its controller's untap step for as long as Somnophore remains on the battlefield. diff --git a/forge-gui/res/cardsfolder/s/song_of_freyalise.txt b/forge-gui/res/cardsfolder/s/song_of_freyalise.txt index 77f7a9da86e..b97b043b48a 100644 --- a/forge-gui/res/cardsfolder/s/song_of_freyalise.txt +++ b/forge-gui/res/cardsfolder/s/song_of_freyalise.txt @@ -2,7 +2,7 @@ Name:Song of Freyalise ManaCost:1 G Types:Enchantment Saga K:Saga:3:DBAnimateAll,DBAnimateAll,DBPutCounterAll -SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Abilities$ AnyMana | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, creatures you control gain "{T}: Add one mana of any color." +SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Abilities$ AnyMana | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures you control gain "{T}: Add one mana of any color." SVar:AnyMana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | SpellDescription$ Add one mana of any color. SVar:DBPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPumpAll | SpellDescription$ Put a +1/+1 counter on each creature you control. Those creatures gain vigilance, trample, and indestructible until end of turn. SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Vigilance & Trample & Indestructible diff --git a/forge-gui/res/cardsfolder/upcoming/soothsayer_adept.txt b/forge-gui/res/cardsfolder/s/soothsayer_adept.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/soothsayer_adept.txt rename to forge-gui/res/cardsfolder/s/soothsayer_adept.txt diff --git a/forge-gui/res/cardsfolder/s/sootwalkers.txt b/forge-gui/res/cardsfolder/s/sootwalkers.txt index bc964fec4ef..c1d7c16501c 100644 --- a/forge-gui/res/cardsfolder/s/sootwalkers.txt +++ b/forge-gui/res/cardsfolder/s/sootwalkers.txt @@ -2,6 +2,5 @@ Name:Sootwalkers ManaCost:2 BR BR Types:Creature Elemental Rogue PT:3/3 -K:CantBeBlockedBy Creature.White -SVar:Picture:http://www.wizards.com/global/images/magic/general/sootwalkers.jpg -Oracle:Sootwalkers can't be blocked by white creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.White | Description$ CARDNAME can't be blocked by white creatures. +Oracle:Sootwalkers can't be blocked by white creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/sorin_solemn_visitor.txt b/forge-gui/res/cardsfolder/s/sorin_solemn_visitor.txt index 3e895a5ddee..c2780164047 100644 --- a/forge-gui/res/cardsfolder/s/sorin_solemn_visitor.txt +++ b/forge-gui/res/cardsfolder/s/sorin_solemn_visitor.txt @@ -2,7 +2,7 @@ Name:Sorin, Solemn Visitor ManaCost:2 W B Types:Legendary Planeswalker Sorin Loyalty:4 -A:AB$ PumpAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Lifelink | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, creatures you control get +1/+0 and gain lifelink. +A:AB$ PumpAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.YouCtrl | NumAtt$ +1 | KW$ Lifelink | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, creatures you control get +1/+0 and gain lifelink. A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | LegacyImage$ b 2 2 vampire flying ktk | TokenOwner$ You | TokenScript$ b_2_2_vampire_flying | SpellDescription$ Create a 2/2 black Vampire creature token with flying. A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Sorin, Solemn Visitor | Triggers$ BOTTrig | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "At the beginning of each opponent's upkeep, that player sacrifices a creature." SVar:BOTTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.Opponent | TriggerZones$ Command | Execute$ SorinSac | TriggerDescription$ At the beginning of each opponent's upkeep, that player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/s/sorin_vengeful_bloodlord.txt b/forge-gui/res/cardsfolder/s/sorin_vengeful_bloodlord.txt index 7bd8c10764c..c5e79674d72 100644 --- a/forge-gui/res/cardsfolder/s/sorin_vengeful_bloodlord.txt +++ b/forge-gui/res/cardsfolder/s/sorin_vengeful_bloodlord.txt @@ -6,6 +6,6 @@ S:Mode$ Continuous | Affected$ Creature.YouCtrl,Planeswalker.YouCtrl | AddKeywor SVar:NonStackingEffect:True A:AB$ DealDamage | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to target player or planeswalker. A:AB$ ChangeZone | Cost$ SubCounter | Planeswalker$ True | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcEQX | AILogic$ SorinVengefulBloodlord | TgtPrompt$ Select target creature with mana value X from your graveyard | AnimateSubAbility$ Animate | SpellDescription$ Return target creature card with mana value X from your graveyard to the battlefield. That creature is a Vampire in addition to its other types. -SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Vampire | Permanent$ True +SVar:Animate:DB$ Animate | Defined$ Remembered | Types$ Vampire | Duration$ Permanent SVar:X:Count$xPaid Oracle:As long as it's your turn, creatures and planeswalkers you control have lifelink.\n[+2]: Sorin, Vengeful Bloodlord deals 1 damage to target player or planeswalker.\n[−X]: Return target creature card with mana value X from your graveyard to the battlefield. That creature is a Vampire in addition to its other types. diff --git a/forge-gui/res/cardsfolder/s/soul_scar_mage.txt b/forge-gui/res/cardsfolder/s/soul_scar_mage.txt index 4990a00606f..70e49cc058e 100644 --- a/forge-gui/res/cardsfolder/s/soul_scar_mage.txt +++ b/forge-gui/res/cardsfolder/s/soul_scar_mage.txt @@ -3,9 +3,8 @@ ManaCost:R Types:Creature Human Wizard PT:1/2 K:Prowess -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Creature.OppCtrl | ReplaceWith$ Counters | IsCombat$ False | Description$ If a source you control would deal noncombat damage to a creature an opponent controls, put that many -1/-1 counters on that creature instead. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.YouCtrl,Emblem.YouCtrl | ValidTarget$ Creature.OppCtrl | ReplaceWith$ Counters | IsCombat$ False | ExecuteMode$ PerTarget | Description$ If a source you control would deal noncombat damage to a creature an opponent controls, put that many -1/-1 counters on that creature instead. SVar:Counters:DB$PutCounter | Defined$ ReplacedTarget | CounterType$ M1M1 | CounterNum$ X SVar:X:ReplaceCount$DamageAmount DeckHas:Ability$Counters -SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_scar_mage.jpg Oracle:Prowess\nIf a source you control would deal noncombat damage to a creature an opponent controls, put that many -1/-1 counters on that creature instead. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/soul_sculptor.txt b/forge-gui/res/cardsfolder/s/soul_sculptor.txt index eddc467b722..94d17d93667 100644 --- a/forge-gui/res/cardsfolder/s/soul_sculptor.txt +++ b/forge-gui/res/cardsfolder/s/soul_sculptor.txt @@ -2,7 +2,7 @@ Name:Soul Sculptor ManaCost:2 W Types:Creature Human PT:1/1 -A:AB$ Animate | Cost$ 1 W T | ValidTgts$ Creature | Types$ Enchantment | RemoveAllAbilities$ True | RemoveCardTypes$ True | UntilAPlayerCastSpell$ Creature | SpellDescription$ Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. +A:AB$ Animate | Cost$ 1 W T | ValidTgts$ Creature | Types$ Enchantment | RemoveAllAbilities$ True | RemoveCardTypes$ True | Duration$ UntilAPlayerCastSpell Creature | SpellDescription$ Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/soul_sculptor.jpg Oracle:{1}{W}, {T}: Target creature becomes an enchantment and loses all abilities until a player casts a creature spell. diff --git a/forge-gui/res/cardsfolder/s/soulsworn_spirit.txt b/forge-gui/res/cardsfolder/s/soulsworn_spirit.txt index c0bfe0b6586..1ec4c21efd0 100644 --- a/forge-gui/res/cardsfolder/s/soulsworn_spirit.txt +++ b/forge-gui/res/cardsfolder/s/soulsworn_spirit.txt @@ -4,7 +4,7 @@ Types:Creature Spirit PT:2/1 K:Unblockable T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ Detain | TriggerDescription$ When CARDNAME enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) -SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | UntilYourNextTurn$ True | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. +SVar:Detain:DB$ Pump | KW$ HIDDEN CARDNAME can't attack or block. & HIDDEN CARDNAME's activated abilities can't be activated. | IsCurse$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature your opponent controls to detain. SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/soulsworn_spirit.jpg Oracle:Soulsworn Spirit can't be blocked.\nWhen Soulsworn Spirit enters the battlefield, detain target creature an opponent controls. (Until your next turn, that creature can't attack or block and its activated abilities can't be activated.) diff --git a/forge-gui/res/cardsfolder/upcoming/sparring_regimen.txt b/forge-gui/res/cardsfolder/s/sparring_regimen.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sparring_regimen.txt rename to forge-gui/res/cardsfolder/s/sparring_regimen.txt diff --git a/forge-gui/res/cardsfolder/s/spatial_binding.txt b/forge-gui/res/cardsfolder/s/spatial_binding.txt index c78a87ac514..d559fa8d650 100644 --- a/forge-gui/res/cardsfolder/s/spatial_binding.txt +++ b/forge-gui/res/cardsfolder/s/spatial_binding.txt @@ -1,7 +1,7 @@ Name:Spatial Binding ManaCost:U B Types:Enchantment -A:AB$ Pump | Cost$ PayLife<1> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | KW$ HIDDEN CARDNAME can't phase out. | AITgts$ Permanent.withPhasing+YouCtrl | UntilYourNextUpkeep$ True | SpellDescription$ Until your next upkeep, target permanent can't phase out. +A:AB$ Pump | Cost$ PayLife<1> | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | KW$ HIDDEN CARDNAME can't phase out. | AITgts$ Permanent.withPhasing+YouCtrl | Duration$ UntilYourNextUpkeep | SpellDescription$ Until your next upkeep, target permanent can't phase out. AI:RemoveDeck:Random SVar:NonStackingEffect:True SVar:Picture:http://www.wizards.com/global/images/magic/general/spatial_binding.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/spawning_kraken.txt b/forge-gui/res/cardsfolder/s/spawning_kraken.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spawning_kraken.txt rename to forge-gui/res/cardsfolder/s/spawning_kraken.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spectacle_mage.txt b/forge-gui/res/cardsfolder/s/spectacle_mage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spectacle_mage.txt rename to forge-gui/res/cardsfolder/s/spectacle_mage.txt diff --git a/forge-gui/res/cardsfolder/upcoming/specter_of_the_fens.txt b/forge-gui/res/cardsfolder/s/specter_of_the_fens.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/specter_of_the_fens.txt rename to forge-gui/res/cardsfolder/s/specter_of_the_fens.txt diff --git a/forge-gui/res/cardsfolder/s/spectral_bears.txt b/forge-gui/res/cardsfolder/s/spectral_bears.txt index 49840903816..3127fea3ca2 100644 --- a/forge-gui/res/cardsfolder/s/spectral_bears.txt +++ b/forge-gui/res/cardsfolder/s/spectral_bears.txt @@ -3,5 +3,5 @@ ManaCost:1 G Types:Creature Bear Spirit PT:3/3 T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | IsPresent$ Permanent.Black+nonToken+DefenderCtrl | PresentCompare$ EQ0 | TriggerDescription$ Whenever CARDNAME attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. -SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:Whenever Spectral Bears attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/s/spectral_force.txt b/forge-gui/res/cardsfolder/s/spectral_force.txt index 22458437e6c..6c4a20f2962 100644 --- a/forge-gui/res/cardsfolder/s/spectral_force.txt +++ b/forge-gui/res/cardsfolder/s/spectral_force.txt @@ -4,5 +4,5 @@ Types:Creature Elemental Spirit PT:8/8 K:Trample T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ StayTapped | IsPresent$ Permanent.Black+nonToken+DefenderCtrl | PresentCompare$ EQ0 | TriggerDescription$ Whenever CARDNAME attacks, if defending player controls no black nontoken permanents, it doesn't untap during your next untap step. -SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:Trample\nWhenever Spectral Force attacks, if defending player controls no black permanents, it doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/s/spectral_grasp.txt b/forge-gui/res/cardsfolder/s/spectral_grasp.txt index 2032951246e..5449e633758 100644 --- a/forge-gui/res/cardsfolder/s/spectral_grasp.txt +++ b/forge-gui/res/cardsfolder/s/spectral_grasp.txt @@ -4,6 +4,6 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 W | ValidTgts$ Creature | AILogic$ Curse S:Mode$ CantAttack | ValidCard$ Creature.EnchantedBy | Target$ You,Planeswalker.YouCtrl | Description$ Enchanted creature can't attack you or planeswalkers you control. -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CantBlock Creature.YouCtrl | Description$ Enchanted creature can't block creatures you control. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.YouCtrl | ValidBlocker$ Creature.EnchantedBy | Description$ Enchanted creature can't block creatures you control. SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_grasp.jpg Oracle:Enchant creature\nEnchanted creature can't attack you or planeswalkers you control.\nEnchanted creature can't block creatures you control. diff --git a/forge-gui/res/cardsfolder/s/spectral_shift.txt b/forge-gui/res/cardsfolder/s/spectral_shift.txt index 19e712b0e26..4e8d645d4e4 100644 --- a/forge-gui/res/cardsfolder/s/spectral_shift.txt +++ b/forge-gui/res/cardsfolder/s/spectral_shift.txt @@ -3,8 +3,8 @@ ManaCost:1 U Types:Instant K:Entwine:2 A:SP$ Charm | Cost$ 1 U | Choices$ DBBasicLand,DBColor -SVar:DBBasicLand:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (This effect lasts indefinitely.) -SVar:DBColor:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Permanent$ True | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) +SVar:DBBasicLand:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeTypeWord$ ChooseBasicLandType ChooseBasicLandType | Duration$ Permanent | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one basic land type with another. (This effect lasts indefinitely.) +SVar:DBColor:DB$ ChangeText | ValidTgts$ Card | TgtZone$ Stack,Battlefield | TgtPrompt$ Choose target spell or permanent | ChangeColorWord$ Choose Choose | Duration$ Permanent | SpellDescription$ Change the text of target spell or permanent by replacing all instances of one color word with another. (This effect lasts indefinitely.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/spectral_shift.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/spell_satchel.txt b/forge-gui/res/cardsfolder/s/spell_satchel.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spell_satchel.txt rename to forge-gui/res/cardsfolder/s/spell_satchel.txt diff --git a/forge-gui/res/cardsfolder/s/sphere_of_duty.txt b/forge-gui/res/cardsfolder/s/sphere_of_duty.txt index ec1754c3651..443a52c6c3c 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_duty.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_duty.txt @@ -1,7 +1,7 @@ Name:Sphere of Duty ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.GreenSource | Amount$ 2 | Description$ If a green source would deal damage to you, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.GreenSource | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a green source would deal damage to you, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_duty.jpg Oracle:If a green source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_grace.txt b/forge-gui/res/cardsfolder/s/sphere_of_grace.txt index d8e72c522fd..5739ec2297d 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_grace.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_grace.txt @@ -1,7 +1,7 @@ Name:Sphere of Grace ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.BlackSource | Amount$ 2 | Description$ If a black source would deal damage to you, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.BlackSource | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a black source would deal damage to you, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_grace.jpg Oracle:If a black source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_law.txt b/forge-gui/res/cardsfolder/s/sphere_of_law.txt index d52cd7e380b..126fdff4143 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_law.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_law.txt @@ -1,7 +1,7 @@ Name:Sphere of Law ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.RedSource | Amount$ 2 | Description$ If a red source would deal damage to you, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.RedSource | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a red source would deal damage to you, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_law.jpg Oracle:If a red source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_purity.txt b/forge-gui/res/cardsfolder/s/sphere_of_purity.txt index 8f4e434af94..b5fe28befbf 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_purity.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_purity.txt @@ -1,7 +1,7 @@ Name:Sphere of Purity ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Artifact | Amount$ 1 | Description$ If an artifact source would deal damage to you, prevent 1 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Artifact | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If an artifact would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_purity.jpg Oracle:If an artifact would deal damage to you, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_reason.txt b/forge-gui/res/cardsfolder/s/sphere_of_reason.txt index 06348adbe40..cebc3c02f0e 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_reason.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_reason.txt @@ -1,7 +1,7 @@ Name:Sphere of Reason ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.BlueSource | Amount$ 2 | Description$ If a blue source would deal damage to you, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.BlueSource | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a blue source would deal damage to you, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_reason.jpg Oracle:If a blue source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphere_of_truth.txt b/forge-gui/res/cardsfolder/s/sphere_of_truth.txt index 658a76d6fab..ce476b768b2 100644 --- a/forge-gui/res/cardsfolder/s/sphere_of_truth.txt +++ b/forge-gui/res/cardsfolder/s/sphere_of_truth.txt @@ -1,7 +1,7 @@ Name:Sphere of Truth ManaCost:3 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Source$ Card.WhiteSource | Amount$ 2 | Description$ If a white source would deal damage to you, prevent 2 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Card.WhiteSource | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a white source would deal damage to you, prevent 2 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 2 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/sphere_of_truth.jpg Oracle:If a white source would deal damage to you, prevent 2 of that damage. diff --git a/forge-gui/res/cardsfolder/s/sphinxs_tutelage.txt b/forge-gui/res/cardsfolder/s/sphinxs_tutelage.txt index 33a1d2b97c6..5d3212eee38 100644 --- a/forge-gui/res/cardsfolder/s/sphinxs_tutelage.txt +++ b/forge-gui/res/cardsfolder/s/sphinxs_tutelage.txt @@ -2,12 +2,11 @@ Name:Sphinx's Tutelage ManaCost:2 U Types:Enchantment T:Mode$ Drawn | ValidCard$ Card.YouOwn | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you draw a card, target opponent mills two cards. If two nonland cards that share a color were milled this way, repeat this process. -SVar:TrigMill:DB$ Repeat | ValidTgts$ Opponent | IsCurse$ True | RepeatSubAbility$ DBCleanAndGrind | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledSharesColor | RepeatSVarCompare$ EQ2 | SubAbility$ DBCleanup -SVar:DBCleanAndGrind:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBPeek -SVar:DBPeek:DB$ PeekAndReveal | Defined$ Targeted | PeekAmount$ 2 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ DBGrind -SVar:DBGrind:DB$ Mill | NumCards$ 2 | Defined$ Targeted | NoReveal$ True +SVar:TrigMill:DB$ Repeat | ValidTgts$ Opponent | IsCurse$ True | RepeatSubAbility$ DBCleanAndGrind | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledSharesColor | RepeatSVarCompare$ GE2 | SubAbility$ DBCleanup +SVar:DBCleanAndGrind:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBGrind +SVar:DBGrind:DB$ Mill | NumCards$ 2 | Defined$ Targeted | NoReveal$ True | RememberMilled$ True SVar:MaxRepeats:TargetedPlayer$CardsInLibrary -SVar:MilledSharesColor:RememberedLKI$Valid Card.nonLand+SharesColorWith Remembered +SVar:MilledSharesColor:Remembered$Valid Card.nonLand+SharesColorWithOther Remembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True A:AB$ Draw | Cost$ 5 U | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose diff --git a/forge-gui/res/cardsfolder/s/spike_tiller.txt b/forge-gui/res/cardsfolder/s/spike_tiller.txt index e233409e36a..fbfd8bc1b54 100644 --- a/forge-gui/res/cardsfolder/s/spike_tiller.txt +++ b/forge-gui/res/cardsfolder/s/spike_tiller.txt @@ -4,7 +4,7 @@ Types:Creature Spike PT:0/0 K:etbCounter:P1P1:3 A:AB$ PutCounter | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | AILogic$ MoveCounter.IsCounterUser | SpellDescription$ Put a +1/+1 counter on target creature. -A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. +A:AB$ Animate | Cost$ 2 SubCounter<1/P1P1> | ValidTgts$ Land | TgtPrompt$ Choose target land. | Power$ 2 | Toughness$ 2 | Types$ Creature | Duration$ Permanent | SubAbility$ DBPutCounter | SpellDescription$ Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/spike_tiller.jpg Oracle:Spike Tiller enters the battlefield with three +1/+1 counters on it.\n{2}, Remove a +1/+1 counter from Spike Tiller: Put a +1/+1 counter on target creature.\n{2}, Remove a +1/+1 counter from Spike Tiller: Target land becomes a 2/2 creature that's still a land. Put a +1/+1 counter on it. diff --git a/forge-gui/res/cardsfolder/s/spin_engine.txt b/forge-gui/res/cardsfolder/s/spin_engine.txt index f059afe08b1..fb8d62f20de 100644 --- a/forge-gui/res/cardsfolder/s/spin_engine.txt +++ b/forge-gui/res/cardsfolder/s/spin_engine.txt @@ -2,7 +2,7 @@ Name:Spin Engine ManaCost:3 Types:Artifact Creature Construct PT:3/1 -A:AB$ Pump | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | KW$ HIDDEN CantBlockCardUIDSource | DefinedKW$ CardUIDSource | UntilHostLeavesPlayOrEOT$ True | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +A:AB$ Effect | Cost$ R | ValidTgts$ Creature | TgtPrompt$ Select target creature that can't block this creature this turn | IsCurse$ True | RememberObjects$ TargetedCard | ForgetOnMoved$ Battlefield | StaticAbilities$ KWPump | Duration$ UntilHostLeavesPlayOrEOT | StackDescription$ {c:Targeted} can't block CARDNAME this turn. | SpellDescription$ Target creature can't block CARDNAME this turn. +SVar:KWPump:Mode$ CantBlockBy | ValidAttacker$ Creature.EffectSource | ValidBlocker$ Creature.IsRemembered | Description$ {c:Remembered} can't block EFFECTSOURCE this turn. DeckNeeds:Color$Red -SVar:Picture:http://www.wizards.com/global/images/magic/general/spin_engine.jpg Oracle:{R}: Target creature can't block Spin Engine this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/spined_karok.txt b/forge-gui/res/cardsfolder/s/spined_karok.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spined_karok.txt rename to forge-gui/res/cardsfolder/s/spined_karok.txt diff --git a/forge-gui/res/cardsfolder/s/spire_patrol.txt b/forge-gui/res/cardsfolder/s/spire_patrol.txt index cbf2b5424b1..df5924716e3 100644 --- a/forge-gui/res/cardsfolder/s/spire_patrol.txt +++ b/forge-gui/res/cardsfolder/s/spire_patrol.txt @@ -5,7 +5,7 @@ PT:3/2 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_patrol.jpg Oracle:Flying\nWhen Spire Patrol enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/spire_tracer.txt b/forge-gui/res/cardsfolder/s/spire_tracer.txt index b78de7bc5de..ff170c409f8 100644 --- a/forge-gui/res/cardsfolder/s/spire_tracer.txt +++ b/forge-gui/res/cardsfolder/s/spire_tracer.txt @@ -2,6 +2,5 @@ Name:Spire Tracer ManaCost:G Types:Creature Elf Scout PT:1/1 -K:CantBeBlockedBy Creature.withoutFlying+withoutReach -SVar:Picture:http://www.wizards.com/global/images/magic/general/spire_tracer.jpg -Oracle:Spire Tracer can't be blocked except by creatures with flying or reach. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying+withoutReach | Description$ CARDNAME can't be blocked except by creatures with flying or reach. +Oracle:Spire Tracer can't be blocked except by creatures with flying or reach. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/spirit_en_kor.txt b/forge-gui/res/cardsfolder/s/spirit_en_kor.txt index 2f9030d00e6..d9053fe20dd 100644 --- a/forge-gui/res/cardsfolder/s/spirit_en_kor.txt +++ b/forge-gui/res/cardsfolder/s/spirit_en_kor.txt @@ -3,7 +3,7 @@ ManaCost:3 W Types:Creature Kor Spirit PT:2/2 K:Flying -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt b/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt index a9fddb9bec2..06d76384647 100644 --- a/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt +++ b/forge-gui/res/cardsfolder/s/spirit_of_resistance.txt @@ -1,8 +1,8 @@ Name:Spirit of Resistance ManaCost:2 W Types:Enchantment -S:Mode$ PreventDamage | Target$ You | Condition$ PermanentOfEachColor | Description$ As long as you control a permanent of each color, prevent all damage that would be dealt to you. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You | Prevent$ True | CheckSVar$ X | SVarCompare$ EQ5 | Description$ As long as you control a permanent of each color, prevent all damage that would be dealt to you. +SVar:X:Count$ColorsCtrl Permanent SVar:NonStackingEffect:True AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/spirit_of_resistance.jpg Oracle:As long as you control a permanent of each color, prevent all damage that would be dealt to you. diff --git a/forge-gui/res/cardsfolder/upcoming/spirit_summoning.txt b/forge-gui/res/cardsfolder/s/spirit_summoning.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spirit_summoning.txt rename to forge-gui/res/cardsfolder/s/spirit_summoning.txt diff --git a/forge-gui/res/cardsfolder/upcoming/spiteful_squad.txt b/forge-gui/res/cardsfolder/s/spiteful_squad.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/spiteful_squad.txt rename to forge-gui/res/cardsfolder/s/spiteful_squad.txt diff --git a/forge-gui/res/cardsfolder/s/spitfire_handler.txt b/forge-gui/res/cardsfolder/s/spitfire_handler.txt index 2fb04e8e06d..d63993d7410 100644 --- a/forge-gui/res/cardsfolder/s/spitfire_handler.txt +++ b/forge-gui/res/cardsfolder/s/spitfire_handler.txt @@ -2,8 +2,7 @@ Name:Spitfire Handler ManaCost:1 R Types:Creature Goblin PT:1/1 -K:CantBlock Creature.powerGTX:creatures with power greater than CARDNAME's power +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGTX | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power greater than CARDNAME's power. A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. SVar:X:Count$CardPower -SVar:Picture:http://www.wizards.com/global/images/magic/general/spitfire_handler.jpg Oracle:Spitfire Handler can't block creatures with power greater than Spitfire Handler's power.\n{R}: Spitfire Handler gets +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/s/spore_cloud.txt b/forge-gui/res/cardsfolder/s/spore_cloud.txt index fcd0d7b3067..0ea95519673 100644 --- a/forge-gui/res/cardsfolder/s/spore_cloud.txt +++ b/forge-gui/res/cardsfolder/s/spore_cloud.txt @@ -3,5 +3,5 @@ ManaCost:1 G G Types:Instant A:SP$ Fog | Cost$ 1 G G | SubAbility$ DBTapAll | SpellDescription$ Tap all blocking creatures. Prevent all combat damage that would be dealt this turn. Each attacking creature and each blocking creature doesn't untap during its controller's next untap step. SVar:DBTapAll:DB$ TapAll | ValidCards$ Creature.blocking | SubAbility$ DBPumpAll -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking,Creature.blocking | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking,Creature.blocking | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent Oracle:Tap all blocking creatures. Prevent all combat damage that would be dealt this turn. Each attacking creature and each blocking creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/springmane_cervin.txt b/forge-gui/res/cardsfolder/s/springmane_cervin.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/springmane_cervin.txt rename to forge-gui/res/cardsfolder/s/springmane_cervin.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sproutback_trudge.txt b/forge-gui/res/cardsfolder/s/sproutback_trudge.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sproutback_trudge.txt rename to forge-gui/res/cardsfolder/s/sproutback_trudge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/square_up.txt b/forge-gui/res/cardsfolder/s/square_up.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/square_up.txt rename to forge-gui/res/cardsfolder/s/square_up.txt diff --git a/forge-gui/res/cardsfolder/s/stalking_stones.txt b/forge-gui/res/cardsfolder/s/stalking_stones.txt index 776498f4715..9da5aaf5aa5 100644 --- a/forge-gui/res/cardsfolder/s/stalking_stones.txt +++ b/forge-gui/res/cardsfolder/s/stalking_stones.txt @@ -2,6 +2,6 @@ Name:Stalking Stones ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Animate | Cost$ 6 | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Artifact,Elemental | Permanent$ True | SpellDescription$ CARDNAME becomes a 3/3 Elemental artifact creature that's still a land. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ 6 | Defined$ Self | Power$ 3 | Toughness$ 3 | Types$ Creature,Artifact,Elemental | Duration$ Permanent | SpellDescription$ CARDNAME becomes a 3/3 Elemental artifact creature that's still a land. (This effect lasts indefinitely.) SVar:Picture:http://www.wizards.com/global/images/magic/general/stalking_stones.jpg Oracle:{T}: Add {C}.\n{6}: Stalking Stones becomes a 3/3 Elemental artifact creature that's still a land. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/upcoming/star_pupil.txt b/forge-gui/res/cardsfolder/s/star_pupil.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/star_pupil.txt rename to forge-gui/res/cardsfolder/s/star_pupil.txt diff --git a/forge-gui/res/cardsfolder/upcoming/start_from_scratch.txt b/forge-gui/res/cardsfolder/s/start_from_scratch.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/start_from_scratch.txt rename to forge-gui/res/cardsfolder/s/start_from_scratch.txt diff --git a/forge-gui/res/cardsfolder/s/stasis_snare.txt b/forge-gui/res/cardsfolder/s/stasis_snare.txt index a8aba35cb05..ba1f2ea8ee1 100644 --- a/forge-gui/res/cardsfolder/s/stasis_snare.txt +++ b/forge-gui/res/cardsfolder/s/stasis_snare.txt @@ -3,7 +3,7 @@ ManaCost:1 W W Types:Enchantment K:Flash T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:Flash (You may cast this spell any time you could cast an instant.)\nWhen Stasis Snare enters the battlefield, exile target creature an opponent controls until Stasis Snare leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/s/steam_vents.txt b/forge-gui/res/cardsfolder/s/steam_vents.txt index 8ce27546321..2c3282acc91 100644 --- a/forge-gui/res/cardsfolder/s/steam_vents.txt +++ b/forge-gui/res/cardsfolder/s/steam_vents.txt @@ -2,6 +2,5 @@ Name:Steam Vents ManaCost:no cost Types:Land Island Mountain K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96923.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {U} or {R}.)\nAs Steam Vents enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/s/steel_leaf_champion.txt b/forge-gui/res/cardsfolder/s/steel_leaf_champion.txt index f9a6f01afe0..ae61305f008 100644 --- a/forge-gui/res/cardsfolder/s/steel_leaf_champion.txt +++ b/forge-gui/res/cardsfolder/s/steel_leaf_champion.txt @@ -2,5 +2,5 @@ Name:Steel Leaf Champion ManaCost:G G G Types:Creature Elf Knight PT:5/4 -K:CantBeBlockedBy Creature.powerLE2 -Oracle:Steel Leaf Champion can't be blocked by creatures with power 2 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. +Oracle:Steel Leaf Champion can't be blocked by creatures with power 2 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/stensia_innkeeper.txt b/forge-gui/res/cardsfolder/s/stensia_innkeeper.txt index 08e12381e53..e5d24ad07c9 100644 --- a/forge-gui/res/cardsfolder/s/stensia_innkeeper.txt +++ b/forge-gui/res/cardsfolder/s/stensia_innkeeper.txt @@ -4,7 +4,7 @@ Types:Creature Vampire PT:3/3 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, enters the battlefield, tap target land an opponent controls. That land doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Land.OppCtrl | TgtPrompt$ Choose target land an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/stensia_innkeeper.jpg Oracle:When Stensia Innkeeper enters the battlefield, tap target land an opponent controls. That land doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/s/stinging_licid.txt b/forge-gui/res/cardsfolder/s/stinging_licid.txt index e1c5bdf2184..6ef0f5e06ff 100644 --- a/forge-gui/res/cardsfolder/s/stinging_licid.txt +++ b/forge-gui/res/cardsfolder/s/stinging_licid.txt @@ -2,7 +2,7 @@ Name:Stinging Licid ManaCost:1 U Types:Creature Licid PT:1/1 -A:AB$ Animate | Cost$ 1 U T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. +A:AB$ Animate | Cost$ 1 U T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ U | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {U} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Curse SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature T:Mode$ Taps | ValidCard$ Card.AttachedBy | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted creature becomes tapped, CARDNAME deals 2 damage to that creature's controller. diff --git a/forge-gui/res/cardsfolder/upcoming/stinging_study.txt b/forge-gui/res/cardsfolder/s/stinging_study.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stinging_study.txt rename to forge-gui/res/cardsfolder/s/stinging_study.txt diff --git a/forge-gui/res/cardsfolder/s/stitched_mangler.txt b/forge-gui/res/cardsfolder/s/stitched_mangler.txt index 71cb95f497a..01c0098d72a 100644 --- a/forge-gui/res/cardsfolder/s/stitched_mangler.txt +++ b/forge-gui/res/cardsfolder/s/stitched_mangler.txt @@ -5,7 +5,7 @@ PT:2/3 K:CARDNAME enters the battlefield tapped. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/stitched_mangler.jpg Oracle:Stitched Mangler enters the battlefield tapped.\nWhen Stitched Mangler enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/s/stitchers_graft.txt b/forge-gui/res/cardsfolder/s/stitchers_graft.txt index 4bd23346f63..395f52c7722 100644 --- a/forge-gui/res/cardsfolder/s/stitchers_graft.txt +++ b/forge-gui/res/cardsfolder/s/stitchers_graft.txt @@ -3,7 +3,7 @@ ManaCost:1 Types:Artifact Equipment S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Equipped creature gets +3/+3. T:Mode$ Attacks | ValidCard$ Card.EquippedBy | Execute$ StayTapped | TriggerDescription$ Whenever equipped creature attacks, it doesn't untap during its controller's next untap step. -SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ TriggeredAttacker | Permanent$ True +SVar:StayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ TriggeredAttacker | Duration$ Permanent T:Mode$ Unattach | ValidAttachment$ Card.Self | ValidObject$ Permanent | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME becomes unattached from a permanent, sacrifice that permanent. SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ TriggeredObject K:Equip:2 diff --git a/forge-gui/res/cardsfolder/s/stoic_ephemera.txt b/forge-gui/res/cardsfolder/s/stoic_ephemera.txt index 95b839418c3..e1749ee178d 100644 --- a/forge-gui/res/cardsfolder/s/stoic_ephemera.txt +++ b/forge-gui/res/cardsfolder/s/stoic_ephemera.txt @@ -6,7 +6,6 @@ K:Defender K:Flying T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelTrig | TriggerDescription$ When CARDNAME blocks, sacrifice it at end of combat. SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Opponent | Execute$ TrigSacrifice | TriggerDescription$ Sacrifice CARDNAME at end of combat. -SVar:TrigSacrifice:DB$Sacrifice | Defined$ Self +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI SVar:SacrificeEndCombat:True -SVar:Picture:http://www.wizards.com/global/images/magic/general/stoic_ephemera.jpg Oracle:Defender (This creature can't attack.)\nFlying\nWhen Stoic Ephemera blocks, sacrifice it at end of combat. diff --git a/forge-gui/res/cardsfolder/s/stolen_goods.txt b/forge-gui/res/cardsfolder/s/stolen_goods.txt index c18c97f2cee..560f455b785 100644 --- a/forge-gui/res/cardsfolder/s/stolen_goods.txt +++ b/forge-gui/res/cardsfolder/s/stolen_goods.txt @@ -2,7 +2,7 @@ Name:Stolen Goods ManaCost:3 U Types:Sorcery A:SP$ DigUntil | Cost$ 3 U | ValidTgts$ Opponent | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | IsCurse$ True | SubAbility$ DBEffect | SpellDescription$ Target opponent exiles cards from the top of their library until they exile a nonland card. Until end of turn, you may cast that card without paying its mana cost. -SVar:DBEffect:DB$ Effect | Name$ Stolen Goods Effect | StaticAbilities$ StolenGoodsPlay | RememberObjects$ Remembered | Permanent$ True | SubAbility$ DBCleanup +SVar:DBEffect:DB$ Effect | Name$ Stolen Goods Effect | StaticAbilities$ StolenGoodsPlay | RememberObjects$ Remembered | Duration$ Permanent | SubAbility$ DBCleanup SVar:StolenGoodsPlay:Mode$ Continuous | MayPlay$ True | MayPlayWithoutManaCost$ True | EffectZone$ Command | Affected$ Card.IsRemembered+OppOwn | AffectedZone$ Exile | Description$ Until end of turn, you may cast this card without paying its mana cost. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBCleanupEffect SVar:DBCleanupEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile diff --git a/forge-gui/res/cardsfolder/s/stomping_ground.txt b/forge-gui/res/cardsfolder/s/stomping_ground.txt index 78fa3777316..134d8bbb4ad 100644 --- a/forge-gui/res/cardsfolder/s/stomping_ground.txt +++ b/forge-gui/res/cardsfolder/s/stomping_ground.txt @@ -2,6 +2,5 @@ Name:Stomping Ground ManaCost:no cost Types:Land Mountain Forest K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/gpt/en-us/card96896.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {R} or {G}.)\nAs Stomping Ground enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/s/stone_spirit.txt b/forge-gui/res/cardsfolder/s/stone_spirit.txt index 9eacdae2b58..9da4ff13dbe 100644 --- a/forge-gui/res/cardsfolder/s/stone_spirit.txt +++ b/forge-gui/res/cardsfolder/s/stone_spirit.txt @@ -2,6 +2,5 @@ Name:Stone Spirit ManaCost:4 R Types:Creature Elemental Spirit PT:4/3 -K:CantBeBlockedBy Creature.withFlying -SVar:Picture:http://www.wizards.com/global/images/magic/general/stone_spirit.jpg -Oracle:Stone Spirit can't be blocked by creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withFlying | Description$ CARDNAME can't be blocked by creatures with flying. +Oracle:Stone Spirit can't be blocked by creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/stonebinders_familiar.txt b/forge-gui/res/cardsfolder/s/stonebinders_familiar.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stonebinders_familiar.txt rename to forge-gui/res/cardsfolder/s/stonebinders_familiar.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stonebound_mentor.txt b/forge-gui/res/cardsfolder/s/stonebound_mentor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stonebound_mentor.txt rename to forge-gui/res/cardsfolder/s/stonebound_mentor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/stonerise_spirit.txt b/forge-gui/res/cardsfolder/s/stonerise_spirit.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/stonerise_spirit.txt rename to forge-gui/res/cardsfolder/s/stonerise_spirit.txt diff --git a/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt b/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt index 2aee12be7cd..4d9176c4618 100644 --- a/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt +++ b/forge-gui/res/cardsfolder/s/stonewise_fortifier.txt @@ -2,7 +2,7 @@ Name:Stonewise Fortifier ManaCost:1 W Types:Creature Human Wizard PT:2/2 -A:AB$ Effect | Cost$ 4 W | ValidTgts$ Creature | RememberObjects$ Targeted | ImprintCards$ Self | ForgetOnMoved$ Battlefield | ReplacementEffects$ RPrevent | Duration$ HostLeavesOrEOT | SpellDescription$ Prevent all damage that would be dealt to CARDNAME by target creature this turn. +A:AB$ Effect | Cost$ 4 W | ValidTgts$ Creature | RememberObjects$ Targeted | ImprintCards$ Self | ForgetOnMoved$ Battlefield | ReplacementEffects$ RPrevent | Duration$ UntilHostLeavesPlayOrEOT | SpellDescription$ Prevent all damage that would be dealt to CARDNAME by target creature this turn. SVar:RPrevent:Event$ DamageDone | Prevent$ True | IsCombat$ True | ActiveZones$ Command | ValidTarget$ Card.IsImprinted | ValidSource$ Creature.IsRemembered | Description$ Prevent all damage that would be dealt to CARDNAME by target creature this turn. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/stonewise_fortifier.jpg diff --git a/forge-gui/res/cardsfolder/s/storm_herald.txt b/forge-gui/res/cardsfolder/s/storm_herald.txt index c937ec72461..759c719da4d 100755 --- a/forge-gui/res/cardsfolder/s/storm_herald.txt +++ b/forge-gui/res/cardsfolder/s/storm_herald.txt @@ -5,7 +5,7 @@ PT:3/2 K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ GraveAuras | TriggerDescription$ When CARDNAME enters the battlefield, return any number of Aura cards from your graveyard to the battlefield attached to creatures you control. Exile those Auras at the beginning of your next end step. If those Auras would leave the battlefield, exile them instead of putting them anywhere else. SVar:GraveAuras:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Aura.YouOwn | RememberChanged$ True | AttachedTo$ Creature.YouCtrl | ChangeNum$ GraveX | Optional$ True | Hidden$ True | SubAbility$ DBUnearthed -SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | LeaveBattlefield$ Exile | Permanent$ True | SubAbility$ DelayedExile | StackDescription$ If those Auras would leave the battlefield, exile them instead of putting them anywhere else. +SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | LeaveBattlefield$ Exile | Duration$ Permanent | SubAbility$ DelayedExile | StackDescription$ If those Auras would leave the battlefield, exile them instead of putting them anywhere else. SVar:DelayedExile:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | RememberObjects$ RememberedLKI | TriggerDescription$ Exile those Auras at the beginning of your next end step. | SubAbility$ DBCleanup SVar:TrigReturn:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ DelayTriggerRememberedLKI SVar:GraveX:Count$ValidGraveyard Aura.YouOwn diff --git a/forge-gui/res/cardsfolder/upcoming/storm_kiln_artist.txt b/forge-gui/res/cardsfolder/s/storm_kiln_artist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/storm_kiln_artist.txt rename to forge-gui/res/cardsfolder/s/storm_kiln_artist.txt diff --git a/forge-gui/res/cardsfolder/s/stormbound_geist.txt b/forge-gui/res/cardsfolder/s/stormbound_geist.txt index ed594a5afb7..34a4533bacd 100644 --- a/forge-gui/res/cardsfolder/s/stormbound_geist.txt +++ b/forge-gui/res/cardsfolder/s/stormbound_geist.txt @@ -3,7 +3,6 @@ ManaCost:1 U U Types:Creature Spirit PT:2/2 K:Flying -K:CARDNAME can block only creatures with flying. K:Undying -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormbound_geist.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nStormbound Geist can block only creatures with flying.\nUndying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) diff --git a/forge-gui/res/cardsfolder/s/stormcloud_djinn.txt b/forge-gui/res/cardsfolder/s/stormcloud_djinn.txt index 4cc571b8aa5..de23aca56e9 100644 --- a/forge-gui/res/cardsfolder/s/stormcloud_djinn.txt +++ b/forge-gui/res/cardsfolder/s/stormcloud_djinn.txt @@ -3,8 +3,7 @@ ManaCost:4 U Types:Creature Djinn PT:3/3 K:Flying -K:CARDNAME can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. A:AB$ Pump | Cost$ R R | NumAtt$ +2 | SubAbility$ DBDealDamage | SpellDescription$ CARDNAME gets +2/+0 until end of turn and deals 1 damage to you. SVar:DBDealDamage:DB$DealDamage | Defined$ You | NumDmg$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/stormcloud_djinn.jpg Oracle:Flying\nStormcloud Djinn can block only creatures with flying.\n{R}{R}: Stormcloud Djinn gets +2/+0 until end of turn and deals 1 damage to you. diff --git a/forge-gui/res/cardsfolder/s/stormwild_capridor.txt b/forge-gui/res/cardsfolder/s/stormwild_capridor.txt index 7809b2c437a..c6dce96c09a 100755 --- a/forge-gui/res/cardsfolder/s/stormwild_capridor.txt +++ b/forge-gui/res/cardsfolder/s/stormwild_capridor.txt @@ -3,7 +3,7 @@ ManaCost:2 W Types:Creature Bird Goat PT:1/3 K:Flying -R:Event$ DamageDone | IsCombat$ False | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ Counters | Description$ If noncombat damage would be dealt to CARDNAME, prevent that damage. Put a +1/+1 counter on CARDNAME for each 1 damage prevented this way. +R:Event$ DamageDone | IsCombat$ False | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If noncombat damage would be dealt to CARDNAME, prevent that damage. Put a +1/+1 counter on CARDNAME for each 1 damage prevented this way. SVar:Counters:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ X | Defined$ Self SVar:X:ReplaceCount$DamageAmount DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/s/stratozeppelid.txt b/forge-gui/res/cardsfolder/s/stratozeppelid.txt index 34b91887f15..b08d1364bc0 100644 --- a/forge-gui/res/cardsfolder/s/stratozeppelid.txt +++ b/forge-gui/res/cardsfolder/s/stratozeppelid.txt @@ -3,6 +3,5 @@ ManaCost:4 U Types:Creature Beast PT:4/4 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/stratozeppelid.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nStratozeppelid can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/s/stratus_walk.txt b/forge-gui/res/cardsfolder/s/stratus_walk.txt index 5f38fd420a9..115bb48ed9a 100644 --- a/forge-gui/res/cardsfolder/s/stratus_walk.txt +++ b/forge-gui/res/cardsfolder/s/stratus_walk.txt @@ -3,8 +3,8 @@ ManaCost:1 U Types:Enchantment Aura K:Enchant creature A:SP$ Attach | Cost$ 1 U | ValidTgts$ Creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | AddHiddenKeyword$ CARDNAME can block only creatures with flying. | Description$ Enchanted creature has flying. (It can't be blocked except by creatures with flying or reach.) Enchanted creature can block only creatures with flying. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Flying | Description$ Enchanted creature has flying. (It can't be blocked except by creatures with flying or reach.) +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.EnchantedBy | Description$ Enchanted creature can block only creatures with flying. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/stratus_walk.jpg Oracle:Enchant creature\nWhen Stratus Walk enters the battlefield, draw a card.\nEnchanted creature has flying. (It can't be blocked except by creatures with flying or reach.)\nEnchanted creature can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/strict_proctor.txt b/forge-gui/res/cardsfolder/s/strict_proctor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/strict_proctor.txt rename to forge-gui/res/cardsfolder/s/strict_proctor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/strixhaven_stadium.txt b/forge-gui/res/cardsfolder/s/strixhaven_stadium.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/strixhaven_stadium.txt rename to forge-gui/res/cardsfolder/s/strixhaven_stadium.txt diff --git a/forge-gui/res/cardsfolder/s/stromkirk_noble.txt b/forge-gui/res/cardsfolder/s/stromkirk_noble.txt index d6e1cac6ce2..3a4d3da5b92 100644 --- a/forge-gui/res/cardsfolder/s/stromkirk_noble.txt +++ b/forge-gui/res/cardsfolder/s/stromkirk_noble.txt @@ -2,8 +2,7 @@ Name:Stromkirk Noble ManaCost:R Types:Creature Vampire Noble PT:1/1 -K:CantBeBlockedBy Creature.Human +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Human | Description$ CARDNAME can't be blocked by Humans. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, put a +1/+1 counter on it. SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/stromkirk_noble.jpg -Oracle:Stromkirk Noble can't be blocked by Humans.\nWhenever Stromkirk Noble deals combat damage to a player, put a +1/+1 counter on it. +Oracle:Stromkirk Noble can't be blocked by Humans.\nWhenever Stromkirk Noble deals combat damage to a player, put a +1/+1 counter on it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/stronghold_zeppelin.txt b/forge-gui/res/cardsfolder/s/stronghold_zeppelin.txt index 68f5d6e897b..7dfb8bf5026 100644 --- a/forge-gui/res/cardsfolder/s/stronghold_zeppelin.txt +++ b/forge-gui/res/cardsfolder/s/stronghold_zeppelin.txt @@ -3,6 +3,5 @@ ManaCost:2 U U Types:Creature Human PT:3/3 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/stronghold_zeppelin.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nStronghold Zeppelin can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/s/struggle_for_sanity.txt b/forge-gui/res/cardsfolder/s/struggle_for_sanity.txt index 44de975c107..969a959e71d 100644 --- a/forge-gui/res/cardsfolder/s/struggle_for_sanity.txt +++ b/forge-gui/res/cardsfolder/s/struggle_for_sanity.txt @@ -11,7 +11,6 @@ SVar:DBReturn:DB$ ChangeZoneAll | ChangeType$ Card.IsImprinted | Origin$ Exile | SVar:DBGoYard:DB$ ChangeZoneAll | ChangeType$ Card.IsNotImprinted+IsRemembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True SVar:X:Count$ValidHand Card.IsRemembered -SVar:NeedsToPlayVar:Y GE2 -SVar:Y:Count$InOppHand -SVar:Picture:http://www.wizards.com/global/images/magic/general/struggle_for_sanity.jpg +SVar:NeedsToPlayVar:Y GE1 +SVar:Y:PlayerCountPropertyOpponent$HasPropertyHasCardsInHand_Card_GE2 Oracle:Target opponent reveals their hand. That player exiles a card from it, then you exile a card from it. Repeat this process until all cards in that hand have been exiled. That player returns the cards they exiled this way to their hand and puts the rest into their graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/study_break.txt b/forge-gui/res/cardsfolder/s/study_break.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/study_break.txt rename to forge-gui/res/cardsfolder/s/study_break.txt diff --git a/forge-gui/res/cardsfolder/upcoming/study_hall.txt b/forge-gui/res/cardsfolder/s/study_hall.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/study_hall.txt rename to forge-gui/res/cardsfolder/s/study_hall.txt diff --git a/forge-gui/res/cardsfolder/upcoming/sudden_breakthrough.txt b/forge-gui/res/cardsfolder/s/sudden_breakthrough.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/sudden_breakthrough.txt rename to forge-gui/res/cardsfolder/s/sudden_breakthrough.txt diff --git a/forge-gui/res/cardsfolder/s/sudden_storm.txt b/forge-gui/res/cardsfolder/s/sudden_storm.txt index eaf508d0f9c..7f70a011c79 100644 --- a/forge-gui/res/cardsfolder/s/sudden_storm.txt +++ b/forge-gui/res/cardsfolder/s/sudden_storm.txt @@ -2,7 +2,7 @@ Name:Sudden Storm ManaCost:3 U Types:Instant A:SP$ Tap | Cost$ 3 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap steps. Scry 1. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | SubAbility$ DBScry +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 1 SVar:Picture:http://www.wizards.com/global/images/magic/general/sudden_storm.jpg Oracle:Tap up to two target creatures. Those creatures don't untap during their controllers' next untap steps. Scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) diff --git a/forge-gui/res/cardsfolder/s/sunweb.txt b/forge-gui/res/cardsfolder/s/sunweb.txt index a1f515331b9..e0f701ecf46 100644 --- a/forge-gui/res/cardsfolder/s/sunweb.txt +++ b/forge-gui/res/cardsfolder/s/sunweb.txt @@ -4,6 +4,5 @@ Types:Creature Wall PT:5/6 K:Flying K:Defender -K:CantBlock Creature.powerLE2:creatures with power 2 or less -SVar:Picture:http://www.wizards.com/global/images/magic/general/sunweb.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerLE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or less. Oracle:Defender (This creature can't attack.)\nFlying\nSunweb can't block creatures with power 2 or less. diff --git a/forge-gui/res/cardsfolder/s/surge_mare.txt b/forge-gui/res/cardsfolder/s/surge_mare.txt index 96de15dffe0..aa992d1aba4 100644 --- a/forge-gui/res/cardsfolder/s/surge_mare.txt +++ b/forge-gui/res/cardsfolder/s/surge_mare.txt @@ -1,11 +1,11 @@ Name:Surge Mare ManaCost:U U Types:Creature Horse Fish -K:CantBeBlockedBy Creature.Green +PT:0/5 +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Green | Description$ CARDNAME can't be blocked by green creatures. T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Opponent | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME deals damage to an opponent, you may draw a card. If you do, discard a card. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBDiscard SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose A:AB$ Pump | Cost$ 1 U | ValidCard$ Card.Self | NumAtt$ +2 | NumDef$ -2 | SpellDescription$ CARDNAME gets +2/-2 until end of turn. DeckHas:Ability$Discard -Oracle:Surge Mare can't be blocked by green creatures.\nWhenever Surge Mare deals damage to an opponent, you may draw a card. If you do, discard a card.\n{1}{U}: Surge Mare gets +2/-2 until end of turn. -PT:0/5 \ No newline at end of file +Oracle:Surge Mare can't be blocked by green creatures.\nWhenever Surge Mare deals damage to an opponent, you may draw a card. If you do, discard a card.\n{1}{U}: Surge Mare gets +2/-2 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/surge_to_victory.txt b/forge-gui/res/cardsfolder/s/surge_to_victory.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/surge_to_victory.txt rename to forge-gui/res/cardsfolder/s/surge_to_victory.txt diff --git a/forge-gui/res/cardsfolder/s/suspension_field.txt b/forge-gui/res/cardsfolder/s/suspension_field.txt index 7e9d57456b2..ef38be8f6e5 100644 --- a/forge-gui/res/cardsfolder/s/suspension_field.txt +++ b/forge-gui/res/cardsfolder/s/suspension_field.txt @@ -2,7 +2,7 @@ Name:Suspension Field ManaCost:1 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may exile target creature with toughness 3 or greater until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.toughnessGE3 | TgtPrompt$ Select target creature with toughness 3 or greater | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.toughnessGE3 | TgtPrompt$ Select target creature with toughness 3 or greater | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:When Suspension Field enters the battlefield, you may exile target creature with toughness 3 or greater until Suspension Field leaves the battlefield. (That creature returns under its owner's control.) diff --git a/forge-gui/res/cardsfolder/s/sutured_ghoul.txt b/forge-gui/res/cardsfolder/s/sutured_ghoul.txt index 825c574dd3f..c3d3926be6b 100644 --- a/forge-gui/res/cardsfolder/s/sutured_ghoul.txt +++ b/forge-gui/res/cardsfolder/s/sutured_ghoul.txt @@ -6,7 +6,7 @@ K:Trample K:ETBReplacement:Copy:ChooseCreatures SVar:ChooseCreatures:DB$ ChooseCard | Defined$ You | Amount$ X | Choices$ Creature.YouOwn | ChoiceTitle$ Exile any number of creature cards from your graveyard. | ChoiceZone$ Graveyard | RememberChosen$ True | SubAbility$ ExileCreatures | SpellDescription$ As CARDNAME enters the battlefield, exile any number of creature cards from your graveyard. CARDNAME's power is equal to the total power of the exiled cards and its toughness is equal to their total toughness. SVar:ExileCreatures:DB$ ChangeZoneAll | ChangeType$ Remembered | Origin$ Graveyard | Destination$ Exile | SubAbility$ AnimateSuture -SVar:AnimateSuture:DB$ Animate | Defined$ Self | Power$ TotalPower | Toughness$ TotalToughness | Permanent$ True | SubAbility$ DBCleanup +SVar:AnimateSuture:DB$ Animate | Defined$ Self | Power$ TotalPower | Toughness$ TotalToughness | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TotalPower:Remembered$CardPower SVar:TotalToughness:Remembered$CardToughness diff --git a/forge-gui/res/cardsfolder/s/swans_of_bryn_argoll.txt b/forge-gui/res/cardsfolder/s/swans_of_bryn_argoll.txt index fc49dbbe8bf..90f02d8f182 100644 --- a/forge-gui/res/cardsfolder/s/swans_of_bryn_argoll.txt +++ b/forge-gui/res/cardsfolder/s/swans_of_bryn_argoll.txt @@ -3,8 +3,7 @@ ManaCost:2 WU WU Types:Creature Bird Spirit PT:4/3 K:Flying -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBDraw | PreventionEffect$ True | Description$ If a source would deal damage to CARDNAME, prevent that damage. The source's controller draws cards equal to the damage prevented this way. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBDraw | PreventionEffect$ True | ExecuteMode$ PerSource | Description$ If a source would deal damage to CARDNAME, prevent that damage. The source's controller draws cards equal to the damage prevented this way. SVar:DBDraw:DB$ Draw | NumCards$ X | Defined$ ReplacedSourceController SVar:X:ReplaceCount$DamageAmount -SVar:Picture:http://www.wizards.com/global/images/magic/general/swans_of_bryn_argoll.jpg Oracle:Flying\nIf a source would deal damage to Swans of Bryn Argoll, prevent that damage. The source's controller draws cards equal to the damage prevented this way. diff --git a/forge-gui/res/cardsfolder/s/swift_warkite.txt b/forge-gui/res/cardsfolder/s/swift_warkite.txt index a2ceb8b6ef2..99b06fbc3c7 100644 --- a/forge-gui/res/cardsfolder/s/swift_warkite.txt +++ b/forge-gui/res/cardsfolder/s/swift_warkite.txt @@ -5,7 +5,7 @@ PT:4/4 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put a creature card with mana value 3 or less from your hand or graveyard onto the battlefield. That creature gains haste. Return it to your hand at the beginning of the next end step. SVar:TrigChange:DB$ChangeZone | Origin$ Hand,Graveyard | Destination$ Battlefield | ChangeType$ Creature.cmcLE3+YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ChangeNum$ 1 -SVar:DBPump:DB$ Animate | Keywords$ Haste | AtEOT$ Hand | Defined$ Remembered | Permanent$ True | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | AtEOT$ Hand | Defined$ Remembered | Duration$ Permanent | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/swift_warkite.jpg diff --git a/forge-gui/res/cardsfolder/s/sygg_river_cutthroat.txt b/forge-gui/res/cardsfolder/s/sygg_river_cutthroat.txt index eea2d2b4a34..e79b989a368 100644 --- a/forge-gui/res/cardsfolder/s/sygg_river_cutthroat.txt +++ b/forge-gui/res/cardsfolder/s/sygg_river_cutthroat.txt @@ -4,6 +4,6 @@ Types:Legendary Creature Merfolk Rogue PT:1/3 T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigDraw | OptionalDecider$ You | CheckSVar$ X | SVarCompare$ GE3 | TriggerDescription$ At the beginning of each end step, if an opponent lost 3 or more life this turn, you may draw a card. (Damage causes loss of life.) SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 -SVar:X:PlayerCountOpponents$HighestLifeLostThisTurn +SVar:X:PlayerCountRegisteredOpponents$HighestLifeLostThisTurn SVar:Picture:http://www.wizards.com/global/images/magic/general/sygg_river_cutthroat.jpg Oracle:At the beginning of each end step, if an opponent lost 3 or more life this turn, you may draw a card. (Damage causes loss of life.) diff --git a/forge-gui/res/cardsfolder/s/sylvan_awakening.txt b/forge-gui/res/cardsfolder/s/sylvan_awakening.txt index 5c72cb1f22e..60d7a4a45f6 100644 --- a/forge-gui/res/cardsfolder/s/sylvan_awakening.txt +++ b/forge-gui/res/cardsfolder/s/sylvan_awakening.txt @@ -1,7 +1,7 @@ Name:Sylvan Awakening ManaCost:2 G Types:Sorcery -A:SP$ AnimateAll | Cost$ 2 G | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Keywords$ Reach & Indestructible & Haste | ValidCards$ Land.YouCtrl | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. +A:SP$ AnimateAll | Cost$ 2 G | Power$ 2 | Toughness$ 2 | Types$ Creature,Elemental | Keywords$ Reach & Indestructible & Haste | ValidCards$ Land.YouCtrl | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/sylvan_awakening.jpg Oracle:Until your next turn, all lands you control become 2/2 Elemental creatures with reach, indestructible, and haste. They're still lands. diff --git a/forge-gui/res/cardsfolder/upcoming/symmetry_sage.txt b/forge-gui/res/cardsfolder/s/symmetry_sage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/symmetry_sage.txt rename to forge-gui/res/cardsfolder/s/symmetry_sage.txt diff --git a/forge-gui/res/cardsfolder/s/szadek_lord_of_secrets.txt b/forge-gui/res/cardsfolder/s/szadek_lord_of_secrets.txt index 7948de06152..27ba3d7c547 100644 --- a/forge-gui/res/cardsfolder/s/szadek_lord_of_secrets.txt +++ b/forge-gui/res/cardsfolder/s/szadek_lord_of_secrets.txt @@ -3,7 +3,7 @@ ManaCost:3 U U B B Types:Legendary Creature Vampire PT:5/5 K:Flying -R:Event$ DamageDone | ActiveZones$ Battlefield | IsCombat$ True | ValidSource$ Card.Self | ValidTarget$ Opponent | ReplaceWith$ CountersAndMill | Description$ If CARDNAME would deal combat damage to a player, instead put that many +1/+1 counters on Szadek and that player mills that many cards. +R:Event$ DamageDone | ActiveZones$ Battlefield | IsCombat$ True | ValidSource$ Card.Self | ValidTarget$ Player | ReplaceWith$ CountersAndMill | ExecuteMode$ PerTarget | Description$ If CARDNAME would deal combat damage to a player, instead put that many +1/+1 counters on Szadek and that player mills that many cards. SVar:X:ReplaceCount$DamageAmount SVar:CountersAndMill:DB$ PutCounter | Defined$ Self | CounterNum$ X | CounterType$ P1P1 | SubAbility$ Mill SVar:Mill:DB$ Mill | Defined$ ReplacedTarget | NumCards$ X diff --git a/forge-gui/res/cardsfolder/t/take_into_custody.txt b/forge-gui/res/cardsfolder/t/take_into_custody.txt index d0276ef4a12..679a5a1124d 100644 --- a/forge-gui/res/cardsfolder/t/take_into_custody.txt +++ b/forge-gui/res/cardsfolder/t/take_into_custody.txt @@ -2,6 +2,6 @@ Name:Take into Custody ManaCost:U Types:Instant A:SP$ Tap | Cost$ U | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/take_into_custody.jpg Oracle:Tap target creature. It doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/takklemaggot.txt b/forge-gui/res/cardsfolder/t/takklemaggot.txt index cec96b32d12..89e39f48d72 100644 --- a/forge-gui/res/cardsfolder/t/takklemaggot.txt +++ b/forge-gui/res/cardsfolder/t/takklemaggot.txt @@ -10,7 +10,7 @@ SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ M0M1 | Co T:Mode$ ChangesZone | ValidCard$ Card.AttachedBy | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigChoose | TriggerDescription$ When enchanted creature dies, that creature's controller chooses a creature that CARDNAME could enchant. If the player does, return CARDNAME to the battlefield under your control attached to that creature. If they don't, return CARDNAME to the battlefield under your control as a non-Aura enchantment. It loses "enchant creature" and gains "At the beginning of that player's upkeep, CARDNAME deals 1 damage to that player." SVar:TrigChoose:DB$ ChooseCard | Defined$ TriggeredCardController | Choices$ Creature.CanBeEnchantedBy | Mandatory$ True | SubAbility$ DBChangeZone SVar:DBChangeZone:DB$ ChangeZone | Defined$ CorrectedSelf | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | AttachedTo$ ChosenCard | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ GE1 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ CorrectedSelf | Types$ Enchantment | RemoveEnchantmentTypes$ True | RemoveKeywords$ Enchant creature | Triggers$ TrigUpkeep | RememberObjects$ TriggeredCardController | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBChangeZone2 | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ CorrectedSelf | Types$ Enchantment | RemoveEnchantmentTypes$ True | RemoveKeywords$ Enchant creature | Triggers$ TrigUpkeep | RememberObjects$ TriggeredCardController | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ EQ0 | SubAbility$ DBChangeZone2 | Duration$ Permanent SVar:DBChangeZone2:DB$ ChangeZone | Defined$ CorrectedSelf | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ConditionDefined$ ChosenCard | ConditionPresent$ Creature | ConditionCompare$ EQ0 SVar:TrigUpkeep:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.IsRemembered | Execute$ TrigDmg | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of that player's upkeep, CARDNAME deals 1 damage to them. SVar:TrigDmg:DB$ DealDamage | Defined$ Remembered | NumDmg$ 1 diff --git a/forge-gui/res/cardsfolder/t/talaras_bane.txt b/forge-gui/res/cardsfolder/t/talaras_bane.txt index 956750de58a..999ba628231 100644 --- a/forge-gui/res/cardsfolder/t/talaras_bane.txt +++ b/forge-gui/res/cardsfolder/t/talaras_bane.txt @@ -2,7 +2,7 @@ Name:Talara's Bane ManaCost:1 B Types:Sorcery A:SP$ RevealHand | Cost$ 1 B | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Target opponent reveals their hand. You choose a green or white creature card from it. You gain life equal to that creature card's toughness, then that player discards that card. -SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Creature.Green+IsRemembered,Creature.White+IsRemembered | SubAbility$ DBImprint | StackDescription$ None +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Mandatory$ True | Choices$ Creature.Green+IsRemembered,Creature.White+IsRemembered | SubAbility$ DBImprint | StackDescription$ None SVar:DBImprint:DB$ Pump | Defined$ ChosenCard | PumpZone$ Hand | ImprintCards$ ChosenCard | SubAbility$ DBGainLife | StackDescription$ None SVar:DBGainLife:DB$ GainLife | LifeAmount$ X | SubAbility$ DBDiscard | StackDescription$ None | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ GE1 SVar:DBDiscard:DB$ Discard | DefinedCards$ Imprinted | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup | StackDescription$ None | ConditionDefined$ Imprinted | ConditionPresent$ Card | ConditionCompare$ GE1 diff --git a/forge-gui/res/cardsfolder/t/talon_gates.txt b/forge-gui/res/cardsfolder/t/talon_gates.txt index 58c66d865dd..c3d4b5fcfba 100644 --- a/forge-gui/res/cardsfolder/t/talon_gates.txt +++ b/forge-gui/res/cardsfolder/t/talon_gates.txt @@ -4,7 +4,7 @@ Types:Plane Dominaria A:AB$ ChangeZone | Cost$ 0 | Origin$ Hand | Destination$ Exile | ChangeType$ Card.nonLand+YouCtrl | DefinedPlayer$ You | RememberChanged$ True | SorcerySpeed$ True | ActivationZone$ Command | SubAbility$ TimeInGates | StackDescription$ Any time you could cast a sorcery, you may exile a nonland card from your hand with X time counters on it, where X is its mana value. | SpellDescription$ Any time you could cast a sorcery, you may exile a nonland card from your hand with X time counters on it, where X is its mana value. If the exiled card doesn't have suspend, it gains suspend. #Removed reminder text because it's too long for sa choice window. Add back when we wrap sa choices text. (At the beginning of its owner's upkeep, they remove a time counter. When the last is removed, the player casts it without paying its mana cost. If it's a creature, it has haste.) SVar:TimeInGates:DB$ PutCounter | Defined$ Remembered | CounterType$ TIME | CounterNum$ GateX | SubAbility$ GiveSuspend | TgtZone$ Exile | StackDescription$ None -SVar:GiveSuspend:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | KW$ Suspend | PumpZone$ Exile | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +SVar:GiveSuspend:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | KW$ Suspend | PumpZone$ Exile | Duration$ Permanent | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:GateX:Remembered$CardManaCost T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, remove two time counters from each suspended card you own. diff --git a/forge-gui/res/cardsfolder/t/tamiyo_field_researcher.txt b/forge-gui/res/cardsfolder/t/tamiyo_field_researcher.txt index 5d1525dc828..b2d13ac6731 100644 --- a/forge-gui/res/cardsfolder/t/tamiyo_field_researcher.txt +++ b/forge-gui/res/cardsfolder/t/tamiyo_field_researcher.txt @@ -8,7 +8,7 @@ SVar:TrigDrawCard:DB$ Draw | NumCards$ 1 | Defined$ You SVar:TrigChange:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ TrigForget SVar:TrigForget:DB$ Pump | ForgetObjects$ TriggeredCard A:AB$ Tap | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target nonland permanent | SubAbility$ DBPump | SpellDescription$ Tap up to two target nonland permanents. They don't untap during their controller's next untap step. -SVar:DBPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Tamiyo, Field Researcher | Image$ emblem_tamiyo_field_researcher | StaticAbilities$ Omniscience | Stackable$ False | Duration$ Permanent | AILogic$ Always | SubAbility$ DBDraw | SpellDescription$ Draw three cards. You get an emblem with "You may cast spells from your hand without paying their mana costs." SVar:Omniscience:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand without paying their mana costs. SVar:DBDraw:DB$Draw | NumCards$ 3 diff --git a/forge-gui/res/cardsfolder/t/tamiyo_the_moon_sage.txt b/forge-gui/res/cardsfolder/t/tamiyo_the_moon_sage.txt index 4b294c45b80..f0da9f755e3 100644 --- a/forge-gui/res/cardsfolder/t/tamiyo_the_moon_sage.txt +++ b/forge-gui/res/cardsfolder/t/tamiyo_the_moon_sage.txt @@ -3,7 +3,7 @@ ManaCost:3 U U Types:Legendary Planeswalker Tamiyo Loyalty:4 A:AB$ Tap | Cost$ AddCounter<1/LOYALTY> | ValidTgts$ Permanent | TgtPrompt$ Choose target permanent. | Planeswalker$ True | SubAbility$ TamiyoPump | SpellDescription$ Tap target permanent. It doesn't untap during its controller's next untap step. -SVar:TamiyoPump:DB$ Pump | Defined$ Targeted | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:TamiyoPump:DB$ Pump | Defined$ Targeted | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. A:AB$ Draw | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Player | TgtPrompt$ Select target player | Defined$ You | NumCards$ X | Planeswalker$ True | SpellDescription$ Draw a card for each tapped creature target player controls. SVar:X:Count$Valid Creature.tapped+TargetedPlayerCtrl A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Tamiyo, the Moon Sage | Image$ emblem_tamiyo_the_moon_sage | StaticAbilities$ UnlimitedHand | Triggers$ TamiyoCardToGrave | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "You have no maximum hand size" and "Whenever a card is put into your graveyard from anywhere, you may return it to your hand." diff --git a/forge-gui/res/cardsfolder/upcoming/tanazir_quandrix.txt b/forge-gui/res/cardsfolder/t/tanazir_quandrix.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tanazir_quandrix.txt rename to forge-gui/res/cardsfolder/t/tanazir_quandrix.txt diff --git a/forge-gui/res/cardsfolder/t/tangle.txt b/forge-gui/res/cardsfolder/t/tangle.txt index d1a1172b252..02f19e7678d 100644 --- a/forge-gui/res/cardsfolder/t/tangle.txt +++ b/forge-gui/res/cardsfolder/t/tangle.txt @@ -2,5 +2,5 @@ Name:Tangle ManaCost:1 G Types:Instant A:SP$ Fog | Cost$ 1 G | SubAbility$ DBPumpAll | SpellDescription$ Prevent all combat damage that would be dealt this turn. Each attacking creature doesn't untap during its controller's next untap step. -SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.attacking | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent Oracle:Prevent all combat damage that would be dealt this turn.\nEach attacking creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/tangletrap.txt b/forge-gui/res/cardsfolder/t/tangletrap.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tangletrap.txt rename to forge-gui/res/cardsfolder/t/tangletrap.txt diff --git a/forge-gui/res/cardsfolder/t/taoist_mystic.txt b/forge-gui/res/cardsfolder/t/taoist_mystic.txt index 3d351bb72a1..5ea79a720b9 100644 --- a/forge-gui/res/cardsfolder/t/taoist_mystic.txt +++ b/forge-gui/res/cardsfolder/t/taoist_mystic.txt @@ -1,7 +1,6 @@ Name:Taoist Mystic ManaCost:2 G Types:Creature Human Mystic -K:CantBeBlockedBy Creature.withHorsemanship PT:2/2 -SVar:Picture:http://www.wizards.com/global/images/magic/general/taoist_mystic.jpg -Oracle:Taoist Mystic can't be blocked by creatures with horsemanship. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withHorsemanship | Description$ CARDNAME can't be blocked by creatures with horsemanship. +Oracle:Taoist Mystic can't be blocked by creatures with horsemanship. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/tattered_haunter.txt b/forge-gui/res/cardsfolder/t/tattered_haunter.txt index 43aa1646a79..d8616d71734 100644 --- a/forge-gui/res/cardsfolder/t/tattered_haunter.txt +++ b/forge-gui/res/cardsfolder/t/tattered_haunter.txt @@ -3,6 +3,5 @@ ManaCost:1 U Types:Creature Spirit PT:2/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/tattered_haunter.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nTattered Haunter can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/teach_by_example.txt b/forge-gui/res/cardsfolder/t/teach_by_example.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/teach_by_example.txt rename to forge-gui/res/cardsfolder/t/teach_by_example.txt diff --git a/forge-gui/res/cardsfolder/upcoming/teachings_of_the_archaics.txt b/forge-gui/res/cardsfolder/t/teachings_of_the_archaics.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/teachings_of_the_archaics.txt rename to forge-gui/res/cardsfolder/t/teachings_of_the_archaics.txt diff --git a/forge-gui/res/cardsfolder/upcoming/team_pennant.txt b/forge-gui/res/cardsfolder/t/team_pennant.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/team_pennant.txt rename to forge-gui/res/cardsfolder/t/team_pennant.txt diff --git a/forge-gui/res/cardsfolder/t/teferi_timeless_voyager.txt b/forge-gui/res/cardsfolder/t/teferi_timeless_voyager.txt index 3e8eb1fd770..23cfc1676c0 100644 --- a/forge-gui/res/cardsfolder/t/teferi_timeless_voyager.txt +++ b/forge-gui/res/cardsfolder/t/teferi_timeless_voyager.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Teferi Loyalty:4 A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | SpellDescription$ Draw a card. A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 0 | SpellDescription$ Put target creature on top of its owner's library. -A:AB$ PumpAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | IsCurse$ True | KW$ HIDDEN CARDNAME can't phase in. | ValidCards$ Creature.TargetedPlayerCtrl | UntilTheEndOfYourNextTurn$ True | RememberAllPumped$ True | SubAbility$ DBPhase | SpellDescription$ Each creature target opponent controls phases out. Until the end of your next turn, they can't phase in. (Treat them and anything attached to them as though they don't exist.) +A:AB$ PumpAll | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | IsCurse$ True | KW$ HIDDEN CARDNAME can't phase in. | ValidCards$ Creature.TargetedPlayerCtrl | Duration$ UntilTheEndOfYourNextTurn | RememberAllPumped$ True | SubAbility$ DBPhase | SpellDescription$ Each creature target opponent controls phases out. Until the end of your next turn, they can't phase in. (Treat them and anything attached to them as though they don't exist.) SVar:DBPhase:DB$ Phases | Defined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:[+1]: Draw a card.\n[−3]: Put target creature on top of its owner's library.\n[−8]: Each creature target opponent controls phases out. Until the end of your next turn, they can't phase in. (Treat them and anything attached to them as though they don't exist.) diff --git a/forge-gui/res/cardsfolder/t/teferis_protection.txt b/forge-gui/res/cardsfolder/t/teferis_protection.txt index 0b6e5b0f86b..26b566c2490 100644 --- a/forge-gui/res/cardsfolder/t/teferis_protection.txt +++ b/forge-gui/res/cardsfolder/t/teferis_protection.txt @@ -1,7 +1,7 @@ Name:Teferi's Protection ManaCost:2 W Types:Instant -A:SP$ Pump | Cost$ 2 W | UntilYourNextTurn$ True | Defined$ You | KW$ Your life total can't change. & Protection from everything | SubAbility$ DBPhases | SpellDescription$ Until your next turn, your life total can't change and you gain protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.) Exile Teferi's Protection. +A:SP$ Pump | Cost$ 2 W | Duration$ UntilYourNextTurn | Defined$ You | KW$ Your life total can't change. & Protection from everything | SubAbility$ DBPhases | SpellDescription$ Until your next turn, your life total can't change and you gain protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.) Exile Teferi's Protection. SVar:DBPhases:DB$ Phases | Defined$ Valid Permanent.YouCtrl | SubAbility$ DBChange SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile Oracle:Until your next turn, your life total can't change and you gain protection from everything. All permanents you control phase out. (While they're phased out, they're treated as though they don't exist. They phase in before you untap during your untap step.)\nExile Teferi's Protection. diff --git a/forge-gui/res/cardsfolder/t/telekinesis.txt b/forge-gui/res/cardsfolder/t/telekinesis.txt index b69cd8e1379..eaa0d11cca9 100644 --- a/forge-gui/res/cardsfolder/t/telekinesis.txt +++ b/forge-gui/res/cardsfolder/t/telekinesis.txt @@ -3,5 +3,5 @@ ManaCost:U U Types:Instant A:SP$ Tap | Cost$ U U | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. Prevent all combat damage that would be dealt by that creature this turn. It doesn't untap during its controller's next two untap steps. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Prevent all combat damage that would be dealt by CARDNAME. | SubAbility$ DBPump2 -SVar:DBPump2:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next two untap steps. | Permanent$ True +SVar:DBPump2:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next two untap steps. | Duration$ Permanent Oracle:Tap target creature. Prevent all combat damage that would be dealt by that creature this turn. It doesn't untap during its controller's next two untap steps. diff --git a/forge-gui/res/cardsfolder/t/temple_altisaur.txt b/forge-gui/res/cardsfolder/t/temple_altisaur.txt index 486f814874b..c30be9e7989 100644 --- a/forge-gui/res/cardsfolder/t/temple_altisaur.txt +++ b/forge-gui/res/cardsfolder/t/temple_altisaur.txt @@ -2,8 +2,8 @@ Name:Temple Altisaur ManaCost:4 W Types:Creature Dinosaur PT:3/4 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Permanent.Dinosaur+YouCtrl+Other | ReplaceWith$ DmgMinus1 | Description$ If a source would deal damage to another Dinosaur you control, prevent all but 1 of that damage. -SVar:DmgMinus1:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ 1 +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Permanent.Dinosaur+YouCtrl+Other | ReplaceWith$ DmgMinus1 | PreventionEffect$ True | Description$ If a source would deal damage to another Dinosaur you control, prevent all but 1 of that damage. +SVar:DmgMinus1:DB$ ReplaceDamage | Amount$ ShieldAmount +SVar:ShieldAmount:ReplaceCount$DamageAmount/Minus.1 DeckHints:Type$Dinosaur -SVar:Picture:http://www.wizards.com/global/images/magic/general/temple_altisaur.jpg Oracle:If a source would deal damage to another Dinosaur you control, prevent all but 1 of that damage. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/temple_garden.txt b/forge-gui/res/cardsfolder/t/temple_garden.txt index 972ed8c7881..3039bf05e26 100644 --- a/forge-gui/res/cardsfolder/t/temple_garden.txt +++ b/forge-gui/res/cardsfolder/t/temple_garden.txt @@ -2,6 +2,5 @@ Name:Temple Garden ManaCost:no cost Types:Land Forest Plains K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card89093.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {G} or {W}.)\nAs Temple Garden enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/t/temple_thief.txt b/forge-gui/res/cardsfolder/t/temple_thief.txt index 631d70fcce6..b9de6184676 100644 --- a/forge-gui/res/cardsfolder/t/temple_thief.txt +++ b/forge-gui/res/cardsfolder/t/temple_thief.txt @@ -2,5 +2,5 @@ Name:Temple Thief ManaCost:1 B Types:Creature Human Rogue PT:2/2 -K:CantBeBlockedBy Creature.enchanted,Creature.Enchantment -Oracle:Temple Thief can't be blocked by enchanted creatures or enchantment creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.enchanted,Creature.Enchantment | Description$ CARDNAME can't be blocked by enchanted creatures or enchantment creatures. +Oracle:Temple Thief can't be blocked by enchanted creatures or enchantment creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/tempted_by_the_oriq.txt b/forge-gui/res/cardsfolder/t/tempted_by_the_oriq.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tempted_by_the_oriq.txt rename to forge-gui/res/cardsfolder/t/tempted_by_the_oriq.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tempting_contract.txt b/forge-gui/res/cardsfolder/t/tempting_contract.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tempting_contract.txt rename to forge-gui/res/cardsfolder/t/tempting_contract.txt diff --git a/forge-gui/res/cardsfolder/t/tempting_licid.txt b/forge-gui/res/cardsfolder/t/tempting_licid.txt index f1b72402a7a..b9aee19ef2d 100644 --- a/forge-gui/res/cardsfolder/t/tempting_licid.txt +++ b/forge-gui/res/cardsfolder/t/tempting_licid.txt @@ -2,7 +2,7 @@ Name:Tempting Licid ManaCost:2 G Types:Creature Licid PT:2/2 -A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | RevertCost$ G | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. +A:AB$ Animate | Cost$ G T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | RevertCost$ G | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {G} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ All creatures able to block CARDNAME do so. | Description$ All creatures able to block enchanted creature do so. diff --git a/forge-gui/res/cardsfolder/upcoming/tend_the_pests.txt b/forge-gui/res/cardsfolder/t/tend_the_pests.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tend_the_pests.txt rename to forge-gui/res/cardsfolder/t/tend_the_pests.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tenured_inkcaster.txt b/forge-gui/res/cardsfolder/t/tenured_inkcaster.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tenured_inkcaster.txt rename to forge-gui/res/cardsfolder/t/tenured_inkcaster.txt diff --git a/forge-gui/res/cardsfolder/t/territorial_hellkite.txt b/forge-gui/res/cardsfolder/t/territorial_hellkite.txt index 5224dd31e7f..1fd498e7814 100644 --- a/forge-gui/res/cardsfolder/t/territorial_hellkite.txt +++ b/forge-gui/res/cardsfolder/t/territorial_hellkite.txt @@ -6,7 +6,7 @@ K:Flying K:Haste T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, choose an opponent at random that Territorial Hellkite didn't attack during your last combat. CARDNAME attacks that player this combat if able. If you can't choose an opponent this way, tap CARDNAME. SVar:TrigChoose:DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent+IsNotRemembered | Random$ True | ChooseSubAbility$ DBPump | CantChooseSubAbility$ DBTap -SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | UntilEndOfCombat$ True +SVar:DBPump:DB$ Pump | Defined$ Self | KW$ HIDDEN CARDNAME attacks specific player each combat if able:ChosenPlayer | Duration$ UntilEndOfCombat SVar:DBTap:DB$ Tap | Defined$ Self | SubAbility$ DBCleanup T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigClearRem | Static$ True SVar:TrigClearRem:DB$ Cleanup | ClearRemembered$ True | SubAbility$ TrigRemember diff --git a/forge-gui/res/cardsfolder/upcoming/test_of_talents.txt b/forge-gui/res/cardsfolder/t/test_of_talents.txt similarity index 50% rename from forge-gui/res/cardsfolder/upcoming/test_of_talents.txt rename to forge-gui/res/cardsfolder/t/test_of_talents.txt index ec8a6392159..6d83be78025 100644 --- a/forge-gui/res/cardsfolder/upcoming/test_of_talents.txt +++ b/forge-gui/res/cardsfolder/t/test_of_talents.txt @@ -1,14 +1,13 @@ Name:Test of Talents ManaCost:1 U Types:Instant -A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Instant,Sorcery | RememberCountered$ True | ForgetOtherTargets$ True | SubAbility$ ExileYard | SpellDescription$ Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. Then that player shuffles their library. -SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ Remembered.sameName | SubAbility$ ExileHand | RememberChanged$ True | StackDescription$ None -SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None -SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ Remembered.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | SubAbility$ Draw | StackDescription$ None +A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | ValidTgts$ Instant,Sorcery | SubAbility$ ExileYard | SpellDescription$ Counter target spell. Search its controller's graveyard, hand, and library for all cards with the same name as that spell and exile them. That player shuffles, then draws a card for each card exiled from their hand this way. | StackDescription$ SpellDescription +SVar:ExileYard:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Exile | Defined$ TargetedController | ChangeType$ TargetedCard.sameName | SubAbility$ ExileHand | StackDescription$ None +SVar:ExileHand:DB$ ChangeZone | Origin$ Hand | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInHand | Chooser$ You | SubAbility$ ExileLib | StackDescription$ None | RememberChanged$ True +SVar:ExileLib:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ TargetedController | ChangeType$ TargetedCard.sameName | ChangeNum$ NumInLib | Chooser$ You | Search$ True | Shuffle$ True | SubAbility$ Draw | StackDescription$ None SVar:Draw:DB$ Draw | Defined$ TargetedController | NumCards$ X | SubAbility$ DBCleanup | StackDescription$ None SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$RememberedSize SVar:NumInHand:TargetedController$CardsInHand SVar:NumInLib:TargetedController$CardsInLibrary -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Counter target instant or sorcery spell. Search its controller's graveyard, hand, and library for any number of cards with the same name as that spell and exile them. That player shuffles, then draws a card for each card exiled from their hand this way. diff --git a/forge-gui/res/cardsfolder/t/tezzeret_agent_of_bolas.txt b/forge-gui/res/cardsfolder/t/tezzeret_agent_of_bolas.txt index 03679e5aa61..1e233117053 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_agent_of_bolas.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_agent_of_bolas.txt @@ -3,7 +3,7 @@ ManaCost:2 U B Types:Legendary Planeswalker Tezzeret Loyalty:3 A:AB$ Dig | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | DigNum$ 5 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Artifact | SpellDescription$ Look at the top five cards of your library. You may reveal an artifact card from among them and put it into your hand. Put the rest on the bottom of your library in any order. -A:AB$ Animate | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact | AITgts$ Artifact.YouCtrl | AITgtsStrict$ True | TgtPrompt$ Select target artifact | Power$ 5 | Toughness$ 5 | Types$ Creature | Permanent$ True | SpellDescription$ Target artifact becomes an artifact creature with base power and toughness 5/5. +A:AB$ Animate | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact | AITgts$ Artifact.YouCtrl | AITgtsStrict$ True | TgtPrompt$ Select target artifact | Power$ 5 | Toughness$ 5 | Types$ Creature | Duration$ Permanent | SpellDescription$ Target artifact becomes an artifact creature with base power and toughness 5/5. A:AB$ LoseLife | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | TgtPrompt$ Select target player | LifeAmount$ X | SubAbility$ DBGain | SpellDescription$ Target player loses X life and you gain X life, where X is twice the number of artifacts you control. SVar:DBGain:DB$GainLife | Defined$ You | LifeAmount$ X SVar:X:Count$Valid Artifact.YouCtrl/Times.2 diff --git a/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt index a757816fd14..4e2763114ae 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_cruel_machinist.txt @@ -3,7 +3,7 @@ ManaCost:4 U U Loyalty:4 Types:Legendary Planeswalker Tezzeret A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card. -A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Creature | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types. +A:AB$ Animate | Cost$ AddCounter<0/LOYALTY> | Planeswalker$ True | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Creature | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types. A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Hand | Destination$ Battlefield | ChangeType$ Card | ChangeNum$ X | FaceDown$ True | FaceDownPower$ 5 | FaceDownToughness$ 5 | FaceDownSetType$ Artifact & Creature | StackDescription$ SpellDescription | SpellDescription$ Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures. SVar:X:Count$InYourHand Oracle:[+1]: Draw a card.\n[0]: Until your next turn, target artifact you control becomes a 5/5 creature in addition to its other types.\n[−7]: Put any number of cards from your hand onto the battlefield face down. They're 5/5 artifact creatures. diff --git a/forge-gui/res/cardsfolder/t/tezzeret_the_schemer.txt b/forge-gui/res/cardsfolder/t/tezzeret_the_schemer.txt index 349ed413153..0670efc2306 100644 --- a/forge-gui/res/cardsfolder/t/tezzeret_the_schemer.txt +++ b/forge-gui/res/cardsfolder/t/tezzeret_the_schemer.txt @@ -7,7 +7,7 @@ A:AB$ Pump | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creat SVar:X:Count$Valid Artifact.YouCtrl A:AB$ Effect | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Tezzeret the Schemer | Triggers$ CombatTrig | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "At the beginning of combat on your turn, target artifact you control becomes an artifact creature with base power and toughness 5/5." SVar:CombatTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Command | Execute$ TezzeretAnimate | TriggerDescription$ At the beginning of combat on your turn, target artifact you control becomes an artifact creature with base power and toughness 5/5. -SVar:TezzeretAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact,Creature | Permanent$ True +SVar:TezzeretAnimate:DB$ Animate | ValidTgts$ Artifact.YouCtrl | TgtPrompt$ Select target artifact you control | Power$ 5 | Toughness$ 5 | Types$ Artifact,Creature | Duration$ Permanent DeckNeeds:Type$Artifact SVar:Picture:http://www.wizards.com/global/images/magic/general/tezzeret_the_schemer.jpg Oracle:[+1]: Create a colorless artifact token named Etherium Cell with "{T}, Sacrifice this artifact: Add one mana of any color."\n[−2]: Target creature gets +X/-X until end of turn, where X is the number of artifacts you control.\n[−7]: You get an emblem with "At the beginning of combat on your turn, target artifact you control becomes an artifact creature with base power and toughness 5/5." diff --git a/forge-gui/res/cardsfolder/t/thalakos_lowlands.txt b/forge-gui/res/cardsfolder/t/thalakos_lowlands.txt index 132e930993d..a1e818ea9f4 100644 --- a/forge-gui/res/cardsfolder/t/thalakos_lowlands.txt +++ b/forge-gui/res/cardsfolder/t/thalakos_lowlands.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ DBStayTapped | SpellDescription$ Add {W}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ DBStayTapped | SpellDescription$ Add {U}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {W} or {U}. Thalakos Lowlands doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/t/the_akroan_war.txt b/forge-gui/res/cardsfolder/t/the_akroan_war.txt index a2b94769951..d6e6f4ad224 100644 --- a/forge-gui/res/cardsfolder/t/the_akroan_war.txt +++ b/forge-gui/res/cardsfolder/t/the_akroan_war.txt @@ -3,7 +3,7 @@ ManaCost:3 R Types:Enchantment Saga K:Saga:3:DBGainControl,DBAllAttack,DBDamageTapped SVar:DBGainControl:DB$ GainControl | ValidTgts$ Creature | TgtPrompt$ Select target creature | LoseControl$ LeavesPlay | SpellDescription$ Gain control of target creature for as long as CARDNAME remains on the battlefield. -SVar:DBAllAttack:DB$ PumpAll | ValidCards$ Creature.OppCtrl | UntilYourNextTurn$ True | KW$ HIDDEN CARDNAME attacks each combat if able. | SpellDescription$ Until your next turn, creatures your opponents control attack each turn if able. +SVar:DBAllAttack:DB$ PumpAll | ValidCards$ Creature.OppCtrl | Duration$ UntilYourNextTurn | KW$ HIDDEN CARDNAME attacks each combat if able. | SpellDescription$ Until your next turn, creatures your opponents control attack each turn if able. SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each tapped creature deals damage to itself equal to its power. SVar:X:Count$CardPower Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Gain control of target creature for as long as The Akroan War remains on the battlefield.\nII — Until your next turn, creatures your opponents control attack each combat if able.\nIII — Each tapped creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/t/the_bears_of_littjara.txt b/forge-gui/res/cardsfolder/t/the_bears_of_littjara.txt index 3658613eb97..75c08e242d3 100644 --- a/forge-gui/res/cardsfolder/t/the_bears_of_littjara.txt +++ b/forge-gui/res/cardsfolder/t/the_bears_of_littjara.txt @@ -3,7 +3,7 @@ ManaCost:1 G U Types:Enchantment Saga K:Saga:3:DBToken,DBAnimate,DBGangUp SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_2_2_shapeshifter_changeling | TokenOwner$ You | SpellDescription$ Create a 2/2 blue Shapeshifter creature token with changeling. -SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature.Shapeshifter+YouCtrl | TargetMin$ 0 | TargetMax$ MaxTargets | TgtPrompt$ Select any number of Shapeshifter creatures you control | Power$ 4 | Toughness$ 4 | Permanent$ True | SpellDescription$ Any number of target Shapeshifter creatures you control have base power and toughness 4/4. +SVar:DBAnimate:DB$ Animate | ValidTgts$ Creature.Shapeshifter+YouCtrl | TargetMin$ 0 | TargetMax$ MaxTargets | TgtPrompt$ Select any number of Shapeshifter creatures you control | Power$ 4 | Toughness$ 4 | Duration$ Permanent | SpellDescription$ Any number of target Shapeshifter creatures you control have base power and toughness 4/4. SVar:DBGangUp:DB$ Pump | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose up to one target creature or planeswalker | ImprintCards$ Targeted | SubAbility$ DBRepeatEach SVar:DBRepeatEach:DB$ RepeatEach | RepeatCards$ Creature.YouCtrl+powerGE4 | RepeatSubAbility$ DBDamage | DamageMap$ True | SubAbility$ DBCleanup | SpellDescription$ Choose up to one target creature or planeswalker. Each creature with power 4 or greater you control deals damage equal to its power to that permanent. SVar:DBDamage:DB$ DealDamage | Defined$ Imprinted | DamageSource$ Remembered | NumDmg$ Z diff --git a/forge-gui/res/cardsfolder/upcoming/the_biblioplex.txt b/forge-gui/res/cardsfolder/t/the_biblioplex.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/the_biblioplex.txt rename to forge-gui/res/cardsfolder/t/the_biblioplex.txt diff --git a/forge-gui/res/cardsfolder/t/the_dead_shall_serve.txt b/forge-gui/res/cardsfolder/t/the_dead_shall_serve.txt index da1e48119b3..6da5041e0b9 100644 --- a/forge-gui/res/cardsfolder/t/the_dead_shall_serve.txt +++ b/forge-gui/res/cardsfolder/t/the_dead_shall_serve.txt @@ -3,8 +3,7 @@ ManaCost:no cost Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TrigControl | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, for each opponent, put up to one target creature card from that player's graveyard onto the battlefield under your control. Each of those creatures attacks its owner each combat if able. SVar:TrigControl:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | ValidTgts$ Creature.OppCtrl | TgtZone$ Graveyard | TgtPrompt$ Choose target creature card in each opponent's graveyard | TargetMin$ 0 | TargetMax$ OneEach | TargetsWithDifferentControllers$ True | RememberChanged$ True | SubAbility$ DBPump -SVar:DBPump:DB$ PumpAll | ValidCards$ Card.IsRemembered | KW$ HIDDEN CARDNAME attacks specific player each combat if able:CardOwner | UntilLoseControl$ True | SubAbility$ DBCleanup +SVar:DBPump:DB$ PumpAll | ValidCards$ Card.IsRemembered | KW$ HIDDEN CARDNAME attacks specific player each combat if able:CardOwner | Duration$ UntilLoseControlOfHost | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:OneEach:PlayerCountOpponents$Amount -SVar:Picture:https://downloads.cardforge.org/images/cards/ARC/The Dead Shall Serve.full.jpg Oracle:When you set this scheme in motion, for each opponent, put up to one target creature card from that player's graveyard onto the battlefield under your control. Each of those creatures attacks its owner each combat if able. diff --git a/forge-gui/res/cardsfolder/t/thelonite_monk.txt b/forge-gui/res/cardsfolder/t/thelonite_monk.txt index 22fe87e4c0b..8d98e011ae1 100644 --- a/forge-gui/res/cardsfolder/t/thelonite_monk.txt +++ b/forge-gui/res/cardsfolder/t/thelonite_monk.txt @@ -2,7 +2,7 @@ Name:Thelonite Monk ManaCost:2 G G Types:Creature Insect Monk Cleric PT:1/2 -A:AB$ Animate | Cost$ T Sac<1/Creature.Green/green creature> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | Permanent$ True | SpellDescription$ Target land becomes a Forest. (This effect lasts indefinitely.) +A:AB$ Animate | Cost$ T Sac<1/Creature.Green/green creature> | ValidTgts$ Land | TgtPrompt$ Select target land | Types$ Forest | RemoveLandTypes$ True | Duration$ Permanent | SpellDescription$ Target land becomes a Forest. (This effect lasts indefinitely.) SVar:AIPreference:SacCost$Creature.Green+token AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thelonite_monk.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/theoretical_duplication.txt b/forge-gui/res/cardsfolder/t/theoretical_duplication.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/theoretical_duplication.txt rename to forge-gui/res/cardsfolder/t/theoretical_duplication.txt diff --git a/forge-gui/res/cardsfolder/t/thopter_arrest.txt b/forge-gui/res/cardsfolder/t/thopter_arrest.txt index 191dd683785..8ac170559ad 100644 --- a/forge-gui/res/cardsfolder/t/thopter_arrest.txt +++ b/forge-gui/res/cardsfolder/t/thopter_arrest.txt @@ -2,7 +2,7 @@ Name:Thopter Arrest ManaCost:2 W Types:Enchantment T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target artifact or creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact.OppCtrl,Creature.OppCtrl | TgtPrompt$ Select target artifact or creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact.OppCtrl,Creature.OppCtrl | TgtPrompt$ Select target artifact or creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:OblivionRing:TRUE Oracle:When Thopter Arrest enters the battlefield, exile target artifact or creature an opponent controls until Thopter Arrest leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/t/thoughtlace.txt b/forge-gui/res/cardsfolder/t/thoughtlace.txt index c5765b4bdb4..6ff9f0a378b 100644 --- a/forge-gui/res/cardsfolder/t/thoughtlace.txt +++ b/forge-gui/res/cardsfolder/t/thoughtlace.txt @@ -1,7 +1,7 @@ Name:Thoughtlace ManaCost:U Types:Instant -A:SP$ Animate | Cost$ U | Colors$ Blue | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Permanent$ True | SpellDescription$ Target spell or permanent becomes blue. (Mana symbols on that permanent remain unchanged.) +A:SP$ Animate | Cost$ U | Colors$ Blue | OverwriteColors$ True | ValidTgts$ Card | TgtZone$ Stack,Battlefield | Duration$ Permanent | SpellDescription$ Target spell or permanent becomes blue. (Mana symbols on that permanent remain unchanged.) AI:RemoveDeck:Random AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/thoughtlace.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/thrilling_discovery.txt b/forge-gui/res/cardsfolder/t/thrilling_discovery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thrilling_discovery.txt rename to forge-gui/res/cardsfolder/t/thrilling_discovery.txt diff --git a/forge-gui/res/cardsfolder/t/through_the_breach.txt b/forge-gui/res/cardsfolder/t/through_the_breach.txt index b402476edff..cd2b7de1138 100644 --- a/forge-gui/res/cardsfolder/t/through_the_breach.txt +++ b/forge-gui/res/cardsfolder/t/through_the_breach.txt @@ -3,7 +3,7 @@ ManaCost:4 R Types:Instant Arcane K:Splice:Arcane:2 R R A:SP$ ChangeZone | Cost$ 4 R | Origin$ Hand | Destination$ Battlefield | ChangeType$ Creature.YouCtrl | SubAbility$ DBPump | RememberChanged$ True | ForgetOtherRemembered$ True | AILogic$ BeforeCombat | SpellDescription$ You may put a creature card from your hand onto the battlefield. That creature gains haste. Sacrifice that creature at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/upcoming/thunderous_orator.txt b/forge-gui/res/cardsfolder/t/thunderous_orator.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/thunderous_orator.txt rename to forge-gui/res/cardsfolder/t/thunderous_orator.txt diff --git a/forge-gui/res/cardsfolder/t/thunderstaff.txt b/forge-gui/res/cardsfolder/t/thunderstaff.txt index b8f5e397f9c..832b29ae8cc 100644 --- a/forge-gui/res/cardsfolder/t/thunderstaff.txt +++ b/forge-gui/res/cardsfolder/t/thunderstaff.txt @@ -1,8 +1,8 @@ Name:Thunderstaff ManaCost:3 Types:Artifact -S:Mode$ PreventDamage | Target$ You | Source$ Creature | CombatDamage$ True | Amount$ 1 | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, if a creature would deal combat damage to you, prevent 1 of that damage. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Creature | ValidTarget$ You | IsCombat$ True | ReplaceWith$ DBReplace | PreventionEffect$ True | CheckSVar$ X | SVarCompare$ EQ1 | Description$ As long as CARDNAME is untapped, if a creature would deal combat damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 A:AB$ PumpAll | Cost$ 2 T | ValidCards$ Creature.attacking | NumAtt$ +1 | SpellDescription$ Attacking creatures get +1/+0 until end of turn. SVar:X:Count$Valid Card.Self+untapped -SVar:Picture:http://www.wizards.com/global/images/magic/general/thunderstaff.jpg Oracle:As long as Thunderstaff is untapped, if a creature would deal combat damage to you, prevent 1 of that damage.\n{2}, {T}: Attacking creatures get +1/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/tidebinder_mage.txt b/forge-gui/res/cardsfolder/t/tidebinder_mage.txt index 505aa60eaf2..c49369ee5ff 100644 --- a/forge-gui/res/cardsfolder/t/tidebinder_mage.txt +++ b/forge-gui/res/cardsfolder/t/tidebinder_mage.txt @@ -4,7 +4,7 @@ Types:Creature Merfolk Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target red or green creature an opponent controls. That creature doesn't untap during its controller's untap step for as long as you control CARDNAME. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.Red+OppCtrl,Creature.Green+OppCtrl | TgtPrompt$ Choose target red or green creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilHostLeavesPlay$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilHostLeavesPlay SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/tidebinder_mage.jpg Oracle:When Tidebinder Mage enters the battlefield, tap target red or green creature an opponent controls. That creature doesn't untap during its controller's untap step for as long as you control Tidebinder Mage. diff --git a/forge-gui/res/cardsfolder/t/time_elemental.txt b/forge-gui/res/cardsfolder/t/time_elemental.txt index bb00aaca78a..f3347ca4396 100644 --- a/forge-gui/res/cardsfolder/t/time_elemental.txt +++ b/forge-gui/res/cardsfolder/t/time_elemental.txt @@ -5,9 +5,8 @@ PT:0/2 A:AB$ ChangeZone | Cost$ 2 U U T | ValidTgts$ Permanent.unenchanted | TgtPrompt$ Select target unenchanted permanent | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return target permanent that isn't enchanted to its owner's hand. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ DelayedTrig | TriggerDescription$ When CARDNAME attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you. T:Mode$ Blocks | ValidCard$ Card.Self | Execute$ DelayedTrig | Secondary$ True | TriggerDescription$ When CARDNAME attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you. -SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSac | TriggerDescription$ At end of combat, sacrifice CARDNAME and CARDNAME deals 5 damage to you. -SVar:TrigSac:DB$Sacrifice | Defined$ Self | SubAbility$ DBDamage +SVar:DelayedTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ EndCombat | ValidPlayer$ Player | Execute$ TrigSacrifice | TriggerDescription$ At end of combat, sacrifice CARDNAME and CARDNAME deals 5 damage to you. +SVar:TrigSacrifice:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI | SubAbility$ DBDamage SVar:DBDamage:DB$DealDamage | NumDmg$ 5 | Defined$ You AI:RemoveDeck:All -SVar:Picture:http://www.wizards.com/global/images/magic/general/time_elemental.jpg Oracle:When Time Elemental attacks or blocks, at end of combat, sacrifice it and it deals 5 damage to you.\n{2}{U}{U}, {T}: Return target permanent that isn't enchanted to its owner's hand. diff --git a/forge-gui/res/cardsfolder/t/time_of_ice.txt b/forge-gui/res/cardsfolder/t/time_of_ice.txt index c273927b903..7b84891e18d 100644 --- a/forge-gui/res/cardsfolder/t/time_of_ice.txt +++ b/forge-gui/res/cardsfolder/t/time_of_ice.txt @@ -3,7 +3,7 @@ ManaCost:3 U Types:Enchantment Saga K:Saga:3:DBTap,DBTap,DBChangeZoneAll SVar:DBTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | SubAbility$ DBPump | SpellDescription$ Tap target creature an opponent controls. It doesn't untap during its controller's untap step for as long as you control CARDNAME. -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilLoseControlOfHost$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Creature.tapped | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return all tapped creatures to their owners' hands. SVar:PlayMain1:TRUE SVar:NeedsToPlay:Creature.OppCtrl diff --git a/forge-gui/res/cardsfolder/t/time_sidewalk.txt b/forge-gui/res/cardsfolder/t/time_sidewalk.txt new file mode 100644 index 00000000000..1cf808dc2a0 --- /dev/null +++ b/forge-gui/res/cardsfolder/t/time_sidewalk.txt @@ -0,0 +1,9 @@ +Name:Time Sidewalk +ManaCost:4 U U U U +Types:Sorcery +K:MayEffectFromOpeningHand:ExileCard +A:SP$ AddTurn | Cost$ 4 U U U U | NumTurns$ 1 | SpellDescription$ Take an extra turn after this one. +SVar:ExileCard:DB$ ChangeZone | Defined$ Self | Origin$ Hand | Destination$ Exile | RememberChanged$ True | SubAbility$ DBMakeCard | SpellDescription$ If this card is in your opening hand, you may exile it. If you do, create four Time Walk token cards and shuffle them into your deck. +SVar:DBMakeCard:DB$ MakeCard | Name$ Time Walk | Amount$ 4 | Zone$ Library | SubAbility$ DBCleanup | ConditionDefined$ Remembered | ConditionPresent$ Card.Self | ConditionCompare$ GE1 +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Take an extra turn after this one.\nIf this card is in your opening hand, you may exile it. If you do, create four Time Walk token cards and shuffle them into your deck. diff --git a/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt b/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt index 825b3e0dba1..b3f20d79fd9 100644 --- a/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt +++ b/forge-gui/res/cardsfolder/t/tin_wing_chimera.txt @@ -4,6 +4,6 @@ Types:Artifact Creature Chimera PT:2/2 K:Flying A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature.Chimera | TgtPrompt$ Select target Chimera creature | CounterType$ P2P2 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) -SVar:DBPump:DB$ Pump | KW$ Flying | Defined$ Targeted | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ Flying | Defined$ Targeted | Duration$ Permanent AI:RemoveDeck:All Oracle:Flying\nSacrifice Tin-Wing Chimera: Put a +2/+2 counter on target Chimera creature. It gains flying. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/upcoming/tivash_gloom_summoner.txt b/forge-gui/res/cardsfolder/t/tivash_gloom_summoner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tivash_gloom_summoner.txt rename to forge-gui/res/cardsfolder/t/tivash_gloom_summoner.txt diff --git a/forge-gui/res/cardsfolder/upcoming/tome_shredder.txt b/forge-gui/res/cardsfolder/t/tome_shredder.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/tome_shredder.txt rename to forge-gui/res/cardsfolder/t/tome_shredder.txt diff --git a/forge-gui/res/cardsfolder/t/torrent_of_lava.txt b/forge-gui/res/cardsfolder/t/torrent_of_lava.txt index 08207482c4d..49db4cbbad6 100644 --- a/forge-gui/res/cardsfolder/t/torrent_of_lava.txt +++ b/forge-gui/res/cardsfolder/t/torrent_of_lava.txt @@ -3,9 +3,8 @@ ManaCost:X R R Types:Sorcery A:SP$ DamageAll | Cost$ X R R | ValidCards$ Creature.withoutFlying | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to each creature without flying. | StackDescription$ SpellDescription SVar:X:Count$xPaid -S:Mode$ Continuous | Affected$ Creature | AddAbility$ DbPrevent | AddSVar$ TOLOutOfSight & TOLSTPrevent & TOLExileSelf | EffectZone$ Stack | Description$ As long as Torrent of Lava is on the stack, each creature has "{T}: Prevent the next 1 damage that would be dealt to this creature by CARDNAME this turn." -SVar:DbPrevent:AB$ Effect | Cost$ T | RememberObjects$ OriginalHost | ImprintCards$ Self | Triggers$ TOLOutOfSight | StaticAbilities$ TOLSTPrevent | SpellDescription$ Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn. | StackDescription$ SpellDescription -SVar:TOLSTPrevent:Mode$ PreventDamage | EffectZone$ Command | Amount$ 1 | Target$ Card.IsImprinted | Source$ Card.IsRemembered | Description$ Prevent the next 1 damage that would be dealt to this creature by remembered Card this turn. -SVar:TOLOutOfSight:Mode$ ChangesZone | TriggerZones$ Command | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ TOLExileSelf | Static$ True -SVar:TOLExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile -Oracle:Torrent of Lava deals X damage to each creature without flying.\nAs long as Torrent of Lava is on the stack, each creature has "{T}: Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn." \ No newline at end of file +S:Mode$ Continuous | Affected$ Creature | AddAbility$ TOPrevent | AddSVar$ DBPrevent & DBReplace | EffectZone$ Stack | Description$ As long as Torrent of Lava is on the stack, each creature has "{T}: Prevent the next 1 damage that would be dealt to this creature by CARDNAME this turn." +SVar:TOPrevent:AB$ Effect | Cost$ T | RememberObjects$ Self | ImprintCards$ OriginalHost | ReplacementEffects$ DBPrevent | ForgetOnMoved$ Battlefield | SpellDescription$ Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn. | StackDescription$ SpellDescription +SVar:DBPrevent:Event$ DamageDone | ActiveZones$ Command | ValidSource$ Card.IsImprinted | ValidTarget$ Card.IsRemembered | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 +Oracle:Torrent of Lava deals X damage to each creature without flying.\nAs long as Torrent of Lava is on the stack, each creature has "{T}: Prevent the next 1 damage that would be dealt to this creature by Torrent of Lava this turn." diff --git a/forge-gui/res/cardsfolder/upcoming/torrent_sculptor_flamethrower_sonata.txt b/forge-gui/res/cardsfolder/t/torrent_sculptor_flamethrower_sonata.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/torrent_sculptor_flamethrower_sonata.txt rename to forge-gui/res/cardsfolder/t/torrent_sculptor_flamethrower_sonata.txt diff --git a/forge-gui/res/cardsfolder/t/tranquil_garden.txt b/forge-gui/res/cardsfolder/t/tranquil_garden.txt index b0b26018b82..1d95d485cbe 100644 --- a/forge-gui/res/cardsfolder/t/tranquil_garden.txt +++ b/forge-gui/res/cardsfolder/t/tranquil_garden.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ G | SubAbility$ DBStayTapped | SpellDescription$ Add {G}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ W | SubAbility$ DBStayTapped | SpellDescription$ Add {W}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {G} or {W}. Tranquil Garden doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt b/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt index 9d6a8e57490..b0d8eed1f01 100644 --- a/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt +++ b/forge-gui/res/cardsfolder/t/transmogrifying_licid.txt @@ -2,7 +2,7 @@ Name:Transmogrifying Licid ManaCost:3 Types:Artifact Creature Licid PT:2/2 -A:AB$ Animate | Cost$ 1 T | Defined$ Self | RemoveThisAbility$ True | Permanent$ True | Permanent$ True | RevertCost$ 1 | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {1} to end this effect. +A:AB$ Animate | Cost$ 1 T | Defined$ Self | RemoveThisAbility$ True | Duration$ Permanent | Duration$ Permanent | RevertCost$ 1 | Keywords$ Enchant creature | Abilities$ SPAttach | Types$ Enchantment,Aura | RemoveCardTypes$ True | RemoveEnchantmentTypes$ True | SubAbility$ DBAttach | SpellDescription$ CARDNAME loses this ability and becomes an Aura enchantment with enchant creature. Attach it to target creature. You may pay {1} to end this effect. SVar:DBAttach:DB$ Attach | ValidTgts$ Creature | AILogic$ Pump SVar:SPAttach:SP$ Attach | Cost$ 0 | ValidTgts$ Creature S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddType$ Artifact | Description$ Enchanted creature gets +1/+1 and is an artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/t/trapjaw_tyrant.txt b/forge-gui/res/cardsfolder/t/trapjaw_tyrant.txt index 4c6555a68df..8f59dc531f8 100644 --- a/forge-gui/res/cardsfolder/t/trapjaw_tyrant.txt +++ b/forge-gui/res/cardsfolder/t/trapjaw_tyrant.txt @@ -3,6 +3,6 @@ ManaCost:3 W W Types:Creature Dinosaur PT:5/5 T:Mode$ DamageDoneOnce | Execute$ TrigExile | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Enrage — Whenever CARDNAME is dealt damage, exile target creature an opponent controls until CARDNAME leaves the battlefield. -SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | UntilHostLeavesPlay$ True +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | Duration$ UntilHostLeavesPlay SVar:HasCombatEffect:TRUE Oracle:Enrage — Whenever Trapjaw Tyrant is dealt damage, exile target creature an opponent controls until Trapjaw Tyrant leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/t/treacherous_urge.txt b/forge-gui/res/cardsfolder/t/treacherous_urge.txt index f9162d93713..0fb1af298be 100644 --- a/forge-gui/res/cardsfolder/t/treacherous_urge.txt +++ b/forge-gui/res/cardsfolder/t/treacherous_urge.txt @@ -2,7 +2,7 @@ Name:Treacherous Urge ManaCost:4 B Types:Instant A:SP$ ChangeZone | Cost$ 4 B | Origin$ Hand | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Creature | GainControl$ True | SubAbility$ DBPump | RememberChanged$ True | IsCurse$ True | SpellDescription$ Target opponent reveals their hand. You may put a creature card from it onto the battlefield under your control. That creature gains haste. Sacrifice it at the beginning of the next end step. -SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Permanent$ True | AtEOT$ Sacrifice | SubAbility$ DBCleanup +SVar:DBPump:DB$ Animate | Keywords$ Haste | Defined$ Remembered | Duration$ Permanent | AtEOT$ Sacrifice | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Picture:http://www.wizards.com/global/images/magic/general/treacherous_urge.jpg Oracle:Target opponent reveals their hand. You may put a creature card from it onto the battlefield under your control. That creature gains haste. Sacrifice it at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/t/treetop_rangers.txt b/forge-gui/res/cardsfolder/t/treetop_rangers.txt index 8de399326f9..18ec029113f 100644 --- a/forge-gui/res/cardsfolder/t/treetop_rangers.txt +++ b/forge-gui/res/cardsfolder/t/treetop_rangers.txt @@ -2,6 +2,5 @@ Name:Treetop Rangers ManaCost:2 G Types:Creature Elf PT:2/2 -K:CantBeBlockedBy Creature.withoutFlying -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_rangers.jpg -Oracle:Treetop Rangers can't be blocked except by creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying | Description$ CARDNAME can't be blocked except by creatures with flying. +Oracle:Treetop Rangers can't be blocked except by creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/treetop_scout.txt b/forge-gui/res/cardsfolder/t/treetop_scout.txt index 9ec1b024420..68c2fe68bd6 100644 --- a/forge-gui/res/cardsfolder/t/treetop_scout.txt +++ b/forge-gui/res/cardsfolder/t/treetop_scout.txt @@ -2,6 +2,5 @@ Name:Treetop Scout ManaCost:G Types:Creature Elf Scout PT:1/1 -K:CantBeBlockedBy Creature.withoutFlying -SVar:Picture:http://www.wizards.com/global/images/magic/general/treetop_scout.jpg -Oracle:Treetop Scout can't be blocked except by creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withoutFlying | Description$ CARDNAME can't be blocked except by creatures with flying. +Oracle:Treetop Scout can't be blocked except by creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/t/trench_behemoth.txt b/forge-gui/res/cardsfolder/t/trench_behemoth.txt index d1c066329f9..b3ab2c960c6 100644 --- a/forge-gui/res/cardsfolder/t/trench_behemoth.txt +++ b/forge-gui/res/cardsfolder/t/trench_behemoth.txt @@ -7,7 +7,7 @@ SVar:DBPump:DB$ Pump | Defined$ Self | KW$ Hexproof T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ Whenever a land enters the battlefield under your control, target creature an opponent controls attacks during its controller's next combat phase if able. SVar:TrigEffect:DB$ Effect | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | IsCurse$ True | RememberObjects$ Targeted | Triggers$ MustAttackTrig | Duration$ Permanent | ForgetOnMoved$ Battlefield SVar:MustAttackTrig:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ Player.controlsCreature.IsRemembered_GE1 | Execute$ TrigPump | TriggerDescription$ Target creature an opponent controls attacks during its controller's next combat phase if able. -SVar:TrigPump:DB$ Animate | Defined$ Remembered | HiddenKeywords$ CARDNAME attacks each combat if able. | UntilEndOfCombat$ True | SubAbility$ ExileSelf +SVar:TrigPump:DB$ Animate | Defined$ Remembered | HiddenKeywords$ CARDNAME attacks each combat if able. | Duration$ UntilEndOfCombat | SubAbility$ ExileSelf SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self SVar:BuffedBy:Land Oracle:Return a land you control to its owner's hand: Untap Trench Behemoth. It gains hexproof until end of turn.\nWhenever a land enters the battlefield under your control, target creature an opponent controls attacks during its controller's next combat phase if able. diff --git a/forge-gui/res/cardsfolder/t/trench_gorger.txt b/forge-gui/res/cardsfolder/t/trench_gorger.txt index 344d8639a13..9ad734b2f42 100644 --- a/forge-gui/res/cardsfolder/t/trench_gorger.txt +++ b/forge-gui/res/cardsfolder/t/trench_gorger.txt @@ -5,7 +5,7 @@ PT:6/6 K:Trample T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | OptionalDecider$ You | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for any number of land cards, exile them, then shuffle. If you do, CARDNAME has base power and base toughness each equal to the number of cards exiled this way. SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Exile | ChangeType$ Land | ChangeNum$ X | RememberChanged$ True | SubAbility$ TrenchAnimate | ShuffleNonMandatory$ True -SVar:TrenchAnimate:DB$Animate | Power$ Y | Toughness$ Y | Permanent$ True | SubAbility$ DBCleanUp +SVar:TrenchAnimate:DB$Animate | Power$ Y | Toughness$ Y | Duration$ Permanent | SubAbility$ DBCleanUp SVar:DBCleanUp:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$TypeInYourLibrary.Land SVar:Y:Remembered$Amount diff --git a/forge-gui/res/cardsfolder/upcoming/triplicate_titan.txt b/forge-gui/res/cardsfolder/t/triplicate_titan.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/triplicate_titan.txt rename to forge-gui/res/cardsfolder/t/triplicate_titan.txt diff --git a/forge-gui/res/cardsfolder/t/triton_tactics.txt b/forge-gui/res/cardsfolder/t/triton_tactics.txt index 70f9c22e97a..12a9775e8a5 100644 --- a/forge-gui/res/cardsfolder/t/triton_tactics.txt +++ b/forge-gui/res/cardsfolder/t/triton_tactics.txt @@ -6,7 +6,7 @@ SVar:DBUntap:DB$ Untap | Defined$ ParentTarget | SubAbility$ DBDelTrig SVar:DBDelTrig:DB$ DelayedTrigger | ThisTurn$ True | Mode$ Phase | Phase$ EndCombat | Execute$ TrigRemember | TriggerDescription$ At this turn's next end of combat, tap each creature that was blocked by one of those creatures this turn and it doesn't untap during its controller's next untap step. | RememberObjects$ ParentTarget SVar:TrigRemember:DB$ Pump | RememberObjects$ DelayTriggerRemembered | SubAbility$ TrigTap SVar:TrigTap:DB$ TapAll | ValidCards$ Creature.blockedByRemembered | SubAbility$ DBPump -SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.blockedByRemembered | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. | SubAbility$ DBCleanup +SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.blockedByRemembered | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/triton_tactics.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/trudge_garden.txt b/forge-gui/res/cardsfolder/t/trudge_garden.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/trudge_garden.txt rename to forge-gui/res/cardsfolder/t/trudge_garden.txt diff --git a/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt b/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt index 7d6002dd4fb..a2205961a7d 100644 --- a/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt +++ b/forge-gui/res/cardsfolder/t/turntimber_symbiosis_turntimber_serpentine_wood.txt @@ -15,6 +15,6 @@ Name:Turntimber, Serpentine Wood ManaCost:no cost Types:Land K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<3> | UnlessPayer$ You | UnlessAI$ UntapFor3 | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped. A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. Oracle:As Turntimber, Serpentine Wood enters the battlefield, you may pay 3 life. If you don't, it enters the battlefield tapped.\n{T}: Add {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/twinscroll_shaman.txt b/forge-gui/res/cardsfolder/t/twinscroll_shaman.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/twinscroll_shaman.txt rename to forge-gui/res/cardsfolder/t/twinscroll_shaman.txt diff --git a/forge-gui/res/cardsfolder/t/tyrite_sanctum.txt b/forge-gui/res/cardsfolder/t/tyrite_sanctum.txt index 7f11153b097..439d988fdd1 100644 --- a/forge-gui/res/cardsfolder/t/tyrite_sanctum.txt +++ b/forge-gui/res/cardsfolder/t/tyrite_sanctum.txt @@ -2,7 +2,7 @@ Name:Tyrite Sanctum ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. -A:AB$ Animate | Cost$ 2 T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | Types$ God | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target legendary creature becomes a God in addition to its other types. Put a +1/+1 counter on it. +A:AB$ Animate | Cost$ 2 T | ValidTgts$ Creature.Legendary | TgtPrompt$ Select target legendary creature | Types$ God | Duration$ Permanent | SubAbility$ DBPutCounter | SpellDescription$ Target legendary creature becomes a God in addition to its other types. Put a +1/+1 counter on it. A:AB$ PutCounter | Cost$ 4 T Sac<1/CARDNAME> | ValidTgts$ God | TgtPrompt$ Select target God | CounterType$ Indestructible | CounterNum$ 1 | SpellDescription$ Put an indestructible counter on target God. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/u/ugins_conjurant.txt b/forge-gui/res/cardsfolder/u/ugins_conjurant.txt index a20a1fbc82b..4d115153060 100644 --- a/forge-gui/res/cardsfolder/u/ugins_conjurant.txt +++ b/forge-gui/res/cardsfolder/u/ugins_conjurant.txt @@ -4,7 +4,7 @@ Types:Creature Spirit Monk PT:0/0 K:etbCounter:P1P1:X SVar:X:Count$xPaid -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ Counters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from CARDNAME. SVar:Counters:DB$ RemoveCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ Y SVar:Y:ReplaceCount$DamageAmount DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/upcoming/umbral_juke.txt b/forge-gui/res/cardsfolder/u/umbral_juke.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/umbral_juke.txt rename to forge-gui/res/cardsfolder/u/umbral_juke.txt diff --git a/forge-gui/res/cardsfolder/u/unbreathing_horde.txt b/forge-gui/res/cardsfolder/u/unbreathing_horde.txt index 395c7faa26f..e86d7ca157f 100644 --- a/forge-gui/res/cardsfolder/u/unbreathing_horde.txt +++ b/forge-gui/res/cardsfolder/u/unbreathing_horde.txt @@ -3,11 +3,10 @@ ManaCost:2 B Types:Creature Zombie PT:0/0 K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each other Zombie you control and each Zombie card in your graveyard. -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME, prevent that damage. Remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 SVar:X:Count$LastStateBattlefield Zombie.YouCtrl/Plus.Y SVar:Y:Count$LastStateGraveyard Zombie.YouCtrl SVar:NeedsToPlayVar:X GE1 AI:RemoveDeck:Random -SVar:Picture:http://www.wizards.com/global/images/magic/general/unbreathing_horde.jpg Oracle:Unbreathing Horde enters the battlefield with a +1/+1 counter on it for each other Zombie you control and each Zombie card in your graveyard.\nIf Unbreathing Horde would be dealt damage, prevent that damage and remove a +1/+1 counter from it. diff --git a/forge-gui/res/cardsfolder/u/undead_alchemist.txt b/forge-gui/res/cardsfolder/u/undead_alchemist.txt index 4460b477ee0..423bdaaa638 100644 --- a/forge-gui/res/cardsfolder/u/undead_alchemist.txt +++ b/forge-gui/res/cardsfolder/u/undead_alchemist.txt @@ -2,7 +2,7 @@ Name:Undead Alchemist ManaCost:3 U Types:Creature Zombie PT:4/2 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Creature.Zombie+YouCtrl | ValidTarget$ Opponent | ReplaceWith$ Mill | IsCombat$ True | Description$ If a Zombie you control would deal combat damage to a player, instead that player mills that many cards. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidSource$ Creature.Zombie+YouCtrl | ValidTarget$ Player | ReplaceWith$ Mill | IsCombat$ True | ExecuteMode$ PerTarget | Description$ If a Zombie you control would deal combat damage to a player, instead that player mills that many cards. SVar:Mill:DB$ Mill | Defined$ ReplacedTarget | NumCards$ X SVar:X:ReplaceCount$DamageAmount T:Mode$ ChangesZone | ValidCard$ Creature.nonToken+OppOwn | Origin$ Library | Destination$ Graveyard | Execute$ ExileAndToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever a creature card is put into an opponent's graveyard from their library, exile that card and create a 2/2 black Zombie creature token. diff --git a/forge-gui/res/cardsfolder/u/undergrowth_champion.txt b/forge-gui/res/cardsfolder/u/undergrowth_champion.txt index d4b5b5ae527..c9e92e13de4 100644 --- a/forge-gui/res/cardsfolder/u/undergrowth_champion.txt +++ b/forge-gui/res/cardsfolder/u/undergrowth_champion.txt @@ -2,9 +2,8 @@ Name:Undergrowth Champion ManaCost:1 G G Types:Creature Elemental PT:2/2 -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from CARDNAME. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ DBRemoveCounters | PreventionEffect$ True | AlwaysReplace$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from CARDNAME. SVar:DBRemoveCounters:DB$ RemoveCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 -SVar:Picture:http://www.wizards.com/global/images/magic/general/undergrowth_champion.jpg Oracle:If damage would be dealt to Undergrowth Champion while it has a +1/+1 counter on it, prevent that damage and remove a +1/+1 counter from Undergrowth Champion.\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Undergrowth Champion. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/u/undiscovered_paradise.txt b/forge-gui/res/cardsfolder/u/undiscovered_paradise.txt index 5a2234c5221..7881428126c 100644 --- a/forge-gui/res/cardsfolder/u/undiscovered_paradise.txt +++ b/forge-gui/res/cardsfolder/u/undiscovered_paradise.txt @@ -2,6 +2,6 @@ Name:Undiscovered Paradise ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. During your next untap step, as you untap your permanents, return Undiscovered Paradise to its owner's hand. | SubAbility$ DBReturn -SVar:DBReturn:DB$ Pump | Defined$ Self | KW$ HIDDEN During your next untap step, as you untap your permanents, return CARDNAME to its owner's hand. | Permanent$ True +SVar:DBReturn:DB$ Pump | Defined$ Self | KW$ HIDDEN During your next untap step, as you untap your permanents, return CARDNAME to its owner's hand. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/undiscovered_paradise.jpg Oracle:{T}: Add one mana of any color. During your next untap step, as you untap your permanents, return Undiscovered Paradise to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/unwilling_ingredient.txt b/forge-gui/res/cardsfolder/u/unwilling_ingredient.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/unwilling_ingredient.txt rename to forge-gui/res/cardsfolder/u/unwilling_ingredient.txt diff --git a/forge-gui/res/cardsfolder/u/urzas_armor.txt b/forge-gui/res/cardsfolder/u/urzas_armor.txt index 346638d0e0f..63814ef093c 100644 --- a/forge-gui/res/cardsfolder/u/urzas_armor.txt +++ b/forge-gui/res/cardsfolder/u/urzas_armor.txt @@ -1,6 +1,6 @@ Name:Urza's Armor ManaCost:6 Types:Artifact -S:Mode$ PreventDamage | Target$ You | Source$ Card | Amount$ 1 | Description$ If a source would deal damage to you, prevent 1 of that damage. -SVar:Picture:http://www.wizards.com/global/images/magic/general/urzas_armor.jpg +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ You | ReplaceWith$ DBReplace | PreventionEffect$ True | Description$ If a source would deal damage to you, prevent 1 of that damage. +SVar:DBReplace:DB$ ReplaceDamage | Amount$ 1 Oracle:If a source would deal damage to you, prevent 1 of that damage. diff --git a/forge-gui/res/cardsfolder/upcoming/uvilda_dean_of_perfection_nassari_dean_of_expression.txt b/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt similarity index 90% rename from forge-gui/res/cardsfolder/upcoming/uvilda_dean_of_perfection_nassari_dean_of_expression.txt rename to forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt index f2e939bbfb5..f8447a97376 100644 --- a/forge-gui/res/cardsfolder/upcoming/uvilda_dean_of_perfection_nassari_dean_of_expression.txt +++ b/forge-gui/res/cardsfolder/u/uvilda_dean_of_perfection_nassari_dean_of_expression.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Djinn Wizard PT:2/2 A:AB$ ChangeZone | Cost$ T | RememberChanged$ True | Origin$ Hand | Destination$ Exile | ChangeType$ Instant,Sorcery | ChangeNum$ 1 | SubAbility$ DBPutCounter | StackDescription$ SpellDescription | SpellDescription$ You may exile an instant or sorcery card from your hand and put three hone counters on it. It gains "At the beginning of your upkeep, if this card is exiled, remove a hone counter from it" and "When the last hone counter is removed from this card, if it's exiled, you may cast it. It costs {4} less to cast this way." SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ HONE | CounterNum$ 3 | SubAbility$ DBAddTriggers | TgtZone$ Exile -SVar:DBAddTriggers:DB$ Animate | Defined$ Remembered | Triggers$ TrigRemoveCounter,TrigCast | SubAbility$ DBCleanup | Permanent$ True +SVar:DBAddTriggers:DB$ Animate | Defined$ Remembered | Triggers$ TrigRemoveCounter,TrigCast | SubAbility$ DBCleanup | Duration$ Permanent SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:TrigRemoveCounter:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Exile | Execute$ DBRemoveCounter | TriggerDescription$ At the beginning of your upkeep, if this card is exiled, remove a hone counter from it. SVar:DBRemoveCounter:DB$ RemoveCounter | Defined$ Self | CounterType$ HONE | CounterNum$ 1 @@ -22,7 +22,7 @@ ManaCost:3 R R Types:Legendary Creature Efreet Shaman PT:4/4 T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigExile | TriggerDescription$ At the beginning of your upkeep, exile the top card of each opponent's library. Until end of turn, you may cast spells from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells. -SVar:TrigExile:DB$ Dig | Defined$ Player.Opponent | DigNum$ 1 | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of each opponent's library. Until end of turn, you may cast nonland cards from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells. +SVar:TrigExile:DB$ Dig | Defined$ Player.Opponent | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of each opponent's library. Until end of turn, you may cast nonland cards from among those exiled cards, and you may spend mana as though it were mana of any color to cast those spells. SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | Triggers$ TriggerCast | RememberObjects$ Remembered | SubAbility$ DBCleanup SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreColor$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast it. SVar:TriggerCast:Mode$ SpellCast | ValidCard$ Card.IsRemembered | TriggerZones$ Command | Execute$ TrigRemoveSelf | Static$ True diff --git a/forge-gui/res/cardsfolder/upcoming/abiding_grace.txt b/forge-gui/res/cardsfolder/upcoming/abiding_grace.txt new file mode 100644 index 00000000000..0ce257e9859 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/abiding_grace.txt @@ -0,0 +1,9 @@ +Name:Abiding Grace +ManaCost:2 W +Types:Enchantment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigCharm | TriggerDescription$ At the beginning of your end step, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBGainLife,DBChangeZone | CharmNum$ 1 +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SpellDescription$ You gain 1 life. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card with mana value 1 in your graveyard | ValidTgts$ Creature.cmcEQ1+YouCtrl | SpellDescription$ Return target creature card with mana value 1 from your graveyard to the battlefield. +DeckHas:Ability$LifeGain +Oracle:At the beginning of your end step, choose one —\n• You gain 1 life.\n• Return target creature card with mana value 1 from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/academy_manufactor.txt b/forge-gui/res/cardsfolder/upcoming/academy_manufactor.txt new file mode 100644 index 00000000000..b3d78de8191 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/academy_manufactor.txt @@ -0,0 +1,12 @@ +Name:Academy Manufactor +ManaCost:3 +Types:Artifact Creature Assembly-Worker +PT:1/3 +R:Event$ CreateToken | ActiveZones$ Battlefield | ValidPlayer$ You | ValidToken$ Clue,Food,Treasure | ReplaceWith$ DBToken | Description$ If you would create a Clue, Food, or Treasure token, instead create one of each. +SVar:DBToken:DB$ Token | TokenScript$ c_a_clue_draw | TokenAmount$ X | SubAbility$ DBToken2 +SVar:DBToken2:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ X | SubAbility$ DBToken3 +SVar:DBToken3:DB$ Token | TokenScript$ c_a_treasure_sac | TokenAmount$ X +SVar:X:ReplaceCount$TokenNum +DeckHas:Ability$Sacrifice & Ability$Token & Ability$LifeGain +DeckHints:Ability$Investigate +Oracle:If you would create a Clue, Food, or Treasure token, instead create one of each. diff --git a/forge-gui/res/cardsfolder/upcoming/aeromoeba.txt b/forge-gui/res/cardsfolder/upcoming/aeromoeba.txt new file mode 100644 index 00000000000..030f6708b09 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aeromoeba.txt @@ -0,0 +1,7 @@ +Name:Aeromoeba +ManaCost:3 U +Types:Creature Elemental Beast +PT:2/4 +K:Flying +A:AB$ Pump | Cost$ Discard<1/Card> | Defined$ Self | AILogic$ SwitchPT | KW$ HIDDEN CARDNAME's power and toughness are switched | SpellDescription$ Switch CARDNAME's power and toughness until end of turn. +Oracle:Flying\nDiscard a card: Switch Aeromoeba's power and toughness until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/aeve_progenitor_ooze.txt b/forge-gui/res/cardsfolder/upcoming/aeve_progenitor_ooze.txt new file mode 100644 index 00000000000..4167b274352 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/aeve_progenitor_ooze.txt @@ -0,0 +1,10 @@ +Name:Aeve, Progenitor Ooze +ManaCost:2 G G G +Types:Legendary Creature Ooze +PT:2/2 +K:Storm +S:Mode$ Continuous | Affected$ Card.token+Self | RemoveType$ Legendary | Description$ CARDNAME is not legendary if it's a token. +K:etbCounter:P1P1:X:no condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each other Ooze you control. +SVar:X:Count$LastStateBattlefield Ooze.YouCtrl+Other +DeckHas:Ability$Counters +Oracle:Storm (When you cast this spell, copy it for each spell cast before it this turn. The copies become tokens.)\nAeve, Progenitor Ooze is not legendary if it's a token.\nAeve enters the battlefield with a +1/+1 counter on it for each other Ooze you control. diff --git a/forge-gui/res/cardsfolder/upcoming/altar_of_the_goyf.txt b/forge-gui/res/cardsfolder/upcoming/altar_of_the_goyf.txt new file mode 100644 index 00000000000..e5f2ba527b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/altar_of_the_goyf.txt @@ -0,0 +1,9 @@ +Name:Altar of the Goyf +ManaCost:5 +Types:Tribal Artifact Lhurgoyf +T:Mode$ Attacks | ValidCard$ Creature.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyards. +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ +X | NumDef$ +X +S:Mode$ Continuous | Affected$ Creature.Lhurgoyf+YouCtrl | AddKeyword$ Trample | Description$ Lhurgoyf creatures you control have trample. +SVar:X:Count$CardTypes.Graveyard +SVar:PlayMain1:TRUE +Oracle:Whenever a creature you control attacks alone, it gets +X/+X until end of turn, where X is the number of card types among cards in all graveyards.\nLhurgoyf creatures you control have trample. diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_javelineer.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_javelineer.txt new file mode 100644 index 00000000000..a069d77d887 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_javelineer.txt @@ -0,0 +1,10 @@ +Name:Arcbound Javelineer +ManaCost:W +Types:Artifact Creature Soldier +PT:0/1 +K:Modular:1 +A:AB$ DealDamage | Cost$ T SubCounter | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target attacking or blocking creature. +SVar:X:Count$xPaid +DeckHas:Ability$Counters +DeckHints:Type$Artifact & Ability$Counters +Oracle:{T}, Remove X +1/+1 counters from Arcbound Javelineer: It deals X damage to target attacking or blocking creature.\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt new file mode 100644 index 00000000000..0182357296c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt @@ -0,0 +1,8 @@ +Name:Arcbound Mouser +ManaCost:W +Types:Artifact Creature Cat +PT:0/0 +K:Lifelink +K:Modular:1 +DeckHas:Ability$Counters & Ability$LifeGain +Oracle:Lifelink\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_prototype.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_prototype.txt new file mode 100644 index 00000000000..81c86302704 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_prototype.txt @@ -0,0 +1,7 @@ +Name:Arcbound Prototype +ManaCost:1 W +Types:Artifact Creature Assembly-Worker +PT:0/0 +K:Modular:2 +DeckHas:Ability$Counters +Oracle:Modular 2 (This creature enters the battlefield with two +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_shikari.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_shikari.txt new file mode 100644 index 00000000000..2b0721cdc93 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_shikari.txt @@ -0,0 +1,11 @@ +Name:Arcbound Shikari +ManaCost:1 R W +Types:Artifact Creature Cat Soldier +PT:0/0 +K:First Strike +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put a +1/+1 counter on each other artifact creature you control. +SVar:TrigPutCounter:DB$ PutCounterAll | ValidCards$ Creature.Artifact+Other+YouCtrl | CounterType$ P1P1 | CounterNum$ 1 +K:Modular:2 +DeckHas:Ability$Counters +SVar:PlayMain1:TRUE +Oracle:First strike\nWhen Arcbound Shikari enters the battlefield, put a +1/+1 counter on each other artifact creature you control.\nModular 2 (This creature enters the battlefield with two +1/+1 counters on it. When it does, you may put its counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_whelp.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_whelp.txt new file mode 100644 index 00000000000..e42ef06d4d9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_whelp.txt @@ -0,0 +1,9 @@ +Name:Arcbound Whelp +ManaCost:3 R +Types:Artifact Creature Dragon +PT:0/0 +K:Flying +K:Modular:2 +A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. +DeckHas:Ability$Counters +Oracle:Flying\n{R}: Arcbound Whelp gets +1/+0 until end of turn.\nModular 2 (This creature enters the battlefield with two +1/+1 counters on it. When it dies, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/archfiend_of_sorrows.txt b/forge-gui/res/cardsfolder/upcoming/archfiend_of_sorrows.txt new file mode 100644 index 00000000000..40198a7f841 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archfiend_of_sorrows.txt @@ -0,0 +1,10 @@ +Name:Archfiend of Sorrows +ManaCost:5 B B +Types:Creature Demon +PT:4/5 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMassacre | TriggerDescription$ When CARDNAME enters the battlefield, creatures your opponents control get -2/-2 until end of turn. +SVar:TrigMassacre:DB$ PumpAll | NumAtt$ -2 | NumDef$ -2 | ValidCards$ Creature.OppCtrl | IsCurse$ True +K:Unearth:3 B B +SVar:PlayMain1:TRUE +Oracle:When Archfiend of Sorrows enters the battlefield, creatures your opponents control get -2/-2 until end of turn.\nUnearth {3}{B}{B} ({3}{B}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/archon_of_cruelty.txt b/forge-gui/res/cardsfolder/upcoming/archon_of_cruelty.txt new file mode 100644 index 00000000000..5d0eaf48cc3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archon_of_cruelty.txt @@ -0,0 +1,14 @@ +Name:Archon of Cruelty +ManaCost:6 B B +Types:Creature Archon +PT:6/6 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, target opponent sacrifices a creature or planeswalker, discards a card, and loses 3 life. You draw a card and gain 3 life. +T:Mode$ Attacks | ValidCard$ Card.Self | Secondary$ True | Execute$ TrigSac | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, target opponent sacrifices a creature or planeswalker, discards a card, and loses 3 life. You draw a card and gain 3 life. +SVar:TrigSac:DB$ Sacrifice | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SacValid$ Creature,Planeswalker | SacMessage$ creature or planeswalker | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ Targeted | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | SubAbility$ DBDraw +SVar:DBDraw:DB$ Draw | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 +DeckHas:Ability$LifeGain +Oracle:Flying\nWhenever Archon of Cruelty enters the battlefield or attacks, target opponent sacrifices a creature or planeswalker, discards a card, and loses 3 life. You draw a card and gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/asmoranomardicadaistinaculdacar.txt b/forge-gui/res/cardsfolder/upcoming/asmoranomardicadaistinaculdacar.txt new file mode 100644 index 00000000000..1ebc2947208 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/asmoranomardicadaistinaculdacar.txt @@ -0,0 +1,14 @@ +Name:Asmoranomardicadaistinaculdacar +ManaCost:no cost +Types:Legendary Creature Human Wizard +Colors:black,red +PT:3/3 +SVar:AltCost:Cost$ BR | CheckSVar$ X | Description$ As long as you've discarded a card this turn, you may pay {B/R} to cast this spell. +SVar:X:PlayerCountPropertyYou$CardsDiscardedThisTurn +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, you may search your library for a card named The Underworld Cookbook, reveal it, put it into your hand, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Card.namedThe Underworld Cookbook | ChangeNum$ 1 | ShuffleNonMandatory$ True +A:AB$ DealDamage | Cost$ Sac<2/Food> | ValidTgts$ Creature | TgtPrompt$ Select target creature | DamageSource$ Targeted | NumDmg$ 6 | SpellDescription$ Target creature deals 6 damage to itself. +DeckHints:Type$Discard +DeckHas:Ability$Sacrifice +DeckNeeds:Name$The Underworld Cookbook +Oracle:As long as you've discarded a card this turn, you may pay {B/R} to cast this spell.\nWhen Asmoranomardicadaistinaculdacar enters the battlefield, you may search your library for a card named The Underworld Cookbook, reveal it, put it into your hand, then shuffle.\nSacrifice two Foods: Target creature deals 6 damage to itself. diff --git a/forge-gui/res/cardsfolder/upcoming/barbed_spike.txt b/forge-gui/res/cardsfolder/upcoming/barbed_spike.txt new file mode 100644 index 00000000000..7a4bc91f1aa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/barbed_spike.txt @@ -0,0 +1,11 @@ +Name:Barbed Spike +ManaCost:1 W +Types:Artifact Equipment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying, then attach CARDNAME to it. +SVar:TrigToken:DB$ Token | TokenScript$ c_1_1_a_thopter_flying | RememberTokens$ True | SubAbility$ DBAttach +SVar:DBAttach:DB$ Attach | Defined$ Remembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | Description$ Equipped creature gets +1/+0. +K:Equip:2 +DeckHas:Ability$Token +Oracle:When Barbed Spike enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying, then attach Barbed Spike to it.\nEquipped creature gets +1/+0.\nEquip {2} ({2}: Attach to target creature you control. Equip only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/batterbone.txt b/forge-gui/res/cardsfolder/upcoming/batterbone.txt new file mode 100644 index 00000000000..6cf334f3bac --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/batterbone.txt @@ -0,0 +1,8 @@ +Name:Batterbone +ManaCost:2 +Types:Artifact Equipment +K:Living Weapon +K:Equip:5 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance & Lifelink | Description$ Equipped creature gets +1/+1 and has vigilance and lifelink. +DeckHas:Ability$LifeGain & Ability$Token +Oracle:Living weapon (When this Equipment enters the battlefield, create a 0/0 black Phyrexian Germ creature token, then attach this to it.)\nEquipped creature gets +1/+1 and has vigilance and lifelink.\nEquip {5} diff --git a/forge-gui/res/cardsfolder/upcoming/battle_plan.txt b/forge-gui/res/cardsfolder/upcoming/battle_plan.txt new file mode 100644 index 00000000000..ae8f89c6eae --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/battle_plan.txt @@ -0,0 +1,8 @@ +Name:Battle Plan +ManaCost:3 R +Types:Enchantment +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ At the beginning of combat on your turn, target creature you control gets +2/+0 until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | NumAtt$ 2 +SVar:PlayMain1:TRUE +K:TypeCycling:Basic:1 R +Oracle:At the beginning of combat on your turn, target creature you control gets +2/+0 until end of turn.\nBasic landcycling {1}{R} ({1}{R}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/blacksmiths_skill.txt b/forge-gui/res/cardsfolder/upcoming/blacksmiths_skill.txt new file mode 100644 index 00000000000..9d60c1a101b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blacksmiths_skill.txt @@ -0,0 +1,7 @@ +Name:Blacksmith's Skill +ManaCost:W +Types:Instant +A:SP$ Pump | Cost$ W | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | KW$ Hexproof & Indestructible | SubAbility$ DBPump | SpellDescription$ Target permanent gains hexproof and indestructible until end of turn. If it's an artifact creature, it gets +2/+2 until end of turn. +SVar:DBPump:DB$ Pump | Defined$ Targeted | NumAtt$ +2 | NumDef$ +2 | ConditionDefined$ Targeted | ConditionPresent$ Creature.Artifact +DeckHints:Type$Artifact +Oracle:Target permanent gains hexproof and indestructible until end of turn. If it's an artifact creature, it gets +2/+2 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/blessed_respite.txt b/forge-gui/res/cardsfolder/upcoming/blessed_respite.txt new file mode 100644 index 00000000000..8e039150dcb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blessed_respite.txt @@ -0,0 +1,7 @@ +Name:Blessed Respite +ManaCost:1 G +Types:Instant +A:SP$ ChangeZoneAll | Cost$ 1 G | ValidTgts$ Player | TgtPrompt$ Select target player | Origin$ Graveyard | Destination$ Library | ChangeType$ Card | Shuffle$ True | SubAbility$ DBFog | SpellDescription$ Target player shuffles their graveyard into their library. Prevent all combat damage that would be dealt this turn. +SVar:DBFog:DB$ Fog +AI:RemoveDeck:Random +Oracle:Target player shuffles their graveyard into their library. Prevent all combat damage that would be dealt this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/blossoming_calm.txt b/forge-gui/res/cardsfolder/upcoming/blossoming_calm.txt new file mode 100644 index 00000000000..7c734d1655a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/blossoming_calm.txt @@ -0,0 +1,8 @@ +Name:Blossoming Calm +ManaCost:W +Types:Instant +K:Rebound +A:SP$ Pump | Defined$ You | KW$ Hexproof | Duration$ UntilYourNextTurn | SubAbility$ DBGainLife | StackDescription$ {p:You} gains hexproof until their next turn. | SpellDescription$ You gain hexproof until your next turn. You gain 2 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 +DeckHas:Ability$LifeGain +Oracle:You gain hexproof until your next turn. You gain 2 life.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/bone_shards.txt b/forge-gui/res/cardsfolder/upcoming/bone_shards.txt new file mode 100644 index 00000000000..e1f01fdf0cd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bone_shards.txt @@ -0,0 +1,7 @@ +Name:Bone Shards +ManaCost:B +Types:Sorcery +K:AlternateAdditionalCost:Sac<1/Creature>:Discard<1/Card> +SVar:AIPreference:SacCost$Creature.token,Creature.cmcLE3 +A:SP$ Destroy | Cost$ B | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | SpellDescription$ Destroy target creature or planeswalker. +Oracle:As an additional cost to cast this spell, sacrifice a creature or discard a card.\nDestroy target creature or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/bottle_golems.txt b/forge-gui/res/cardsfolder/upcoming/bottle_golems.txt new file mode 100644 index 00000000000..23e9a23d768 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bottle_golems.txt @@ -0,0 +1,10 @@ +Name:Bottle Golems +ManaCost:4 +Types:Artifact Creature Golem +PT:3/3 +K:Trample +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigSac | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you gain life equal to its power. +SVar:TrigSac:DB$GainLife | Defined$ TriggeredCardController | LifeAmount$ XPower +SVar:XPower:TriggeredCard$CardPower +DeckHas:Ability$LifeGain +Oracle:Trample\nWhen Bottle Golems dies, you gain life equal to its power. diff --git a/forge-gui/res/cardsfolder/upcoming/brainstone.txt b/forge-gui/res/cardsfolder/upcoming/brainstone.txt new file mode 100644 index 00000000000..b1ec13f6269 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/brainstone.txt @@ -0,0 +1,6 @@ +Name:Brainstone +ManaCost:1 +Types:Artifact +A:AB$ Draw | Cost$ 2 T Sac<1/CARDNAME> | NumCards$ 3 | SubAbility$ DBChangeZone | StackDescription$ {p:You} draws three cards, | SpellDescription$ Draw three cards, then put two cards from your hand on top of your library in any order. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Hand | Destination$ Library | ChangeNum$ 2 | Mandatory$ True | StackDescription$ then puts two cards from their hand on top of their library in any order. +Oracle:{2}, {T}, Sacrifice Brainstone: Draw three cards, then put two cards from your hand on top of your library in any order. diff --git a/forge-gui/res/cardsfolder/upcoming/break_ties.txt b/forge-gui/res/cardsfolder/upcoming/break_ties.txt new file mode 100644 index 00000000000..150d0396809 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/break_ties.txt @@ -0,0 +1,10 @@ +Name:Break Ties +ManaCost:2 W +Types:Instant +K:Reinforce:1:W +A:SP$ Charm | Choices$ DBDestroyArtifact,DBDestroyEnchantment,DBExile +SVar:DBDestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SpellDescription$ Destroy target artifact. +SVar:DBDestroyEnchantment:DB$ Destroy | ValidTgts$ Enchantment | TgtPrompt$ Select target enchantment | SpellDescription$ Destroy target enchantment. +SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard. | SpellDescription$ Exile target card from a graveyard. +DeckHas:Ability$Counters +Oracle:Choose one —\n• Destroy target artifact.\n• Destroy target enchantment.\n• Exile target card from a graveyard.\nReinforce 1—{W} ({W}, Discard this card: Put a +1/+1 counter on target creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/breyas_apprentice.txt b/forge-gui/res/cardsfolder/upcoming/breyas_apprentice.txt new file mode 100644 index 00000000000..69286dd6d91 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/breyas_apprentice.txt @@ -0,0 +1,14 @@ +Name:Breya's Apprentice +ManaCost:2 R +Types:Artifact Creature Human Artificer +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You +A:AB$ Charm | Cost$ T Sac<1/Artifact> | Choices$ DBImpulse,DBPump | Defined$ You +SVar:DBImpulse:DB$ Dig | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. Until the end of your next turn, you may play that card. +SVar:DBEffect:DB$ Effect | StaticAbilities$ StaticMayPlay | Duration$ UntilTheEndOfYourNextTurn | RememberObjects$ Remembered | ForgetOnMoved$ Exile +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:StaticMayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ Until the end of your next turn, you may play that card. +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | NumAtt$ +2 | TgtPrompt$ Select target creature. | SpellDescription$ Target creature gets +2/+0 until end of turn. +DeckHas:Ability$Token +Oracle:When Breya's Apprentice enters the battlefield, create a 1/1 colorless Thopter artifact creature token with flying.\n{T}, Sacrifice an artifact: Choose one —\n• Exile the top card of your library. Until the end of your next turn, you may play that card.\n• Target creature gets +2/+0 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/burdened_aerialist.txt b/forge-gui/res/cardsfolder/upcoming/burdened_aerialist.txt new file mode 100644 index 00000000000..79ed65e02d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/burdened_aerialist.txt @@ -0,0 +1,10 @@ +Name:Burdened Aerialist +ManaCost:2 U +Types:Creature Human Pirate +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTreasure | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, create a Treasure token. +SVar:TrigTreasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You +T:Mode$ Sacrificed | ValidPlayer$ You | ValidCard$ Permanent.token+YouCtrl | Origin$ Any | Destination$ Battlefield | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice a token, CARDNAME gains flying until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Flying +DeckHas:Ability$Token +Oracle:When Burdened Aerialist enters the battlefield, create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\nWhenever you sacrifice a token, Burdened Aerialist gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt new file mode 100644 index 00000000000..14630b8f383 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt @@ -0,0 +1,10 @@ +Name:Calibrated Blast +ManaCost:2 R +Types:Instant +A:SP$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | RememberFound$ True | SubAbility$ DBImmediateTrigger | StackDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | Execute$ TrigDamage | TriggerDescription$ When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$CardManaCost +K:Flashback:3 R R +Oracle:Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, Calibrated Blast deals damage equal to that card's mana value to any target.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/caprichrome.txt b/forge-gui/res/cardsfolder/upcoming/caprichrome.txt new file mode 100644 index 00000000000..0009b0b167a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/caprichrome.txt @@ -0,0 +1,10 @@ +Name:Caprichrome +ManaCost:3 W +Types:Artifact Creature Goat +PT:2/2 +K:Flash +K:Vigilance +K:Devour artifact:1 +DeckHas:Ability$Counters +DeckNeeds:Type$Artifact +Oracle:Flash\nVigilance\nDevour artifact 1 (As this enters the battlefield, you may sacrifice any number of artifacts. This creature enters the battlefield with that many +1/+1 counters on it.) diff --git a/forge-gui/res/cardsfolder/upcoming/captain_ripley_vance.txt b/forge-gui/res/cardsfolder/upcoming/captain_ripley_vance.txt new file mode 100644 index 00000000000..558be2b94df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captain_ripley_vance.txt @@ -0,0 +1,11 @@ +Name:Captain Ripley Vance +ManaCost:2 R +Types:Legendary Creature Human Pirate +PT:3/2 +T:Mode$ SpellCast | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | CheckSVar$ YouCastThisTurn | SVarCompare$ EQ3 | NoResolvingCheck$ True | TriggerDescription$ Whenever you cast your third spell each turn, put a +1/+1 counter on CARDNAME, then it deals damage equal to its power to any target. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBDealDamage +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X +SVar:X:Count$CardPower +SVar:YouCastThisTurn:Count$ThisTurnCast_Card.YouCtrl +DeckHas:Ability$Counters +Oracle:Whenever you cast your third spell each turn, put a +1/+1 counter on Captain Ripley Vance, then it deals damage equal to its power to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/captured_by_lagacs.txt b/forge-gui/res/cardsfolder/upcoming/captured_by_lagacs.txt new file mode 100644 index 00000000000..d94a4fd6da4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captured_by_lagacs.txt @@ -0,0 +1,9 @@ +Name:Captured by Lagacs +ManaCost:1 G W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 1 G W | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddHiddenKeyword$ CARDNAME can't attack or block. | Description$ Enchanted creature can't attack or block. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two target creatures.) +SVar:TrigPut:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | TargetMin$ 0 | TargetMax$ 2 | CounterType$ P1P1 | CounterNum$ 1 +Oracle:Enchant creature\nEnchanted creature can't attack or block.\nWhen Captured by Lagacs enters the battlefield, support 2. (Put a +1/+1 counter on each of up to two target creatures.) diff --git a/forge-gui/res/cardsfolder/upcoming/chatterfang_squirrel_general.txt b/forge-gui/res/cardsfolder/upcoming/chatterfang_squirrel_general.txt new file mode 100644 index 00000000000..0fb16a15cd3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chatterfang_squirrel_general.txt @@ -0,0 +1,14 @@ +Name:Chatterfang, Squirrel General +ManaCost:2 G +Types:Legendary Creature Squirrel Warrior +PT:3/3 +K:Forestwalk +R:Event$ CreateToken | ActiveZones$ Battlefield | ValidPlayer$ You | ReplaceWith$ DBReplace | Description$ If one or more tokens would be created under your control, those tokens plus that many 1/1 green Squirrel creature tokens are created instead. +SVar:DBReplace:DB$ ReplaceEffect | VarName$ TokenNum | VarValue$ Y | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ Y | TokenScript$ g_1_1_squirrel +A:AB$ Pump | Cost$ B Sac | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | NumDef$ -X | SpellDescription$ Target creature gets +X/-X until end of turn. +SVar:X:Count$xPaid +SVar:Y:ReplaceCount$TokenNum +DeckHas:Ability$Token +DeckHints:Type$Squirrel +Oracle:Forestwalk (This creature can't be blocked as long as defending player controls a Forest.)\nIf one or more tokens would be created under your control, those tokens plus that many 1/1 green Squirrel creature tokens are created instead.\n{B}, Sacrifice X Squirrels: Target creature gets +X/-X until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/chatterstorm.txt b/forge-gui/res/cardsfolder/upcoming/chatterstorm.txt new file mode 100644 index 00000000000..24f309643df --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chatterstorm.txt @@ -0,0 +1,7 @@ +Name:Chatterstorm +ManaCost:1 G +Types:Sorcery +K:Storm +A:SP$ Token | Cost$ 1 G | TokenAmount$ 1 | TokenScript$ g_1_1_squirrel | TokenOwner$ You | SpellDescription$ Create a 1/1 green Squirrel creature token. +DeckHas:Ability$Token +Oracle:Create a 1/1 green Squirrel creature token.\nStorm (When you cast this spell, copy it for each spell cast before it this turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/chefs_kiss.txt b/forge-gui/res/cardsfolder/upcoming/chefs_kiss.txt new file mode 100644 index 00000000000..bca9676325a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chefs_kiss.txt @@ -0,0 +1,7 @@ +Name:Chef's Kiss +ManaCost:1 R R +Types:Instant +A:SP$ ControlSpell | ValidTgts$ Card | TgtPrompt$ Select target spell that targets only a single permanent or player | TargetType$ Spell | Mode$ Gain | TargetsSingleTarget$ True | TargetValidTargeting$ Permanent,Player | SubAbility$ DBCopy | StackDescription$ SpellDescription | SpellDescription$ Gain control of target spell that targets only a single permanent or player. Copy it, then reselect the targets at random for the spell and the copy. The new targets can't be you or a permanent you control. +SVar:DBCopy:DB$ CopySpellAbility | Defined$ Targeted | RandomTarget$ True | RandomTargetRestriction$ Player.Other,Permanent.YouDontCtrl | SubAbility$ DBChangeTargets | StackDescription$ None +SVar:DBChangeTargets:DB$ ChangeTargets | Defined$ Targeted | RandomTarget$ True | RandomTargetRestriction$ Player.Other,Permanent.YouDontCtrl +Oracle:Gain control of target spell that targets only a single permanent or player. Copy it, then reselect the targets at random for the spell and the copy. The new targets can't be you or a permanent you control. diff --git a/forge-gui/res/cardsfolder/upcoming/chitterspitter.txt b/forge-gui/res/cardsfolder/upcoming/chitterspitter.txt new file mode 100644 index 00000000000..9fddbbf3eb6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chitterspitter.txt @@ -0,0 +1,11 @@ +Name:Chitterspitter +ManaCost:2 G +Types:Artifact +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, you may sacrifice a token. If you do, put an acorn counter on CARDNAME. +SVar:TrigPutCounter:AB$ PutCounter | Cost$ Sac<1/Permanent.token/token> | CounterType$ ACORN | CounterNum$ 1 +S:Mode$ Continuous | Affected$ Squirrel.YouCtrl | AddPower$ X | AddToughness$ X | Description$ Squirrels you control get +1/+1 for each acorn counter on CARDNAME. +A:AB$ Token | Cost$ G T | TokenScript$ g_1_1_squirrel | SpellDescription$ Create a 1/1 green Squirrel creature token. +SVar:X:Count$CardCounters.ACORN +DeckHas:Ability$Sacrifice & Ability$Counters & Ability$Token +DeckHints:Type$Squirrel +Oracle:At the beginning of your upkeep, you may sacrifice a token. If you do, put an acorn counter on Chitterspitter.\nSquirrels you control get +1/+1 for each acorn counter on Chitterspitter.\n{G}, {T}: Create a 1/1 green Squirrel creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/chrome_courier.txt b/forge-gui/res/cardsfolder/upcoming/chrome_courier.txt new file mode 100644 index 00000000000..8778dfef486 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/chrome_courier.txt @@ -0,0 +1,12 @@ +Name:Chrome Courier +ManaCost:1 W U +Types:Artifact Creature Thopter +PT:1/1 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDig | DestinationZone2$ Graveyard | TriggerDescription$ When CARDNAME enters the battlefield, reveal the top two cards of your library. Put one of them into your hand and the other into your graveyard. If you put an artifact card into your hand this way, you gain 3 life. +SVar:TrigDig:DB$ Dig | DigNum$ 2 | ChangeNum$ 1 | Reveal$ True | ChangeType$ Card | RememberChanged$ True | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Artifact | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHints:Type$Artifact +DeckHas:Ability$LifeGain +Oracle:Flying\nWhen Chrome Courier enters the battlefield, reveal the top two cards of your library. Put one of them into your hand and the other into your graveyard. If you put an artifact card into your hand this way, you gain 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/clattering_augur.txt b/forge-gui/res/cardsfolder/upcoming/clattering_augur.txt new file mode 100644 index 00000000000..88bba61615d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/clattering_augur.txt @@ -0,0 +1,12 @@ +Name:Clattering Augur +ManaCost:1 B +Types:Creature Skeleton Shaman +PT:1/1 +K:CARDNAME can't block. +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw a card and you lose 1 life. +SVar:TrigDraw:DB$ Draw | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 +A:AB$ ChangeZone | Cost$ 2 B B | ActivationZone$ Graveyard | Origin$ Graveyard | Destination$ Hand | SpellDescription$ Return CARDNAME from your graveyard to your hand. +SVar:SacMe:2 +SVar:DiscardMe:2 +Oracle:Clattering Augur can't block.\nWhen Clattering Augur enters the battlefield, you draw a card and you lose 1 life.\n{2}{B}{B}: Return Clattering Augur from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/combine_chrysalis.txt b/forge-gui/res/cardsfolder/upcoming/combine_chrysalis.txt new file mode 100644 index 00000000000..8150d92ad2f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/combine_chrysalis.txt @@ -0,0 +1,8 @@ +Name:Combine Chrysalis +ManaCost:G U +Types:Artifact +S:Mode$ Continuous | Affected$ Creature.token | AddKeyword$ Flying | Description$ Creature tokens you control have flying. +A:AB$ Token | Cost$ 2 G U T Sac<1/Permanent.token/token> | SorcerySpeed$ True | TokenScript$ g_4_4_beast | SpellDescription$ Create a 4/4 green Beast creature token. Activate only as a sorcery. +DeckNeeds:Ability$Token +DeckHas:Ability$Token +Oracle:Creature tokens you control have flying.\n{2}{G}{U}, {T}, Sacrifice a token: Create a 4/4 green Beast creature token. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt new file mode 100644 index 00000000000..e3319aa3907 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt @@ -0,0 +1,10 @@ +Name:Constable of the Realm +ManaCost:4 W +Types:Creature Giant Soldier +PT:3/3 +K:Renown:2 +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | CounterType$ P1P1 | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, exile up to one other target nonland permanent until CARDNAME leaves the battlefield. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Select up to one other target nonland permanent | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay +DeckHas:Ability$Counters +DeckHints:Ability$Counters & Ability$Proliferate +Oracle:Renown 2 (When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)\nWhenever one or more +1/+1 counters are put on Constable of the Realm, exile up to one other target nonland permanent until Constable of the Realm leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/dakkon_shadow_slayer.txt b/forge-gui/res/cardsfolder/upcoming/dakkon_shadow_slayer.txt new file mode 100644 index 00000000000..45e6e4cc95c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dakkon_shadow_slayer.txt @@ -0,0 +1,11 @@ +Name:Dakkon, Shadow Slayer +ManaCost:W U B +Types:Legendary Planeswalker Dakkon +Loyalty:0 +K:etbCounter:LOYALTY:X:no Condition:CARDNAME enters the battlefield with a number of loyalty counters on him equal to the number of lands you control. +SVar:X:Count$Valid Land.YouCtrl +A:AB$ Surveil | Cost$ AddCounter<1/LOYALTY> | Amount$ 2 | Planeswalker$ True | SpellDescription$ Surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +A:AB$ ChangeZone | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target creature. +A:AB$ ChangeZone | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ChangeType$ Artifact.YouOwn | ChangeNum$ 1 | Origin$ Hand,Graveyard | Destination$ Battlefield | StackDescription$ SpellDescription | SpellDescription$ You may put an artifact card from your hand or graveyard onto the battlefield. +DeckHints:Type$Artifact +Oracle:Dakkon, Shadow Slayer enters the battlefield with a number of loyalty counters on him equal to the number of lands you control.\n[+1]: Surveil 2.\n[−3]: Exile target creature.\n[-6]: You may put an artifact card from your hand or graveyard onto the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/damn.txt b/forge-gui/res/cardsfolder/upcoming/damn.txt new file mode 100644 index 00000000000..86fc0dcc6ee --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/damn.txt @@ -0,0 +1,6 @@ +Name:Damn +ManaCost:B B +Types:Sorcery +A:SP$ Destroy | Cost$ B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NoRegen$ True | SpellDescription$ Destroy target creature. A creature destroyed this way can't be regenerated. +A:SP$ DestroyAll | Cost$ 2 W W | ValidCards$ Creature | NoRegen$ True | SpellDescription$ Destroy each creature. A creature destroyed this way can't be regenerated. +Oracle:Destroy target creature. A creature destroyed this way can't be regenerated.\nOverload {2}{W}{W} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") diff --git a/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt new file mode 100644 index 00000000000..032cd61081d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt @@ -0,0 +1,8 @@ +Name:Darkmoss Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Darkmoss Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt new file mode 100644 index 00000000000..103cf04837c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt @@ -0,0 +1,9 @@ +Name:Dermotaxi +ManaCost:2 +Types:Artifact Vehicle +PT:0/0 +K:ETBReplacement:Other:Imprint +SVar:Imprint:DB$ ChangeZone | Imprint$ True | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Exile | Mandatory$ True | Hidden$ True | Chooser$ You | SpellDescription$ Imprint - As CARDNAME enters the battlefield, exile a creature card from a graveyard. +A:AB$ Clone | Cost$ tapXType<2/Creature> | Defined$ Imprinted | Duration$ UntilEndOfTurn | AddTypes$ Vehicle & Artifact | StackDescription$ Until end of turn, CARDNAME becomes a copy of {c:Imprinted}, except it’s a Vehicle artifact in addition to its other types. | SpellDescription$ Until end of turn, CARDNAME becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. +SVar:NeedsToPlay:Creature.inZoneGraveyard +Oracle:Imprint — As Dermotaxi enters the battlefield, exile a creature card from a graveyard.\nTap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/diamond_lion.txt b/forge-gui/res/cardsfolder/upcoming/diamond_lion.txt new file mode 100644 index 00000000000..d6dd235c1e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/diamond_lion.txt @@ -0,0 +1,7 @@ +Name:Diamond Lion +ManaCost:2 +Types:Artifact Creature Lion +PT:2/2 +A:AB$ Mana | Cost$ Discard<0/Hand> Sac<1/CARDNAME> | Produced$ Any | Amount$ 3 | InstantSpeed$ True | SpellDescription$ Add three mana of any one color. Activate only as an instant. +AI:RemoveDeck:All +Oracle:{T}, Discard your hand, Sacrifice Diamond Lion: Add three mana of any one color. Activate only as an instant. diff --git a/forge-gui/res/cardsfolder/upcoming/dihadas_ploy.txt b/forge-gui/res/cardsfolder/upcoming/dihadas_ploy.txt new file mode 100644 index 00000000000..96e30a1797b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dihadas_ploy.txt @@ -0,0 +1,11 @@ +Name:Dihada's Ploy +ManaCost:1 U B +Types:Instant +K:Jump-start +A:SP$ Draw | Cost$ 1 U B | NumCards$ 2 | SpellDescription$ Draw two cards, then discard a card. You gain life equal to the number of cards you've discarded this turn. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X +SVar:X:PlayerCountPropertyYou$CardsDiscardedThisTurn +DeckHas:Ability$Discard +DeckHints:Keyword$Madness & Ability$Delirium +Oracle:Draw two cards, then discard a card. You gain life equal to the number of cards you've discarded this turn.\nJump-start (You may cast this card from your graveyard by discarding a card in addition to paying its other costs. Then exile this card.) diff --git a/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt new file mode 100644 index 00000000000..a3dabc0f9e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt @@ -0,0 +1,10 @@ +Name:Discerning Taste +ManaCost:2 B +Types:Sorcery +A:SP$ Dig | DigNum$ 4 | DestinationZone2$ Graveyard | RememberMovedToZone$ 2 | SubAbility$ DBLifeGain | StackDescription$ SpellDescription | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$GreatestPowerGraveyard_Creature.IsRemembered +DeckHints:Ability$Graveyard +DeckHas:Ability$LifeGain +Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. diff --git a/forge-gui/res/cardsfolder/upcoming/disciple_of_the_sun.txt b/forge-gui/res/cardsfolder/upcoming/disciple_of_the_sun.txt new file mode 100644 index 00000000000..41d156b4097 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/disciple_of_the_sun.txt @@ -0,0 +1,8 @@ +Name:Disciple of the Sun +ManaCost:4 W +Types:Creature Human Cleric +PT:3/3 +K:Lifelink +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigReturn | TriggerDescription$ When CARDNAME enters the battlefield, return target permanent card with mana value 3 or less from your graveyard to your hand. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Permanent.YouCtrl+cmcLE3 | TgtPrompt$ Select target permanent card with mana value 3 in your graveyard | Origin$ Graveyard | Destination$ Hand +Oracle:Lifelink\nWhen Disciple of the Sun enters the battlefield, return target permanent card with mana value 3 or less from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/dragons_rage_channeler.txt b/forge-gui/res/cardsfolder/upcoming/dragons_rage_channeler.txt new file mode 100644 index 00000000000..e123553e454 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dragons_rage_channeler.txt @@ -0,0 +1,9 @@ +Name:Dragon's Rage Channeler +ManaCost:R +Types:Creature Human Shaman +PT:1/1 +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ DBSurveil | TriggerDescription$ Whenever you cast a noncreature spell, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) +SVar:DBSurveil:DB$ Surveil | Defined$ You | Amount$ 1 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying & CARDNAME attacks each combat if able. | Condition$ Delirium | Description$ Delirium — As long as there are four or more card types in your graveyard, CARDNAME gets +2/+2, has flying, and attacks each combat if able. +DeckHas:Ability$Delirium & Ability$Surveil +Oracle:Whenever you cast a noncreature spell, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.)\nDelirium — As long as there are four or more card types among cards in your graveyard, Dragon's Rage Channeler gets +2/+2, has flying, and attacks each combat if able. diff --git a/forge-gui/res/cardsfolder/upcoming/dress_down.txt b/forge-gui/res/cardsfolder/upcoming/dress_down.txt new file mode 100644 index 00000000000..859adf7117e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dress_down.txt @@ -0,0 +1,13 @@ +Name:Dress Down +ManaCost:1 U +Types:Enchantment +K:Flash +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Creature | RemoveAllAbilities$ True | Description$ All creatures lose all abilities. +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self +SVar:EndOfTurnLeavePlay:True +AI:RemoveDeck:Random +DeckHas:Ability$Sacrifice +Oracle:Flash\nWhen Dress Down enters the battlefield, draw a card.\nAll creatures lose all abilities.\nAt the beginning of the end step, sacrifice Dress Down. diff --git a/forge-gui/res/cardsfolder/upcoming/drey_keeper.txt b/forge-gui/res/cardsfolder/upcoming/drey_keeper.txt new file mode 100644 index 00000000000..ada59c2c187 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drey_keeper.txt @@ -0,0 +1,11 @@ +Name:Drey Keeper +ManaCost:3 B G +Types:Creature Elf Druid +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 green Squirrel creature tokens. +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_1_1_squirrel | TokenOwner$ You +A:AB$ PumpAll | Cost$ 3 B | ValidCards$ Squirrel.YouCtrl | NumAtt$ +1 | KW$ Menace | SpellDescription$ Squirrels you control get +1/+0 and gain menace until end of turn. +SVar:PlayMain1:TRUE +DeckNeeds:Type$Squirrel +DeckHas:Ability$Token +Oracle:When Drey Keeper enters the battlefield, create two 1/1 green Squirrel creature tokens.\n{3}{B}: Squirrels you control get +1/+0 and gain menace until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/drizzt_dourden.txt b/forge-gui/res/cardsfolder/upcoming/drizzt_dourden.txt new file mode 100644 index 00000000000..1fa2ed8d8eb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drizzt_dourden.txt @@ -0,0 +1,15 @@ +Name:Drizzt Do'Urden +Nickname:Drizzt +ManaCost:3 G W +Types:Legendary Creature Elf Ranger +PT:3/3 +K:Double Strike +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create Guenhwyvar, a legendary 4/1 green Cat creature token with trample. +SVar:TrigToken:DB$ Token | TokenScript$ guenhwyvar +T:Mode$ ChangesZone | ValidCard$ Creature.powerGTX | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature dies, if it had power greater than NICKNAME's power, put a number of +1/+1 counters on NICKNAME equal to the difference. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ Z +SVar:X:Count$CardPower +SVar:Y:TriggeredCard$CardPower +SVar:Z:SVar$Y/Minus.X +DeckHas:Ability$Token & Ability$Counters +Oracle:Double strike\nWhen Drizzt Do'Urden enters the battlefield, create Guenhwyvar, a legendary 4/1 green Cat creature token with trample.\nWhenever a creature dies, if it had power greater than Drizzt's power, put a number of +1/+1 counters on Drizzt equal to the difference. diff --git a/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt new file mode 100644 index 00000000000..3a35bfe6a8a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt @@ -0,0 +1,8 @@ +Name:Drossforge Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Drossforge Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/echoing_return.txt b/forge-gui/res/cardsfolder/upcoming/echoing_return.txt new file mode 100644 index 00000000000..d1f7eb45ce7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/echoing_return.txt @@ -0,0 +1,7 @@ +Name:Echoing Return +ManaCost:B +Types:Sorcery +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Hand | AILogic$ SameName | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature | SubAbility$ DBReturn | SpellDescription$ Return target creature card and all other cards with the same name as that card from your graveyard to your hand. | StackDescription$ Return {c:Targeted} and all other cards with the same name as that card from your graveyard to your hand. +SVar:DBReturn:DB$ ChangeZoneAll | Origin$ Graveyard | Destination$ Hand | Defined$ You | ChangeType$ TargetedCard.sameName +DeckHas:Ability$Graveyard +Oracle:Return target creature card and all other cards with the same name as that card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/endurance.txt b/forge-gui/res/cardsfolder/upcoming/endurance.txt new file mode 100644 index 00000000000..3aaed429e41 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/endurance.txt @@ -0,0 +1,10 @@ +Name:Endurance +ManaCost:1 G G +Types:Creature Elemental Incarnation +PT:3/4 +K:Flash +K:Reach +K:Evoke:ExileFromHand<1/Card.Green+Other> +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigBottom | TriggerDescription$ When CARDNAME enters the battlefield, up to one target player puts all the cards from their graveyard on the bottom of their library in a random order. +SVar:TrigBottom:DB$ ChangeZoneAll | ValidTgts$ Player | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target player | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Reveal$ False | RandomOrder$ True +Oracle:Flash\nReach\nWhen Endurance enters the battlefield, up to one target player puts all the cards from their graveyard on the bottom of their library in a random order.\nEvoke — Exile a green card from your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/esper_sentinel.txt b/forge-gui/res/cardsfolder/upcoming/esper_sentinel.txt new file mode 100644 index 00000000000..9baea341b1c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/esper_sentinel.txt @@ -0,0 +1,8 @@ +Name:Esper Sentinel +ManaCost:W +Types:Artifact Creature Human Soldier +PT:1/1 +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ Player.Opponent | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent casts their first noncreature spell each turn, draw a card unless that player pays {X}, where X is CARDNAME's power. +SVar:TrigDraw:DB$Draw | Defined$ You | UnlessCost$ X | UnlessPayer$ TriggeredPlayer | NumCards$ 1 +SVar:X:Count$CardPower +Oracle:Whenever an opponent casts their first noncreature spell each turn, draw a card unless that player pays {X}, where X is Esper Sentinel's power. diff --git a/forge-gui/res/cardsfolder/upcoming/etherium_spinner.txt b/forge-gui/res/cardsfolder/upcoming/etherium_spinner.txt new file mode 100644 index 00000000000..5221fa53952 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/etherium_spinner.txt @@ -0,0 +1,8 @@ +Name:Etherium Spinner +ManaCost:2 U +Types:Artifact Creature Human Wizard +PT:2/1 +T:Mode$ SpellCast | ValidCard$ Card.cmcGE4 | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell with mana value 4 or greater, create a 1/1 colorless Thopter artifact creature token with flying. +DeckHas:Ability$Token +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenScript$ c_1_1_a_thopter_flying | TokenAmount$ 1 +Oracle:Whenever you cast a spell with mana value 4 or greater, create a 1/1 colorless Thopter artifact creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/ethersworn_sphinx.txt b/forge-gui/res/cardsfolder/upcoming/ethersworn_sphinx.txt new file mode 100644 index 00000000000..69bdb1465ec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ethersworn_sphinx.txt @@ -0,0 +1,9 @@ +Name:Ethersworn Sphinx +ManaCost:7 W U +Types:Artifact Creature Sphinx +PT:4/4 +K:Affinity:Artifact +K:Flying +K:Cascade +DeckNeeds:Type$Artifact +Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nCascade (When you cast this spell, exile cards from the top of your library until you exile a nonland card with lesser mana value. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) diff --git a/forge-gui/res/cardsfolder/upcoming/fae_offering.txt b/forge-gui/res/cardsfolder/upcoming/fae_offering.txt new file mode 100644 index 00000000000..feade557e79 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fae_offering.txt @@ -0,0 +1,12 @@ +Name:Fae Offering +ManaCost:2 G +Types:Enchantment +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | CheckSVar$ Z | SVarCompare$ GE2 | Execute$ TrigTokenClue | TriggerDescription$ At the beginning of each end step, if you cast a creature and non-creature spell this turn, create a Clue token, a Food token, and a Treasure token. +SVar:TrigTokenClue:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_clue_draw | TokenOwner$ You | SubAbility$ TrigTokenFood +SVar:TrigTokenFood:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | SubAbility$ TrigTokenTreasure +SVar:TrigTokenTreasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You +SVar:X:Count$ThisTurnCast_Creature.YouCtrl/LimitMax.1 +SVar:Y:Count$ThisTurnCast_Card.nonCreature+YouCtrl/LimitMax.1 +SVar:Z:SVar$X/Plus.Y +DeckHas:Ability$Token +Oracle:At the beginning of each end step, if you cast a creature and non-creature spell this turn, create a Clue token, a Food token, and a Treasure token. diff --git a/forge-gui/res/cardsfolder/upcoming/fairgrounds_patrol.txt b/forge-gui/res/cardsfolder/upcoming/fairgrounds_patrol.txt new file mode 100644 index 00000000000..61a2ca2bf61 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fairgrounds_patrol.txt @@ -0,0 +1,7 @@ +Name:Fairgrounds Patrol +ManaCost:1 W +Types:Creature Human Soldier +PT:2/1 +A:AB$ Token | Cost$ 1 W ExileFromGrave<1/CARDNAME> | ActivationZone$ Graveyard | SorcerySpeed$ True | TokenScript$ c_1_1_a_thopter_flying | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying. Activate only as a sorcery. +DeckHas:Ability$Token & Type$Artifact +Oracle:{1}{W}, Exile Fairgrounds Patrol from your graveyard: Create a 1/1 colorless Thopter artifact creature token with flying. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/upcoming/fast_furious.txt b/forge-gui/res/cardsfolder/upcoming/fast_furious.txt new file mode 100644 index 00000000000..1f9a9947e0a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fast_furious.txt @@ -0,0 +1,16 @@ +Name:Fast +ManaCost:2 R +Types:Instant +A:SP$ Discard | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Discard a card, then draw two cards. +SVar:DBDraw:DB$ Draw | NumCards$ 2 +DeckHas:Ability$Discard +AlternateMode:Split +Oracle:Discard a card, then draw two cards. + +ALTERNATE + +Name:Furious +ManaCost:3 R R +Types:Sorcery +A:SP$ DamageAll | ValidCards$ Creature.withoutFlying | NumDmg$ 3 | ValidDescription$ each creature without flying | SpellDescription$ CARDNAME deals 3 damage to each creature without flying. +Oracle:Furious deals 3 damage to each creature without flying. diff --git a/forge-gui/res/cardsfolder/upcoming/feast_of_sanity.txt b/forge-gui/res/cardsfolder/upcoming/feast_of_sanity.txt new file mode 100644 index 00000000000..d2b09cf479e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/feast_of_sanity.txt @@ -0,0 +1,9 @@ +Name:Feast of Sanity +ManaCost:3 B +Types:Enchantment +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ Whenever you discard a card, CARDNAME deals 1 damage to any target and you gain 1 life. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 1 damage to any target and you gain 1 life. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 1 +DeckHints:Ability$Discard +DeckHas:Ability$LifeGain +Oracle:Whenever you discard a card, Feast of Sanity deals 1 damage to any target and you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/filigree_attendant.txt b/forge-gui/res/cardsfolder/upcoming/filigree_attendant.txt new file mode 100644 index 00000000000..8a3e21acab7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/filigree_attendant.txt @@ -0,0 +1,9 @@ +Name:Filigree Attendant +ManaCost:2 U U +Types:Artifact Creature Homunculus +PT:*/3 +K:Flying +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | Description$ CARDNAME's power is equal to the number of artifacts you control. +SVar:X:Count$Valid Artifact.YouCtrl +DeckHints:Type$Artifact +Oracle:Flying\nFiligree Attendant's power is equal to the number of artifacts you control. diff --git a/forge-gui/res/cardsfolder/upcoming/flame_blitz.txt b/forge-gui/res/cardsfolder/upcoming/flame_blitz.txt new file mode 100644 index 00000000000..6ab6cedf360 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flame_blitz.txt @@ -0,0 +1,7 @@ +Name:Flame Blitz +ManaCost:R +Types:Enchantment +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDealDamage | TriggerDescription$ At the beginning of your end step, CARDNAME deals 5 damage to each planeswalker. +SVar:TrigDealDamage:DB$ DamageAll | ValidCards$ Planeswalker | NumDmg$ 5 +K:Cycling:2 +Oracle:At the beginning of your end step, Flame Blitz deals 5 damage to each planeswalker.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/flametongue_yearling.txt b/forge-gui/res/cardsfolder/upcoming/flametongue_yearling.txt new file mode 100644 index 00000000000..c620655416a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flametongue_yearling.txt @@ -0,0 +1,13 @@ +Name:Flametongue Yearling +ManaCost:R R +Types:Creature Kavu +PT:2/1 +K:Multikicker:2 +K:etbCounter:P1P1:XKicked:no condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each time it was kicked. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals damage equal to its power to target creature. +SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ Y +SVar:X:Count$CardCounters.P1P1 +SVar:XKicked:Count$TimesKicked +SVar:Y:Count$CardPower +DeckHas:Ability$Counters +Oracle:Multikicker {2} (You may pay an additional {2} any number of times as you cast this spell.)\nFlametongue Yearling enters the battlefield with a +1/+1 counter on it for each time it was kicked.\nWhen Flametongue Yearling enters the battlefield, it deals damage equal to its power to target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/flay_essence.txt b/forge-gui/res/cardsfolder/upcoming/flay_essence.txt new file mode 100644 index 00000000000..7699e170589 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flay_essence.txt @@ -0,0 +1,8 @@ +Name:Flay Essence +ManaCost:1 B B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 1 B B | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | RememberLKI$ True | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBGainLife | SpellDescription$ Exile target creature or planeswalker. You gain life equal to the number of counters on it. +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:RememberedLKI$CardCounters.ALL +Oracle:Exile target creature or planeswalker. You gain life equal to the number of counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/floodhound.txt b/forge-gui/res/cardsfolder/upcoming/floodhound.txt new file mode 100644 index 00000000000..443cc611a91 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/floodhound.txt @@ -0,0 +1,7 @@ +Name:Floodhound +ManaCost:U +Types:Creature Elemental Dog +PT:1/2 +A:AB$ Investigate | Cost$ 3 T | SpellDescription$ Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") +DeckHints:Ability$Investigate & Ability$Token +Oracle:{3}, {T}: Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/upcoming/flourishing_strike.txt b/forge-gui/res/cardsfolder/upcoming/flourishing_strike.txt new file mode 100644 index 00000000000..1e8715c456f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flourishing_strike.txt @@ -0,0 +1,8 @@ +Name:Flourishing Strike +ManaCost:1 G +Types:Instant +K:Entwine:2 G +A:SP$ Charm | Choices$ DBDealDamage,DBPump +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature with flying. +SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | AILogic$ Pump | SpellDescription$ Target creature gets +3/+3 until end of turn. +Oracle:Choose one — \n• Flourishing Strike deals 5 damage to target creature with flying.\n• Target creature gets +3/+3 until end of turn.\nEntwine {2}{G} (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/fodder_tosser.txt b/forge-gui/res/cardsfolder/upcoming/fodder_tosser.txt new file mode 100644 index 00000000000..5684addf8a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fodder_tosser.txt @@ -0,0 +1,5 @@ +Name:Fodder Tosser +ManaCost:3 +Types:Artifact +A:AB$ DealDamage | Cost$ T Discard<1/Card> | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target player or planeswalker. +Oracle:{T}, Discard a card: Fodder Tosser deals 2 damage to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/foul_watcher.txt b/forge-gui/res/cardsfolder/upcoming/foul_watcher.txt new file mode 100644 index 00000000000..383f8ff8d69 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foul_watcher.txt @@ -0,0 +1,11 @@ +Name:Foul Watcher +ManaCost:1 U +Types:Creature Nightmare Bird +PT:1/2 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.) +SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 1 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | Condition$ Delirium | Description$ Delirium — CARDNAME gets +1/+0 as long as there are four or more card types among cards in your graveyard. +DeckHints:Ability$Graveyard & Ability$Discard +DeckHas:Ability$Delirium +Oracle:Flying\nWhen Foul Watcher enters the battlefield, surveil 1. (Look at the top card of your library. You may put that card into your graveyard.)\nDelirium — Foul Watcher gets +1/+0 as long as there are four or more card types among cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/foundry_helix.txt b/forge-gui/res/cardsfolder/upcoming/foundry_helix.txt new file mode 100644 index 00000000000..aae3b83227a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foundry_helix.txt @@ -0,0 +1,9 @@ +Name:Foundry Helix +ManaCost:1 R W +Types:Instant +A:SP$ DealDamage | Cost$ 1 R W Sac<1/Permanent> | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals 4 damage to any target. If the sacrificed permanent was an artifact, you gain 4 life. +SVar:DBGainLife:DB$ GainLife | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | LifeAmount$ 4 +SVar:X:Sacrificed$Valid Artifact +DeckHints:Type$Artifact +DeckHas:Ability$LifeGain +Oracle:As an additional cost to cast this spell, sacrifice a permanent.\nFoundry Helix deals 4 damage to any target. If the sacrificed permanent was an artifact, you gain 4 life. diff --git a/forge-gui/res/cardsfolder/upcoming/fractured_sanity.txt b/forge-gui/res/cardsfolder/upcoming/fractured_sanity.txt new file mode 100644 index 00000000000..1a4242fa1c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fractured_sanity.txt @@ -0,0 +1,9 @@ +Name:Fractured Sanity +ManaCost:U U U +Types:Sorcery +K:Cycling:1 U +A:SP$ Mill | Defined$ Opponent | NumCards$ 14 | SpellDescription$ Each opponent mills fourteen cards. +T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When you cycle CARDNAME, each opponent mills four cards. +SVar:TrigMill:DB$ Mill | Defined$ Opponent | NumCards$ 4 +DeckHas:Ability$Mill +Oracle:Each opponent mills fourteen cards.\nCycling {1}{U}\nWhen you cycle Fractured Sanity, each opponent mills four cards. diff --git a/forge-gui/res/cardsfolder/upcoming/funnel_web_recluse.txt b/forge-gui/res/cardsfolder/upcoming/funnel_web_recluse.txt new file mode 100644 index 00000000000..3d518131a51 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/funnel_web_recluse.txt @@ -0,0 +1,9 @@ +Name:Funnel-Web Recluse +ManaCost:4 G +Types:Creature Spider +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ Morbid | SVarCompare$ GE1 | Execute$ TrigInvestigate | TriggerDescription$ Morbid — When CARDNAME enters the battlefield, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") +SVar:TrigInvestigate:DB$ Investigate +SVar:Morbid:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature +DeckHas:Ability$Investigate & Ability$Token +Oracle:Reach\nMorbid — When Funnel-Web Recluse enters the battlefield, if a creature died this turn, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/upcoming/fury.txt b/forge-gui/res/cardsfolder/upcoming/fury.txt new file mode 100644 index 00000000000..5fb38c5d7e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fury.txt @@ -0,0 +1,9 @@ +Name:Fury +ManaCost:3 R R +Types:Creature Elemental Incarnation +PT:3/3 +K:Double Strike +K:Evoke:ExileFromHand<1/Card.Red+Other> +T:Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME enters the battlefield, it deals 4 damage divided as you choose among any number of target creatures and/or planeswalkers. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker to distribute damage to | NumDmg$ 4 | TargetMin$ 1 | TargetMax$ 4 | DividedAsYouChoose$ 4 +Oracle:Double strike\nEvoke—Exile a red card from your hand.\nWhen Fury enters the battlefield, it deals 4 damage divided as you choose among any number of target creatures and/or planeswalkers. diff --git a/forge-gui/res/cardsfolder/upcoming/gaeas_will.txt b/forge-gui/res/cardsfolder/upcoming/gaeas_will.txt new file mode 100644 index 00000000000..1fa90ce0dde --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gaeas_will.txt @@ -0,0 +1,11 @@ +Name:Gaea's Will +ManaCost:no cost +Types:Sorcery +Colors:green +K:Suspend:4:G +A:SP$ Effect | ReplacementEffects$ GraveToExile | StaticAbilities$ STPlay | AILogic$ YawgmothsWill | AINoRecursiveCheck$ True | SpellDescription$ Until end of turn, you may play lands and cast spells from your graveyard. If a card would be put into your graveyard from anywhere this turn, exile that card instead. +SVar:STPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.YouCtrl | AffectedZone$ Graveyard | MayPlay$ True | Description$ Until end of turn, you may play lands and cast spells from your graveyard. +SVar:GraveToExile:Event$ Moved | ActiveZones$ Command | Destination$ Graveyard | ValidCard$ Card.nonToken+YouOwn | ReplaceWith$ Exile | Description$ If a card would be put into your graveyard from anywhere this turn, exile it instead. +SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard +SVar:PlayMain1:ALWAYS +Oracle:Suspend 4 — {G}\nUntil end of turn, you may play lands and cast spells from your graveyard.\nIf a card would be put into your graveyard from anywhere this turn, exile that card instead. diff --git a/forge-gui/res/cardsfolder/upcoming/galvanic_relay.txt b/forge-gui/res/cardsfolder/upcoming/galvanic_relay.txt new file mode 100644 index 00000000000..f99f6bffed1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/galvanic_relay.txt @@ -0,0 +1,10 @@ +Name:Galvanic Relay +ManaCost:2 R +Types:Sorcery +K:Storm +A:SP$ Dig | Cost$ 2 R | Defined$ You | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBDelay | SpellDescription$ Exile the top card of your library. During your next turn, you may play that card. +SVar:DBDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ DBEffect | RememberObjects$ Remembered | Static$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ DelayTriggerRemembered | ForgetOnMoved$ Exile +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play the exiled card. +Oracle:Exile the top card of your library. During your next turn, you may play that card.\nStorm (When you cast this spell, copy it for each spell cast before it this turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/gargadon.txt b/forge-gui/res/cardsfolder/upcoming/gargadon.txt new file mode 100644 index 00000000000..c9746f750b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gargadon.txt @@ -0,0 +1,7 @@ +Name:Gargadon +ManaCost:5 R R +Types:Creature Beast +PT:7/5 +K:Trample +K:Suspend:4:1 R +Oracle:Trample\nSuspend {1}{R} (Rather than cast this card from your hand, pay {1}{R} and exile it with four time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost. It has haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/general_ferrous_rokiric.txt b/forge-gui/res/cardsfolder/upcoming/general_ferrous_rokiric.txt new file mode 100644 index 00000000000..eecc2939b9a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/general_ferrous_rokiric.txt @@ -0,0 +1,11 @@ +Name:General Ferrous Rokiric +ManaCost:1 R W +Types:Legendary Creature Human Soldier +PT:3/1 +K:Hexproof:Card.MonoColor:monocolored +T:Mode$ SpellCast | ValidCard$ Card.MultiColor | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a multicolored spell, create a 4/4 red and white Golem artifact creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenOwner$ You | TokenScript$ rw_4_4_a_golem +AI:RemoveDeck:Random +SVar:BuffedBy:Card.MultiColor +DeckHas:Ability$Token +Oracle:Hexproof from monocolored (This creature can't be the target of monocolored spells or abilities your opponents control.)\nWhenever you cast a multicolored spell, create a 4/4 red and white Golem artifact creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/geyadrone_dihada.txt b/forge-gui/res/cardsfolder/upcoming/geyadrone_dihada.txt new file mode 100644 index 00000000000..88354ea8189 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/geyadrone_dihada.txt @@ -0,0 +1,14 @@ +Name:Geyadrone Dihada +ManaCost:1 U B R +Types:Legendary Planeswalker Dihada +Loyalty:4 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Protection:Permanent.counters_GE1_CORRUPTION:Protection from permanents with corruption counters on them | Description$ Protection from permanents with corruption counters on them +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Choose up to one other target creature or planeswalker | ValidTgts$ Creature.Other,Planeswalker.Other | SubAbility$ DBLoseLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life. Put a corruption counter on up to one other target creature or planeswalker. +SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ CORRUPTION | CounterNum$ 1 +A:AB$ GainControl | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SubAbility$ DBPutCounter | SpellDescription$ Gain control of target creature or planeswalker until end of turn. Untap it and put a corruption counter on it. It gains haste until end of turn. +SVar:DBPutCounter:DB$PutCounter | Defined$ Targeted | CounterType$ CORRUPTION | CounterNum$ 1 +A:AB$ GainControl | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | AllValid$ Permanent.counters_GE1_CORRUPTION | SpellDescription$ Gain control of each permanent with a corruption counter on it. +DeckHas:Ability$LifeGain +Oracle:Protection from permanents with corruption counters on them\n[+1]: Each opponent loses 2 life and you gain 2 life. Put a corruption counter on up to one other target creature or planeswalker.\n[−3]: Gain control of target creature or planeswalker until end of turn. Untap it and put a corruption counter on it. It gains haste until end of turn.\n[−7]: Gain control of each permanent with a corruption counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt new file mode 100644 index 00000000000..3d3ef383fe9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt @@ -0,0 +1,9 @@ +Name:Ghost-Lit Drifter +ManaCost:2 U +Types:Creature Spirit +PT:2/2 +K:Flying +A:AB$ Pump | Cost$ 2 U | ValidTgts$ Creature.Other | KW$ Flying | TgtPrompt$ Select another target creature | SpellDescription$ Another target creature gains flying until end of turn. +A:AB$ Pump | Cost$ X U Discard<1/CARDNAME> | TargetMin$ X | TargetMax$ X | KW$ Flying | ValidTgts$ Creature | TgtPrompt$ Select X target creatures | ActivationZone$ Hand | PrecostDesc$ Channel — | SpellDescription$ X target creatures gain flying until end of turn. +SVar:X:Count$xPaid +Oracle:Flying\n{2}{U}: Another target creature gains flying until end of turn.\nChannel — {X}{U}, discard Ghost-Lit Drifter: X target creatures gain flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/glimpse_of_tomorrow.txt b/forge-gui/res/cardsfolder/upcoming/glimpse_of_tomorrow.txt new file mode 100644 index 00000000000..647384836c3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glimpse_of_tomorrow.txt @@ -0,0 +1,14 @@ +Name:Glimpse of Tomorrow +ManaCost:no cost +Types:Sorcery +Colors:red +K:Suspend:3:R R +A:SP$ ChangeZoneAll | ChangeType$ Permanent.YouOwn | Imprint$ True | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDig | SpellDescription$ Shuffle all permanents you own into your library, then reveal that many cards from the top of your library. Put all non-Aura permanent cards revealed this way onto the battlefield, then do the same for Aura cards, then put the rest on the bottom of your library in a random order. +SVar:DBDig:DB$ Dig | Defined$ You | NoMove$ True | DigNum$ WarpX | RememberRevealed$ True | Reveal$ True | SubAbility$ DBCleanImprint +SVar:DBCleanImprint:DB$ Cleanup | ClearImprinted$ True | SubAbility$ ChangePermanent +SVar:WarpX:Imprinted$Amount +SVar:ChangePermanent:DB$ ChangeZoneAll | ChangeType$ Permanent.nonAura+IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ ChangeEnchantment +SVar:ChangeEnchantment:DB$ ChangeZoneAll | ChangeType$ Aura.IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ GotoBottom +SVar:GotoBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +Oracle:Shuffle all permanents you own into your library, then reveal that many cards from the top of your library. Put all non-Aura permanent cards revealed this way onto the battlefield, then do the same for Aura cards, then put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/glinting_creeper.txt b/forge-gui/res/cardsfolder/upcoming/glinting_creeper.txt new file mode 100644 index 00000000000..4dbaee319dc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glinting_creeper.txt @@ -0,0 +1,10 @@ +Name:Glinting Creeper +ManaCost:4 G +Types:Creature Plant +PT:0/0 +K:etbCounter:P1P1:Y:no Condition:Converge — CARDNAME enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it. +K:CantBeBlockedBy Creature.powerLE2 +SVar:X:Count$Converge +SVar:Y:SVar$X/Twice +DeckHints:Ability$Counters +Oracle:Converge — Glinting Creeper enters the battlefield with a +1/+1 counter on it for each color of mana spent to cast it.\nGlinting Creeper can't be blocked by creautures with power 2 or less. diff --git a/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt new file mode 100644 index 00000000000..372a1f2b377 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt @@ -0,0 +1,11 @@ +Name:Glorious Enforcer +ManaCost:5 W W +Types:Creature Angel +PT:5/5 +K:Flying +K:Lifelink +T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigPump | CheckSVar$ Y | SVarCompare$ GTX | TriggerDescription$ At the beginning of each combat, if you have more life than an opponent, CARDNAME gains double strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Double Strike +SVar:X:PlayerCountOpponents$LowestLifeTotal +SVar:Y:Count$YourLifeTotal +Oracle:Flying, lifelink\nAt the beginning of each combat, if you have more life than an opponent, Glorious Enforcer gains double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_anarchomancer.txt b/forge-gui/res/cardsfolder/upcoming/goblin_anarchomancer.txt new file mode 100644 index 00000000000..3e8e7c532f8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_anarchomancer.txt @@ -0,0 +1,8 @@ +Name:Goblin Anarchomancer +ManaCost:R G +Types:Creature Goblin Shaman +PT:2/2 +S:Mode$ ReduceCost | ValidCard$ Card.Red,Card.Green | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Each spell you cast that's red or green costs {1} less to cast. +AI:RemoveDeck:Random +DeckNeeds:Color$Red & Color$Green +Oracle:Each spell you cast that's red or green costs {1} less to cast. diff --git a/forge-gui/res/cardsfolder/upcoming/goblin_traprunner.txt b/forge-gui/res/cardsfolder/upcoming/goblin_traprunner.txt new file mode 100644 index 00000000000..e933032c796 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goblin_traprunner.txt @@ -0,0 +1,9 @@ +Name:Goblin Traprunner +ManaCost:3 R +Types:Creature Goblin +PT:4/2 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigFlipCoins | TriggerDescription$ Whenever CARDNAME attacks, flip three coins. For each flip you win, create a 1/1 red Goblin creature token tapped and attacking. +SVar:TrigFlipCoins:DB$ FlipACoin | Amount$ 3 | WinSubAbility$ DBToken | RememberNumber$ Wins +SVar:DBToken:DB$ Token | TokenOwner$ You | TokenAmount$ Wins | TokenScript$ r_1_1_goblin | TokenTapped$ True | TokenAttacking$ True +DeckHas:Ability$Token +Oracle:Whenever Goblin Traprunner attacks, flip three coins. For each flip you win, create a 1/1 red Goblin creature token tapped and attacking. diff --git a/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt new file mode 100644 index 00000000000..bdfabe1f328 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt @@ -0,0 +1,8 @@ +Name:Goldmire Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Goldmire Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/grief.txt b/forge-gui/res/cardsfolder/upcoming/grief.txt new file mode 100644 index 00000000000..9d0c34c280b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grief.txt @@ -0,0 +1,9 @@ +Name:Grief +ManaCost:2 B B +Types:Creature Elemental Incarnation +PT:3/2 +K:Menace +K:Evoke:ExileFromHand<1/Card.Black+Other> +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRemove | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals their hand. You choose a nonland card from it. That player discards that card. +SVar:TrigRemove:DB$ Discard | ValidTgts$ Opponent | NumCards$ 1 | Mode$ RevealYouChoose | DiscardValid$ Card.nonLand | SpellDescription$ Target opponent reveals their hand. You choose a nonland card from it. That player discards that card. +Oracle:Menace\nWhen Grief enters the battlefield, target opponent reveals their hand. You choose a nonland card from it. That player discards that card.\nEvoke — Exile a black card from your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/grist_the_hunger_tide.txt b/forge-gui/res/cardsfolder/upcoming/grist_the_hunger_tide.txt new file mode 100644 index 00000000000..aa084668b9f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/grist_the_hunger_tide.txt @@ -0,0 +1,22 @@ +Name:Grist, the Hunger Tide +ManaCost:1 B G +Types:Legendary Planeswalker Grist +Loyalty:3 +S:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Command,Exile,Graveyard,Hand,Library,Stack | SetPower$ 1 | SetToughness$ 1 | AddType$ Creature & Insect | CharacteristicDefining$ True | Description$ As long as CARDNAME isn't on the battlefield, it's a 1/1 Insect creature in addition to its other types. +S:Mode$ Continuous | Affected$ Card.Self | AffectedZone$ Battlefield | RemoveType$ Creature | RemoveCreatureTypes$ True +A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | SubAbility$ DBRepeat | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. +SVar:DBRepeat:DB$ Repeat | RepeatSubAbility$ CleanupBegin | MaxRepeat$ MaxRepeats | RepeatCheckSVar$ MilledInsect | RepeatSVarCompare$ EQ1 | SubAbility$ DBCleanup +SVar:CleanupBegin:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBToken +SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ bg_1_1_insect | TokenOwner$ You | Planeswalker$ True | SubAbility$ DBMill | SpellDescription$ Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process. +SVar:DBMill:DB$ Mill | Defined$ You | NumCards$ 1 | RememberMilled$ True | SubAbility$ DBPutCounter +SVar:DBPutCounter:DB$PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card.Insect | ConditionCompare$ EQ1 +SVar:MaxRepeats:Count$InYourLibrary +SVar:MilledInsect:RememberedLKI$Valid Card.Insect +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:AB$ ImmediateTrigger | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Execute$ TrigDestroy | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You | UnlessSwitched$ True | SpellDescription$ You may sacrifice a creature. When you do, destroy target creature or planeswalker. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker +A:AB$ LoseLife | Cost$ SubCounter<5/LOYALTY> | LifeAmount$ X | Defined$ Player.Opponent | Planeswalker$ True | SpellDescription$ Each opponent loses life equal to the number of creature cards in your graveyard. +SVar:X:Count$TypeInYourYard.Creature +DeckHas:Ability$Token & Ability$Mill +DeckHints:Type$Insect +Oracle:As long as Grist, the Hunger Tide isn’t on the battlefield, it’s a 1/1 Insect creature in addition to its other types.\n[+1]: Create a 1/1 black and green Insect creature token, then mill a card. If an Insect card was milled this way, put a loyalty counter on Grist and repeat this process.\n[−2]: You may sacrifice a creature. When you do, destroy target creature or planeswalker.\n[−5]: Each opponent loses life equal to the number of creature cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/guardian_kirin.txt b/forge-gui/res/cardsfolder/upcoming/guardian_kirin.txt new file mode 100644 index 00000000000..7ad4d1460f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/guardian_kirin.txt @@ -0,0 +1,9 @@ +Name:Guardian Kirin +ManaCost:3 W +Types:Creature Kirin +PT:2/3 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever another creature you control dies, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Flying\nWhenever another creature you control dies, put a +1/+1 counter on Guardian Kirin. diff --git a/forge-gui/res/cardsfolder/upcoming/hard_evidence.txt b/forge-gui/res/cardsfolder/upcoming/hard_evidence.txt new file mode 100644 index 00000000000..b45cb039dc3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/hard_evidence.txt @@ -0,0 +1,7 @@ +Name:Hard Evidence +ManaCost:U +Types:Sorcery +A:SP$ Token | TokenAmount$ 1 | TokenScript$ u_0_3_crab | TokenOwner$ You | SubAbility$ DBInvestigate | SpellDescription$ Create a 0/3 blue Crab creature token. Investigate. +SVar:DBInvestigate:DB$ Investigate +DeckHas:Ability$Investigate & Ability$Token +Oracle:Create a 0/3 blue Crab creature token. Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt new file mode 100644 index 00000000000..27d66b0d212 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt @@ -0,0 +1,8 @@ +Name:Harmonic Prodigy +ManaCost:1 R +Types:Creature Human Wizard +PT:1/3 +K:Prowess +S:Mode$ Panharmonicon | ValidCard$ Shaman.YouCtrl,Wizard.Other+YouCtrl | Description$ If an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. +DeckHints:Type$Shaman|Wizard +Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nIf an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. diff --git a/forge-gui/res/cardsfolder/upcoming/healers_flock.txt b/forge-gui/res/cardsfolder/upcoming/healers_flock.txt new file mode 100644 index 00000000000..d2891596038 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/healers_flock.txt @@ -0,0 +1,7 @@ +Name:Healer's Flock +ManaCost:W W W +Types:Creature Bird +PT:3/3 +K:Flying +K:Lifelink +Oracle:Flying, lifelink diff --git a/forge-gui/res/cardsfolder/upcoming/herd_baloth.txt b/forge-gui/res/cardsfolder/upcoming/herd_baloth.txt new file mode 100644 index 00000000000..507a3b36ce7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/herd_baloth.txt @@ -0,0 +1,9 @@ +Name:Herd Baloth +ManaCost:3 G G +Types:Creature Beast +PT:4/4 +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, you may create a 4/4 green Beast creature token. +SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_4_4_beast | TokenOwner$ You +DeckHints:Ability$Counters +DeckHas:Ability$Token +Oracle:Whenever one or more +1/+1 counters are put on Herd Baloth, you may create a 4/4 green Beast creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/ignoble_hierarch.txt b/forge-gui/res/cardsfolder/upcoming/ignoble_hierarch.txt new file mode 100644 index 00000000000..cf1d84fdc14 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ignoble_hierarch.txt @@ -0,0 +1,9 @@ +Name:Ignoble Hierarch +ManaCost:G +Types:Creature Goblin Shaman +PT:0/1 +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:Exalted +Oracle:Exalted (Whenever a creature you control attacks alone, that creature gets +1/+1 until end of turn.)\n{T}: Add {B}, {R}, or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/inevitable_betrayal.txt b/forge-gui/res/cardsfolder/upcoming/inevitable_betrayal.txt new file mode 100644 index 00000000000..c1b7fcae660 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/inevitable_betrayal.txt @@ -0,0 +1,7 @@ +Name:Inevitable Betrayal +ManaCost:no cost +Types:Sorcery +Colors:blue +K:Suspend:3:1 U U +A:SP$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Creature | ChangeNum$ 1 | GainControl$ True | IsCurse$ True | StackDescription$ SpellDescription | SpellDescription$ Search target opponent's library for a creature card and put that card onto the battlefield under your control. Then that player shuffles. +Oracle:Suspend 3 — {1}{U}{U} (Rather than cast this card from your hand, pay {1}{U}{U} and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\nSearch target opponent's library for a creature card and put that card onto the battlefield under your control. Then that player shuffles. diff --git a/forge-gui/res/cardsfolder/upcoming/infuse_with_vitality.txt b/forge-gui/res/cardsfolder/upcoming/infuse_with_vitality.txt deleted file mode 100644 index 764df2925ed..00000000000 --- a/forge-gui/res/cardsfolder/upcoming/infuse_with_vitality.txt +++ /dev/null @@ -1,10 +0,0 @@ -Name:Infuse with Vitality -ManaCost:B G -Types:Instant -A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Triggers$ SupernaturalStaminaChangeZone | sVars$ SupernaturalStaminaTrigChangeZone | Defined$ ParentTarget -SVar:SupernaturalStaminaChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ SupernaturalStaminaTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. -SVar:SupernaturalStaminaTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy | SubAbility$ DBGainLife -SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 -DeckHas:Ability$LifeGain -Oracle:Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control."\nYou gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/jade_avenger.txt b/forge-gui/res/cardsfolder/upcoming/jade_avenger.txt new file mode 100644 index 00000000000..e2200ddb132 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/jade_avenger.txt @@ -0,0 +1,6 @@ +Name:Jade Avenger +ManaCost:1 G +Types:Creature Frog Samurai +PT:2/2 +K:Bushido:2 +Oracle:Bushido 2 (Whenever this creature blocks or becomes blocked, it gets +2/+2 until end of turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/junk_winder.txt b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt new file mode 100644 index 00000000000..bb2250d7694 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt @@ -0,0 +1,10 @@ +Name:Junk Winder +ManaCost:5 U U +Types:Creature Serpent +PT:5/6 +K:Affinity:Permanent.token:token +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.token+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent +DeckNeeds:Ability$Token +Oracle:Affinity for tokens (This spell costs {1} less to cast for each token you control.)\nWhenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/kaldra_compleat.txt b/forge-gui/res/cardsfolder/upcoming/kaldra_compleat.txt new file mode 100644 index 00000000000..8f2413724e8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kaldra_compleat.txt @@ -0,0 +1,10 @@ +Name:Kaldra Compleat +ManaCost:7 +Types:Legendary Artifact Equipment +K:Living Weapon +K:Indestructible +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 5 | AddToughness$ 5 | AddKeyword$ First Strike & Trample & Indestructible & Haste | AddTrigger$ TrigDamageDone | Description$ Equipped creature gets +5/+5 and has first strike, trample, indestructible, haste, and "Whenever this creature deals combat damage to a creature, exile that creature." +SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Creature | Execute$ TrigChangeZone | TriggerDescription$ Whenever this creature deals combat damage to a creature, exile that creature. +SVar:TrigChangeZone:DB$ ChangeZone | Defined$ TriggeredTarget | Origin$ Battlefield | Destination$ Exile +K:Equip:7 +Oracle:Living weapon\nIndestructible\nEquipped creature gets +5/+5 and has first strike, trample, indestructible, haste, and "Whenever this creature deals combat damage to a creature, exile that creature."\nEquip {7} diff --git a/forge-gui/res/cardsfolder/upcoming/kaleidoscorch.txt b/forge-gui/res/cardsfolder/upcoming/kaleidoscorch.txt new file mode 100644 index 00000000000..829a793341a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kaleidoscorch.txt @@ -0,0 +1,7 @@ +Name:Kaleidoscorch +ManaCost:1 R +Types:Sorcery +A:SP$ DealDamage | NumDmg$ X | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | SpellDescription$ Converge — CARDNAME deals X damage to any target, where X is the number of colors of mana spent to cast this spell. +SVar:X:Count$Converge +K:Flashback:4 R +Oracle:Converge - Radiant Flames deals X damage to any target, where X is the number of colors of mana spent to cast this spell.\nFlashback {4}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/kitchen_imp.txt b/forge-gui/res/cardsfolder/upcoming/kitchen_imp.txt new file mode 100644 index 00000000000..7b40dd0e3ce --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/kitchen_imp.txt @@ -0,0 +1,9 @@ +Name:Kitchen Imp +ManaCost:3 B +Types:Creature Imp +PT:2/2 +K:Flying +K:Haste +K:Madness:B +DeckHints:Ability$Discard +Oracle:Flying, haste\nMadness {B} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/knighted_myr.txt b/forge-gui/res/cardsfolder/upcoming/knighted_myr.txt new file mode 100644 index 00000000000..485db3fcf2b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knighted_myr.txt @@ -0,0 +1,10 @@ +Name:Knighted Myr +ManaCost:2 W +Types:Artifact Creature Myr Knight +PT:2/2 +K:Adapt:1:2 W +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | CounterType$ P1P1 | Execute$ TrigPump | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, it gains double strike until end of turn. +SVar:TrigPump:DB$ Pump | KW$ Double Strike +DeckHas:Ability$Counters +DeckHints:Ability$Counters +Oracle:{2}{W}: Adapt 1. (If this creature has no +1/+1 counters on it, put a +1/+1 counter on it.)\nWhenever one or more +1/+1 counters are put on Knighted Myr, it gains double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt new file mode 100644 index 00000000000..5720eadfbb0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt @@ -0,0 +1,8 @@ +Name:Landscaper Colos +ManaCost:5 W +Types:Creature Goat Beast +PT:4/6 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, put target card from an opponent's graveyard on the bottom of their library. +SVar:TrigChange:DB$ ChangeZone | ValidTgts$ Card.OppOwn | TgtPrompt$ Select target card in an opponent's graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 +K:TypeCycling:Basic:1 W +Oracle:When Landscaper Colos enters the battlefield, put target card from an opponent's graveyard on the bottom of their library.\nBasic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/late_to_dinner.txt b/forge-gui/res/cardsfolder/upcoming/late_to_dinner.txt new file mode 100644 index 00000000000..3872256d003 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/late_to_dinner.txt @@ -0,0 +1,7 @@ +Name:Late to Dinner +ManaCost:3 W +Types:Sorcery +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn | TgtPrompt$ Choose target creature card in your graveyard | SubAbility$ DBToken | SpellDescription$ Return target creature card from your graveyard to the battlefield. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:DBToken:DB$ Token | TokenScript$ c_a_food_sac +DeckHas:Ability$Graveyard & Ability$Token & Ability$Sacrifice & Ability$LifeGain +Oracle:Return target creature card from your graveyard to the battlefield. Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") diff --git a/forge-gui/res/cardsfolder/upcoming/lazotep_chancellor.txt b/forge-gui/res/cardsfolder/upcoming/lazotep_chancellor.txt new file mode 100644 index 00000000000..8cbd2d8246e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lazotep_chancellor.txt @@ -0,0 +1,9 @@ +Name:Lazotep Chancellor +ManaCost:U B +Types:Creature Zombie Wizard +PT:1/3 +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigAmass | TriggerDescription$ Whenever you cycle or discard a card, you may pay {1}. If you do, amass 2. +SVar:TrigAmass:DB$ Amass | Num$ 2 +DeckHints:Ability$Amass & Type$Zombie & Ability$Discard +DeckHas:Ability$Amass & Ability$Counters & Ability$Token +Oracle:Whenever you cycle or discard a card, you may pay {1}. If you do, amass 2. (Put two +1/+1 counters on an Army you control. If you don't control one, create a 0/0 black Zombie Army creature token first.) diff --git a/forge-gui/res/cardsfolder/upcoming/legion_vanguard.txt b/forge-gui/res/cardsfolder/upcoming/legion_vanguard.txt new file mode 100644 index 00000000000..2325b3a95d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/legion_vanguard.txt @@ -0,0 +1,7 @@ +Name:Legion Vanguard +ManaCost:1 B +Types:Creature Vampire Soldier +PT:2/2 +A:AB$ Explore | Cost$ 1 Sac<1/Creature.Other/another creature> | AILogic$ Aristocrat | SpellDescription$ CARDNAME explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.) +DeckHas:Ability$Counters +Oracle:{1}, Sacrifice another creature: Legion Vanguard explores. (Reveal the top card of your library. Put that card into your hand if it's a land. Otherwise, put a +1/+1 counter on this creature, then put the card back or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/lens_flare.txt b/forge-gui/res/cardsfolder/upcoming/lens_flare.txt new file mode 100644 index 00000000000..ca80a722bf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lens_flare.txt @@ -0,0 +1,6 @@ +Name:Lens Flare +ManaCost:4 W +Types:Instant +K:Affinity:Artifact +A:SP$ DealDamage | Cost$ 4 W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target attacking or blocking creature. +Oracle:Lens Flare deals 5 damage to target attacking or blocking creature. diff --git a/forge-gui/res/cardsfolder/upcoming/liquimetal_torque.txt b/forge-gui/res/cardsfolder/upcoming/liquimetal_torque.txt new file mode 100644 index 00000000000..ea6f47be152 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/liquimetal_torque.txt @@ -0,0 +1,7 @@ +Name:Liquimetal Torque +ManaCost:2 +Types:Artifact +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Animate | Cost$ T | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target permanent | Types$ Artifact | SpellDescription$ Target nonland permanent becomes an artifact in addition to its other types until end of turn. +AI:RemoveDeck:Random +Oracle:{T}: Add {C}.\n{T}: Target nonland permanent becomes an artifact in addition to its other types until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/lolth_spider_queen.txt b/forge-gui/res/cardsfolder/upcoming/lolth_spider_queen.txt new file mode 100644 index 00000000000..8014cced293 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lolth_spider_queen.txt @@ -0,0 +1,16 @@ +Name:Lolth, Spider Queen +ManaCost:3 B B +Types:Legendary Planeswalker Lolth +Loyalty:4 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a creature you control dies, put a loyalty counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ LOYALTY | CounterNum$ 1 +A:AB$ Draw | Cost$ AddCounter<0/LOYALTY> | NumCards$ 1 | SubAbility$ DBLoseLife1 | Planeswalker$ True | SpellDescription$ You draw a card and you lose 1 life. +SVar:DBLoseLife1:DB$ LoseLife | LifeAmount$ 1 +A:AB$ Token | Cost$ SubCounter<3/LOYALTY> | TokenAmount$ 2 | TokenScript$ b_2_1_spider_menace_reach | TokenOwner$ You | Planeswalker$ True | SpellDescription$ Create two 2/1 black Spider creature tokens with menace and reach. +A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Name$ Emblem - Lolth, Spider Queen | Triggers$ TrigLoseLife | Planeswalker$ True | Ultimate$ True | Duration$ Permanent | AILogic$ Main1 | SpellDescription$ You get an emblem with "Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference." +SVar:TrigLoseLife:Mode$ DamageDoneOnce | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | CombatDamage$ True | CheckSVar$ X | SVarCompare$ LT8 | Execute$ LoseLife | TriggerZones$ Command | TriggerDescription$ Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference. +SVar:LoseLife:DB$ LoseLife | Defined$ TriggeredTarget | LifeAmount$ Y | SubAbility$ Cleanup +SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:TriggeredTarget$LifeLostThisTurn +SVar:Y:SVar$X/NMinus.8 +Oracle:Whenever a creature you control dies, put a loyalty counter on Lolth, Spider Queen.\n[0]: You draw a card and you lose 1 life.\n[−3]: Create two 2/1 black Spider creature tokens with menace and reach.\n[−8]: You get an emblem with "Whenever an opponent is dealt combat damage by one or more creatures you control, if that player lost less than 8 life this turn, they lose life equal to the difference." diff --git a/forge-gui/res/cardsfolder/upcoming/lonis_cryptozoologist.txt b/forge-gui/res/cardsfolder/upcoming/lonis_cryptozoologist.txt new file mode 100644 index 00000000000..6344d89d46d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lonis_cryptozoologist.txt @@ -0,0 +1,15 @@ +Name:Lonis, Cryptozoologist +ManaCost:G U +Types:Legendary Creature Snake Elf Scout +PT:1/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+nonToken+Other | TriggerZones$ Battlefield | Execute$ TrigInvestigate | TriggerDescription$ Whenever another nontoken creature enters the battlefield under your control, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") +SVar:TrigInvestigate:DB$ Investigate +A:AB$ Dig | Cost$ T Sac | ValidTgts$ Player.Opponent | TgtPrompt$ Select target opponent | Reveal$ True | NoMove$ True | DigNum$ X | RememberRevealed$ True | DestinationZone$ Library | SubAbility$ PickOne | SpellDescription$ Target opponent reveals the top X cards of their library. You may put a nonland permanent card with mana value X or less from among them onto the battlefield under your control. That player puts the rest on the bottom of their library in a random order. +SVar:PickOne:DB$ ChooseCard | Defined$ You | Amount$ 1 | Mandatory$ True | ChoiceTitle$ Choose a nonland permanent to put on the battlefield under your control | Choices$ Permanent.nonLand+cmcLEX+IsRemembered | ChoiceZone$ Library | SubAbility$ MoveChosen +SVar:MoveChosen:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | GainControl$ True | Defined$ ChosenCard | SubAbility$ DBBottom +SVar:DBBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$xPaid +DeckHints:Ability$Investigate +DeckHas:Ability$Investigate & Ability$Token +Oracle:Whenever another nontoken creature enters the battlefield under your control, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")\n{T}, Sacrifice X Clues: Target opponent reveals the top X cards of their library. You may put a nonland permanent card with mana value X or less from among them onto the battlefield under your control. That player puts the rest on the bottom of their library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/lose_focus.txt b/forge-gui/res/cardsfolder/upcoming/lose_focus.txt new file mode 100644 index 00000000000..f7ca4210d41 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lose_focus.txt @@ -0,0 +1,6 @@ +Name:Lose Focus +ManaCost:1 U +Types:Instant +K:Replicate:U +A:SP$ Counter | Cost$ 1 U | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays {2}. +Oracle:Replicate {U} (When you cast this spell, copy it for each time you paid its replicate cost. You may choose new targets for the copies.)\nCounter target spell unless its controller pays {2}. diff --git a/forge-gui/res/cardsfolder/upcoming/lucid_dreams.txt b/forge-gui/res/cardsfolder/upcoming/lucid_dreams.txt new file mode 100644 index 00000000000..c1774174eb7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lucid_dreams.txt @@ -0,0 +1,7 @@ +Name:Lucid Dreams +ManaCost:3 U U +Types:Sorcery +A:SP$ Draw | NumCards$ X | SpellDescription$ Draw X cards, where X is the number of card types among cards in your graveyard. +SVar:X:Count$CardControllerTypes.Graveyard +DeckHints:Ability$Discard & Ability$Graveyard +Oracle:Draw X cards, where X is the number of card types among cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/marble_gargoyle.txt b/forge-gui/res/cardsfolder/upcoming/marble_gargoyle.txt new file mode 100644 index 00000000000..85532b78f94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/marble_gargoyle.txt @@ -0,0 +1,7 @@ +Name:Marble Gargoyle +ManaCost:2 W +Types:Artifact Creature Gargoyle +PT:2/2 +K:Flying +A:AB$ Pump | Cost$ W | NumDef$ 1 | SpellDescription$ CARDNAME gets +0/+1 until end of turn. +Oracle:Flying\n{W}: Marble Gargoyle gets +0/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/master_of_death.txt b/forge-gui/res/cardsfolder/upcoming/master_of_death.txt new file mode 100644 index 00000000000..2889df1d949 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/master_of_death.txt @@ -0,0 +1,11 @@ +Name:Master of Death +ManaCost:1 U B +Types:Creature Zombie Wizard +PT:3/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSurveil | TriggerDescription$ When CARDNAME enters the battlefield, surveil 2. (Look at the top two cards of your library, then put any number of them into your graveyard and the rest on top of your library in any order.) +SVar:TrigSurveil:DB$ Surveil | Defined$ You | Amount$ 2 +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | PresentPlayer$ You | TriggerZones$ Graveyard | OptionalDecider$ You | Execute$ TrigReturn | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay 1 life. If you do, return CARDNAME to your hand. +SVar:TrigReturn:AB$ChangeZone | Cost$ PayLife<1> | Defined$ Self | Origin$ Graveyard | Destination$ Hand +SVar:SacMe:2 +SVar:DiscardMe:1 +Oracle:When Master of Death enters the battlefield, surveil 2.\nAt the beginning of your upkeep, if Master of Death is in your graveyard, you may pay 1 life. If you do, return Master of Death to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/mental_journey.txt b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt new file mode 100644 index 00000000000..ceb40a54a56 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt @@ -0,0 +1,6 @@ +Name:Mental Journey +ManaCost:4 U U +Types:Instant +A:SP$ Draw | Cost$ 4 U U | NumCards$ 3 | SpellDescription$ Draw three cards. +K:TypeCycling:Basic:1 U +Oracle:Draw three cards.\nBasic landcycling {1}{U} ({1}{U}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt new file mode 100644 index 00000000000..d541d050c8e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt @@ -0,0 +1,8 @@ +Name:Mistvault Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Mistvault Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/moderation.txt b/forge-gui/res/cardsfolder/upcoming/moderation.txt new file mode 100644 index 00000000000..7c2f07bc1cc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/moderation.txt @@ -0,0 +1,7 @@ +Name:Moderation +ManaCost:1 W U +Types:Enchantment +S:Mode$ CantBeCast | ValidCard$ Card | Caster$ You | NumLimitEachTurn$ 1 | Description$ You can't cast more than one spell each turn. +T:Mode$ SpellCast | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerDescription$ Whenever you cast a spell, draw a card. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +Oracle:You can't cast more than one spell each turn.\nWhenever you cast a spell, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/monoskelion.txt b/forge-gui/res/cardsfolder/upcoming/monoskelion.txt new file mode 100644 index 00000000000..be1e58da78b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/monoskelion.txt @@ -0,0 +1,8 @@ +Name:Monoskelion +ManaCost:2 +Types:Artifact Creature Construct +PT:1/1 +K:etbCounter:P1P1:1 +A:AB$ DealDamage | AILogic$ Triskelion | Cost$ SubCounter<1/P1P1> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 1 | SpellDescription$ CARDNAME deals 1 damage to any target. +DeckHas:Ability$Counters +Oracle:Monoskelion enters the battlefield with a +1/+1 counter on it.\nRemove a +1/+1 counter from Monoskelion: It deals 1 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/mount_velus_manticore.txt b/forge-gui/res/cardsfolder/upcoming/mount_velus_manticore.txt new file mode 100644 index 00000000000..e1201774f06 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mount_velus_manticore.txt @@ -0,0 +1,12 @@ +Name:Mount Velus Manticore +ManaCost:2 R R +Types:Enchantment Creature Manticore +PT:3/4 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigDiscard | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of combat on your turn, you may discard a card. When you do, CARDNAME deals X damage to any target, where X is the number of card types the discarded card has. +SVar:TrigDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBImmediateTrigger +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | Execute$ TrigDamage | RememberObjects$ RememberedCard | SubAbility$ DBCleanup | TriggerDescription$ When you do, CARDNAME deals X damage to any target, where X is the number of card types the discarded card has. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X +SVar:X:Count$RememberedCardNumTypes +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AI:RemoveDeck:Random +Oracle:At the beginning of combat on your turn, you may discard a card. When you do, Mount Velus Manticore deals X damage to any target, where X is the number of card types the discarded card has. diff --git a/forge-gui/res/cardsfolder/upcoming/murktide_regent.txt b/forge-gui/res/cardsfolder/upcoming/murktide_regent.txt new file mode 100644 index 00000000000..d5628f94fc1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/murktide_regent.txt @@ -0,0 +1,13 @@ +Name:Murktide Regent +ManaCost:5 U U +Types:Creature Dragon +PT:3/3 +K:Delve +K:Flying +K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each instant and sorcery card exiled with it. +SVar:X:Count$ValidExile Instant.ExiledWithSource,Sorcery.ExiledWithSource +T:Mode$ ChangesZone | ValidCard$ Instant,Sorcery | Origin$ Graveyard | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an instant or sorcery card leaves your graveyard, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 +DeckNeeds:Type$Instant|Sorcery +DeckHas:Ability$Counters +Oracle:Delve (Each card you exile from your graveyard while casting this spell pays for {1}.)\nFlying\nMurktide Regent enters the battlefield with a +1/+1 counter on it for each instant and sorcery card exiled with it.\nWhenever an instant or sorcery card leaves your graveyard, put a +1/+1 counter on Murktide Regent. diff --git a/forge-gui/res/cardsfolder/upcoming/myr_scrapling.txt b/forge-gui/res/cardsfolder/upcoming/myr_scrapling.txt new file mode 100644 index 00000000000..46c5b2faab5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/myr_scrapling.txt @@ -0,0 +1,7 @@ +Name:Myr Scrapling +ManaCost:1 +Types:Artifact Creature Myr +PT:1/1 +A:AB$ PutCounter | Cost$ Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. +DeckHas:Ability$Counters +Oracle:Sacrifice Myr Scrapling: Put a +1/+1 counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt new file mode 100644 index 00000000000..7916287fbc3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt @@ -0,0 +1,8 @@ +Name:Mystic Redaction +ManaCost:2 U +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you discard a card, each opponent mills two cards. +SVar:TrigMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 2 +Oracle:At the beginning of your upkeep, scry 1.\nWhenever you discard a card, each opponent mills two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/necromancers_familiar.txt b/forge-gui/res/cardsfolder/upcoming/necromancers_familiar.txt new file mode 100644 index 00000000000..103d79a5022 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/necromancers_familiar.txt @@ -0,0 +1,10 @@ +Name:Necromancer's Familiar +ManaCost:3 B +Types:Creature Bird Spirit +PT:3/1 +K:Flying +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Lifelink | Condition$ Hellbent | Description$ Hellbent — CARDNAME has lifelink as long as you have no cards in hand. +A:AB$ Pump | Cost$ B Discard<1/Card> | Defined$ Self | KW$ Indestructible | SubAbility$ DBTap | SpellDescription$ CARDNAME gains indestructible until end of turn. Tap it. +SVar:DBTap:DB$ Tap | Defined$ Self +DeckHas:Ability$LifeGain +Oracle:Flying\nNecromancer's Familiar has lifelink as long as you have no cards in hand.\n{B}, Discard a card: CARDNAME gains indestructible until end of turn. Tap it. (Damage and effects that say "destroy" don't destroy it.) diff --git a/forge-gui/res/cardsfolder/upcoming/nettlecyst.txt b/forge-gui/res/cardsfolder/upcoming/nettlecyst.txt new file mode 100644 index 00000000000..fd5b56ebd6b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nettlecyst.txt @@ -0,0 +1,12 @@ +Name:Nettlecyst +ManaCost:3 +Types:Artifact Equipment +K:Living Weapon +K:Equip:2 +S:Mode$ Continuous | Affected$ Card.EquippedBy | AddPower$ X | AddToughness$ X | Description$ Equipped creature gets +1/+1 for each artifact and/or enchantment you control. +SVar:X:Count$Valid Artifact.YouCtrl,Enchantment.YouCtrl +SVar:NeedsToPlayVar:X GE1 +SVar:BuffedBy:Artifact,Enchantment +DeckHas:Ability$Token +DeckHints:Type$Artifact|Enchantment +Oracle:Living weapon (When this Equipment enters the battlefield, create a 0/0 black Germ creature token, then attach this to it.)\nEquipped creature gets +1/+1 for each artifact and/or enchantment you control.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/nykthos_paragon.txt b/forge-gui/res/cardsfolder/upcoming/nykthos_paragon.txt new file mode 100644 index 00000000000..6a8b8ca0839 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/nykthos_paragon.txt @@ -0,0 +1,10 @@ +Name:Nykthos Paragon +ManaCost:4 W W +Types:Enchantment Creature Human Soldier +PT:4/6 +T:Mode$ LifeGained | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounterAll | ActivationLimit$ 1 | OptionalDecider$ You | TriggerDescription$ Whenever you gain life, you may put that many +1/+1 counters on each creature you control. This ability triggers only once each turn. +SVar:TrigPutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.YouCtrl | CounterType$ P1P1 | CounterNum$ X +SVar:X:TriggerCount$LifeAmount +DeckNeeds:Ability$LifeGain +DeckHas:Ability$Counters +Oracle:Whenever you gain life, you may put that many +1/+1 counters on each creature you control. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/obsidian_charmaw.txt b/forge-gui/res/cardsfolder/upcoming/obsidian_charmaw.txt new file mode 100644 index 00000000000..d7ec9671a98 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/obsidian_charmaw.txt @@ -0,0 +1,10 @@ +Name:Obsidian Charmaw +ManaCost:3 R R +Types:Creature Dragon +PT:4/4 +K:Flying +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {1} more to cast for each land your opponents control that could produce {C}. +SVar:X:Count$Valid Land.OppCtrl+canProduceManaColor Colorless +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ When CARDNAME enters the battlefield, destroy target nonbasic land an opponent controls. +SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Land.nonBasic+OppCtrl | TgtPrompt$ Select target nonbasic land an opponent controls +Oracle:This spell costs {1} more to cast for each land your opponents control that could produce {C}.\nFlying\nWhen Obsidian Charmaw enters the battlefield, destroy target nonbasic land an opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/orchard_strider.txt b/forge-gui/res/cardsfolder/upcoming/orchard_strider.txt new file mode 100644 index 00000000000..3cf7f170d13 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/orchard_strider.txt @@ -0,0 +1,9 @@ +Name:Orchard Strider +ManaCost:4 G G +Types:Creature Treefolk +PT:6/4 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two Food tokens. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +SVar:TrigToken:DB$ Token | TokenScript$ c_a_food_sac | TokenAmount$ 2 +K:TypeCycling:Basic:1 G +DeckHas:Ability$Token & Ability$LifeGain +Oracle:When Orchard Strider enters the battlefield, create two Food tokens. (They're artifacts with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\nBasic landcycling {1}{G} ({1}{G}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/ornithopter_of_paradise.txt b/forge-gui/res/cardsfolder/upcoming/ornithopter_of_paradise.txt new file mode 100644 index 00000000000..aec50484b30 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ornithopter_of_paradise.txt @@ -0,0 +1,7 @@ +Name:Ornithopter of Paradise +ManaCost:2 +Types:Artifact Creature Thopter +PT:0/2 +K:Flying +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:Flying\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/out_of_time.txt b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt new file mode 100644 index 00000000000..1cc025d449b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt @@ -0,0 +1,15 @@ +Name:Out of Time +ManaCost:1 W W +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap all creatures, then phase them out until CARDNAME leaves the battlefield. Put a time counter on CARDNAME for each creature phased out this way. +SVar:TrigUntap:DB$ UntapAll | ValidCards$ Creature | RememberUntapped$ True | SubAbility$ DBPhase +SVar:DBPhase:DB$ Phases | Defined$ Remembered | WontPhaseInNormal$ True | ConditionPresent$ Card.Self | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ TrigComeBack | RememberObjects$ Remembered | ImprintCards$ Self | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnPhasedIn$ True | SubAbility$ DBPutCounter +SVar:TrigComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ DBPhaseIn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ These creatures phase out until CARDNAME leaves the battlefield. +SVar:DBPhaseIn:DB$ Phases | Defined$ Remembered | PhaseInOrOut$ True | SubAbility$ DBExileSelf +SVar:DBExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:DBPutCounter:DB$ PutCounter | CounterType$ TIME | CounterNum$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$RememberedSize +K:Vanishing:0 +Oracle:When Out of Time enters the battlefield, untap all creatures, then phase them out until Out of Time leaves the battlefield. Put a time counter on Out of Time for each creature phased out this way.\nVanishing (At the beginning of your upkeep, remove a time counter from this enchantment. When the last is removed, sacrifice it.) diff --git a/forge-gui/res/cardsfolder/upcoming/parcel_myr.txt b/forge-gui/res/cardsfolder/upcoming/parcel_myr.txt new file mode 100644 index 00000000000..d9d5950306d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/parcel_myr.txt @@ -0,0 +1,6 @@ +Name:Parcel Myr +ManaCost:1 U +Types:Artifact Creature Clue Myr +PT:2/1 +A:AB$ Draw | Cost$ 2 Sac<1/CARDNAME> | SpellDescription$ Draw a card. +Oracle:{2}, Sacrifice Parcel Myr: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/persist.txt b/forge-gui/res/cardsfolder/upcoming/persist.txt new file mode 100644 index 00000000000..5e8c524cc5d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/persist.txt @@ -0,0 +1,5 @@ +Name:Persist +ManaCost:1 B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 1 B | ValidTgts$ Creature.nonLegendary+YouCtrl | TgtPrompt$ Select target creature from your graveyard | Origin$ Graveyard | Destination$ Battlefield | WithCounters$ M1M1_1 | SpellDescription$ Choose target non-legendary creature card in your graveyard. Return it to the battlefield with a -1/-1 counter on it. +Oracle:Choose target non-legendary creature card in your graveyard. Return it to the battlefield with a -1/-1 counter on it. diff --git a/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt new file mode 100644 index 00000000000..d5ee0c86a3e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt @@ -0,0 +1,9 @@ +Name:Phantasmal Dreadmaw +ManaCost:2 U U +Types:Creature Dinosaur Illusion +PT:6/6 +K:Trample +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, sacrifice it. +SVar:TrigSac:DB$ Sacrifice | Defined$ Self +SVar:Targeting:Dies +Oracle:Trample\nWhen Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it. diff --git a/forge-gui/res/cardsfolder/upcoming/piercing_rays.txt b/forge-gui/res/cardsfolder/upcoming/piercing_rays.txt new file mode 100644 index 00000000000..c1827830d0e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/piercing_rays.txt @@ -0,0 +1,6 @@ +Name:Piercing Rays +ManaCost:1 W +Types:Sorcery +A:SP$ ChangeZone | Cost$ 1 W | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target tapped creature. +A:AB$ Tap | Cost$ 2 W Reveal<1/CARDNAME> | TgtPrompt$ Select target untapped creature | ValidTgts$ Creature.untapped | Forecast$ True | SpellDescription$ Tap target untapped creature. (Activate this ability only during your upkeep and only once each turn.) +Oracle:Exile target tapped creature.\nForecast — {2}{W}, Reveal Piercing Rays from your hand: Tap target untapped creature. (Activate this ability only during your upkeep and only once each turn.) diff --git a/forge-gui/res/cardsfolder/upcoming/piru_the_volatile.txt b/forge-gui/res/cardsfolder/upcoming/piru_the_volatile.txt new file mode 100644 index 00000000000..6894a141ada --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/piru_the_volatile.txt @@ -0,0 +1,10 @@ +Name:Piru, the Volatile +ManaCost:2 R R W W B B +Types:Legendary Creature Elder Dragon +PT:7/7 +K:Flying +K:Lifelink +K:UpkeepCost:R W B +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 7 damage to each nonlegendary creature. +SVar:TrigDamage:DB$ DamageAll | ValidCards$ Creature.nonLegendary | NumDmg$ 7 | ValidDescription$ each nonlegendary creature. +Oracle:Flying, lifelink\nAt the beginning of your upkeep, sacrifice Piru, the Volatile unless you pay {R}{W}{B}.\nWhen Piru dies, it deals 7 damage to each nonlegendary creature. diff --git a/forge-gui/res/cardsfolder/upcoming/portable_hole.txt b/forge-gui/res/cardsfolder/upcoming/portable_hole.txt new file mode 100644 index 00000000000..0147c3805f4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/portable_hole.txt @@ -0,0 +1,7 @@ +Name:Portable Hole +ManaCost:W +Types:Artifact +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls with mana value 2 or less until CARDNAME leaves the battlefield. +SVar:TrigExile:DB$ ChangeZone | ValidTgts$ Permanent.nonLand+OppCtrl+cmcLE2 | TgtPrompt$ Select target nonland permanent an opponent controls with mana value 2 or less | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay +SVar:PlayMain1:TRUE +Oracle:When Portable Hole enters the battlefield, exile target nonland permanent an opponent controls with mana value 2 or less until Portable Hole leaves the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/power_depot.txt b/forge-gui/res/cardsfolder/upcoming/power_depot.txt new file mode 100644 index 00000000000..8ffb95cb670 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/power_depot.txt @@ -0,0 +1,10 @@ +Name:Power Depot +ManaCost:no cost +Types:Artifact Land +K:CARDNAME enters the battlefield tapped. +K:Modular:1 +A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +A:AB$ Mana | Cost$ T | Produced$ Any | RestrictValid$ Spell.Artifact,Activated.Artifact | SpellDescription$ Add {C}. Spend this mana only to cast artifact spells or activate abilities of artifacts. +DeckHints:Type$Artifact +DeckHas:Ability$Counters +Oracle:Power Depot enters the battlefield tapped.\n{T}: Add {C}.\n{T}: Add {C}. Spend this mana only to cast artifact spells or activate abilities of artifacts.\nModular 1 (This land enters the battlefield with a +1/+1 counter on it. When it is put into a graveyard from the battlefield, you may put its +1/+1 counters on target artifact creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/power_word_kill.txt b/forge-gui/res/cardsfolder/upcoming/power_word_kill.txt new file mode 100644 index 00000000000..4d513f48e79 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/power_word_kill.txt @@ -0,0 +1,5 @@ +Name:Power Word Kill +ManaCost:1 B +Types:Instant +A:SP$ Destroy | Cost$ 1 B | ValidTgts$ Creature.nonAngel+nonDemon+nonDevil+nonDragon | TgtPrompt$ Select target non-Angel, non-Demon, non-Devil, non-Dragon creature | SpellDescription$ Destroy target non-Angel, non-Demon, non-Devil, non-Dragon creature. +Oracle:Destroy target non-Angel, non-Demon, non-Devil, non-Dragon creature. diff --git a/forge-gui/res/cardsfolder/upcoming/priest_of_fell_rites.txt b/forge-gui/res/cardsfolder/upcoming/priest_of_fell_rites.txt new file mode 100644 index 00000000000..39baadc1992 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/priest_of_fell_rites.txt @@ -0,0 +1,7 @@ +Name:Priest of Fell Rites +ManaCost:W B +Types:Creature Human Warlock +PT:2/2 +A:AB$ ChangeZone | Cost$ T PayLife<3> Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouCtrl | SorcerySpeed$ True | SpellDescription$ Return target creature card from your graveyard to the battlefield. +K:Unearth:3 W B +Oracle:{T}, Pay 3 life, Sacrifice Priest of Fell Rites: Return target creature card from your graveyard to the battlefield. Activate only as a sorcery.\nUnearth {3}{W}{B} ({3}{W}{B}: Return this card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. Unearth only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/prismatic_ending.txt b/forge-gui/res/cardsfolder/upcoming/prismatic_ending.txt new file mode 100644 index 00000000000..b4dba9beaf9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prismatic_ending.txt @@ -0,0 +1,8 @@ +Name:Prismatic Ending +ManaCost:X W +Types:Sorcery +A:SP$ ChangeZone | Cost$ X W | ValidTgts$ Permanent.nonLand | Origin$ Battlefield | Destination$ Exile | TgtPrompt$ Select target nonland permanent | ConditionDefined$ Targeted | ConditionPresent$ Permanent.nonLand+cmcLEY | ConditionCompare$ EQ1 | SpellDescription$ Exile target nonland permanent if its mana value is less than or equal to the number of colors of mana spent to cast this spell. +SVar:X:Count$xPaid +SVar:Y:Count$Converge +AI:RemoveDeck:All +Oracle:Converge — Exile target nonland permanent if its mana value is less than or equal to the number of colors of mana spent to cast this spell. diff --git a/forge-gui/res/cardsfolder/upcoming/profane_tutor.txt b/forge-gui/res/cardsfolder/upcoming/profane_tutor.txt new file mode 100644 index 00000000000..5187f4f4479 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/profane_tutor.txt @@ -0,0 +1,7 @@ +Name:Profane Tutor +ManaCost:no cost +Types:Sorcery +Colors:black +K:Suspend:2:1 B +A:SP$ ChangeZone | Cost$ 0 | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, put that card into your hand, then shuffle. +Oracle:Suspend 2—{1}{B} (Rather than cast this card from your hand, pay {1}{B} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\nSearch your library for a card, put that card into your hand, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/prophetic_titan.txt b/forge-gui/res/cardsfolder/upcoming/prophetic_titan.txt new file mode 100644 index 00000000000..5eebcdb16d6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prophetic_titan.txt @@ -0,0 +1,12 @@ +Name:Prophetic Titan +ManaCost:4 U R +Types:Creature Giant Wizard +PT:4/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Delirium — When CARDNAME enters the battlefield, choose one. If there are four or more card types in your graveyard, choose both. +SVar:TrigCharm:DB$ Charm | CharmNum$ X | Choices$ DBDealDamage,DBDig | AdditionalDescription$ If there are four or more card types in your graveyard, choose both. +SVar:DBDealDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker,Player | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target. +SVar:DBDig:DB$ Dig | DigNum$ 4 | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. Put one in your hand and the rest on the bottom of your library in a random order. +SVar:X:Count$Compare Y GE4.2.1 +SVar:Y:Count$CardControllerTypes.Graveyard +SVar:PlayMain1:TRUE +Oracle:Delirium — When Prophetic Titan enters the battlefield, choose one. If there are four or more card types in your graveyard, choose both.\n• Prophetic Titan deals 4 damage to any target.\n• Look at the top four cards of your library. Put one in your hand and the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/prosperous_innkeeper.txt b/forge-gui/res/cardsfolder/upcoming/prosperous_innkeeper.txt new file mode 100644 index 00000000000..069df635234 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/prosperous_innkeeper.txt @@ -0,0 +1,10 @@ +Name:Prosperous Innkeeper +ManaCost:1 G +Types:Creature Halfling Citizen +PT:1/1 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") +SVar:TrigToken:DB$ Token | TokenScript$ c_a_treasure_sac +T:Mode$ ChangesZone | ValidCard$ Creature.Other+YouCtrl | Destination$ Battlefield | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain 1 life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 1 +DeckHas:Ability$Token & Ability$LifeGain +Oracle:When Prosperous Innkeeper enters the battlefield, create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\nWhenever another creature enters the battlefield under your control, you gain 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/ragavan_nimble_pilferer.txt b/forge-gui/res/cardsfolder/upcoming/ragavan_nimble_pilferer.txt new file mode 100644 index 00000000000..b253965b27f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ragavan_nimble_pilferer.txt @@ -0,0 +1,12 @@ +Name:Ragavan, Nimble Pilferer +ManaCost:R +Types:Legendary Creature Monkey Pirate +PT:2/1 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigTreasure | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, create a Treasure token and exile the top card of that player's library. Until end of turn, you may cast that card. +SVar:TrigTreasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You | SubAbility$ TrigExile +SVar:TrigExile:DB$ Dig | Defined$ TriggeredTarget | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | ForgetOnMoved$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AffectedZone$ Exile | Description$ Until end of turn, you may cast that card and you may spend mana as though it were mana of any color to cast that spell. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +K:Dash:1 R +Oracle:Whenever Ragavan, Nimble Pilferer deals combat damage to a player, create a Treasure token and exile the top card of that player's library. Until end of turn, you may cast that card.\nDash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) diff --git a/forge-gui/res/cardsfolder/upcoming/rakdos_headliner.txt b/forge-gui/res/cardsfolder/upcoming/rakdos_headliner.txt new file mode 100644 index 00000000000..6f51fae7098 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rakdos_headliner.txt @@ -0,0 +1,7 @@ +Name:Rakdos Headliner +ManaCost:B R +Types:Creature Devil +PT:3/3 +K:Haste +K:Echo:Discard<1/Card> +Oracle:Haste\nEcho — Discard a card. (At the beginning of your upkeep, if this came under your control since the beginning of your last upkeep, sacrifice it unless you pay its echo cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/ravenous_squirrel.txt b/forge-gui/res/cardsfolder/upcoming/ravenous_squirrel.txt new file mode 100644 index 00000000000..44060d47674 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ravenous_squirrel.txt @@ -0,0 +1,10 @@ +Name:Ravenous Squirrel +ManaCost:BG +Types:Creature Squirrel +PT:1/1 +T:Mode$ Sacrificed | ValidCard$ Artifact.YouCtrl,Creature.YouCtrl | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you sacrifice an artifact or creature, put a +1/+1 counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +A:AB$ GainLife | Cost$ 1 B G Sac<1/Artifact;Creature/artifact or creature> | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | SpellDescription$ You gain 1 life and draw a card. +SVar:DBDraw:DB$ Draw | NumCards$ 1 +DeckHas:Ability$Sacrifice & Ability$Counters & Ability$LifeGain +Oracle:Whenever you sacrifice an artifact or creature, put a +1/+1 counter on Ravenous Squirrel.\n{1}{B}{G}, Sacrifice an artifact or creature: You gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/raving_visionary.txt b/forge-gui/res/cardsfolder/upcoming/raving_visionary.txt new file mode 100644 index 00000000000..e7a9c2ae2d4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/raving_visionary.txt @@ -0,0 +1,10 @@ +Name:Raving Visionary +ManaCost:1 U +Types:Creature Merfolk Wizard +PT:1/1 +A:AB$ Draw | Cost$ U T | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard +SVar:DBDiscard:DB$Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1 +A:AB$ Draw | Cost$ 2 U T | NumCards$ 1 | Activation$ Delirium | PrecostDesc$ Delirium — | SpellDescription$ Draw a card. Activate this ability only if there are four or more card types among cards in your graveyard. +DeckHints:Ability$Graveyard & Ability$Discard +DeckHas:Ability$Delirium +Oracle:{U}{T}: Draw a card, then discard a card.\nDelirium — {2}{U}, {T}: Draw a card. Activate this ability only if there are four or more card types among cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt new file mode 100644 index 00000000000..a5fad386479 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt @@ -0,0 +1,8 @@ +Name:Razortide Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Razortide Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/resurgent_belief.txt b/forge-gui/res/cardsfolder/upcoming/resurgent_belief.txt new file mode 100644 index 00000000000..887e262f7ef --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/resurgent_belief.txt @@ -0,0 +1,9 @@ +Name:Resurgent Belief +ManaCost:no cost +Types:Sorcery +Colors:white +K:Suspend:2:1 W +A:SP$ ChangeZoneAll | ChangeType$ Enchantment.YouOwn | Origin$ Graveyard | Destination$ Battlefield | SpellDescription$ Return all enchantment cards from your graveyard to the battlefield. (Auras with nothing to enchant remain in your graveyard.) +DeckNeeds:Type$Enchantment +AI:RemoveDeck:Random +Oracle:Suspend 2 — {1}{W} (Rather than cast this card from your hand, pay {1}{W} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\nReturn all enchantment cards from your graveyard to the battlefield. (Auras with nothing to enchant remain in your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/rift_sower.txt b/forge-gui/res/cardsfolder/upcoming/rift_sower.txt new file mode 100644 index 00000000000..95609684341 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rift_sower.txt @@ -0,0 +1,7 @@ +Name:Rift Sower +ManaCost:2 G +Types:Creature Elf Druid +PT:1/3 +K:Suspend:2:G +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +Oracle:{T}: Add one mana of any color.\nSuspend 2—{G} (Rather than cast this card from your hand, you may pay {G} and exile it with two time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/rise_and_shine.txt b/forge-gui/res/cardsfolder/upcoming/rise_and_shine.txt new file mode 100644 index 00000000000..6f5fdd84be2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rise_and_shine.txt @@ -0,0 +1,10 @@ +Name:Rise and Shine +ManaCost:1 U +Types:Sorcery +A:SP$ Animate | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select target noncreature artifact you control | Types$ Artifact,Creature | Duration$ Permanent | Power$ 0 | Toughness$ 0 | RememberAnimated$ True | SubAbility$ DBPutCounter | StackDescription$ {c:Targeted} becomes a 0/0 artifact creature. | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on each artifact that became a creature this way. +A:SP$ AnimateAll | Cost$ 4 U U | ValidCards$ Artifact.nonCreature+YouCtrl | Types$ Artifact,Creature | Duration$ Permanent | Power$ 0 | Toughness$ 0 | PrecostDesc$ Overload | CostDesc$ {4}{U}{U} | NonBasicSpell$ True | RememberAnimated$ True | SubAbility$ DBPutCounter | StackDescription$ Each noncreature artifact {p:You} controls becomes a 0/0 artifact creature. | SpellDescription$ (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") +SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 4 | SubAbility$ DBCleanup | StackDescription$ {p:You} puts four +1/+1 counters on each artifact that became a creature this way. | SpellDescription$ Put four +1/+1 counters on each artifact that became a creature this way. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Counters +DeckNeeds:Type$Artifact +Oracle:Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on each artifact that became a creature this way.\nOverload {4}{U}{U} (You may cast this spell for its overload cost. If you do, change its text by replacing all instances of "target" with "each.") diff --git a/forge-gui/res/cardsfolder/upcoming/rishadan_dockhand.txt b/forge-gui/res/cardsfolder/upcoming/rishadan_dockhand.txt new file mode 100644 index 00000000000..1ecdc9a1d78 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rishadan_dockhand.txt @@ -0,0 +1,7 @@ +Name:Rishadan Dockhand +ManaCost:U +Types:Creature Merfolk +PT:1/2 +K:Islandwalk +A:AB$ Tap | Cost$ 1 T | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Tap target land. +Oracle:Islandwalk\n{1}, {T}: Tap target land. diff --git a/forge-gui/res/cardsfolder/upcoming/road_ruin.txt b/forge-gui/res/cardsfolder/upcoming/road_ruin.txt new file mode 100644 index 00000000000..146d84a0849 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/road_ruin.txt @@ -0,0 +1,16 @@ +Name:Road +ManaCost:2 G +AlternateMode: Split +Types:Instant +A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | Tapped$ True | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. +Oracle:Search your library for a basic land card, put it onto the battlefield tapped, then shuffle. + +ALTERNATE + +Name:Ruin +ManaCost:1 R R +Types:Sorcery +K:Aftermath +A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ X | SpellDescription$ CARDNAME deals damage to target creature equal to the number of lands you control. +SVar:X:Count$TypeYouCtrl.Land +Oracle:Ruin deals damage to target creature equal to the number of lands you control. diff --git a/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt new file mode 100644 index 00000000000..c5a0e5b9015 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt @@ -0,0 +1,8 @@ +Name:Rustvale Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Rustvale Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/upcoming/said_done.txt b/forge-gui/res/cardsfolder/upcoming/said_done.txt new file mode 100644 index 00000000000..ef8f83e66cf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/said_done.txt @@ -0,0 +1,15 @@ +Name:Said +ManaCost:2 U +AlternateMode: Split +Types:Sorcery +A:SP$ ChangeZone | Cost$ 2 U | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SpellDescription$ Return target instant or sorcery card from your graveyard to your hand. +Oracle:Return target instant or sorcery card from your graveyard to your hand. + +ALTERNATE + +Name:Done +ManaCost:3 U +Types:Instant +A:SP$ Tap | Cost$ 3 U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose up to two target creatures | ValidTgts$ Creature | SubAbility$ TrigPump | StackDescription$ SpellDescription | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | StackDescription$ None +Oracle:Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/sanctifier_en_vec.txt b/forge-gui/res/cardsfolder/upcoming/sanctifier_en_vec.txt new file mode 100644 index 00000000000..3c5f3cc57d5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sanctifier_en_vec.txt @@ -0,0 +1,12 @@ +Name:Sanctifier en-Vec +ManaCost:W W +Types:Creature Human Cleric +PT:2/2 +K:Protection from black +K:Protection from red +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZoneAll | TriggerDescription$ When CARDNAME enters the battlefield, exile all cards that are black or red from all graveyards. +SVar:TrigChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.Black,Card.Red | Origin$ Graveyard | Destination$ Exile +R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Black,Card.Red | ReplaceWith$ Exile | Description$ If a black or red permanent, spell, or card not on the battlefield would be put into a graveyard, exile it instead. +SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard +SVar:NonStackingEffect:True +Oracle:Protection from black and from red\nWhen Sanctifier en-Vec enters the battlefield, exile all cards that are black or red from all graveyards.\nIf a black or red permanent, spell, or card not on the battlefield would be put into a graveyard, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/sanctuary_raptor.txt b/forge-gui/res/cardsfolder/upcoming/sanctuary_raptor.txt new file mode 100644 index 00000000000..906008e3bf6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sanctuary_raptor.txt @@ -0,0 +1,9 @@ +Name:Sanctuary Raptor +ManaCost:3 +Types:Artifact Creature Bird +PT:2/1 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | IsPresent$ Permanent.token+YouCtrl | PresentCompare$ GE3 | TriggerDescription$ Whenever CARDNAME attacks, if you control three or more tokens, CARDNAME gets +2/+0 and gains first strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | KW$ First Strike +DeckHints:Ability$Token +Oracle:Whenever Sanctuary Raptor attacks, if you control three or more tokens, Sanctuary Raptor gets +2/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/sanctum_weaver.txt b/forge-gui/res/cardsfolder/upcoming/sanctum_weaver.txt new file mode 100644 index 00000000000..8e395cc5114 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sanctum_weaver.txt @@ -0,0 +1,7 @@ +Name:Sanctum Weaver +ManaCost:1 G +Types:Enchantment Creature Dryad +PT:0/2 +A:AB$ Mana | Cost$ T | Produced$ Any | Amount$ X | SpellDescription$ Add X mana of any one color, where X is the number of enchantments you control. +SVar:X:Count$Valid Enchantment.YouCtrl +Oracle:{T}: Add X mana of any one color, where X is the number of enchantments you control. diff --git a/forge-gui/res/cardsfolder/upcoming/scion_of_draco.txt b/forge-gui/res/cardsfolder/upcoming/scion_of_draco.txt new file mode 100644 index 00000000000..4db6c4d7153 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scion_of_draco.txt @@ -0,0 +1,13 @@ +Name:Scion of Draco +ManaCost:12 +Types:Artifact Creature Dragon +PT:4/4 +K:Flying +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ Domain — This spell costs {2} less to cast for each basic land type among lands you control. +S:Mode$ Continuous | Affected$ Creature.White+YouCtrl | AddKeyword$ Vigilance | Description$ Each creature you control gains vigilance if it's white. +S:Mode$ Continuous | Affected$ Creature.Blue+YouCtrl | AddKeyword$ Hexproof | Description$ Each creature you control gains hexproof if it's blue. +S:Mode$ Continuous | Affected$ Creature.Black+YouCtrl | AddKeyword$ Lifelink | Description$ Each creature you control gains lifelink if it's black. +S:Mode$ Continuous | Affected$ Creature.Red+YouCtrl | AddKeyword$ First strike | Description$ Each creature you control gains first strike if it's red. +S:Mode$ Continuous | Affected$ Creature.Green+YouCtrl | AddKeyword$ Trample | Description$ Each creature you control gains trample if it's green. +SVar:X:Count$Domain/Twice +Oracle:Domain — This spell costs {2} less to cast for each basic land type among lands you control.\nFlying\nEach creature you control gains vigilance if it’s white, hexproof if it’s blue, lifelink if it’s black, first strike if it’s red, and trample if it’s green. diff --git a/forge-gui/res/cardsfolder/upcoming/scour_the_desert.txt b/forge-gui/res/cardsfolder/upcoming/scour_the_desert.txt new file mode 100644 index 00000000000..a5dbe6d8462 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scour_the_desert.txt @@ -0,0 +1,8 @@ +Name:Scour the Desert +ManaCost:3 W W +Types:Sorcery +A:SP$ ChangeZone | Cost$ 3 W W | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Creature.YouOwn | TgtPrompt$ Choose target creature card in your graveyard | SubAbility$ DBToken | SpellDescription$ Exile target creature card from your graveyard. Create X 1/1 white Bird creature tokens, where X is the exiled card's toughness. +SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ w_1_1_bird_flying | TokenOwner$ You +SVar:X:Targeted$CardToughness +DeckHas:Ability$Token +Oracle:Exile target creature card from your graveyard. Create X 1/1 white Bird creature tokens, where X is the exiled card's toughness. diff --git a/forge-gui/res/cardsfolder/upcoming/scurry_oak.txt b/forge-gui/res/cardsfolder/upcoming/scurry_oak.txt new file mode 100644 index 00000000000..c0f553b7ed0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scurry_oak.txt @@ -0,0 +1,10 @@ +Name:Scurry Oak +ManaCost:2 G +Types:Creature Treefolk +PT:1/2 +K:Evolve +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | TriggerZones$ Battlefield | CounterType$ P1P1 | OptionalDecider$ You | Execute$ TrigSquirrel | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, you may create a 1/1 green Squirrel creature token. +SVar:TrigSquirrel:DB$ Token | TokenAmount$ 1 | TokenScript$ g_1_1_squirrel | TokenOwner$ You +DeckHints:Ability$Counters +DeckHas:Ability$Token & Ability$Counters +Oracle:Evolve (Whenever a creature enters the battlefield under your control, if that creature has greater power or toughness than this creature, put a +1/+1 counter on this creature.)\nWhenever one or more +1/+1 counters are put on Scurry Oak, you may create a 1/1 green Squirrel creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/scuttletide.txt b/forge-gui/res/cardsfolder/upcoming/scuttletide.txt new file mode 100644 index 00000000000..e9406271530 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/scuttletide.txt @@ -0,0 +1,7 @@ +Name:Scuttletide +ManaCost:1 U +Types:Enchantment +A:AB$ Token | Cost$ 1 Discard<1/Card> | TokenAmount$ 1 | TokenScript$ u_0_3_crab | TokenOwner$ You | SpellDescription$ Create a 0/3 blue Crab creature token. +S:Mode$ Continuous | Affected$ Crab.YouCtrl | AddPower$ 1 | AddToughness$ 1 | Condition$ Delirium | Description$ Delirium — Crabs you control get +1/+1 as long as there are four or more card types among cards in your graveyard. +DeckHas:Ability$Token +Oracle:{1}, Discard a card: Create a 0/3 blue Crab creature token.\nDelirium — Crabs you control get +1/+1 as long as there are four or more card types among cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/search_the_premises.txt b/forge-gui/res/cardsfolder/upcoming/search_the_premises.txt new file mode 100644 index 00000000000..ebd7af96e6c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/search_the_premises.txt @@ -0,0 +1,7 @@ +Name:Search the Premises +ManaCost:2 W +Types:Enchantment +T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigInvestigate | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.) +SVar:TrigInvestigate:DB$ Investigate +DeckHas:Ability$Investigate & Ability$Token +Oracle:Whenever a creature attacks you or a planeswalker you control, investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt new file mode 100644 index 00000000000..0f5d4e890b8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt @@ -0,0 +1,10 @@ +Name:Serra's Emissary +ManaCost:4 W W W +Types:Creature Angel +PT:7/7 +K:Flying +K:ETBReplacement:Other:ChooseCT +SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose a card type. +S:Mode$ Continuous | Affected$ You,Creature.YouCtrl | AddKeyword$ Protection from ChosenType | Description$ You and creatures you control have protection from the chosen type. +SVar:PlayMain1:TRUE +Oracle:As Serra's Emissary enters the battlefield, choose a card type. \nYou and creatures you control have protection from the chosen type. diff --git a/forge-gui/res/cardsfolder/upcoming/shattered_ego.txt b/forge-gui/res/cardsfolder/upcoming/shattered_ego.txt new file mode 100644 index 00000000000..33fe02bbc95 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/shattered_ego.txt @@ -0,0 +1,8 @@ +Name:Shattered Ego +ManaCost:U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -3 | Description$ Enchanted creature gets -3/-0. +A:AB$ ChangeZone | Cost$ 3 U U | Defined$ Enchanted | Origin$ Battlefield | Destination$ Library | LibraryPosition$ 2 | SpellDescription$ Put enchanted creature into its owner's library third from the top. +Oracle:Enchant creature\nEnchanted creature gets -3/-0.\n{3}{U}{U}: Put enchanted creature into its owner's library third from the top. diff --git a/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt new file mode 100644 index 00000000000..2e7a7f50f34 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt @@ -0,0 +1,8 @@ +Name:Silverbluff Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Silverbluff Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/skophos_reaver.txt b/forge-gui/res/cardsfolder/upcoming/skophos_reaver.txt new file mode 100644 index 00000000000..f24b76a54a2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skophos_reaver.txt @@ -0,0 +1,8 @@ +Name:Skophos Reaver +ManaCost:2 R +Types:Creature Minotaur Warrior +PT:2/3 +K:Madness:1 R +S:Mode$ Continuous | Affected$ Card.Self | Condition$ PlayerTurn | AddPower$ 2 | Description$ As long as it's your turn, CARDNAME gets +2/+0. +DeckHints:Ability$Discard +Oracle:As long as it's your turn, Skophos Reaver gets +2/+0.\nMadness {1}{R} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/skyblades_boon.txt b/forge-gui/res/cardsfolder/upcoming/skyblades_boon.txt new file mode 100644 index 00000000000..68df4fd4d26 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skyblades_boon.txt @@ -0,0 +1,10 @@ +Name:Skyblade's Boon +ManaCost:1 W +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Flying | Description$ Enchanted creature gets +1/+1 and has flying. +A:AB$ ChangeZone | Cost$ 2 W | Origin$ Battlefield | Destination$ Hand | ActivationZone$ Battlefield | SpellDescription$ Return CARDNAME to its owner's hand. Activate only if CARDNAME is on the battlefield or in your graveyard. +A:AB$ ChangeZone | Cost$ 2 W | Origin$ Graveyard | Destination$ Hand | ActivationZone$ Graveyard | Secondary$ True | SpellDescription$ Return CARDNAME to its owner's hand. Activate only if CARDNAME is on the battlefield or in your graveyard. +SVar:DiscardMe:1 +Oracle:Enchant creature\nEnchanted creature gets +1/+1 and has flying.\n{2}{W}: Return Skyblade's Boon to its owner's hand. Activate only if Skyblade's Boon is on the battlefield or in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt new file mode 100644 index 00000000000..0e855ae30c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt @@ -0,0 +1,8 @@ +Name:Slagwoods Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Slagwoods Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/so_shiny.txt b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt new file mode 100644 index 00000000000..7a05396db2c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt @@ -0,0 +1,13 @@ +Name:So Shiny +ManaCost:2 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ KeepTapped +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | IsPresent$ Card.YouCtrl+token | PresentCompare$ GE1 | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, if you control a token, tap enchanted creature, then scry 2. +SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 +S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. +DeckNeeds:Ability$Token +SVar:NeedsToPlayVar:Y GE1 +SVar:Y:Count$Valid Permanent.token+YouCtrl +Oracle:Enchant creature\nWhen So Shiny enters the battlefield, if you control a token, tap enchanted creature, then scry 2.\nEnchanted creature doesn't untap during its controller's untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/sojourners_companion.txt b/forge-gui/res/cardsfolder/upcoming/sojourners_companion.txt new file mode 100644 index 00000000000..97185fbabe5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sojourners_companion.txt @@ -0,0 +1,7 @@ +Name:Sojourner's Companion +ManaCost:7 +Types:Artifact Creature Salamander +PT:4/4 +K:Affinity:Artifact +K:TypeCycling:Land.Artifact:2 +Oracle:Affinity for artifacts\nArtifact landcycling {2} (({2}, Discard this card: Search your library for an artifact land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/sol_talisman.txt b/forge-gui/res/cardsfolder/upcoming/sol_talisman.txt new file mode 100644 index 00000000000..5fb9ffc3b51 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sol_talisman.txt @@ -0,0 +1,6 @@ +Name:Sol Talisman +ManaCost:no cost +Types:Artifact +K:Suspend:3:1 +A:AB$ Mana | Cost$ T | Produced$ C | Amount$ 2 | SpellDescription$ Add {C}{C}. +Oracle:Suspend 3—{1} (Rather than cast this card from your hand, pay 0 and exile it with three time counters on it. At the beginning of your upkeep, remove a time counter. When the last is removed, cast it without paying its mana cost.)\n{T}: Add {C}{C}. diff --git a/forge-gui/res/cardsfolder/upcoming/solitude.txt b/forge-gui/res/cardsfolder/upcoming/solitude.txt new file mode 100644 index 00000000000..a0253119e2a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/solitude.txt @@ -0,0 +1,13 @@ +Name:Solitude +ManaCost:3 W W +Types:Creature Elemental Incarnation +PT:3/2 +K:Flash +K:Lifelink +K:Evoke:ExileFromHand<1/Card.White+Other> +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile up to one target creature. That creature's controller gains life equal to its power. +SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.Other | RememberLKI$ True | TgtPrompt$ Select up to one other target creature | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ RememberedController | LifeAmount$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:RememberedLKI$CardPower +Oracle:Flash\nLifelink\nWhen Solitude enters the battlefield, exile up to one target creature. That creature's controller gains life equal to its power.\nEvoke — Exile a white card from your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/soul_of_migration.txt b/forge-gui/res/cardsfolder/upcoming/soul_of_migration.txt new file mode 100644 index 00000000000..0636e33cad8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/soul_of_migration.txt @@ -0,0 +1,10 @@ +Name:Soul of Migration +ManaCost:5 W W +Types:Creature Elemental +PT:2/4 +K:Flying +K:Evoke:3 W +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 white Bird creature tokens with flying. +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 2 | TokenScript$ w_1_1_bird_flying +DeckHas:Ability$Token +Oracle:Flying\nWhen Soul of Migration enters the battlefield, create two 1/1 white Bird creature tokens with flying.\nEvoke {3}{W} (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) diff --git a/forge-gui/res/cardsfolder/upcoming/spreading_insurrection.txt b/forge-gui/res/cardsfolder/upcoming/spreading_insurrection.txt new file mode 100644 index 00000000000..2a9e53f8443 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spreading_insurrection.txt @@ -0,0 +1,6 @@ +Name:Spreading Insurrection +ManaCost:4 R +Types:Sorcery +K:Storm +A:SP$ GainControl | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature you don't control until end of turn. Untap that creature. It gains haste until end of turn. +Oracle:Gain control of target creature you don't control until end of turn. Untap that creature. It gains haste until end of turn.\nStorm (When you cast this spell, copy it for each spell cast before it this turn. You may choose new targets for the copies.) diff --git a/forge-gui/res/cardsfolder/upcoming/squirrel_mob.txt b/forge-gui/res/cardsfolder/upcoming/squirrel_mob.txt new file mode 100644 index 00000000000..baa26dc8089 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/squirrel_mob.txt @@ -0,0 +1,9 @@ +Name:Squirrel Mob +ManaCost:1 G G +Types:Creature Squirrel +PT:2/2 +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each other Squirrel on the battlefield. +SVar:X:Count$Valid Squirrel.Other +SVar:BuffedBy:Squirrel +DeckHints:Type$Squirrel +Oracle:Squirrel Mob gets +1/+1 for each other Squirrel on the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/squirrel_sanctuary.txt b/forge-gui/res/cardsfolder/upcoming/squirrel_sanctuary.txt new file mode 100644 index 00000000000..d3763df2120 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/squirrel_sanctuary.txt @@ -0,0 +1,9 @@ +Name:Squirrel Sanctuary +ManaCost:G +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 green Squirrel creature token. +SVar:TrigToken:DB$ Token | TokenScript$ g_1_1_squirrel +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken | TriggerZones$ Battlefield | Execute$ TrigReturn | TriggerDescription$ Whenever a nontoken creature you control dies, you may pay {1}. If you do, return CARDNAME to its owner's hand. +SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 | Origin$ Battlefield | Destination$ Hand | Defined$ Self +DeckHas:Ability$Token +Oracle:When Squirrel Sanctuary enters the battlefield, create a 1/1 green Squirrel creature token.\nWhenever a nontoken creature you control dies, you may pay {1}. If you do, return Squirrel Sanctuary to its owner's hand. diff --git a/forge-gui/res/cardsfolder/upcoming/squirrel_sovereign.txt b/forge-gui/res/cardsfolder/upcoming/squirrel_sovereign.txt new file mode 100644 index 00000000000..ef8732a5b94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/squirrel_sovereign.txt @@ -0,0 +1,8 @@ +Name:Squirrel Sovereign +ManaCost:1 G +Types:Creature Squirrel Noble +PT:2/2 +S:Mode$ Continuous | Affected$ Creature.Squirrel+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Squirrels you control get +1/+1. +SVar:PlayMain1:TRUE +DeckNeeds:Type$Squirrel +Oracle:Other Squirrels you control get +1/+1. diff --git a/forge-gui/res/cardsfolder/upcoming/steel_dromedary.txt b/forge-gui/res/cardsfolder/upcoming/steel_dromedary.txt new file mode 100644 index 00000000000..9725e48029a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/steel_dromedary.txt @@ -0,0 +1,12 @@ +Name:Steel Dromedary +ManaCost:3 +Types:Artifact Creature Camel +PT:2/2 +K:ETBReplacement:Other:CamelTapped +SVar:CamelTapped:DB$ Tap | Defined$ Self | ETB$ True | SubAbility$ DBAddCounter | SpellDescription$ CARDNAME enters the battlefield tapped with two +1/+1 counters on it. +SVar:DBAddCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 +S:Mode$ Continuous | Affected$ Card.Self+counters_GE1_P1P1 | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ As long as there are +1/+1 counters on CARDNAME, it doesn't untap during your untap step. +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigMoveCounter | TriggerDescription$ At the beginning of combat on your turn, you may move a +1/+1 counter from CARDNAME onto another target creature. +SVar:TrigMoveCounter:DB$ MoveCounter | ValidTgts$ Creature.Other | TgtPrompt$ Select another target creature | Source$ Self | CounterType$ P1P1 | CounterNum$ 1 +DeckHas:Ability$Counters +Oracle:Steel Dromedary enters the battlefield tapped with two +1/+1 counters on it.\nAs long as there are +1/+1 counters on Steel Dromedary, it doesn't untap during your untap step.\nAt the beginning of combat on your turn, you may move a +1/+1 counter from Steel Dromedary onto another target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/step_through.txt b/forge-gui/res/cardsfolder/upcoming/step_through.txt new file mode 100644 index 00000000000..07fc4d92541 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/step_through.txt @@ -0,0 +1,6 @@ +Name:Step Through +ManaCost:3 U U +Types:Sorcery +K:TypeCycling:Wizard:2 +A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return two target creatures to their owners' hands. +Oracle:Return two target creatures to their owners' hands.\nWizardcycling {2} ({2}, Discard this card: Search your library for a Wizard card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/storm_gods_oracle.txt b/forge-gui/res/cardsfolder/upcoming/storm_gods_oracle.txt new file mode 100644 index 00000000000..66e62ac0b8b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/storm_gods_oracle.txt @@ -0,0 +1,8 @@ +Name:Storm God's Oracle +ManaCost:1 U R +Types:Enchantment Creature Human Shaman +PT:1/3 +A:AB$ Pump | Cost$ 1 | Defined$ Self | NumAtt$ +1 | NumDef$ -1 | SpellDescription$ CARDNAME gets +1/-1 until end of turn. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 3 damage to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 +Oracle:{1}: Storm God's Oracle gets +1/-1 until end of turn.\nWhen Storm God's Oracle dies, it deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/strike_it_rich.txt b/forge-gui/res/cardsfolder/upcoming/strike_it_rich.txt new file mode 100644 index 00000000000..082f74b55e5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/strike_it_rich.txt @@ -0,0 +1,7 @@ +Name:Strike It Rich +ManaCost:R +Types:Sorcery +K:Flashback:2 R +A:SP$ Token | TokenScript$ c_a_treasure_sac | SpellDescription$ Create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") +DeckHas:Ability$Token & Ability$Sacrifice +Oracle:Create a Treasure token. (It's an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.")\nFlashback {2}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/subtlety.txt b/forge-gui/res/cardsfolder/upcoming/subtlety.txt new file mode 100644 index 00000000000..26551f9bd68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/subtlety.txt @@ -0,0 +1,10 @@ +Name:Subtlety +ManaCost:2 U U +Types:Creature Elemental Incarnation +PT:3/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTuck | TriggerDescription$ When CARDNAME enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +SVar:TrigTuck:DB$ ChangeZone | ValidTgts$ Card.inZoneStack+Creature,Card.inZoneStack+Planeswalker | TgtZone$ Stack | TgtPrompt$ Select up to one target creature spell or planeswalker spell | AlternativeDecider$ TargetedController | Origin$ Stack | Fizzle$ True | Destination$ Library | LibraryPosition$ 0 | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | AlternativeDestinationMessage$ Would you like to put the card on the top of your library (and not on the bottom)? | SpellDescription$ Choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +K:Evoke:ExileFromHand<1/Card.Blue+Other> +Oracle:Flash\nFlying\nWhen Subtlety enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library.\nEvoke — Exile a blue card from your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/sudden_edict.txt b/forge-gui/res/cardsfolder/upcoming/sudden_edict.txt new file mode 100644 index 00000000000..09553adb198 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sudden_edict.txt @@ -0,0 +1,6 @@ +Name:Sudden Edict +ManaCost:1 B +Types:Instant +K:Split second +A:SP$ Sacrifice | Cost$ 1 B | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | SpellDescription$ Target player sacrifices a creature. +Oracle:Split second (As long as this spell is on the stack, players can't cast spells or activate abilities that aren't mana abilities.)\nTarget player sacrifices a creature. diff --git a/forge-gui/res/cardsfolder/upcoming/suspend.txt b/forge-gui/res/cardsfolder/upcoming/suspend.txt new file mode 100644 index 00000000000..a899f7451fd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/suspend.txt @@ -0,0 +1,8 @@ +Name:Suspend +ManaCost:U +Types:Instant +A:SP$ ChangeZone | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | WithCountersType$ TIME | WithCountersAmount$ 2 | RememberChanged$ True | SubAbility$ DBPump | StackDescription$ Exile {c:Targeted} and put two time counters on it. | SpellDescription$ Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. +SVar:DBPump:DB$ Pump | Defined$ Remembered | ConditionDefined$ Remembered | ConditionPresent$ Card.withoutSuspend | PumpZone$ Exile | KW$ Suspend | Duration$ Permanent | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Counters +Oracle:Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) diff --git a/forge-gui/res/cardsfolder/upcoming/svyelun_of_sea_and_sky.txt b/forge-gui/res/cardsfolder/upcoming/svyelun_of_sea_and_sky.txt new file mode 100644 index 00000000000..4794c84a69b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/svyelun_of_sea_and_sky.txt @@ -0,0 +1,10 @@ +Name:Svyelun of Sea and Sky +ManaCost:1 U U +Types:Legendary Creature Merfolk God +PT:3/4 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Indestructible | IsPresent$ Merfolk.Other+YouCtrl | PresentCompare$ GE2 | Description$ As long as you control two other Merfolk, CARDNAME has indestructible. (Damage and effects that say "destroy" don't destroy it.) +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ Whenever CARDNAME attacks, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +S:Mode$ Continuous | Affected$ Merfolk.Other+YouCtrl | AddKeyword$ Ward:1 | Description$ Other Merfolk you control have ward {1}. +DeckNeeds:Type$Merfolk +Oracle:Svyelun of Sea and Sky has indestructible as long as you control at least two other Merfolk.\nWhenever Svyelun attacks, draw a card.\nOther Merfolk you control have ward {1}. diff --git a/forge-gui/res/cardsfolder/upcoming/sweep_the_skies.txt b/forge-gui/res/cardsfolder/upcoming/sweep_the_skies.txt new file mode 100644 index 00000000000..58703fc14e1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sweep_the_skies.txt @@ -0,0 +1,8 @@ +Name:Sweep the Skies +ManaCost:X U U +Types:Sorcery +A:SP$ Token | Cost$ X U U | TokenAmount$ Y | TokenScript$ c_1_1_a_thopter_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 colorless Thopter artifact creature token with flying for each color of mana spent to cast this spell. +SVar:X:Count$xPaid +SVar:Y:Count$Converge +DeckHas:Ability$Token +Oracle:Converge — Create a 1/1 colorless Thopter artifact creature token with flying for each color of mana spent to cast this spell. diff --git a/forge-gui/res/cardsfolder/upcoming/sword_of_hearth_and_home.txt b/forge-gui/res/cardsfolder/upcoming/sword_of_hearth_and_home.txt new file mode 100644 index 00000000000..0afa6aef4ab --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sword_of_hearth_and_home.txt @@ -0,0 +1,12 @@ +Name:Sword of Hearth and Home +ManaCost:3 +Types:Artifact Equipment +K:Equip:2 +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 2 | AddSVar$ SwordOfHearthAndHomeCE | AddKeyword$ Protection from green & Protection from white | Description$ Equipped creature gets +2/+2 and has protection from green and from white. +T:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigBlink | TriggerZones$ Battlefield | TriggerDescription$ Whenever equipped creature deals combat damage to a player, exile up to one target creature you own, then search your library for a basic land card. Put both cards onto the battlefield under your control, then shuffle. +SVar:TrigBlink:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | ValidTgts$ Creature.YouOwn | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature you own | SubAbility$ DBLand +SVar:DBLand:DB$ ChangeZone | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic | ChangeNum$ 1 | RememberChanged$ True | SubAbility$ DBReturn +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:SwordOfHearthAndHomeCE:SVar:MustBeBlocked:AttackingPlayerConservative +Oracle:Equipped creature gets +2/+2 and has protection from green and from white.\nWhenever equipped creature deals combat damage to a player, exile up to one target creature you own, then search your library for a basic land card. Put both cards onto the battlefield under your control, then shuffle.\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/sylvan_anthem.txt b/forge-gui/res/cardsfolder/upcoming/sylvan_anthem.txt new file mode 100644 index 00000000000..40ba97bc516 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sylvan_anthem.txt @@ -0,0 +1,7 @@ +Name:Sylvan Anthem +ManaCost:G G +Types:Enchantment +S:Mode$ Continuous | Affected$ Creature.Green+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Green creatures you control get +1/+1. +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Green+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ Whenever a green creature enters the battlefield under your control, scry 1. (Look at the top card of your library. You may put that card on the bottom of your library.) +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +Oracle:Green creatures you control get +1/+1.\nWhenever a green creature enters the battlefield under your control, scry 1. diff --git a/forge-gui/res/cardsfolder/upcoming/sythis_harvests_hand.txt b/forge-gui/res/cardsfolder/upcoming/sythis_harvests_hand.txt new file mode 100644 index 00000000000..813ab172105 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sythis_harvests_hand.txt @@ -0,0 +1,10 @@ +Name:Sythis, Harvest's Hand +ManaCost:G W +Types:Legendary Enchantment Creature Nymph +PT:1/2 +T:Mode$ SpellCast | ValidCard$ Enchantment | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever you cast an enchantment spell, you gain 1 life and draw a card. +SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 1 | SubAbility$ TrigDraw +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1 +DeckHints:Type$Enchantment +DeckHas:Ability$LifeGain +Oracle:Whenever you cast an enchantment spell, you gain 1 life and draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt new file mode 100644 index 00000000000..0c52eaad5ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt @@ -0,0 +1,8 @@ +Name:Tanglepool Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Tanglepool Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/tavern_scoundrel.txt b/forge-gui/res/cardsfolder/upcoming/tavern_scoundrel.txt new file mode 100644 index 00000000000..b155585c937 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tavern_scoundrel.txt @@ -0,0 +1,9 @@ +Name:Tavern Scoundrel +ManaCost:1 R +Types:Creature Human Rogue +PT:1/3 +T:Mode$ FlippedCoin | ValidPlayer$ You | ValidResult$ Win | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you win a coin flip, create two Treasure tokens. (They're artifacts with "{T}, Sacrifice this artifact: Add one mana of any color.") +SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ c_a_treasure_sac +A:AB$ FlipACoin | Cost$ 1 T Sac<1/Permanent.Other/another permanent> | SpellDescription$ Flip a coin. +DeckHas:Ability$Sacrifice & Ability$Token +Oracle:Whenever you win a coin flip, create two Treasure tokens. (They're artifacts with "{T}, Sacrifice this artifact: Add one mana of any color.")\n{1}, {T}, Sacrifice another permanent: Flip a coin. diff --git a/forge-gui/res/cardsfolder/upcoming/terminal_agony.txt b/forge-gui/res/cardsfolder/upcoming/terminal_agony.txt new file mode 100644 index 00000000000..36155de7685 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/terminal_agony.txt @@ -0,0 +1,7 @@ +Name:Terminal Agony +ManaCost:3 B R +Types:Sorcery +K:Madness:B R +A:SP$ Destroy | Cost$ 3 B R | ValidTgts$ Creature | TgtPrompt$ Select target creature | SpellDescription$ Destroy target creature. +DeckHints:Ability$Discard +Oracle:Destroy target creature.\nMadness {B}{R} (If you discard this card, discard it into exile. When you do, cast it for its madness cost or put it into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/terramorph.txt b/forge-gui/res/cardsfolder/upcoming/terramorph.txt new file mode 100644 index 00000000000..22b04268d4b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/terramorph.txt @@ -0,0 +1,6 @@ +Name:Terramorph +ManaCost:3 G +Types:Sorcery +K:Rebound +A:SP$ ChangeZone | Cost$ 3 G | Origin$ Library | Destination$ Battlefield | ChangeType$ Land.Basic | ChangeNum$ 1 | SpellDescription$ Search your library for a basic land card, put it onto the battlefield, then shuffle. +Oracle:Search your library for a basic land card, put it onto the battlefield, then shuffle.\nRebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, you may cast this card from exile without paying its mana cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/territorial_kavu.txt b/forge-gui/res/cardsfolder/upcoming/territorial_kavu.txt new file mode 100644 index 00000000000..394e3cbdc8d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/territorial_kavu.txt @@ -0,0 +1,14 @@ +Name:Territorial Kavu +ManaCost:R G +Types:Creature Kavu +PT:*/* +S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ Domain — CARDNAME's power and toughness are each equal to the number of basic land types among lands you control. +SVar:X:Count$Domain +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ Whenever CARDNAME attacks, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ DBDiscard,DBExile +SVar:DBDiscard:DB$ Discard | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ Discard a card. If you do, draw a card. +SVar:DBDraw:DB$ Draw | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBExile:DB$ ChangeZone | ValidTgts$ Card | TgtPrompt$ Select up to one target card in a graveyard | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Exile | SpellDescription$ Exile up to one target card from a graveyard. +DeckHas:Ability$Discard +Oracle:Domain — Territorial Kavu's power and toughness are each equal to the number of basic land types among lands you control.\nWhenever Territorial Kavu attacks, choose one —\n• Discard a card. If you do, draw a card.\n• Exile up to one target card from a graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/the_underworld_cookbook.txt b/forge-gui/res/cardsfolder/upcoming/the_underworld_cookbook.txt new file mode 100644 index 00000000000..f2e017ed976 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_underworld_cookbook.txt @@ -0,0 +1,8 @@ +Name:The Underworld Cookbook +ManaCost:1 +Types:Artifact +A:AB$ Token | Cost$ T Discard<1/Card> | TokenScript$ c_a_food_sac | SpellDescription$ Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.") +A:AB$ ChangeZone | Cost$ 4 T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature card | SpellDescription$ Return target creature card from your graveyard to your hand. +DeckHas:Ability$Discard & Ability$Token & Ability$Sacrifice & Ability$LifeGain & Ability$Graveyard +DeckHints:Name$Asmoranomardicadaistinaculdacar +Oracle:{T}, Discard a card: Create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life.")\n{4}, {T}, Sacrifice The Underworld Cookbook: Return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt new file mode 100644 index 00000000000..7a9b0684e68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt @@ -0,0 +1,8 @@ +Name:Thornglint Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Thornglint Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {W}. diff --git a/forge-gui/res/cardsfolder/upcoming/thought_monitor.txt b/forge-gui/res/cardsfolder/upcoming/thought_monitor.txt new file mode 100644 index 00000000000..84d57dfbf7d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thought_monitor.txt @@ -0,0 +1,10 @@ +Name:Thought Monitor +ManaCost:6 U +Types:Artifact Creature Construct +PT:2/2 +K:Flying +K:Affinity:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw two cards. +SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 2 +DeckHints:Type$Artifact +Oracle:Affinity for artifacts (This spell costs {1} less to cast for each artifact you control.)\nFlying\nWhen Thought Monitor enters the battlefield, draw two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/thraben_watcher.txt b/forge-gui/res/cardsfolder/upcoming/thraben_watcher.txt new file mode 100644 index 00000000000..d5c6567f328 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thraben_watcher.txt @@ -0,0 +1,9 @@ +Name:Thraben Watcher +ManaCost:2 W W +Types:Creature Angel +PT:2/2 +K:Flying +K:Vigilance +S:Mode$ Continuous | Affected$ Creature.nonToken+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance | Description$ Other nontoken creatures you control get +1/+1 and have vigilance. +SVar:PlayMain1:TRUE +Oracle:Flying, vigilance\nOther nontoken creatures you control get +1/+1 and have vigilance. diff --git a/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt b/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt new file mode 100644 index 00000000000..b2be79410a9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thrasta_tempests_roar.txt @@ -0,0 +1,11 @@ +Name:Thrasta, Tempest's Roar +ManaCost:10 G G +Types:Legendary Creature Dinosaur +PT:7/7 +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ X | EffectZone$ All | Description$ This spell costs {3} less to cast for each other spell cast this turn. +SVar:X:Count$ThisTurnCast_Card.Other/Times.3 +K:Trample +K:Haste +K:Trample over planeswalkers +S:Mode$ Continuous | Affected$ Card.Self+ThisTurnEntered | AddKeyword$ Hexproof | Description$ CARDNAME has hexproof as long as it entered the battlefield this turn. +Oracle:This spell costs {3} less to cast for each other spell cast this turn.\nTrample, haste\nTrample over planeswalkers (This creature can deal excess combat damage to the controller of the planeswalker it’s attacking.)\nThrasta, Tempest’s Roar has hexproof as long as it entered the battlefield this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/tiamat.txt b/forge-gui/res/cardsfolder/upcoming/tiamat.txt new file mode 100644 index 00000000000..4fc0de97a7b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tiamat.txt @@ -0,0 +1,9 @@ +Name:Tiamat +ManaCost:2 W U B R G +Types:Legendary Creature Dragon God +PT:7/7 +K:Flying +T:Mode$ ChangesZone | ValidCard$ Card.Self+wasCast | Destination$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it, search your library for up to five Dragon cards not named Tiamat that each have different names, reveal them, put them into your hand, then shuffle. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Dragon.notnamedTiamat | ChangeNum$ 5 | DifferentNames$ True +DeckNeeds:Type$Dragon +Oracle:Flying\nWhen Tiamat enters the battlefield, if you cast it, search your library for up to five Dragon cards not named Tiamat that each have different names, reveal them, put them into your hand, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/tide_shaper.txt b/forge-gui/res/cardsfolder/upcoming/tide_shaper.txt new file mode 100644 index 00000000000..4245d4c01cc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tide_shaper.txt @@ -0,0 +1,10 @@ +Name:Tide Shaper +ManaCost:U +Types:Creature Merfolk Wizard +PT:1/1 +K:Kicker:1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigAnimate | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target land becomes an Island for as long as CARDNAME remains on the battlefield. +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddToughness$ 1 | IsPresent$ X | SVarCompare$ GE1 | Description$ CARDNAME gets +1/+1 as long as an opponent controls an Island. +SVar:X:Count$Valid Island.OppCtrl +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Land | AITgts$ Land.OppCtrl | Types$ Island | RemoveLandTypes$ True | Duration$ UntilHostLeavesPlay | IsCurse$ True +Oracle:Kicker {1} (You may pay an additional {1} as you cast this spell.)\nWhen Tide Shaper enters the battlefield, if it was kicked, target land becomes an Island for as long as Tide Shaper remains on the battlefield.\nTide Shaper gets +1/+1 as long as an opponent controls an Island. diff --git a/forge-gui/res/cardsfolder/upcoming/timeless_dragon.txt b/forge-gui/res/cardsfolder/upcoming/timeless_dragon.txt new file mode 100644 index 00000000000..c33be7cb19f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/timeless_dragon.txt @@ -0,0 +1,9 @@ +Name:Timeless Dragon +ManaCost:3 W W +Types:Creature Dragon +PT:5/5 +K:Flying +K:TypeCycling:Plains:2 +K:Eternalize:2 W W +DeckHas:Ability$Token +Oracle:Flying\nPlainscycling {2} ({2}, Discard this card: Search your library for a Plains card, reveal it, put it into your hand, then shuffle.)\nEternalize {2}{W}{W} ({2}{W}{W}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Dragon with no mana cost. Eternalize only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/timeless_witness.txt b/forge-gui/res/cardsfolder/upcoming/timeless_witness.txt new file mode 100644 index 00000000000..1eba90fe7f3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/timeless_witness.txt @@ -0,0 +1,9 @@ +Name:Timeless Witness +ManaCost:2 G G +Types:Creature Human Shaman +PT:2/1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may return target card from your graveyard to your hand. +SVar:TrigChangeZone:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.YouCtrl +K:Eternalize:5 G G +DeckHas:Ability$Token +Oracle:When Eternal Witness enters the battlefield, you may return target card from your graveyard to your hand.\nEternalize {5}{G}{G} ({5}{G}{G}, Exile this card from your graveyard: Create a token that's a copy of it, except it's a 4/4 black Zombie Human Shaman with no mana cost. Eternalize only as a sorcery.) diff --git a/forge-gui/res/cardsfolder/upcoming/tireless_provisioner.txt b/forge-gui/res/cardsfolder/upcoming/tireless_provisioner.txt new file mode 100644 index 00000000000..02ad7062cf7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tireless_provisioner.txt @@ -0,0 +1,10 @@ +Name:Tireless Provisioner +ManaCost:2 G +Types:Creature Elf Scout +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTokenChoice | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, create a Food token or a Treasure token. (Food is an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life." Treasure is an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") +SVar:TrigTokenChoice:DB$ GenericChoice | Defined$ You | Choices$ Food,Treasure | SpellDescription$ Whenever a land enters the battlefield under your control, create a Food token or a Treasure token. +SVar:Food:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_food_sac | TokenOwner$ You | SpellDescription$ Food +SVar:Treasure:DB$ Token | TokenAmount$ 1 | TokenScript$ c_a_treasure_sac | TokenOwner$ You | SpellDescription$ Treasure +DeckHas:Ability$Token & Ability$LifeGain +Oracle:Landfall — Whenever a land enters the battlefield under your control, create a Food token or a Treasure token. (Food is an artifact with "{2}, {T}, Sacrifice this artifact: You gain 3 life." Treasure is an artifact with "{T}, Sacrifice this artifact: Add one mana of any color.") diff --git a/forge-gui/res/cardsfolder/upcoming/tormods_cryptkeeper.txt b/forge-gui/res/cardsfolder/upcoming/tormods_cryptkeeper.txt new file mode 100644 index 00000000000..ee05392ddc1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tormods_cryptkeeper.txt @@ -0,0 +1,8 @@ +Name:Tormod's Cryptkeeper +ManaCost:3 +Types:Artifact Creature Golem +PT:3/2 +K:Vigilance +A:AB$ ChangeZoneAll | Cost$ T Sac<1/CARDNAME> | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Player | TgtPrompt$ Select target player | ChangeType$ Card | SpellDescription$ Exile all cards from target player's graveyard. +AI:RemoveDeck:Random +Oracle:Vigilance\n{T}, Sacrifice Tormod's Cryptkeeper: Exile all cards from target player's graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/tourach_dread_cantor.txt b/forge-gui/res/cardsfolder/upcoming/tourach_dread_cantor.txt new file mode 100644 index 00000000000..8ed3700cb14 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tourach_dread_cantor.txt @@ -0,0 +1,12 @@ +Name:Tourach, Dread Cantor +ManaCost:1 B +Types:Legendary Creature Human Cleric +PT:2/1 +K:Kicker:B B +K:Protection from white +T:Mode$ Discarded | ValidCard$ Card.OppOwn | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ Whenever an opponent discards a card, put a +1/+1 counter on CARDNAME. +SVar:TrigCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+kicked | Execute$ TrigDiscard | TriggerDescription$ When CARDNAME enters the battlefield, if it was kicked, target opponent discards two cards at random. +SVar:TrigDiscard:DB$ Discard | ValidTgts$ Opponent | NumCards$ 2 | Mode$ Random +DeckHas:Ability$Counters +Oracle:Kicker {B}{B}\nProtection from white\nWhenever an opponent discards a card, put a +1/+1 counter on Tourach, Dread Cantor.\nWhen Tourach enters the battlefield, if it was kicked, target opponent discards two cards at random. diff --git a/forge-gui/res/cardsfolder/upcoming/tourachs_canticle.txt b/forge-gui/res/cardsfolder/upcoming/tourachs_canticle.txt new file mode 100644 index 00000000000..9095bd084de --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tourachs_canticle.txt @@ -0,0 +1,6 @@ +Name:Tourach's Canticle +ManaCost:3 B +Types:Sorcery +A:SP$ Discard | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ 1 | SubAbility$ DiscardRandom | SpellDescription$ Target opponent reveals their hand. You choose a card from it. That player discards that card, then discards a card at random. +SVar:DiscardRandom:DB$ Discard | Defined$ Targeted | NumCards$ 1 | Mode$ Random +Oracle:Target opponent reveals their hand. You choose a card from it. That player discards that card, then discards a card at random. diff --git a/forge-gui/res/cardsfolder/upcoming/unbounded_potential.txt b/forge-gui/res/cardsfolder/upcoming/unbounded_potential.txt new file mode 100644 index 00000000000..4cc817333da --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unbounded_potential.txt @@ -0,0 +1,9 @@ +Name:Unbounded Potential +ManaCost:1 W +Types:Instant +K:Entwine:3 W +A:SP$ Charm | Choices$ DBCounter,DBProliferate | SpellDescription$ Choose one — ABILITY +SVar:DBCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | SpellDescription$ Put a +1/+1 counter on each of up to two target creatures. +SVar:DBProliferate:DB$ Proliferate | SpellDescription$ Proliferate (Choose any number of permanents and/or players, then give each another counter of each kind already there.) +DeckHas:Ability$Counters +Oracle:Choose one — \n• Put a +1/+1 counter on each of up to two target creatures.\n• Proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)\nK:Entwine:3 W (Choose both if you pay the entwine cost.) diff --git a/forge-gui/res/cardsfolder/upcoming/underworld_hermit.txt b/forge-gui/res/cardsfolder/upcoming/underworld_hermit.txt new file mode 100644 index 00000000000..4d9d98b6e1c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/underworld_hermit.txt @@ -0,0 +1,9 @@ +Name:Underworld Hermit +ManaCost:4 B B +Types:Creature Human Peasant +PT:3/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a number of 1/1 green Squirrel creature tokens equal to your devotion to black. +SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ g_1_1_squirrel | TokenOwner$ You +SVar:X:Count$Devotion.Black +DeckHas:Ability$Token +Oracle:When Underworld Hermit enters the battlefield, create a number of 1/1 green Squirrel creature tokens equal to your devotion to black. diff --git a/forge-gui/res/cardsfolder/upcoming/unmarked_grave.txt b/forge-gui/res/cardsfolder/upcoming/unmarked_grave.txt new file mode 100644 index 00000000000..f979b9603f0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unmarked_grave.txt @@ -0,0 +1,7 @@ +Name:Unmarked Grave +ManaCost:1 B +Types:Sorcery +A:SP$ ChangeZone | Cost$ 1 B | Origin$ Library | Destination$ Graveyard | ChangeType$ Card.nonLegendary | ChangeNum$ 1 | SpellDescription$ Search your library for a nonlegendary card, put that card into your graveyard, then shuffle. +DeckHas:Ability$Graveyard +AI:RemoveDeck:Random +Oracle:Search your library for a nonlegendary card, put that card into your graveyard, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/urban_daggertooth.txt b/forge-gui/res/cardsfolder/upcoming/urban_daggertooth.txt new file mode 100644 index 00000000000..07225de8d14 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/urban_daggertooth.txt @@ -0,0 +1,9 @@ +Name:Urban Daggertooth +ManaCost:2 G G +Types:Creature Dinosaur +PT:4/3 +K:Vigilance +T:Mode$ DamageDoneOnce | Execute$ TrigProliferate | ValidTarget$ Card.Self | TriggerZones$ Battlefield | TriggerDescription$ Enrage — Whenever CARDNAME is dealt damage, proliferate. +SVar:TrigProliferate:DB$Proliferate +SVar:HasCombatEffect:TRUE +Oracle:Enrage — Whenever Urban Daggertooth is dealt damage, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.) diff --git a/forge-gui/res/cardsfolder/upcoming/urzas_saga.txt b/forge-gui/res/cardsfolder/upcoming/urzas_saga.txt new file mode 100644 index 00000000000..81dbc818345 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/urzas_saga.txt @@ -0,0 +1,12 @@ +Name:Urza's Saga +ManaCost:no cost +Types:Enchantment Land Urza's Saga +K:Saga:3:Animate1,Animate2,Tutor +SVar:Animate1:DB$ Animate | Defined$ Self | Abilities$ ABMana | Duration$ Permanent | SpellDescription$ CARDNAME gains "{T}: Add {C}." +SVar:ABMana:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. +SVar:Animate2:DB$ Animate | Defined$ Self | Abilities$ ABToken | Duration$ Permanent | SpellDescription$ CARDNAME gains "{2}, {T}: Create a 0/0 colorless Construct artifact creature token with 'This creature gets +1/+1 for each artifact you control.'" +SVar:ABToken:AB$ Token | Cost$ 2 T | TokenScript$ c_0_0_a_construct_total_artifacts | SpellDescription$ Create a 0/0 colorless Construct artifact creature token with "This creature gets +1/+1 for each artifact you control." +SVar:Tutor:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Artifact.ManaCost0,Artifact.ManaCost1 | ChangeNum$ 1 | SpellDescription$ Search your library for an artifact card with mana cost {0} or {1}, put it onto the battlefield, then shuffle. +DeckHas:Ability$Token +DeckNeeds:Type$Artifact +Oracle:I — Urza's Saga gains "{T}: Add {C}."\nII — Urza's Saga gains "{2}, {T}: Create a 0/0 colorless Construct artifact creature token with 'This creature gets +1/+1 for each artifact you control.'"\nIII — Search your library for an artifact card with mana cost {0} or {1}, put it onto the battlefield, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt new file mode 100644 index 00000000000..bf5e490605d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt @@ -0,0 +1,6 @@ +Name:Vectis Gloves +ManaCost:2 +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Artifact landwalk | Description$ Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.) +K:Equip:2 +Oracle:Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.)\nEquip {2} diff --git a/forge-gui/res/cardsfolder/upcoming/vedalken_infiltrator.txt b/forge-gui/res/cardsfolder/upcoming/vedalken_infiltrator.txt new file mode 100644 index 00000000000..468ef3e22f5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vedalken_infiltrator.txt @@ -0,0 +1,8 @@ +Name:Vedalken Infiltrator +ManaCost:1 U +Types:Creature Vedalken Rogue +PT:1/3 +K:Unblockable +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | Condition$ Metalcraft | Description$ Metalcraft — As long as you control three or more artifacts, CARDNAME gets +1/0. +SVar:BuffedBy:Artifact +Oracle:Vedalken Infiltrator can't be blocked.\nMetalcraft — As long as you control three or more artifacts, Vedalken Infiltrator gets +1/0. diff --git a/forge-gui/res/cardsfolder/upcoming/verdant_command.txt b/forge-gui/res/cardsfolder/upcoming/verdant_command.txt new file mode 100644 index 00000000000..277c9b93584 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/verdant_command.txt @@ -0,0 +1,10 @@ +Name:Verdant Command +ManaCost:1 G +Types:Instant +A:SP$ Charm | Cost$ 1 G | Choices$ DBToken,DBCounter,DBExile,DBGainLife | CharmNum$ 2 +SVar:DBToken:DB$ Token | ValidTgts$ Player | TgtPrompt$ Select target player | TokenAmount$ 2 | TokenScript$ g_1_1_squirrel | TokenTapped$ True | TokenOwner$ TargetedPlayer | SpellDescription$ • Target player creates two tapped 1/1 green Squirrel creature tokens. +SVar:DBCounter:DB$ Counter | TargetType$ Activated | TgtPrompt$ Select target loyalty ability of a planeswalker | ValidTgts$ Planeswalker | SpellDescription$ • Counter target loyalty ability of a planeswalker. +SVar:DBExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Card | TgtPrompt$ Select target card from a graveyard | SpellDescription$ • Exile target card from a graveyard. +SVar:DBGainLife:DB$ GainLife | ValidTgts$ Player | TgtPrompt$ Select target player to gain life | LifeAmount$ 3 | SpellDescription$ • Target player gains 3 life. +DeckHas:Ability$Token & Ability$LifeGain +Oracle:Choose two —\n• Target player creates two tapped 1/1 green Squirrel creature tokens.\n• Counter target loyalty ability of a planeswalker.\n• Exile target card from a graveyard.\n• Target player gains 3 life. diff --git a/forge-gui/res/cardsfolder/upcoming/vile_entomber.txt b/forge-gui/res/cardsfolder/upcoming/vile_entomber.txt new file mode 100644 index 00000000000..3a8574a9181 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vile_entomber.txt @@ -0,0 +1,9 @@ +Name:Vile Entomber +ManaCost:2 B B +Types:Creature Zombie Warlock +PT:2/2 +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for a card, put that card into your graveyard, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Graveyard | ChangeNum$ 1 | Mandatory$ True | ChangeType$ Card +DeckHas:Ability$Graveyard +Oracle:Deathtouch\nWhen Vile Entomber enters the battlefield, search your library for a card, put that card into your graveyard, then shuffle. diff --git a/forge-gui/res/cardsfolder/upcoming/void_mirror.txt b/forge-gui/res/cardsfolder/upcoming/void_mirror.txt new file mode 100644 index 00000000000..ded729b4ea2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/void_mirror.txt @@ -0,0 +1,6 @@ +Name:Void Mirror +ManaCost:2 +Types:Artifact +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Player | TriggerZones$ Battlefield | Execute$ TrigCounter | NoColoredMana$ True | TriggerDescription$ Whenever a player casts a spell, if no colored mana was spent to cast it, counter that spell. +SVar:TrigCounter:DB$ Counter | Defined$ TriggeredSpellAbility +Oracle:Whenever a player casts a spell, if no colored mana was spent to cast it, counter that spell. diff --git a/forge-gui/res/cardsfolder/upcoming/vorpal_sword.txt b/forge-gui/res/cardsfolder/upcoming/vorpal_sword.txt new file mode 100644 index 00000000000..8444b7f6d71 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vorpal_sword.txt @@ -0,0 +1,11 @@ +Name:Vorpal Sword +ManaCost:B +Types:Artifact Equipment +K:Equip:B B +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Deathtouch | Description$ Equipped creature gets +2/+0 and has deathtouch. +A:AB$ Animate | Cost$ 5 B B B | Defined$ Self | Triggers$ TrigDamageDone | SubAbility$ DBAddSVar | SpellDescription$ Until end of turn, CARDNAME gains "Whenever equipped creature deals combat damage to a player, that player loses the game." +SVar:DBAddSVar:DB$ Animate | Defined$ Equipped | sVars$ MustBeBlocked +SVar:MustBeBlocked:True +SVar:TrigDamageDone:Mode$ DamageDone | ValidSource$ Creature.EquippedBy | ValidTarget$ Player | CombatDamage$ True | Execute$ DBLose | TriggerDescription$ Whenever equipped creature deals combat damage to a player, that player loses the game. +SVar:DBLose:DB$ LosesGame | Defined$ TriggeredTarget +Oracle:Equipped creature gets +2/+0 and has deathtouch.\n{5}{B}{B}{B}: Until end of turn, Vorpal Sword gains "Whenever equipped creature deals combat damage to a player, that player loses the game."\nEquip {B}{B} diff --git a/forge-gui/res/cardsfolder/upcoming/wavesifter.txt b/forge-gui/res/cardsfolder/upcoming/wavesifter.txt new file mode 100644 index 00000000000..e409d02a137 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wavesifter.txt @@ -0,0 +1,10 @@ +Name:Wavesifter +ManaCost:3 G U +Types:Creature Elemental +PT:3/2 +K:Flying +K:Evoke:G U +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigInvestigate | TriggerDescription$ When CARDNAME enters the battlefield, investigate twice. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") +SVar:TrigInvestigate:DB$ Investigate | Num$ 2 +DeckHas:Ability$Token +Oracle:Flying\nWhen Wavesifter enters the battlefield, investigate twice. (To investigate, create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.")\nEvoke G U (You may cast this spell for its evoke cost. If you do, it's sacrificed when it enters the battlefield.) diff --git a/forge-gui/res/cardsfolder/upcoming/world_weary.txt b/forge-gui/res/cardsfolder/upcoming/world_weary.txt new file mode 100644 index 00000000000..40cd636299c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/world_weary.txt @@ -0,0 +1,8 @@ +Name:World-Weary +ManaCost:3 B B +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 3 B B | ValidTgts$ Creature | AILogic$ Curse +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -4 | AddToughness$ -4 | Description$ Enchanted creature gets -4/-4. +K:TypeCycling:Basic:1 B +Oracle:Enchant creature\nEnchanted creature gets -4/-4.\nBasic landcycling {1}{B} ({1}{B}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) diff --git a/forge-gui/res/cardsfolder/upcoming/yavimaya_cradle_of_growth.txt b/forge-gui/res/cardsfolder/upcoming/yavimaya_cradle_of_growth.txt new file mode 100644 index 00000000000..9bcb0db425b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yavimaya_cradle_of_growth.txt @@ -0,0 +1,6 @@ +Name:Yavimaya, Cradle of Growth +ManaCost:no cost +Types:Legendary Land +S:Mode$ Continuous | Affected$ Land | AddType$ Forest | Description$ Each land is a Forest in addition to its other land types. +AI:RemoveDeck:Random +Oracle:Each land is a Forest in addition to its other land types. diff --git a/forge-gui/res/cardsfolder/upcoming/young_necromancer.txt b/forge-gui/res/cardsfolder/upcoming/young_necromancer.txt new file mode 100644 index 00000000000..0a81da5c581 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/young_necromancer.txt @@ -0,0 +1,14 @@ +Name:Young Necromancer +ManaCost:4 B +Types:Creature Human Warlock +PT:2/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigImmediateTrig | TriggerDescription$ When CARDNAME enters the battlefield, you may exile two cards from your graveyard. When you do, return target creature card from your graveyard to the battlefield. +SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ ExileFromGrave<2/card> | Execute$ TrigReturn | SpellDescription$ When you do, return target creature card from your graveyard to the battlefield. +SVar:TrigReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature to return from your graveyard +DeckHas:Ability$Graveyard +DeckHints:Ability$Discard +SVar:NeedsToPlayVar:Z EQ3 +SVar:X:Count$InYourYard/LimitMax.3 +SVar:Y:Count$TypeInYourYard.Creature/LimitMax.1 +SVar:Z:SVar$X/Times.Y +Oracle:When Young Necromancer enters the battlefield, you may exile two cards from your graveyard. When you do, return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/yusri_fortunes_flame.txt b/forge-gui/res/cardsfolder/upcoming/yusri_fortunes_flame.txt new file mode 100644 index 00000000000..4f4083819a7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/yusri_fortunes_flame.txt @@ -0,0 +1,17 @@ +Name:Yusri, Fortune's Flame +ManaCost:1 U R +Types:Legendary Creature Efreet +PT:2/3 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChooseNumber | TriggerDescription$ Whenever CARDNAME attacks, choose a number between 1 and 5. Flip that many coins. For each flip you win, draw a card. For each flip you lose, NICKNAME deals 2 damage to you. If you won five flips this way, you may cast spells from your hand this turn without paying their mana costs. +SVar:TrigChooseNumber:DB$ ChooseNumber | Defined$ You | Min$ 1 | Max$ 5 | AILogic$ Max | SubAbility$ FlipCoin +SVar:FlipCoin:DB$ FlipACoin | Amount$ X | WinSubAbility$ DBDraw | LoseSubAbility$ DBDamage | RememberNumber$ Wins | SubAbility$ DBEffect +SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ Wins +SVar:DBDamage:DB$ DealDamage | NumDmg$ Damage | Defined$ You +SVar:DBEffect:DB$ Effect | StaticAbilities$ MayPlay | Stackable$ False | ConditionCheckSVar$ Y | ConditionSVarCompare$ EQ5 | SubAbility$ DBCleanup +SVar:MayPlay:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonLand+YouOwn | MayPlay$ True | MayPlayWithoutManaCost$ True | AffectedZone$ Hand | Description$ You may cast spells from your hand this turn without paying their mana costs. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Number$ChosenNumber +SVar:Y:Count$RememberedNumber +SVar:Damage:SVar$Losses/Times.2 +Oracle:Flying\nWhenever Yusri, Fortune's Flame attacks, choose a number between 1 and 5. Flip that many coins. For each flip you win, draw a card. For each flip you lose, Yusri deals 2 damage to you. If you won five flips this way, you may cast spells from your hand this turn without paying their mana costs. diff --git a/forge-gui/res/cardsfolder/upcoming/valentin_dean_of_the_vein_lisette_dean_of_the_root.txt b/forge-gui/res/cardsfolder/v/valentin_dean_of_the_vein_lisette_dean_of_the_root.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/valentin_dean_of_the_vein_lisette_dean_of_the_root.txt rename to forge-gui/res/cardsfolder/v/valentin_dean_of_the_vein_lisette_dean_of_the_root.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vanishing_verse.txt b/forge-gui/res/cardsfolder/v/vanishing_verse.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vanishing_verse.txt rename to forge-gui/res/cardsfolder/v/vanishing_verse.txt diff --git a/forge-gui/res/cardsfolder/v/vaporkin.txt b/forge-gui/res/cardsfolder/v/vaporkin.txt index 55d6fa93161..86588c1a999 100644 --- a/forge-gui/res/cardsfolder/v/vaporkin.txt +++ b/forge-gui/res/cardsfolder/v/vaporkin.txt @@ -3,6 +3,5 @@ ManaCost:1 U Types:Creature Elemental PT:2/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/vaporkin.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying\nVaporkin can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt b/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt index 66824489bfa..73fcd774f7a 100644 --- a/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt +++ b/forge-gui/res/cardsfolder/v/varchild_betrayer_of_kjeldor.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigToken | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, that player creates that many 1/1 red Survivor creature tokens. SVar:TrigToken:DB$ Token | TokenOwner$ TriggeredTarget | TokenAmount$ X | TokenScript$ r_1_1_survivor | LegacyImage$ r 1 1 survivor c18 SVar:X:TriggerCount$DamageAmount -S:Mode$ Continuous | Affected$ Survivor.OppCtrl | AddHiddenKeyword$ CantBlock Creature | Description$ Survivors your opponents control can't block. +S:Mode$ CantBlockBy | ValidBlocker$ Survivor.OppCtrl | Description$ Survivors your opponents control can't block. S:Mode$ CantAttack | ValidCard$ Creature.Survivor+OppCtrl | Target$ You,Planeswalker.YouCtrl | Description$ Survivors your opponents control can't attack you or planeswalkers you control. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.Self | Execute$ TrigGainControl | TriggerDescription$ When NICKNAME leaves the battlefield, gain control of all Survivors. SVar:TrigGainControl:DB$ GainControl | AllValid$ Survivor | NewController$ You diff --git a/forge-gui/res/cardsfolder/v/vassals_duty.txt b/forge-gui/res/cardsfolder/v/vassals_duty.txt index 9c7143b9e49..06df1e6baa6 100644 --- a/forge-gui/res/cardsfolder/v/vassals_duty.txt +++ b/forge-gui/res/cardsfolder/v/vassals_duty.txt @@ -1,7 +1,7 @@ Name:Vassal's Duty ManaCost:3 W Types:Enchantment -A:AB$ Effect | Cost$ 1 | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature to redirect damage from | ReplacementEffects$ DamageEvent | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target legendary creature you control is dealt to you instead. +A:AB$ Effect | Cost$ 1 | ValidTgts$ Creature.Legendary+YouCtrl | TgtPrompt$ Select target legendary creature to redirect damage from | ReplacementEffects$ DamageEvent | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to target legendary creature you control is dealt to you instead. SVar:DamageEvent:Event$ DamageDone | ValidTarget$ Creature.IsRemembered | ReplaceWith$ DamageEventDmg | DamageTarget$ You | Description$ The next 1 damage that would be dealt to target legendary creature you control is dealt to you instead. SVar:DamageEventDmg:DB$ ReplaceSplitDamage | DamageTarget$ You AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/v/vec_townships.txt b/forge-gui/res/cardsfolder/v/vec_townships.txt index 0d5dcda81c4..22d2c180c85 100644 --- a/forge-gui/res/cardsfolder/v/vec_townships.txt +++ b/forge-gui/res/cardsfolder/v/vec_townships.txt @@ -4,5 +4,5 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. CARDNAME doesn't untap during your next untap step. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBPump:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent Oracle:{T}: Add {C}.\n{T}: Add {G} or {W}. Vec Townships doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/v/veil_of_birds.txt b/forge-gui/res/cardsfolder/v/veil_of_birds.txt index 645d31fe877..64ed1481ed3 100644 --- a/forge-gui/res/cardsfolder/v/veil_of_birds.txt +++ b/forge-gui/res/cardsfolder/v/veil_of_birds.txt @@ -2,6 +2,6 @@ Name:Veil of Birds ManaCost:U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes a 1/1 Bird creature with flying. -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 1 | Toughness$ 1 | Keywords$ Flying | Types$ Creature,Bird | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 1 | Toughness$ 1 | Keywords$ Flying | Types$ Creature,Bird | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/veil_of_birds.jpg Oracle:When an opponent casts a spell, if Veil of Birds is an enchantment, Veil of Birds becomes a 1/1 Bird creature with flying. diff --git a/forge-gui/res/cardsfolder/v/veiled_apparition.txt b/forge-gui/res/cardsfolder/v/veiled_apparition.txt index d45fa1b80d9..705a2a502b8 100644 --- a/forge-gui/res/cardsfolder/v/veiled_apparition.txt +++ b/forge-gui/res/cardsfolder/v/veiled_apparition.txt @@ -2,6 +2,6 @@ Name:Veiled Apparition ManaCost:1 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice CARDNAME unless you pay {1}{U}." -SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ Flying & UpkeepCost:1 U | Types$ Creature,Illusion | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$Animate | Defined$ Self | Power$ 3 | Toughness$ 3 | Keywords$ Flying & UpkeepCost:1 U | Types$ Creature,Illusion | RemoveCardTypes$ True | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_apparition.jpg Oracle:When an opponent casts a spell, if Veiled Apparition is an enchantment, Veiled Apparition becomes a 3/3 Illusion creature with flying and "At the beginning of your upkeep, sacrifice Veiled Apparition unless you pay {1}{U}." diff --git a/forge-gui/res/cardsfolder/v/veiled_crocodile.txt b/forge-gui/res/cardsfolder/v/veiled_crocodile.txt index 51d99482a91..0531525601f 100644 --- a/forge-gui/res/cardsfolder/v/veiled_crocodile.txt +++ b/forge-gui/res/cardsfolder/v/veiled_crocodile.txt @@ -2,7 +2,7 @@ Name:Veiled Crocodile ManaCost:2 U Types:Enchantment T:Mode$ Always | CheckSVar$ X | SVarCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigVCAnimate | IsPresent$ Card.Self+Enchantment | ResolvingCheck$ IsPresent | TriggerDescription$ When a player has no cards in hand, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Crocodile creature. -SVar:TrigVCAnimate:DB$ Animate | Types$ Creature,Crocodile | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Permanent$ True +SVar:TrigVCAnimate:DB$ Animate | Types$ Creature,Crocodile | Power$ 4 | Toughness$ 4 | RemoveCardTypes$ True | Duration$ Permanent SVar:X:PlayerCountPlayers$LowestValidHand Card.YouOwn AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_crocodile.jpg diff --git a/forge-gui/res/cardsfolder/v/veiled_sentry.txt b/forge-gui/res/cardsfolder/v/veiled_sentry.txt index 10572115497..3941b608a01 100644 --- a/forge-gui/res/cardsfolder/v/veiled_sentry.txt +++ b/forge-gui/res/cardsfolder/v/veiled_sentry.txt @@ -2,7 +2,7 @@ Name:Veiled Sentry ManaCost:U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | Execute$ TrigAnimate | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes an Illusion creature with power and toughness each equal to that spell's mana value. -SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Illusion | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ X | Toughness$ X | Types$ Creature,Illusion | RemoveCardTypes$ True | Duration$ Permanent SVar:X:TriggerCount$CastSACMC SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_sentry.jpg Oracle:When an opponent casts a spell, if Veiled Sentry is an enchantment, Veiled Sentry becomes an Illusion creature with power and toughness each equal to that spell's mana value. diff --git a/forge-gui/res/cardsfolder/v/veiled_serpent.txt b/forge-gui/res/cardsfolder/v/veiled_serpent.txt index 425163a3892..55b4fb75fae 100644 --- a/forge-gui/res/cardsfolder/v/veiled_serpent.txt +++ b/forge-gui/res/cardsfolder/v/veiled_serpent.txt @@ -2,7 +2,7 @@ Name:Veiled Serpent ManaCost:2 U Types:Enchantment T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | IsPresent$ Card.Self+Enchantment | Execute$ TrigAnimate | TriggerDescription$ When an opponent casts a spell, if CARDNAME is an enchantment, CARDNAME becomes a 4/4 Serpent creature with "This creature can't attack unless defending player controls an Island." -SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | staticAbilities$ VeiledSerpentST | Types$ Creature,Serpent | RemoveCardTypes$ True | Permanent$ True +SVar:TrigAnimate:DB$ Animate | Defined$ Self | Power$ 4 | Toughness$ 4 | staticAbilities$ VeiledSerpentST | Types$ Creature,Serpent | RemoveCardTypes$ True | Duration$ Permanent K:Cycling:2 SVar:VeiledSerpentST:Mode$ CantAttack | ValidCard$ Card.Self | UnlessDefenderControls$ Island | Description$ CARDNAME can't attack unless defending player controls an Island. SVar:Picture:http://www.wizards.com/global/images/magic/general/veiled_serpent.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/veinwitch_coven.txt b/forge-gui/res/cardsfolder/v/veinwitch_coven.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/veinwitch_coven.txt rename to forge-gui/res/cardsfolder/v/veinwitch_coven.txt diff --git a/forge-gui/res/cardsfolder/upcoming/velomachus_lorehold.txt b/forge-gui/res/cardsfolder/v/velomachus_lorehold.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/velomachus_lorehold.txt rename to forge-gui/res/cardsfolder/v/velomachus_lorehold.txt diff --git a/forge-gui/res/cardsfolder/upcoming/venerable_warsinger.txt b/forge-gui/res/cardsfolder/v/venerable_warsinger.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/venerable_warsinger.txt rename to forge-gui/res/cardsfolder/v/venerable_warsinger.txt diff --git a/forge-gui/res/cardsfolder/upcoming/verdant_mastery.txt b/forge-gui/res/cardsfolder/v/verdant_mastery.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/verdant_mastery.txt rename to forge-gui/res/cardsfolder/v/verdant_mastery.txt diff --git a/forge-gui/res/cardsfolder/v/verdant_touch.txt b/forge-gui/res/cardsfolder/v/verdant_touch.txt index d17e78a6b26..5f922b7dca9 100644 --- a/forge-gui/res/cardsfolder/v/verdant_touch.txt +++ b/forge-gui/res/cardsfolder/v/verdant_touch.txt @@ -1,7 +1,7 @@ Name:Verdant Touch ManaCost:1 G Types:Sorcery -A:SP$ Animate | Cost$ 1 G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Types$ Creature | Permanent$ True | SpellDescription$ Target land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) +A:SP$ Animate | Cost$ 1 G | ValidTgts$ Land | TgtPrompt$ Select target land | Power$ 2 | Toughness$ 2 | Types$ Creature | Duration$ Permanent | SpellDescription$ Target land becomes a 2/2 creature that's still a land. (This effect lasts indefinitely.) K:Buyback:3 AI:RemoveDeck:Random SVar:Picture:http://www.wizards.com/global/images/magic/general/verdant_touch.jpg diff --git a/forge-gui/res/cardsfolder/v/vertigo_spawn.txt b/forge-gui/res/cardsfolder/v/vertigo_spawn.txt index ae5e0099927..7d85c22f961 100644 --- a/forge-gui/res/cardsfolder/v/vertigo_spawn.txt +++ b/forge-gui/res/cardsfolder/v/vertigo_spawn.txt @@ -5,7 +5,7 @@ PT:0/3 K:Defender T:Mode$ AttackerBlocked | ValidCard$ Creature | ValidBlocker$ Card.Self | Execute$ TrigTap | TriggerDescription$ Whenever CARDNAME blocks a creature, tap that creature. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | Defined$ TriggeredAttacker | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:HasBlockEffect:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/vertigo_spawn.jpg Oracle:Defender\nWhenever Vertigo Spawn blocks a creature, tap that creature. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt index 336eb8270ba..3f8f0e1bce7 100644 --- a/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt +++ b/forge-gui/res/cardsfolder/v/vesuvan_doppelganger.txt @@ -7,6 +7,6 @@ K:ETBReplacement:Copy:ChooseCreature:Optional SVar:ChooseCreature:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.Other | SubAbility$ DBCopy | RememberChosen$ True | AILogic$ Clone | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." SVar:DBCopy:DB$ Clone | Defined$ Remembered | Colors$ Blue | OverwriteColors$ True | AddTriggers$ VesDopUpkeepTrig | AddSVars$ VesDopCopy,VesDopUpkeepTrig SVar:VesDopUpkeepTrig:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ VesDopCopy | TriggerDescription$ At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability. -SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | AddSVars$ VesDopCopy | AILogic$ CloneBestCreature | SubAbility$ DBCleanup +SVar:VesDopCopy:DB$ Clone | ValidTgts$ Creature | TgtPrompt$ Select target creature to copy. | Optional$ True | Colors$ Blue | OverwriteColors$ True | GainThisAbility$ True | AddSVars$ VesDopCopy | AILogic$ CloneBestCreature SVar:Picture:http://www.wizards.com/global/images/magic/general/vesuvan_doppelganger.jpg Oracle:You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield, except it doesn't copy that creature's color and it has "At the beginning of your upkeep, you may have this creature become a copy of target creature, except it doesn't copy that creature's color and it has this ability." diff --git a/forge-gui/res/cardsfolder/v/vexing_shusher.txt b/forge-gui/res/cardsfolder/v/vexing_shusher.txt index c1c29c6002d..b1498c592fa 100644 --- a/forge-gui/res/cardsfolder/v/vexing_shusher.txt +++ b/forge-gui/res/cardsfolder/v/vexing_shusher.txt @@ -3,6 +3,6 @@ ManaCost:RG RG Types:Creature Goblin Shaman PT:2/2 K:CARDNAME can't be countered. -A:AB$ Pump | Cost$ RG | ValidTgts$ Card.inZoneStack | TgtZone$ Stack | PumpZone$ Stack | KW$ HIDDEN This spell can't be countered. | SpellDescription$ Target spell can't be countered. +A:AB$ Pump | Cost$ RG | ValidTgts$ Card.inZoneStack | TgtZone$ Stack | PumpZone$ Stack | KW$ HIDDEN CARDNAME can't be countered. | SpellDescription$ Target spell can't be countered. AI:RemoveDeck:All Oracle:This spell can't be countered.\n{R/G}: Target spell can't be countered. diff --git a/forge-gui/res/cardsfolder/upcoming/veyran_voice_of_duality.txt b/forge-gui/res/cardsfolder/v/veyran_voice_of_duality.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/veyran_voice_of_duality.txt rename to forge-gui/res/cardsfolder/v/veyran_voice_of_duality.txt diff --git a/forge-gui/res/cardsfolder/v/vigor.txt b/forge-gui/res/cardsfolder/v/vigor.txt index 3405c022579..cbb45842ece 100644 --- a/forge-gui/res/cardsfolder/v/vigor.txt +++ b/forge-gui/res/cardsfolder/v/vigor.txt @@ -3,10 +3,9 @@ ManaCost:3 G G G Types:Creature Elemental Incarnation PT:6/6 K:Trample -R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Creature.YouCtrl+Other | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to another creature you control, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way. +R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Creature.YouCtrl+Other | ReplaceWith$ Counters | PreventionEffect$ True | ExecuteMode$ PerTarget | Description$ If damage would be dealt to another creature you control, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way. SVar:Counters:DB$PutCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ X SVar:X:ReplaceCount$DamageAmount T:Mode$ ChangesZone | Origin$ Any | Destination$ Graveyard | ValidCard$ Creature.Self | Execute$ TrigShuffle | TriggerDescription$ When CARDNAME is put into a graveyard from anywhere, shuffle it into its owner's library. SVar:TrigShuffle:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ TriggeredCardLKICopy -SVar:Picture:http://www.wizards.com/global/images/magic/general/vigor.jpg Oracle:Trample\nIf damage would be dealt to another creature you control, prevent that damage. Put a +1/+1 counter on that creature for each 1 damage prevented this way.\nWhen Vigor is put into a graveyard from anywhere, shuffle it into its owner's library. diff --git a/forge-gui/res/cardsfolder/v/vindictive_mob.txt b/forge-gui/res/cardsfolder/v/vindictive_mob.txt index 9615210989a..a3874dd0280 100644 --- a/forge-gui/res/cardsfolder/v/vindictive_mob.txt +++ b/forge-gui/res/cardsfolder/v/vindictive_mob.txt @@ -3,9 +3,8 @@ ManaCost:4 B B Types:Creature Human Berserker PT:5/5 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSac | TriggerDescription$ When CARDNAME enters the battlefield, sacrifice a creature. -SVar:TrigSac:DB$Sacrifice | Defined$ You | SacValid$ Creature -K:CantBeBlockedBy Saproling +SVar:TrigSac:DB$ Sacrifice | Defined$ You | SacValid$ Creature +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Saproling | Description$ CARDNAME can't be blocked by Saprolings. AI:RemoveDeck:Random SVar:NeedsToPlay:Creature.YouCtrl -SVar:Picture:http://www.wizards.com/global/images/magic/general/vindictive_mob.jpg -Oracle:When Vindictive Mob enters the battlefield, sacrifice a creature.\nVindictive Mob can't be blocked by Saprolings. +Oracle:When Vindictive Mob enters the battlefield, sacrifice a creature.\nVindictive Mob can't be blocked by Saprolings. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/v/vine_mare.txt b/forge-gui/res/cardsfolder/v/vine_mare.txt index eb76fdca105..d8053a725f6 100644 --- a/forge-gui/res/cardsfolder/v/vine_mare.txt +++ b/forge-gui/res/cardsfolder/v/vine_mare.txt @@ -1,7 +1,7 @@ Name:Vine Mare ManaCost:2 G G Types:Creature Elemental Horse -K:Hexproof -K:CantBeBlockedBy Creature.Black -Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nVine Mare can't be blocked by black creatures. PT:5/3 +K:Hexproof +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Black | Description$ CARDNAME can't be blocked by black creatures. +Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nVine Mare can't be blocked by black creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/vineglimmer_snarl.txt b/forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vineglimmer_snarl.txt rename to forge-gui/res/cardsfolder/v/vineglimmer_snarl.txt diff --git a/forge-gui/res/cardsfolder/v/vivien_champion_of_the_wilds.txt b/forge-gui/res/cardsfolder/v/vivien_champion_of_the_wilds.txt index d9accf3e095..12320dc20a8 100644 --- a/forge-gui/res/cardsfolder/v/vivien_champion_of_the_wilds.txt +++ b/forge-gui/res/cardsfolder/v/vivien_champion_of_the_wilds.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Legendary Planeswalker Vivien Loyalty:4 S:Mode$ CastWithFlash | ValidCard$ Creature | ValidSA$ Spell | Caster$ You | Description$ You may cast creature spells as though they had flash. -A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature | KW$ Vigilance & Reach | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, up to one target creature gains vigilance and reach. +A:AB$ Pump | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature | KW$ Vigilance & Reach | Duration$ UntilYourNextTurn | SpellDescription$ Until your next turn, up to one target creature gains vigilance and reach. A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Defined$ You | DigNum$ 3 | DestinationZone$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DBEffect | AILogic$ DigForCreature | SpellDescription$ Look at the top three cards of your library. Exile one face down and put the rest on the bottom of your library in any order. For as long as it remains exiled, you may look at that card and you may cast it if it's a creature spell. SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STPlay1,STPlay2 | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup SVar:STPlay1:Mode$ Continuous | MayLookAt$ You | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may look at the card and you may cast it if it's a creature. diff --git a/forge-gui/res/cardsfolder/v/vodalian_mystic.txt b/forge-gui/res/cardsfolder/v/vodalian_mystic.txt index f7a0acc6aa4..56388ba1d65 100644 --- a/forge-gui/res/cardsfolder/v/vodalian_mystic.txt +++ b/forge-gui/res/cardsfolder/v/vodalian_mystic.txt @@ -3,7 +3,7 @@ ManaCost:1 U Types:Creature Merfolk Wizard PT:1/1 A:AB$ ChooseColor | Cost$ T | Defined$ You | SubAbility$ Animate | SpellDescription$ Target instant or sorcery spell becomes the color of your choice. -SVar:Animate:DB$ Animate | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target instant or sorcery spell to change the color of | TgtZone$ Stack | Colors$ ChosenColor | OverwriteColors$ True | Permanent$ True +SVar:Animate:DB$ Animate | ValidTgts$ Instant,Sorcery | TgtPrompt$ Select target instant or sorcery spell to change the color of | TgtZone$ Stack | Colors$ ChosenColor | OverwriteColors$ True | Duration$ Permanent AI:RemoveDeck:Random AI:RemoveDeck:All Oracle:{T}: Target instant or sorcery spell becomes the color of your choice. diff --git a/forge-gui/res/cardsfolder/v/void_winnower.txt b/forge-gui/res/cardsfolder/v/void_winnower.txt index 676eecee8bf..89b80e74206 100644 --- a/forge-gui/res/cardsfolder/v/void_winnower.txt +++ b/forge-gui/res/cardsfolder/v/void_winnower.txt @@ -3,7 +3,6 @@ ManaCost:9 Types:Creature Eldrazi PT:11/9 S:Mode$ CantBeCast | ValidCard$ Card.cmcEven | Caster$ Opponent | Description$ Your opponents can't cast spells with even mana values. (Zero is even.) -S:Mode$ Continuous | Affected$ Creature.OppCtrl+cmcEven | AddHiddenKeyword$ CARDNAME can't block. | Description$ Your opponents can't block with creatures with even mana values. +S:Mode$ CantBlockBy | ValidAttacker$ Creature | ValidBlocker$ Creature.OppCtrl+cmcEven | Description$ Your opponents can't block with creatures with even mana values. SVar:PlayMain1:TRUE -SVar:Picture:http://www.wizards.com/global/images/magic/general/void_winnower.jpg Oracle:Your opponents can't cast spells with even mana values. (Zero is even.)\nYour opponents can't block with creatures with even mana values. diff --git a/forge-gui/res/cardsfolder/v/vorinclex_voice_of_hunger.txt b/forge-gui/res/cardsfolder/v/vorinclex_voice_of_hunger.txt index 2e24c03e087..3bf1d621497 100644 --- a/forge-gui/res/cardsfolder/v/vorinclex_voice_of_hunger.txt +++ b/forge-gui/res/cardsfolder/v/vorinclex_voice_of_hunger.txt @@ -6,5 +6,5 @@ K:Trample T:Mode$ TapsForMana | ValidCard$ Land | Activator$ You | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever you tap a land for mana, add one mana of any type that land produced. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ You T:Mode$ TapsForMana | ValidCard$ Land.OppCtrl | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever an opponent taps a land for mana, that land doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:TrigPump:DB$ Pump | Defined$ TriggeredCard | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. Oracle:Trample\nWhenever you tap a land for mana, add one mana of any type that land produced.\nWhenever an opponent taps a land for mana, that land doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/vortex_runner.txt b/forge-gui/res/cardsfolder/v/vortex_runner.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/vortex_runner.txt rename to forge-gui/res/cardsfolder/v/vortex_runner.txt diff --git a/forge-gui/res/cardsfolder/v/vraska_the_unseen.txt b/forge-gui/res/cardsfolder/v/vraska_the_unseen.txt index 54151eace7b..225c46f3320 100644 --- a/forge-gui/res/cardsfolder/v/vraska_the_unseen.txt +++ b/forge-gui/res/cardsfolder/v/vraska_the_unseen.txt @@ -2,7 +2,7 @@ Name:Vraska the Unseen ManaCost:3 B G Types:Legendary Planeswalker Vraska Loyalty:5 -A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Self | Triggers$ TrigVraska | sVars$ VraskaGaze | UntilYourNextTurn$ True | AILogic$ EOT | SpellDescription$ Until your next turn, whenever a creature deals combat damage to CARDNAME, destroy that creature. | StackDescription$ Until your next turn, whenever a creature deals combat damage to CARDNAME, destroy that creature. +A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Self | Triggers$ TrigVraska | sVars$ VraskaGaze | Duration$ UntilYourNextTurn | AILogic$ EOT | SpellDescription$ Until your next turn, whenever a creature deals combat damage to CARDNAME, destroy that creature. | StackDescription$ Until your next turn, whenever a creature deals combat damage to CARDNAME, destroy that creature. SVar:TrigVraska:Mode$ DamageDone | ValidSource$ Creature | ValidTarget$ Card.Self | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ VraskaGaze | TriggerDescription$ Until your next turn, whenever a creature deals combat damage to CARDNAME, destroy that creature. SVar:VraskaGaze:DB$ Destroy | Defined$ TriggeredSourceLKICopy A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent.nonLand | TgtPrompt$ Select target nonland permanent | SpellDescription$ Destroy target nonland permanent. diff --git a/forge-gui/res/cardsfolder/upcoming/wake_the_past.txt b/forge-gui/res/cardsfolder/w/wake_the_past.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wake_the_past.txt rename to forge-gui/res/cardsfolder/w/wake_the_past.txt diff --git a/forge-gui/res/cardsfolder/w/waker_of_the_wilds.txt b/forge-gui/res/cardsfolder/w/waker_of_the_wilds.txt index 0e7b5375207..416f8c4232c 100644 --- a/forge-gui/res/cardsfolder/w/waker_of_the_wilds.txt +++ b/forge-gui/res/cardsfolder/w/waker_of_the_wilds.txt @@ -3,7 +3,7 @@ ManaCost:2 G G Types:Creature Merfolk Shaman PT:3/3 A:AB$ PutCounter | Cost$ X G G | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBAnimate | SpellDescription$ Put X +1/+1 counters on target land you control. That land becomes a 0/0 Elemental creature with haste. It's still a land. -SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent SVar:X:Count$xPaid SVar:Picture:http://media.wizards.com/2017/xln/en_UBMBPNXl7u.png Oracle:{X}{G}{G}: Put X +1/+1 counters on target land you control. That land becomes a 0/0 Elemental creature with haste. It's still a land. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/wakeroot_elemental.txt b/forge-gui/res/cardsfolder/w/wakeroot_elemental.txt index 8844064008c..a8c1ff5ab6a 100644 --- a/forge-gui/res/cardsfolder/w/wakeroot_elemental.txt +++ b/forge-gui/res/cardsfolder/w/wakeroot_elemental.txt @@ -3,5 +3,5 @@ ManaCost:4 G G Types:Creature Elemental PT:5/5 A:AB$ Untap | Cost$ G G G G G | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | SubAbility$ DBAnimate | SpellDescription$ Untap target land you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts as long as that land remains on the battlefield.) -SVar:DBAnimate:DB$ Animate | Power$ 5 | Toughness$ 5 | Defined$ Targeted | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +SVar:DBAnimate:DB$ Animate | Power$ 5 | Toughness$ 5 | Defined$ Targeted | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent Oracle:{G}{G}{G}{G}{G}: Untap target land you control. It becomes a 5/5 Elemental creature with haste. It's still a land. (This effect lasts as long as that land remains on the battlefield.) diff --git a/forge-gui/res/cardsfolder/w/wall_of_frost.txt b/forge-gui/res/cardsfolder/w/wall_of_frost.txt index 0b017a4f424..8858f6330a1 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_frost.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_frost.txt @@ -4,6 +4,6 @@ Types:Creature Wall PT:0/7 K:Defender T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:HasBlockEffect:TRUE Oracle:Defender\nWhenever Wall of Frost blocks a creature, that creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt b/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt index 3f9a9527e74..95fc57d0e19 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt @@ -5,6 +5,6 @@ PT:0/6 K:Defender T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME enters the battlefield, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. SVar:TrigPutCounter:DB$PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Permanent$ True +SVar:DBAnimate:DB$Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_resurgence.jpg Oracle:Defender\nWhen Wall of Resurgence enters the battlefield, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt b/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt index 7b3f7c1fcf7..9bd045bfaf5 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_stolen_identity.txt @@ -6,6 +6,6 @@ K:ETBReplacement:Copy:DBCopy:Optional SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | AddTypes$ Wall | AddKeywords$ Defender | AiChoiceLogic$ BestOppCtrl | SubAbility$ DBTrigger | RememberCloneOrigin$ True | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature on the battlefield, except it's a Wall in addition to its other types and has defender. When you do, tap the copied creature and it doesn't untap during its controller's untap step for as long as you control CARDNAME. SVar:DBTrigger:DB$ ImmediateTrigger | Execute$ DBTap | RememberObjects$ RememberedCard | SubAbility$ DBCleanup | TriggerDescription$ When you do, tap the copied creature and it doesn't untap during its controller's untap step for as long as you control CARDNAME. SVar:DBTap:DB$ Tap | Defined$ DelayTriggerRemembered | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ DelayTriggerRemembered | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | UntilHostLeavesPlay$ True +SVar:DBPump:DB$ Pump | Defined$ DelayTriggerRemembered | KW$ HIDDEN CARDNAME doesn't untap during your untap step. | Duration$ UntilLoseControlOfHost SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:You may have Wall of Stolen Identity enter the battlefield as a copy of any creature on the battlefield, except it's a Wall in addition to its other types and has defender. When you do, tap the copied creature and it doesn't untap during its controller's untap step for as long as you control Wall of Stolen Identity. diff --git a/forge-gui/res/cardsfolder/w/wall_of_tombstones.txt b/forge-gui/res/cardsfolder/w/wall_of_tombstones.txt index 764d51e26a8..d08b16fee37 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_tombstones.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_tombstones.txt @@ -4,7 +4,7 @@ Types:Creature Wall PT:0/1 K:Defender T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigTough | TriggerDescription$ At the beginning of your upkeep, change CARDNAME's base toughness to 1 plus the number of creature cards in your graveyard. (This effect lasts indefinitely.) -SVar:TrigTough:DB$Animate | Toughness$ X | Permanent$ True +SVar:TrigTough:DB$Animate | Toughness$ X | Duration$ Permanent SVar:X:Count$TypeInYourYard.Creature/Plus.1 SVar:Picture:http://www.wizards.com/global/images/magic/general/wall_of_tombstones.jpg Oracle:Defender (This creature can't attack.)\nAt the beginning of your upkeep, change Wall of Tombstones's base toughness to 1 plus the number of creature cards in your graveyard. (This effect lasts indefinitely.) diff --git a/forge-gui/res/cardsfolder/w/wanderbrine_rootcutters.txt b/forge-gui/res/cardsfolder/w/wanderbrine_rootcutters.txt index 672cbaf2b01..36194ef8bd3 100644 --- a/forge-gui/res/cardsfolder/w/wanderbrine_rootcutters.txt +++ b/forge-gui/res/cardsfolder/w/wanderbrine_rootcutters.txt @@ -2,6 +2,5 @@ Name:Wanderbrine Rootcutters ManaCost:2 UB UB Types:Creature Merfolk Rogue PT:3/3 -K:CantBeBlockedBy Creature.Green -SVar:Picture:http://www.wizards.com/global/images/magic/general/wanderbrine_rootcutters.jpg -Oracle:Wanderbrine Rootcutters can't be blocked by green creatures. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.Green | Description$ CARDNAME can't be blocked by green creatures. +Oracle:Wanderbrine Rootcutters can't be blocked by green creatures. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/wandering_archaic_explore_the_vastlands.txt b/forge-gui/res/cardsfolder/w/wandering_archaic_explore_the_vastlands.txt similarity index 59% rename from forge-gui/res/cardsfolder/upcoming/wandering_archaic_explore_the_vastlands.txt rename to forge-gui/res/cardsfolder/w/wandering_archaic_explore_the_vastlands.txt index 85c4862a634..75049133171 100644 --- a/forge-gui/res/cardsfolder/upcoming/wandering_archaic_explore_the_vastlands.txt +++ b/forge-gui/res/cardsfolder/w/wandering_archaic_explore_the_vastlands.txt @@ -12,8 +12,7 @@ ALTERNATE Name:Explore the Vastlands ManaCost:3 Types:Sorcery -A:SP$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBDig | SpellDescription$ Each player looks at the top five cards of their library and may reveal a land card and/or an instant or sorcery card from among them. Each player puts the cards they revealed this way into their hand and the rest on the bottom of their library in a random order. Each player gains 3 life. -SVar:DBDig:DB$ Dig | Defined$ Player.IsRemembered | Choser$ Player.IsRemembered | DigNum$ 5 | ChangeNum$ 1 | ChangeValid$ Land,Instant,Sorcery | RestRandomOrder$ True | SubAbility$ DBGainLife | SpellDescription$ Each player looks at the top five cards of their library, reveals a land card and/or an instant or sorcery card from among them, then puts the cards they revealed this way into their hand and the rest on the bottom of their library in a random order. +A:SP$ DigMultiple | Defined$ Player | DigNum$ 5 | Optional$ True | ChangeValid$ Land,Spell.HasNoSubtype Aura | RestRandomOrder$ True | SpellDescription$ Each player may reveal a land card and/or an instant or sorcery card from among them, then puts the cards they revealed this way into their hand and the rest on the bottom of their library in a random order. SVar:DBGainLife:DB$ GainLife | Defined$ Player | LifeAmount$ 3 DeckHas:Ability$LifeGain DeckHints:Type$Instant|Sorcery diff --git a/forge-gui/res/cardsfolder/w/wandering_wolf.txt b/forge-gui/res/cardsfolder/w/wandering_wolf.txt index 9fbbd335f9b..2ba33e074c4 100644 --- a/forge-gui/res/cardsfolder/w/wandering_wolf.txt +++ b/forge-gui/res/cardsfolder/w/wandering_wolf.txt @@ -2,6 +2,6 @@ Name:Wandering Wolf ManaCost:1 G Types:Creature Wolf PT:2/1 -K:Creatures with power less than CARDNAME's power can't block it. -SVar:Picture:http://www.wizards.com/global/images/magic/general/wandering_wolf.jpg -Oracle:Creatures with power less than Wandering Wolf's power can't block it. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLTX | Description$ Creatures with power less than CARDNAME's power can't block it. +SVar:X:Count$CardPower +Oracle:Creatures with power less than Wandering Wolf's power can't block it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/war_name_aspirant.txt b/forge-gui/res/cardsfolder/w/war_name_aspirant.txt index 82f8cd49e10..a2dad8c251f 100644 --- a/forge-gui/res/cardsfolder/w/war_name_aspirant.txt +++ b/forge-gui/res/cardsfolder/w/war_name_aspirant.txt @@ -2,7 +2,7 @@ Name:War-Name Aspirant ManaCost:1 R Types:Creature Human Warrior PT:2/1 -K:CantBeBlockedBy Creature.powerLE1 K:etbCounter:P1P1:1:CheckSVar$ RaidTest: Raid — CARDNAME enters the battlefield with a +1/+1 counter on it if you attacked this turn. SVar:RaidTest:Count$AttackersDeclared -Oracle:Raid — War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked this turn.\nWar-Name Aspirant can't be blocked by creatures with power 1 or less. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE1 | Description$ CARDNAME can't be blocked by creatures with power 1 or less. +Oracle:Raid — War-Name Aspirant enters the battlefield with a +1/+1 counter on it if you attacked this turn.\nWar-Name Aspirant can't be blocked by creatures with power 1 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/warden_of_the_first_tree.txt b/forge-gui/res/cardsfolder/w/warden_of_the_first_tree.txt index 90893a4cdf7..2dc8af14234 100644 --- a/forge-gui/res/cardsfolder/w/warden_of_the_first_tree.txt +++ b/forge-gui/res/cardsfolder/w/warden_of_the_first_tree.txt @@ -2,8 +2,8 @@ Name:Warden of the First Tree ManaCost:G Types:Creature Human PT:1/1 -A:AB$ Animate | Cost$ 1 WB | Types$ Human,Warrior | Permanent$ True | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME becomes a Human Warrior with base power and toughness 3/3. -A:AB$ Animate | Cost$ 2 WB WB | Defined$ Self | ConditionPresent$ Card.Self+Warrior | Types$ Human,Warrior,Spirit | Permanent$ True | Keywords$ Trample & Lifelink | SpellDescription$ If CARDNAME is a Warrior, it becomes a Human Spirit Warrior with trample and lifelink. +A:AB$ Animate | Cost$ 1 WB | Types$ Human,Warrior | Duration$ Permanent | Power$ 3 | Toughness$ 3 | SpellDescription$ CARDNAME becomes a Human Warrior with base power and toughness 3/3. +A:AB$ Animate | Cost$ 2 WB WB | Defined$ Self | ConditionPresent$ Card.Self+Warrior | Types$ Human,Warrior,Spirit | Duration$ Permanent | Keywords$ Trample & Lifelink | SpellDescription$ If CARDNAME is a Warrior, it becomes a Human Spirit Warrior with trample and lifelink. A:AB$ PutCounter | Cost$ 3 WB WB WB | ConditionPresent$ Card.Self+Spirit | CounterType$ P1P1 | CounterNum$ 5 | SpellDescription$ If CARDNAME is a Spirit, put five +1/+1 counters on it. SVar:Picture:http://www.wizards.com/global/images/magic/general/warden_of_the_first_tree.jpg Oracle:{1}{W/B}: Warden of the First Tree becomes a Human Warrior with base power and toughness 3/3.\n{2}{W/B}{W/B}: If Warden of the First Tree is a Warrior, it becomes a Human Spirit Warrior with trample and lifelink.\n{3}{W/B}{W/B}{W/B}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/w/warrior_en_kor.txt b/forge-gui/res/cardsfolder/w/warrior_en_kor.txt index c566b3f0001..8a789006f02 100644 --- a/forge-gui/res/cardsfolder/w/warrior_en_kor.txt +++ b/forge-gui/res/cardsfolder/w/warrior_en_kor.txt @@ -2,7 +2,7 @@ Name:Warrior en-Kor ManaCost:W W Types:Creature Kor Warrior Knight PT:2/2 -A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. +A:AB$ Effect | Cost$ 0 | Name$ en-Kor Redirection | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control to redirect the damage to | ReplacementEffects$ EnKor | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature you control instead. SVar:EnKor:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ EnKorDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature you control instead. SVar:EnKorDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/waterfall_aerialist.txt b/forge-gui/res/cardsfolder/w/waterfall_aerialist.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/waterfall_aerialist.txt rename to forge-gui/res/cardsfolder/w/waterfall_aerialist.txt diff --git a/forge-gui/res/cardsfolder/w/watertrap_weaver.txt b/forge-gui/res/cardsfolder/w/watertrap_weaver.txt index 89deb91cc37..1ad8dc02a27 100644 --- a/forge-gui/res/cardsfolder/w/watertrap_weaver.txt +++ b/forge-gui/res/cardsfolder/w/watertrap_weaver.txt @@ -4,7 +4,7 @@ Types:Creature Merfolk Wizard PT:2/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:PlayMain1:TRUE SVar:Picture:http://www.wizards.com/global/images/magic/general/watertrap_weaver.jpg Oracle:When Watertrap Weaver enters the battlefield, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/w/waterveil_cavern.txt b/forge-gui/res/cardsfolder/w/waterveil_cavern.txt index 06b6f77dfa0..807028c5025 100644 --- a/forge-gui/res/cardsfolder/w/waterveil_cavern.txt +++ b/forge-gui/res/cardsfolder/w/waterveil_cavern.txt @@ -4,6 +4,6 @@ Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. A:AB$ Mana | Cost$ T | Produced$ U | SubAbility$ DBStayTapped | SpellDescription$ Add {U}. CARDNAME doesn't untap during your next untap step. A:AB$ Mana | Cost$ T | Produced$ B | SubAbility$ DBStayTapped | SpellDescription$ Add {B}. CARDNAME doesn't untap during your next untap step. -SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Permanent$ True +SVar:DBStayTapped:DB$ Pump | KW$ HIDDEN This card doesn't untap during your next untap step. | Defined$ Self | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/waterveil_cavern.jpg Oracle:{T}: Add {C}.\n{T}: Add {U} or {B}. Waterveil Cavern doesn't untap during your next untap step. diff --git a/forge-gui/res/cardsfolder/w/watery_grave.txt b/forge-gui/res/cardsfolder/w/watery_grave.txt index bb0e8a1248b..ad93987ac46 100644 --- a/forge-gui/res/cardsfolder/w/watery_grave.txt +++ b/forge-gui/res/cardsfolder/w/watery_grave.txt @@ -2,6 +2,5 @@ Name:Watery Grave ManaCost:no cost Types:Land Island Swamp K:ETBReplacement:Other:DBTap -SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ Shockland | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. -SVar:Picture:http://resources.wizards.com/magic/cards/rav/en-us/card83731.jpg +SVar:DBTap:DB$ Tap | ETB$ True | Defined$ Self | UnlessCost$ PayLife<2> | UnlessPayer$ You | UnlessAI$ UntapFor2 | StackDescription$ enters the battlefield tapped. | SpellDescription$ As CARDNAME enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. Oracle:({T}: Add {U} or {B}.)\nAs Watery Grave enters the battlefield, you may pay 2 life. If you don't, it enters the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/w/wavecrash_triton.txt b/forge-gui/res/cardsfolder/w/wavecrash_triton.txt index 4f5ca58bec3..3d6240f01b4 100644 --- a/forge-gui/res/cardsfolder/w/wavecrash_triton.txt +++ b/forge-gui/res/cardsfolder/w/wavecrash_triton.txt @@ -4,6 +4,6 @@ Types:Creature Merfolk Wizard PT:1/4 T:Mode$ SpellCast | ValidActivatingPlayer$ You | TargetsValid$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Heroic — Whenever you cast a spell that targets CARDNAME, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls. | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/wavecrash_triton.jpg Oracle:Heroic — Whenever you cast a spell that targets Wavecrash Triton, tap target creature an opponent controls. That creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/w/welkin_tern.txt b/forge-gui/res/cardsfolder/w/welkin_tern.txt index e2c3829059b..f33eb0c7ef1 100644 --- a/forge-gui/res/cardsfolder/w/welkin_tern.txt +++ b/forge-gui/res/cardsfolder/w/welkin_tern.txt @@ -3,6 +3,5 @@ ManaCost:1 U Types:Creature Bird PT:2/1 K:Flying -K:CARDNAME can block only creatures with flying. -SVar:Picture:http://www.wizards.com/global/images/magic/general/welkin_tern.jpg +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. Oracle:Flying (This creature can't be blocked except by creatures with flying or reach.)\nWelkin Tern can block only creatures with flying. diff --git a/forge-gui/res/cardsfolder/w/wheel_of_fortune.txt b/forge-gui/res/cardsfolder/w/wheel_of_fortune.txt index 0c8d0975673..6dac569ecd8 100644 --- a/forge-gui/res/cardsfolder/w/wheel_of_fortune.txt +++ b/forge-gui/res/cardsfolder/w/wheel_of_fortune.txt @@ -4,6 +4,5 @@ Types:Sorcery A:SP$ Discard | Cost$ 2 R | Mode$ Hand | Defined$ Player | SubAbility$ DBEachDraw | SpellDescription$ Each player discards their hand, then draws seven cards. SVar:DBEachDraw:DB$Draw | Defined$ Player | NumCards$ 7 SVar:NeedsToPlayVar:Y LE2 -SVar:Y:Count$InYourHand.notNamedWheel of Fortune -SVar:Picture:http://www.wizards.com/global/images/magic/general/wheel_of_fortune.jpg +SVar:Y:Count$InYourHand.notnamedWheel of Fortune Oracle:Each player discards their hand, then draws seven cards. diff --git a/forge-gui/res/cardsfolder/w/whip_of_erebos.txt b/forge-gui/res/cardsfolder/w/whip_of_erebos.txt index 72c39ea4097..29f61ab2c75 100644 --- a/forge-gui/res/cardsfolder/w/whip_of_erebos.txt +++ b/forge-gui/res/cardsfolder/w/whip_of_erebos.txt @@ -3,7 +3,7 @@ ManaCost:2 B B Types:Legendary Enchantment Artifact S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddKeyword$ Lifelink | Description$ Creatures you control have lifelink. A:AB$ ChangeZone | Cost$ 2 B B T | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature you control to return | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | RememberChanged$ True | SubAbility$ DBUnearthed | AILogic$ BeforeCombat | SpellDescription$ Return target creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. If it would leave the battlefield, exile it instead of putting it anywhere else. Activate only as a sorcery. -SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | Keywords$ Haste | LeaveBattlefield$ Exile | sVars$ WhipMustAttack | Permanent$ True | AtEOT$ Exile | SubAbility$ DBCleanup | StackDescription$ It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. +SVar:DBUnearthed:DB$ Animate | Defined$ Remembered | Keywords$ Haste | LeaveBattlefield$ Exile | sVars$ WhipMustAttack | Duration$ Permanent | AtEOT$ Exile | SubAbility$ DBCleanup | StackDescription$ It gains haste. Exile it at the beginning of the next end step or if it would leave the battlefield. SVar:WhipMustAttack:SVar:MustAttack:True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE diff --git a/forge-gui/res/cardsfolder/w/will_kenrith.txt b/forge-gui/res/cardsfolder/w/will_kenrith.txt index 8ed5e8fac5d..926d5df98f2 100644 --- a/forge-gui/res/cardsfolder/w/will_kenrith.txt +++ b/forge-gui/res/cardsfolder/w/will_kenrith.txt @@ -4,7 +4,7 @@ Types:Legendary Planeswalker Will Loyalty:4 Text:CARDNAME can be your commander. K:Partner:Rowan Kenrith:Rowan -A:AB$ Animate | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | UntilYourNextTurn$ True | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | Power$ 0 | Toughness$ 3 | IsCurse$ True | RemoveAllAbilities$ True | SpellDescription$ Until your next turn, up to two target creatures each have base power and toughness 0/3 and lose all abilities. +A:AB$ Animate | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | Duration$ UntilYourNextTurn | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | Power$ 0 | Toughness$ 3 | IsCurse$ True | RemoveAllAbilities$ True | SpellDescription$ Until your next turn, up to two target creatures each have base power and toughness 0/3 and lose all abilities. A:AB$ Draw | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Player | NumCards$ 2 | SubAbility$ DBEffect | SpellDescription$ Target player draws two cards. Until your next turn, instant, sorcery, and planeswalker spells that player casts cost {2} less to cast. SVar:DBEffect:DB$ Effect | StaticAbilities$ WillReduceCost | RememberObjects$ Targeted | Duration$ UntilYourNextTurn SVar:WillReduceCost:Mode$ ReduceCost | EffectZone$ Command | ValidCard$ Instant,Sorcery,Planeswalker | Type$ Spell | Activator$ Player.IsRemembered | Amount$ 2 | Description$ Until your next turn, instant, sorcery, and planeswalker spells that player casts cost {2} less to cast. diff --git a/forge-gui/res/cardsfolder/w/will_of_the_naga.txt b/forge-gui/res/cardsfolder/w/will_of_the_naga.txt index 047ef7d211b..e5b1962eb6c 100644 --- a/forge-gui/res/cardsfolder/w/will_of_the_naga.txt +++ b/forge-gui/res/cardsfolder/w/will_of_the_naga.txt @@ -3,6 +3,6 @@ ManaCost:4 U U Types:Instant K:Delve A:SP$ Tap | Cost$ 4 U U | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Choose target creature | ValidTgts$ Creature | SubAbility$ TrigPump | SpellDescription$ Tap up to two target creatures. Those creatures don't untap during their controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent DeckHints:Ability$Graveyard Oracle:Delve (Each card you exile from your graveyard while casting this spell pays for {1}.)\nTap up to two target creatures. Those creatures don't untap during their controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/willowdusk_essence_seer.txt b/forge-gui/res/cardsfolder/w/willowdusk_essence_seer.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/willowdusk_essence_seer.txt rename to forge-gui/res/cardsfolder/w/willowdusk_essence_seer.txt diff --git a/forge-gui/res/cardsfolder/w/wine_of_blood_and_iron.txt b/forge-gui/res/cardsfolder/w/wine_of_blood_and_iron.txt index 7f5aaeb18cc..6d0a515d8a3 100644 --- a/forge-gui/res/cardsfolder/w/wine_of_blood_and_iron.txt +++ b/forge-gui/res/cardsfolder/w/wine_of_blood_and_iron.txt @@ -3,7 +3,6 @@ ManaCost:3 Types:Artifact A:AB$ Pump | Cost$ 4 | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +X | SubAbility$ DBDelay | AILogic$ Berserk | SpellDescription$ Target creature gets +X/+0 until end of turn, where X is its power. Sacrifice CARDNAME at the beginning of the next end step. SVar:DBDelay:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ TrigSac | TriggerDescription$ Sacrifice CARDNAME at the beginning of the next end step. -SVar:TrigSac:DB$ SacrificeAll | Defined$ Self | Controller$ You +SVar:TrigSac:DB$ SacrificeAll | Defined$ DelayTriggerRememberedLKI | Controller$ You SVar:X:Targeted$CardPower -SVar:Picture:http://www.wizards.com/global/images/magic/general/wine_of_blood_and_iron.jpg Oracle:{4}: Target creature gets +X/+0 until end of turn, where X is its power. Sacrifice Wine of Blood and Iron at the beginning of the next end step. diff --git a/forge-gui/res/cardsfolder/w/winters_chill.txt b/forge-gui/res/cardsfolder/w/winters_chill.txt index b784695d8f5..b5f12f535d5 100644 --- a/forge-gui/res/cardsfolder/w/winters_chill.txt +++ b/forge-gui/res/cardsfolder/w/winters_chill.txt @@ -5,7 +5,7 @@ Text:Cast CARDNAME only during combat before blockers are declared.\r\nX can't b A:SP$ RepeatEach | Cost$ X U | XMaxLimit$ Snow | TargetMin$ X | TargetMax$ X | ValidTgts$ Creature.attacking | TgtPrompt$ Select X target attacking creatures | ActivationPhases$ BeginCombat->Declare Attackers | IsCurse$ True | DefinedCards$ Targeted | RepeatSubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Choose X target attacking creatures. For each of those creatures, its controller may pay {1} or {2}. If that player doesn't, destroy that creature at end of combat. If that player pays only {1}, prevent all combat damage that would be dealt to and dealt by that creature this combat. SVar:DBChoose:DB$ GenericChoice | Defined$ RememberedController | Choices$ Pay2,Pay1 | AILogic$ PayUnlessCost | SubAbility$ DBDelayTrigger SVar:Pay2:DB$ Cleanup | ClearRemembered$ True | UnlessCost$ 2 | UnlessPayer$ RememberedController | UnlessSwitched$ True | SpellDescription$ You may pay {2} to avoid negative effects | ShowCurrentCard$ Remembered -SVar:Pay1:DB$ Pump | Defined$ Remembered | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | UntilEndOfCombat$ True | UnlessCost$ 1 | UnlessPayer$ RememberedController | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBCleanup | ShowCurrentCard$ Remembered | SpellDescription$ You may pay {1}, prevent all combat damage that would be dealt to and dealt by that creature this combat. +SVar:Pay1:DB$ Pump | Defined$ Remembered | KW$ Prevent all combat damage that would be dealt to and dealt by CARDNAME. | Duration$ UntilEndOfCombat | UnlessCost$ 1 | UnlessPayer$ RememberedController | UnlessSwitched$ True | UnlessResolveSubs$ WhenPaid | SubAbility$ DBCleanup | ShowCurrentCard$ Remembered | SpellDescription$ You may pay {1}, prevent all combat damage that would be dealt to and dealt by that creature this combat. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBDelayTrigger:DB$ DelayedTrigger | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ GE1 | RememberObjects$ Remembered | Mode$ Phase | Phase$ EndCombat | Execute$ TrigDestroy | TriggerDescription$ Destroy that creature at end of combat. SVar:TrigDestroy:DB$ Destroy | Defined$ DelayTriggerRemembered diff --git a/forge-gui/res/cardsfolder/w/winters_night.txt b/forge-gui/res/cardsfolder/w/winters_night.txt index 71885262d3b..6740b68c7be 100644 --- a/forge-gui/res/cardsfolder/w/winters_night.txt +++ b/forge-gui/res/cardsfolder/w/winters_night.txt @@ -3,7 +3,7 @@ ManaCost:R G W Types:World Enchantment T:Mode$ TapsForMana | ValidCard$ Land.Snow | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever a player taps a snow land for mana, that player adds one mana of any type that land produced. That land doesn't untap during its controller's next untap step. SVar:TrigMana:DB$ ManaReflected | ColorOrType$ Type | ReflectProperty$ Produced | Defined$ TriggeredActivator | SubAbility$ DBPump -SVar:DBPump:DB$ Pump | Defined$ TriggeredCard | Permanent$ True | KW$ HIDDEN This card doesn't untap during your next untap step. +SVar:DBPump:DB$ Pump | Defined$ TriggeredCard | Duration$ Permanent | KW$ HIDDEN This card doesn't untap during your next untap step. AI:RemoveDeck:All AI:RemoveDeck:Random Oracle:Whenever a player taps a snow land for mana, that player adds one mana of any type that land produced. That land doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/witchs_clinic.txt b/forge-gui/res/cardsfolder/w/witchs_clinic.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/witchs_clinic.txt rename to forge-gui/res/cardsfolder/w/witchs_clinic.txt diff --git a/forge-gui/res/cardsfolder/upcoming/witherbloom_apprentice.txt b/forge-gui/res/cardsfolder/w/witherbloom_apprentice.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/witherbloom_apprentice.txt rename to forge-gui/res/cardsfolder/w/witherbloom_apprentice.txt diff --git a/forge-gui/res/cardsfolder/upcoming/witherbloom_campus.txt b/forge-gui/res/cardsfolder/w/witherbloom_campus.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/witherbloom_campus.txt rename to forge-gui/res/cardsfolder/w/witherbloom_campus.txt diff --git a/forge-gui/res/cardsfolder/upcoming/witherbloom_command.txt b/forge-gui/res/cardsfolder/w/witherbloom_command.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/witherbloom_command.txt rename to forge-gui/res/cardsfolder/w/witherbloom_command.txt diff --git a/forge-gui/res/cardsfolder/upcoming/witherbloom_pledgemage.txt b/forge-gui/res/cardsfolder/w/witherbloom_pledgemage.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/witherbloom_pledgemage.txt rename to forge-gui/res/cardsfolder/w/witherbloom_pledgemage.txt diff --git a/forge-gui/res/cardsfolder/w/woodwraith_corrupter.txt b/forge-gui/res/cardsfolder/w/woodwraith_corrupter.txt index e4bba016609..efe810650fe 100644 --- a/forge-gui/res/cardsfolder/w/woodwraith_corrupter.txt +++ b/forge-gui/res/cardsfolder/w/woodwraith_corrupter.txt @@ -2,6 +2,6 @@ Name:Woodwraith Corrupter ManaCost:3 B B G Types:Creature Elemental Horror PT:3/6 -A:AB$ Animate | Cost$ 1 B G T | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental,Horror | Colors$ Black,Green | Permanent$ True | AILogic$ EOT | SpellDescription$ Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. +A:AB$ Animate | Cost$ 1 B G T | ValidTgts$ Forest | TgtPrompt$ Select target Forest | Power$ 4 | Toughness$ 4 | Types$ Creature,Elemental,Horror | Colors$ Black,Green | Duration$ Permanent | AILogic$ EOT | SpellDescription$ Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. SVar:Picture:http://www.wizards.com/global/images/magic/general/woodwraith_corrupter.jpg Oracle:{1}{B}{G}, {T}: Target Forest becomes a 4/4 black and green Elemental Horror creature. It's still a land. diff --git a/forge-gui/res/cardsfolder/w/workshop_elders.txt b/forge-gui/res/cardsfolder/w/workshop_elders.txt index 8c65b3a4c9d..68e251c06d3 100644 --- a/forge-gui/res/cardsfolder/w/workshop_elders.txt +++ b/forge-gui/res/cardsfolder/w/workshop_elders.txt @@ -5,7 +5,7 @@ PT:4/4 S:Mode$ Continuous | Affected$ Creature.Artifact+YouCtrl | AddKeyword$ Flying | Description$ Artifact creatures you control have flying. SVar:PlayMain1:TRUE T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigAnimate | TriggerDescription$ At the beginning of combat on your turn, you may have target noncreature artifact you control becomes a 0/0 artifact creature. If you do, put four +1/+1 counters on it. -SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Duration$ Permanent | SubAbility$ DBPutCounter SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4 DeckHas:Ability$Counters Oracle:Artifact creatures you control have flying.\nAt the beginning of combat on your turn, you may have target noncreature artifact you control become a 0/0 artifact creature. If you do, put four +1/+1 counters on it. diff --git a/forge-gui/res/cardsfolder/upcoming/wormhole_serpent.txt b/forge-gui/res/cardsfolder/w/wormhole_serpent.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/wormhole_serpent.txt rename to forge-gui/res/cardsfolder/w/wormhole_serpent.txt diff --git a/forge-gui/res/cardsfolder/w/wrath_of_sod.txt b/forge-gui/res/cardsfolder/w/wrath_of_sod.txt index f3ce0ab1750..63a9dd60c0a 100644 --- a/forge-gui/res/cardsfolder/w/wrath_of_sod.txt +++ b/forge-gui/res/cardsfolder/w/wrath_of_sod.txt @@ -2,6 +2,6 @@ Name:Wrath of Sod ManaCost:2 W G Types:Sorcery A:SP$ PutCounterAll | Cost$ 2 W G | ValidCards$ Creature | CounterType$ MANABOND | CounterNum$ 1 | SubAbility$ DBAnimateAll | SpellDescription$ Put a manabond counter on all creatures. (They lose all other abilities and become lands with "{T}: Add one mana of this card's color.") -SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature | Permanent$ True | OverwriteTypes$ True | Types$ Land | Abilities$ ABMana +SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Creature | Duration$ Permanent | OverwriteTypes$ True | Types$ Land | Abilities$ ABMana SVar:ABMana:AB$ ManaReflected | Cost$ T | Valid$ Defined.Self | ColorOrType$ Color | ReflectProperty$ Is | SpellDescription$ Add one mana of any of this card's colors. Oracle:Put a manabond counter on all creatures. (They lose all other abilities and become lands with "{T}: Add one mana of this card's color.") diff --git a/forge-gui/res/cardsfolder/x/xathrid_gorgon.txt b/forge-gui/res/cardsfolder/x/xathrid_gorgon.txt index 12fb6f55b91..c8fa92722a7 100644 --- a/forge-gui/res/cardsfolder/x/xathrid_gorgon.txt +++ b/forge-gui/res/cardsfolder/x/xathrid_gorgon.txt @@ -4,6 +4,6 @@ Types:Creature Gorgon PT:3/6 K:Deathtouch A:AB$ PutCounter | Cost$ 2 B T | ValidTgts$ Creature| CounterNum$ 1 | CounterType$ PETRIFICATION | IsCurse$ True | SubAbility$ TurnToStone | SpellDescription$ Put a petrification counter on target creature. It gains defender and becomes a colorless artifact in addition to its other types. Its activated abilities can't be activated. (A creature with defender can't attack.) -SVar:TurnToStone:DB$ Animate | Defined$ Targeted | Keywords$ Defender | Colors$ Colorless | OverwriteColors$ True | Types$ Artifact | HiddenKeywords$ CARDNAME's activated abilities can't be activated. | Permanent$ True +SVar:TurnToStone:DB$ Animate | Defined$ Targeted | Keywords$ Defender | Colors$ Colorless | OverwriteColors$ True | Types$ Artifact | HiddenKeywords$ CARDNAME's activated abilities can't be activated. | Duration$ Permanent SVar:Picture:http://www.wizards.com/global/images/magic/general/xathrid_gorgon.jpg Oracle:Deathtouch (Any amount of damage this deals to a creature is enough to destroy it.)\n{2}{B}, {T}: Put a petrification counter on target creature. It gains defender and becomes a colorless artifact in addition to its other types. Its activated abilities can't be activated. (A creature with defender can't attack.) diff --git a/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt b/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt index c1b02ed2a2d..86201292ebc 100644 --- a/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt +++ b/forge-gui/res/cardsfolder/x/xenic_poltergeist.txt @@ -2,7 +2,7 @@ Name:Xenic Poltergeist ManaCost:1 B B Types:Creature Spirit PT:1/1 -A:AB$ Animate | Cost$ T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Creature,Artifact | UntilYourNextUpkeep$ True | SpellDescription$ Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value. +A:AB$ Animate | Cost$ T | ValidTgts$ Artifact.nonCreature | TgtPrompt$ Select target noncreature artifact | Power$ X | Toughness$ X | Types$ Creature,Artifact | Duration$ UntilYourNextUpkeep | SpellDescription$ Until your next upkeep, target noncreature artifact becomes an artifact creature with power and toughness each equal to its mana value. SVar:X:Targeted$CardManaCost AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/xenic_poltergeist.jpg diff --git a/forge-gui/res/cardsfolder/y/yannik_scavenging_sentinel.txt b/forge-gui/res/cardsfolder/y/yannik_scavenging_sentinel.txt index c91ca6a8a1b..e1eb93ee95a 100755 --- a/forge-gui/res/cardsfolder/y/yannik_scavenging_sentinel.txt +++ b/forge-gui/res/cardsfolder/y/yannik_scavenging_sentinel.txt @@ -6,7 +6,7 @@ K:Partner:Nikara, Lair Scavenger:Nikara K:Vigilance T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, exile another creature you control until CARDNAME leaves the battlefield. When you do, distribute +1/+1 counters among any number of target creatures, where X is the exiled creature's power. SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.YouCtrl+Other | ChoiceZone$ Battlefield | ChoiceTitle$ Select another creature you control | Mandatory$ True | SubAbility$ DBExile -SVar:DBExile:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | UntilHostLeavesPlay$ True | SubAbility$ DBImmediateTrigger +SVar:DBExile:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | Duration$ UntilHostLeavesPlay | SubAbility$ DBImmediateTrigger SVar:DBImmediateTrigger:DB$ ImmediateTrigger | Execute$ TrigPutCounters | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | TriggerDescription$ When you do, distribute X +1/+1 counters among any number of target creatures, where X is the exiled creature's power. SVar:TrigPutCounters:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute counters to | CounterType$ P1P1 | CounterNum$ X | TargetMin$ 1 | TargetMax$ X | DividedAsYouChoose$ X | SubAbility$ DBCleanup | SpellDescription$ Distribute X +1/+1 counters among any number of target creatures. SVar:X:RememberedLKI$CardPower diff --git a/forge-gui/res/cardsfolder/upcoming/yedora_grave_gardener.txt b/forge-gui/res/cardsfolder/y/yedora_grave_gardener.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/yedora_grave_gardener.txt rename to forge-gui/res/cardsfolder/y/yedora_grave_gardener.txt diff --git a/forge-gui/res/cardsfolder/y/yuan_shaos_infantry.txt b/forge-gui/res/cardsfolder/y/yuan_shaos_infantry.txt index 0bf078949df..08505a1f7b2 100644 --- a/forge-gui/res/cardsfolder/y/yuan_shaos_infantry.txt +++ b/forge-gui/res/cardsfolder/y/yuan_shaos_infantry.txt @@ -3,5 +3,5 @@ ManaCost:3 R Types:Creature Human Soldier PT:2/2 T:Mode$ Attacks | ValidCard$ Card.Self | Alone$ True | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks alone, CARDNAME can't be blocked this combat. -SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | UntilEndOfCombat$ True +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ HIDDEN Unblockable | Duration$ UntilEndOfCombat Oracle:Whenever Yuan Shao's Infantry attacks alone, Yuan Shao's Infantry can't be blocked this combat. diff --git a/forge-gui/res/cardsfolder/upcoming/zaffai_thunder_conductor.txt b/forge-gui/res/cardsfolder/z/zaffai_thunder_conductor.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zaffai_thunder_conductor.txt rename to forge-gui/res/cardsfolder/z/zaffai_thunder_conductor.txt diff --git a/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt b/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt index e3ab638dfa6..bbc0ba0ee7d 100644 --- a/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt +++ b/forge-gui/res/cardsfolder/z/zealous_inquisitor.txt @@ -2,7 +2,7 @@ Name:Zealous Inquisitor ManaCost:2 W Types:Creature Human Cleric PT:2/2 -A:AB$ Effect | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ Zealous | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature instead. +A:AB$ Effect | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature to redirect the damage to | ReplacementEffects$ Zealous | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to target creature instead. SVar:Zealous:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ ZealousDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to target creature instead. SVar:ZealousDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/zephyr_boots.txt b/forge-gui/res/cardsfolder/z/zephyr_boots.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zephyr_boots.txt rename to forge-gui/res/cardsfolder/z/zephyr_boots.txt diff --git a/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt b/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt index 93b000aef88..ba0fe672dd0 100644 --- a/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt +++ b/forge-gui/res/cardsfolder/z/zhalfirin_crusader.txt @@ -3,7 +3,7 @@ ManaCost:1 W W Types:Creature Human Knight PT:2/2 K:Flanking -A:AB$ Effect | Cost$ 1 W | Name$ Zhalfirin Redirection | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect the damage to | ReplacementEffects$ Zhalfirin | Duration$ HostLeavesOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to any target instead. +A:AB$ Effect | Cost$ 1 W | Name$ Zhalfirin Redirection | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target to redirect the damage to | ReplacementEffects$ Zhalfirin | Duration$ UntilHostLeavesPlayOrEOT | RememberObjects$ Targeted | ExileOnMoved$ Battlefield | SpellDescription$ The next 1 damage that would be dealt to CARDNAME this turn is dealt to any target instead. SVar:Zhalfirin:Event$ DamageDone | ValidTarget$ Creature.EffectSource | ReplaceWith$ ZhalfirinDmg | DamageTarget$ Remembered | Description$ The next 1 damage that would be dealt to EFFECTSOURCE this turn is dealt to any target. SVar:ZhalfirinDmg:DB$ ReplaceSplitDamage | DamageTarget$ Remembered AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/upcoming/zimone_quandrix_prodigy.txt b/forge-gui/res/cardsfolder/z/zimone_quandrix_prodigy.txt similarity index 100% rename from forge-gui/res/cardsfolder/upcoming/zimone_quandrix_prodigy.txt rename to forge-gui/res/cardsfolder/z/zimone_quandrix_prodigy.txt diff --git a/forge-gui/res/cardsfolder/z/zuo_ci_the_mocking_sage.txt b/forge-gui/res/cardsfolder/z/zuo_ci_the_mocking_sage.txt index 60fb802f930..54da14c003f 100644 --- a/forge-gui/res/cardsfolder/z/zuo_ci_the_mocking_sage.txt +++ b/forge-gui/res/cardsfolder/z/zuo_ci_the_mocking_sage.txt @@ -2,7 +2,6 @@ Name:Zuo Ci, the Mocking Sage ManaCost:1 G G Types:Legendary Creature Human Advisor PT:1/2 -K:CantBeBlockedBy Creature.withHorsemanship K:Hexproof -SVar:Picture:http://www.wizards.com/global/images/magic/general/zuo_ci_the_mocking_sage.jpg -Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nZuo Ci, the Mocking Sage can't be blocked by creatures with horsemanship. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.withHorsemanship | Description$ CARDNAME can't be blocked by creatures with horsemanship. +Oracle:Hexproof (This creature can't be the target of spells or abilities your opponents control.)\nZuo Ci, the Mocking Sage can't be blocked by creatures with horsemanship. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/z/zurgo_bellstriker.txt b/forge-gui/res/cardsfolder/z/zurgo_bellstriker.txt index 05deed7a93c..21125706de6 100644 --- a/forge-gui/res/cardsfolder/z/zurgo_bellstriker.txt +++ b/forge-gui/res/cardsfolder/z/zurgo_bellstriker.txt @@ -2,7 +2,6 @@ Name:Zurgo Bellstriker ManaCost:R Types:Legendary Creature Orc Warrior PT:2/2 -K:CantBlock Creature.powerGE2:creatures with power 2 or greater +S:Mode$ CantBlockBy | ValidAttacker$ Creature.powerGE2 | ValidBlocker$ Creature.Self | Description$ CARDNAME can't block creatures with power 2 or greater. K:Dash:1 R -SVar:Picture:http://www.wizards.com/global/images/magic/general/zurgo_bellstriker.jpg Oracle:Zurgo Bellstriker can't block creatures with power 2 or greater.\nDash {1}{R} (You may cast this spell for its dash cost. If you do, it gains haste, and it's returned from the battlefield to its owner's hand at the beginning of the next end step.) diff --git a/forge-gui/res/draft/rankings.txt b/forge-gui/res/draft/rankings.txt index 2f93a151984..9ce21b6f44c 100644 --- a/forge-gui/res/draft/rankings.txt +++ b/forge-gui/res/draft/rankings.txt @@ -1,4 +1,307 @@ //Rank|Name|Rarity|Set +#1|Fury|M|MH2 +#2|Grist, the Hunger Tide|M|MH2 +#3|Kaldra Compleat|M|MH2 +#4|Archon of Cruelty|M|MH2 +#5|Grief|M|MH2 +#6|Damn|R|MH2 +#7|Timeless Dragon|R|MH2 +#8|Murktide Regent|M|MH2 +#9|Svyelun of Sea and Sky|M|MH2 +#10|Solitude|M|MH2 +#11|Geyadrone Dihada|M|MH2 +#12|Dakkon, Shadow Slayer|M|MH2 +#13|Sword of Hearth and Home|M|MH2 +#14|Tourach, Dread Cantor|M|MH2 +#15|Nykthos Paragon|R|MH2 +#16|Karmic Guide|R|MH2 +#17|Serra's Emissary|M|MH2 +#18|Subtlety|M|MH2 +#19|Obsidian Charmaw|R|MH2 +#20|Chatterfang, Squirrel General|M|MH2 +#21|Thrasta, Tempest's Roar|M|MH2 +#22|General Ferrous Rokiric|R|MH2 +#23|Upheaval|R|MH2 +#24|Titania, Protector of Argoth|M|MH2 +#25|Chainer, Nightmare Adept|R|MH2 +#26|Flametongue Yearling|U|MH2 +#27|Scion of Draco|M|MH2 +#28|Endurance|M|MH2 +#29|Necrogoyf|R|MH2 +#30|Ignoble Hierarch|R|MH2 +#31|Inevitable Betrayal|R|MH2 +#32|Master of Death|R|MH2 +#33|Mirari's Wake|M|MH2 +#34|Yusri, Fortune's Flame|R|MH2 +#35|Priest of Fell Rites|R|MH2 +#36|Calibrated Blast|R|MH2 +#37|Flay Essence|U|MH2 +#38|Piru, the Volatile|R|MH2 +#39|Chitterspitter|R|MH2 +#40|Imperial Recruiter|M|MH2 +#41|Vindicate|R|MH2 +#42|Prismatic Ending|U|MH2 +#43|Aeve, Progenitor Ooze|R|MH2 +#44|Prophetic Titan|U|MH2 +#45|Ragavan, Nimble Pilferer|M|MH2 +#46|Kaleidoscorch|U|MH2 +#47|Nettlecyst|R|MH2 +#48|Sylvan Anthem|R|MH2 +#49|Timeless Witness|U|MH2 +#50|Dauthi Voidwalker|R|MH2 +#51|Search the Premises|R|MH2 +#52|Thought Monitor|R|MH2 +#53|Goblin Bombardment|R|MH2 +#54|Bone Shredder|U|MH2 +#55|Braids, Cabal Minion|R|MH2 +#56|Rise and Shine|R|MH2 +#57|Underworld Hermit|U|MH2 +#58|Breya's Apprentice|R|MH2 +#59|Graceful Restoration|U|MH2 +#60|Sythis, Harvest's Hand|R|MH2 +#61|Captured by Lagacs|C|MH2 +#62|Magus of the Bridge|R|MH2 +#63|Nevinyrral's Disk|R|MH2 +#64|Shardless Agent|R|MH2 +#65|Fire Ice|R|MH2 +#66|Profane Tutor|R|MH2 +#67|Garth One-Eye|M|MH2 +#68|Lonis, Cryptozoologist|R|MH2 +#69|Asmoranomardicadaistinaculdacar|R|MH2 +#70|Road Ruin|U|MH2 +#71|Sanctum Weaver|R|MH2 +#72|Arcus Acolyte|U|MH2 +#73|Rakdos Headliner|U|MH2 +#74|Sanctifier en-Vec|R|MH2 +#75|Lazotep Chancellor|U|MH2 +#76|Terminal Agony|C|MH2 +#77|Sol Talisman|R|MH2 +#78|Soul Snare|U|MH2 +#79|Squirrel Sanctuary|U|MH2 +#80|Arcbound Shikari|U|MH2 +#81|Junk Winder|U|MH2 +#82|Ethersworn Sphinx|U|MH2 +#83|Goblin Traprunner|U|MH2 +#84|Fractured Sanity|R|MH2 +#85|Squirrel Sovereign|U|MH2 +#86|Urza's Saga|R|MH2 +#87|Young Necromancer|U|MH2 +#88|Zabaz, the Glimmerwasp|R|MH2 +#89|Vectis Gloves|U|MH2 +#90|Ghost-Lit Drifter|U|MH2 +#91|Scurry Oak|U|MH2 +#92|Territorial Kavu|R|MH2 +#93|Raving Visionary|U|MH2 +#94|Vile Entomber|U|MH2 +#95|Mine Collapse|C|MH2 +#96|Smell Fear|C|MH2 +#97|Moderation|R|MH2 +#98|Combine Chrysalis|U|MH2 +#99|Wonder|R|MH2 +#100|Mishra's Factory|U|MH2 +#101|Filigree Attendant|U|MH2 +#102|Gaea's Will|R|MH2 +#103|Sweep the Skies|U|MH2 +#104|Herd Baloth|U|MH2 +#105|Archfiend of Sorrows|U|MH2 +#106|World-Weary|C|MH2 +#107|Barbed Spike|U|MH2 +#108|Specimen Collector|U|MH2 +#109|Radiant Epicure|U|MH2 +#110|Healer's Flock|U|MH2 +#111|Clattering Augur|U|MH2 +#112|Thraben Watcher|U|MH2 +#113|Glinting Creeper|U|MH2 +#114|Bannerhide Krushok|C|MH2 +#115|Tragic Fall|C|MH2 +#116|Squirrel Mob|R|MH2 +#117|Counterspell|U|MH2 +#118|Patriarch's Bidding|R|MH2 +#119|Yavimaya Elder|U|MH2 +#120|Rishadan Dockhand|R|MH2 +#121|Late to Dinner|C|MH2 +#122|Verdant Command|R|MH2 +#123|So Shiny|C|MH2 +#124|Arcbound Whelp|U|MH2 +#125|Phantasmal Dreadmaw|C|MH2 +#126|Rift Sower|C|MH2 +#127|Persist|R|MH2 +#128|Glorious Enforcer|U|MH2 +#129|Chrome Courier|C|MH2 +#130|Wren's Run Hydra|U|MH2 +#131|Goblin Anarchomancer|C|MH2 +#132|Said Done|U|MH2 +#133|Fast Furious|U|MH2 +#134|Unholy Heat|C|MH2 +#135|Wavesifter|C|MH2 +#136|Breathless Knight|C|MH2 +#137|Enchantress's Presence|R|MH2 +#138|Hunting Pack|U|MH2 +#139|Misty Rainforest|R|MH2 +#140|Scalding Tarn|R|MH2 +#141|Verdant Catacombs|R|MH2 +#142|Arid Mesa|R|MH2 +#143|Marsh Flats|R|MH2 +#144|Steel Dromedary|U|MH2 +#145|Drey Keeper|C|MH2 +#146|Chatterstorm|C|MH2 +#147|Chef's Kiss|R|MH2 +#148|Vedalken Infiltrator|U|MH2 +#149|Dragon's Rage Channeler|U|MH2 +#150|Bone Shards|C|MH2 +#151|Liquimetal Torque|U|MH2 +#152|Necromancer's Familiar|U|MH2 +#153|Esper Sentinel|R|MH2 +#154|Scuttletide|U|MH2 +#155|Legion Vanguard|U|MH2 +#156|Mental Journey|C|MH2 +#157|Harmonic Prodigy|R|MH2 +#158|Skyblade's Boon|U|MH2 +#159|Slag Strider|U|MH2 +#160|Captain Ripley Vance|U|MH2 +#161|Caprichrome|U|MH2 +#162|Tireless Provisioner|U|MH2 +#163|Arcbound Prototype|C|MH2 +#164|Arcbound Tracker|C|MH2 +#165|Hell Mongrel|C|MH2 +#166|Lightning Spear|C|MH2 +#167|Recalibrate|C|MH2 +#168|Piercing Rays|C|MH2 +#169|Revolutionist|C|MH2 +#170|Dihada's Ploy|C|MH2 +#171|Foundry Helix|C|MH2 +#172|Storm God's Oracle|C|MH2 +#173|Ornithopter of Paradise|C|MH2 +#174|Sea Drake|U|MH2 +#175|Ravenous Squirrel|U|MH2 +#176|Lucid Dreams|U|MH2 +#177|Step Through|C|MH2 +#178|Darkmoss Bridge|C|MH2 +#179|Drossforge Bridge|C|MH2 +#180|Goldmire Bridge|C|MH2 +#181|Mistvault Bridge|C|MH2 +#182|Razortide Bridge|C|MH2 +#183|Rustvale Bridge|C|MH2 +#184|Silverbluff Bridge|C|MH2 +#185|Slagwoods Bridge|C|MH2 +#186|Thornglint Bridge|C|MH2 +#187|Tanglepool Bridge|C|MH2 +#188|Mystic Redaction|U|MH2 +#189|Skophos Reaver|C|MH2 +#190|Constable of the Realm|U|MH2 +#191|Dermotaxi|R|MH2 +#192|Academy Manufactor|R|MH2 +#193|Landscaper Colos|C|MH2 +#194|Urban Daggertooth|C|MH2 +#195|Orchard Strider|C|MH2 +#196|Battle Plan|C|MH2 +#197|Lens Flare|C|MH2 +#198|Resurgent Belief|R|MH2 +#199|Scour the Desert|U|MH2 +#200|Blazing Rootwalla|U|MH2 +#201|Fairgrounds Patrol|C|MH2 +#202|Guardian Kirin|C|MH2 +#203|Loathsome Curator|C|MH2 +#204|Arcbound Slasher|C|MH2 +#205|Batterbone|U|MH2 +#206|Quirion Ranger|U|MH2 +#207|Solitary Confinement|R|MH2 +#208|Angelic Curator|U|MH2 +#209|Millikin|U|MH2 +#210|Diamond Lion|R|MH2 +#211|Spreading Insurrection|U|MH2 +#212|Carth the Lion|R|MH2 +#213|Jade Avenger|C|MH2 +#214|Monoskelion|U|MH2 +#215|Galvanic Relay|C|MH2 +#216|The Underworld Cookbook|U|MH2 +#217|Suspend|R|MH2 +#218|Sanctuary Raptor|U|MH2 +#219|Out of Time|R|MH2 +#220|Feast of Sanity|U|MH2 +#221|Fae Offering|U|MH2 +#222|Aeromoeba|C|MH2 +#223|Tide Shaper|U|MH2 +#224|Bloodbraid Marauder|R|MH2 +#225|Foundation Breaker|U|MH2 +#226|Arcbound Javelineer|U|MH2 +#227|Unbounded Potential|C|MH2 +#228|Sudden Edict|U|MH2 +#229|Strike It Rich|U|MH2 +#230|Disciple of the Sun|C|MH2 +#231|Burdened Aerialist|C|MH2 +#232|Cabal Initiate|C|MH2 +#233|Etherium Spinner|C|MH2 +#234|Gouged Zealot|C|MH2 +#235|Deepwood Denizen|C|MH2 +#236|Knighted Myr|C|MH2 +#237|Marble Gargoyle|C|MH2 +#238|Mount Velus Manticore|C|MH2 +#239|Jewel-Eyed Cobra|C|MH2 +#240|Lose Focus|C|MH2 +#241|Shattered Ego|C|MH2 +#242|Sinister Starfish|C|MH2 +#243|Faithless Salvaging|C|MH2 +#244|Gargadon|C|MH2 +#245|Altar of the Goyf|U|MH2 +#246|Abiding Grace|U|MH2 +#247|Extruder|U|MH2 +#248|Skirge Familiar|U|MH2 +#249|Seal of Removal|U|MH2 +#250|Greed|U|MH2 +#251|Patchwork Gnomes|U|MH2 +#252|Break Ties|C|MH2 +#253|Terramorph|U|MH2 +#254|Kitchen Imp|C|MH2 +#255|Tormod's Cryptkeeper|C|MH2 +#256|Arcbound Mouser|C|MH2 +#257|Abundant Harvest|C|MH2 +#258|Dress Down|R|MH2 +#259|Blossoming Calm|U|MH2 +#260|Gilt-Blade Prowler|C|MH2 +#261|Foul Watcher|C|MH2 +#262|Parcel Myr|C|MH2 +#263|Nested Shambler|C|MH2 +#264|Duskshell Crawler|C|MH2 +#265|Tizerus Charger|C|MH2 +#266|Flourishing Strike|C|MH2 +#267|Soul of Migration|C|MH2 +#268|Hard Evidence|C|MH2 +#269|Steelfin Whale|C|MH2 +#270|Vermin Gorger|C|MH2 +#271|Viashino Lashclaw|C|MH2 +#272|Funnel-Web Recluse|C|MH2 +#273|Fodder Tosser|C|MH2 +#274|Sojourner's Companion|C|MH2 +#275|Sterling Grove|R|MH2 +#276|Brainstone|U|MH2 +#277|Tourach's Canticle|C|MH2 +#278|Discerning Taste|C|MH2 +#279|Yavimaya, Cradle of Growth|R|MH2 +#280|Power Depot|U|MH2 +#281|Tavern Scoundrel|C|MH2 +#282|Floodhound|C|MH2 +#283|Echoing Return|C|MH2 +#284|Blacksmith's Skill|C|MH2 +#285|Glimmer Bairn|C|MH2 +#286|Zuran Orb|U|MH2 +#287|Unmarked Grave|R|MH2 +#288|Bottle Golems|C|MH2 +#289|Crack Open|C|MH2 +#290|Myr Scrapling|C|MH2 +#291|Flame Rift|U|MH2 +#292|Riptide Laboratory|R|MH2 +#293|Gorilla Shaman|U|MH2 +#294|Flame Blitz|U|MH2 +#295|Cabal Coffers|M|MH2 +#296|Mogg Salvage|U|MH2 +#297|Seal of Cleansing|U|MH2 +#298|Cursed Totem|R|MH2 +#299|Blessed Respite|U|MH2 +#300|Void Mirror|R|MH2 +#301|Glimpse of Tomorrow|R|MH2 +#302|Chance Encounter|R|MH2 +#303|Break the Ice|U|MH2 #1|Hofri Ghostforge|M|STX #2|Tanazir Quandrix|M|STX #3|Multiple Choice|R|STX diff --git a/forge-gui/res/editions/2021 Lunar New Year.txt b/forge-gui/res/editions/2021 Lunar New Year.txt index e5e05ca5171..58be9f3b7a9 100644 --- a/forge-gui/res/editions/2021 Lunar New Year.txt +++ b/forge-gui/res/editions/2021 Lunar New Year.txt @@ -6,6 +6,8 @@ Type=Reprint [cards] 1 R Sethron, Hurloon General +2 M Moraug, Fury of Akoum +3 M Ox of Agonas [tokens] r_2_3_minotaur diff --git a/forge-gui/res/editions/Alliances.txt b/forge-gui/res/editions/Alliances.txt index 856302f13fd..73d2dbfb0aa 100644 --- a/forge-gui/res/editions/Alliances.txt +++ b/forge-gui/res/editions/Alliances.txt @@ -11,205 +11,205 @@ BoosterBox=45 Foil=NotSupported [cards] -C Aesthir Glider -C Aesthir Glider -C Agent of Stromgald -C Agent of Stromgald -C Arcane Denial -C Arcane Denial -R Ashnod's Cylix -C Astrolabe -C Astrolabe -C Awesome Presence -C Awesome Presence -U Balduvian Dead -R Balduvian Horde -R Balduvian Trading Post -C Balduvian War-Makers -C Balduvian War-Makers -C Benthic Explorers -C Benthic Explorers -C Bestial Fury -C Bestial Fury -U Bounty of the Hunt -U Browse -U Burnout -C Carrier Pigeons -C Carrier Pigeons -C Casting of Bones -C Casting of Bones -R Chaos Harlequin -U Contagion -C Deadly Insect -C Deadly Insect -U Death Spark -R Diminishing Returns -U Diseased Vermin -R Dystopia -U Elvish Bard -C Elvish Ranger -C Elvish Ranger -U Elvish Spirit Guide -U Energy Arc -C Enslaved Scout -C Enslaved Scout -C Errand of Duty -C Errand of Duty -R Exile -C False Demise -C False Demise -R Fatal Lore -C Feast or Famine -C Feast or Famine -C Fevered Strength -C Fevered Strength -R Floodwater Dam -U Force of Will -C Foresight -C Foresight -C Fyndhorn Druid -C Fyndhorn Druid -R Gargantuan Gorilla -C Gift of the Woods -C Gift of the Woods -C Gorilla Berserkers -C Gorilla Berserkers -C Gorilla Chieftain -C Gorilla Chieftain -C Gorilla Shaman -C Gorilla Shaman -C Gorilla War Cry -C Gorilla War Cry -C Guerrilla Tactics -C Guerrilla Tactics -R Gustha's Scepter -U Hail Storm -R Heart of Yavimaya -R Helm of Obedience -U Inheritance -C Insidious Bookworms -C Insidious Bookworms -R Ivory Gargoyle -U Juniper Order Advocate -R Kaysa -R Keeper of Tresserhorn -C Kjeldoran Escort -C Kjeldoran Escort -U Kjeldoran Home Guard -R Kjeldoran Outpost -C Kjeldoran Pride -C Kjeldoran Pride -R Krovikan Horror -U Krovikan Plague -R Lake of the Dead -C Lat-Nam's Legacy -C Lat-Nam's Legacy -R Library of Lat-Nam -C Lim-Dul's High Guard -C Lim-Dul's High Guard -U Lim-Dul's Paladin -U Lim-Dul's Vault -R Lodestone Bauble -R Lord of Tresserhorn -C Martyrdom -C Martyrdom -R Misfortune -U Mishra's Groundbreaker -U Misinformation -U Mystic Compass -U Nature's Blessing -U Nature's Chosen -R Nature's Wrath -C Noble Steeds -C Noble Steeds -R Omen of Fire -C Phantasmal Fiend -C Phantasmal Fiend -R Phantasmal Sphere -R Phelddagrif -C Phyrexian Boon -C Phyrexian Boon -R Phyrexian Devourer -R Phyrexian Portal -C Phyrexian War Beast -C Phyrexian War Beast -U Pillage -U Primitive Justice -U Pyrokinesis -C Reinforcements -C Reinforcements -C Reprisal -C Reprisal -R Ritual of the Machine -R Rogue Skycaptain -R Royal Decree -C Royal Herbalist -C Royal Herbalist -U Scarab of the Unseen -U Scars of the Veteran -U School of the Unseen -U Seasoned Tactician -R Sheltered Valley -U Shield Sphere -U Sol Grail -C Soldevi Adnate -C Soldevi Adnate -R Soldevi Digger -R Soldevi Excavations -C Soldevi Heretic -C Soldevi Heretic -C Soldevi Sage -C Soldevi Sage -C Soldevi Sentry -C Soldevi Sentry -C Soldevi Steam Beast -C Soldevi Steam Beast -U Soldier of Fortune -U Spiny Starfish -R Splintering Wind -C Stench of Decay -C Stench of Decay -R Storm Cauldron -C Storm Crow -C Storm Crow -U Storm Elemental -C Storm Shaman -C Storm Shaman -U Stromgald Spy -U Suffocation -U Surge of Strength -R Sustaining Spirit -C Swamp Mosquito -C Swamp Mosquito -R Sworn Defender -C Taste of Paradise -C Taste of Paradise -R Thawing Glaciers -R Thought Lash -R Tidal Control -R Tornado -C Undergrowth -C Undergrowth -U Unlikely Alliance -U Urza's Engine -C Varchild's Crusader -C Varchild's Crusader -R Varchild's War-Riders -C Veteran's Voice -C Veteran's Voice -C Viscerid Armor -C Viscerid Armor -U Viscerid Drone -R Wandering Mage -C Whip Vine -C Whip Vine -U Whirling Catapult -C Wild Aesthir -C Wild Aesthir -R Winter's Night -C Yavimaya Ancients -C Yavimaya Ancients -U Yavimaya Ants +116a C Aesthir Glider +116b C Aesthir Glider +64a C Agent of Stromgald +64b C Agent of Stromgald +22a C Arcane Denial +22b C Arcane Denial +117 R Ashnod's Cylix +118a C Astrolabe +118b C Astrolabe +23a C Awesome Presence +23b C Awesome Presence +43 U Balduvian Dead +65 R Balduvian Horde +137 R Balduvian Trading Post +66a C Balduvian War-Makers +66b C Balduvian War-Makers +24a C Benthic Explorers +24b C Benthic Explorers +67a C Bestial Fury +67b C Bestial Fury +85 U Bounty of the Hunt +25 U Browse +68 U Burnout +1a C Carrier Pigeons +1b C Carrier Pigeons +44a C Casting of Bones +44b C Casting of Bones +69 R Chaos Harlequin +45 U Contagion +86a C Deadly Insect +86b C Deadly Insect +70 U Death Spark +26 R Diminishing Returns +46 U Diseased Vermin +47 R Dystopia +87 U Elvish Bard +88a C Elvish Ranger +88b C Elvish Ranger +89 U Elvish Spirit Guide +106 U Energy Arc +71a C Enslaved Scout +71b C Enslaved Scout +2a C Errand of Duty +2b C Errand of Duty +3 R Exile +27a C False Demise +27b C False Demise +48 R Fatal Lore +49a C Feast or Famine +49b C Feast or Famine +50a C Fevered Strength +50b C Fevered Strength +119 R Floodwater Dam +28 U Force of Will +29a C Foresight +29b C Foresight +90a C Fyndhorn Druid +90b C Fyndhorn Druid +91 R Gargantuan Gorilla +92a C Gift of the Woods +92b C Gift of the Woods +93a C Gorilla Berserkers +93b C Gorilla Berserkers +94a C Gorilla Chieftain +94b C Gorilla Chieftain +72a C Gorilla Shaman +72b C Gorilla Shaman +73a C Gorilla War Cry +73b C Gorilla War Cry +74a C Guerrilla Tactics +74b C Guerrilla Tactics +120 R Gustha's Scepter +95 U Hail Storm +138 R Heart of Yavimaya +121 R Helm of Obedience +4 U Inheritance +51a C Insidious Bookworms +51b C Insidious Bookworms +5 R Ivory Gargoyle +6 U Juniper Order Advocate +96 R Kaysa +52 R Keeper of Tresserhorn +7a C Kjeldoran Escort +7b C Kjeldoran Escort +8 U Kjeldoran Home Guard +139 R Kjeldoran Outpost +9a C Kjeldoran Pride +9b C Kjeldoran Pride +53 R Krovikan Horror +54 U Krovikan Plague +140 R Lake of the Dead +30a C Lat-Nam's Legacy +30b C Lat-Nam's Legacy +31 R Library of Lat-Nam +55a C Lim-Dul's High Guard +55b C Lim-Dul's High Guard +108 U Lim-Dul's Paladin +107 U Lim-Dul's Vault +122 R Lodestone Bauble +112 R Lord of Tresserhorn +10a C Martyrdom +10b C Martyrdom +113 R Misfortune +123 U Mishra's Groundbreaker +56 U Misinformation +124 U Mystic Compass +110 U Nature's Blessing +97 U Nature's Chosen +98 R Nature's Wrath +11a C Noble Steeds +11b C Noble Steeds +75 R Omen of Fire +57a C Phantasmal Fiend +57b C Phantasmal Fiend +32 R Phantasmal Sphere +115 R Phelddagrif +58a C Phyrexian Boon +58b C Phyrexian Boon +125 R Phyrexian Devourer +126 R Phyrexian Portal +127a C Phyrexian War Beast +127b C Phyrexian War Beast +76 U Pillage +77 U Primitive Justice +78 U Pyrokinesis +12a C Reinforcements +12b C Reinforcements +13a C Reprisal +13b C Reprisal +59 R Ritual of the Machine +79 R Rogue Skycaptain +14 R Royal Decree +15a C Royal Herbalist +15b C Royal Herbalist +128 U Scarab of the Unseen +16 U Scars of the Veteran +141 U School of the Unseen +17 U Seasoned Tactician +142 R Sheltered Valley +129 U Shield Sphere +130 U Sol Grail +60a C Soldevi Adnate +60b C Soldevi Adnate +131 R Soldevi Digger +143 R Soldevi Excavations +33a C Soldevi Heretic +33b C Soldevi Heretic +34a C Soldevi Sage +34b C Soldevi Sage +132a C Soldevi Sentry +132b C Soldevi Sentry +133a C Soldevi Steam Beast +133b C Soldevi Steam Beast +80 U Soldier of Fortune +35 U Spiny Starfish +99 R Splintering Wind +61a C Stench of Decay +61b C Stench of Decay +134 R Storm Cauldron +36a C Storm Crow +36b C Storm Crow +37 U Storm Elemental +81a C Storm Shaman +81b C Storm Shaman +62 U Stromgald Spy +38 U Suffocation +109 U Surge of Strength +18 R Sustaining Spirit +63a C Swamp Mosquito +63b C Swamp Mosquito +19 R Sworn Defender +100a C Taste of Paradise +100b C Taste of Paradise +144 R Thawing Glaciers +39 R Thought Lash +40 R Tidal Control +101 R Tornado +102a C Undergrowth +102b C Undergrowth +20 U Unlikely Alliance +135 U Urza's Engine +82a C Varchild's Crusader +82b C Varchild's Crusader +83 R Varchild's War-Riders +84a C Veteran's Voice +84b C Veteran's Voice +41a C Viscerid Armor +41b C Viscerid Armor +42 U Viscerid Drone +111 R Wandering Mage +103a C Whip Vine +103b C Whip Vine +136 U Whirling Catapult +21a C Wild Aesthir +21b C Wild Aesthir +114 R Winter's Night +104a C Yavimaya Ancients +104b C Yavimaya Ancients +105 U Yavimaya Ants [tokens] w_0_1_deserter diff --git a/forge-gui/res/editions/Antiquities.txt b/forge-gui/res/editions/Antiquities.txt index a2809eca8e6..bbf21ef4c08 100644 --- a/forge-gui/res/editions/Antiquities.txt +++ b/forge-gui/res/editions/Antiquities.txt @@ -11,106 +11,106 @@ BoosterBox=60 Foil=NotSupported [cards] -C Amulet of Kroog -R Argivian Archaeologist -C Argivian Blacksmith -C Argothian Pixies -C Argothian Treefolk -U Armageddon Clock -C Artifact Blast -C Artifact Possession -C Artifact Ward -U Ashnod's Altar -U Ashnod's Battle Gear -U Ashnod's Transmogrant -C Atog -C Battering Ram -R Bronze Tablet -R Candelabra of Tawnos -U Circle of Protection: Artifacts -U Citanul Druid -C Clay Statue -R Clockwork Avian -R Colossus of Sardia -R Coral Helm -C Crumble -U Cursed Rack -U Damping Field -U Detonate -C Drafna's Restoration -C Dragon Engine -U Dwarven Weaponsmith -U Energy Flux -U Feldon's Cane -R Gaea's Avenger -U Gate to Phyrexia -U Goblin Artisans -R Golgothian Sylex -C Grapeshot Catapult -U Haunting Wind -R Hurkyl's Recall -U Ivory Tower -U Jalum Tome -U Martyrs of Korlis -U Mightstone -U Millstone -R Mishra's Factory -R Mishra's Factory -U Mishra's Factory -R Mishra's Factory -R Mishra's War Machine -R Mishra's Workshop -R Obelisk of Undoing -U Onulet -C Orcish Mechanics -C Ornithopter -C Phyrexian Gremlins -U Power Artifact -U Powerleech -C Priest of Yawgmoth -U Primal Clay -U Rakalite -C Reconstruction -C Reverse Polarity -U Rocket Launcher -C Sage of Lat-Nam -R Shapeshifter -R Shatterstorm -C Staff of Zegon -R Strip Mine -R Strip Mine -R Strip Mine -U Strip Mine -U Su-Chi -C Tablet of Epityr -R Tawnos's Coffin -U Tawnos's Wand -U Tawnos's Weaponry -R Tetravus -U The Rack -U Titania's Song -U Transmute Artifact -R Triskelion -R Urza's Avenger -C Urza's Chalice -C Urza's Mine -U Urza's Mine -C Urza's Mine -U Urza's Mine -R Urza's Miter -U Urza's Power Plant -C Urza's Power Plant -C Urza's Power Plant -U Urza's Power Plant -U Urza's Tower -U Urza's Tower -C Urza's Tower -U Urza's Tower -U Wall of Spears -U Weakstone -U Xenic Poltergeist -R Yawgmoth Demon -C Yotian Soldier +36 C Amulet of Kroog +1 R Argivian Archaeologist +2 C Argivian Blacksmith +29 C Argothian Pixies +30 C Argothian Treefolk +37 U Armageddon Clock +22 C Artifact Blast +15 C Artifact Possession +3 C Artifact Ward +38 U Ashnod's Altar +39 U Ashnod's Battle Gear +40 U Ashnod's Transmogrant +23 C Atog +41 C Battering Ram +42 R Bronze Tablet +43 R Candelabra of Tawnos +4 U Circle of Protection: Artifacts +31 U Citanul Druid +44 C Clay Statue +45 R Clockwork Avian +46 R Colossus of Sardia +47 R Coral Helm +32 C Crumble +48 U Cursed Rack +5 U Damping Field +24 U Detonate +8 C Drafna's Restoration +49 C Dragon Engine +25 U Dwarven Weaponsmith +9 U Energy Flux +50 U Feldon's Cane +33 R Gaea's Avenger +16 U Gate to Phyrexia +26 U Goblin Artisans +51 R Golgothian Sylex +52 C Grapeshot Catapult +17 U Haunting Wind +10 R Hurkyl's Recall +53 U Ivory Tower +54 U Jalum Tome +6 U Martyrs of Korlis +55 U Mightstone +56 U Millstone +80c R Mishra's Factory +80b R Mishra's Factory +80a U Mishra's Factory +80d R Mishra's Factory +57 R Mishra's War Machine +81 R Mishra's Workshop +58 R Obelisk of Undoing +59 U Onulet +27 C Orcish Mechanics +60 C Ornithopter +18 C Phyrexian Gremlins +11 U Power Artifact +34 U Powerleech +19 C Priest of Yawgmoth +61 U Primal Clay +62 U Rakalite +12 C Reconstruction +7 C Reverse Polarity +63 U Rocket Launcher +13 C Sage of Lat-Nam +64 R Shapeshifter +28 R Shatterstorm +65 C Staff of Zegon +82d R Strip Mine +82b R Strip Mine +82c R Strip Mine +82a U Strip Mine +66 U Su-Chi +67 C Tablet of Epityr +68 R Tawnos's Coffin +69 U Tawnos's Wand +70 U Tawnos's Weaponry +71 R Tetravus +72 U The Rack +35 U Titania's Song +14 U Transmute Artifact +73 R Triskelion +74 R Urza's Avenger +75 C Urza's Chalice +83c C Urza's Mine +83b U Urza's Mine +83a C Urza's Mine +83d U Urza's Mine +76 R Urza's Miter +84b U Urza's Power Plant +84a C Urza's Power Plant +84c C Urza's Power Plant +84d U Urza's Power Plant +85c U Urza's Tower +85b U Urza's Tower +85a C Urza's Tower +85d U Urza's Tower +77 U Wall of Spears +78 U Weakstone +20 U Xenic Poltergeist +21 R Yawgmoth Demon +79 C Yotian Soldier [tokens] c_1_1_a_tetravite_flying_noenchant \ No newline at end of file diff --git a/forge-gui/res/editions/Arabian Nights.txt b/forge-gui/res/editions/Arabian Nights.txt index 5adf1b60955..2642e9ff9f4 100644 --- a/forge-gui/res/editions/Arabian Nights.txt +++ b/forge-gui/res/editions/Arabian Nights.txt @@ -11,98 +11,98 @@ BoosterBox=60 Foil=NotSupported [cards] -U Abu Ja'far -R Aladdin -R Aladdin's Lamp -R Aladdin's Ring -U Ali Baba -R Ali from Cairo -C Army of Allah -C Army of Allah -U Bazaar of Baghdad -C Bird Maiden -C Bird Maiden -R Bottle of Suleiman -U Brass Man -C Camel -R City in a Bottle -U City of Brass -C Cuombajj Witches -U Cyclone -R Dancing Scimitar -C Dandan -C Desert -C Desert Nomads -U Desert Twister -U Diamond Valley -R Drop of Honey -R Ebony Horse -R El-Hajjaj -R Elephant Graveyard -C Erg Raiders -C Erg Raiders -R Erhnam Djinn -U Eye for an Eye -C Fishliver Oil -C Fishliver Oil -U Flying Carpet -C Flying Men -C Ghazban Ogre -C Giant Tortoise -C Giant Tortoise -R Guardian Beast -C Hasran Ogress -C Hasran Ogress -C Hurr Jackal -R Ifh-Biff Efreet -R Island Fish Jasconius -R Island of Wak-Wak -R Jandor's Ring -R Jandor's Saddlebags -U Jeweled Bird -R Jihad -R Junun Efreet -R Juzam Djinn -U Khabal Ghoul -R King Suleiman -C Kird Ape -U Library of Alexandria -U Magnetic Mountain -U Merchant Ship -C Metamorphosis -R Mijae Djinn -C Moorish Cavalry -C Moorish Cavalry -C Mountain -C Nafs Asp -C Nafs Asp -U Oasis -R Old Man of the Sea -C Oubliette -C Oubliette -C Piety -C Piety -R Pyramids -R Repentant Blacksmith -R Ring of Ma'ruf -C Rukh Egg -C Rukh Egg -U Sandals of Abdallah -C Sandstorm -R Serendib Djinn -R Serendib Efreet -R Shahrazad -U Sindbad -R Singing Tree -U Sorceress Queen -C Stone-Throwing Devils -C Stone-Throwing Devils -C Unstable Mutation -C War Elephant -C War Elephant -C Wyluli Wolf -C Wyluli Wolf -R Ydwen Efreet +1 U Abu Ja'far +34 R Aladdin +56 R Aladdin's Lamp +57 R Aladdin's Ring +35 U Ali Baba +36 R Ali from Cairo +2 C Army of Allah +2+ C Army of Allah +70 U Bazaar of Baghdad +37 C Bird Maiden +37+ C Bird Maiden +58 R Bottle of Suleiman +59 U Brass Man +3 C Camel +60 R City in a Bottle +71 U City of Brass +23 C Cuombajj Witches +45 U Cyclone +61 R Dancing Scimitar +12 C Dandan +72 C Desert +38 C Desert Nomads +46 U Desert Twister +73 U Diamond Valley +47 R Drop of Honey +62 R Ebony Horse +24 R El-Hajjaj +74 R Elephant Graveyard +25 C Erg Raiders +25+ C Erg Raiders +48 R Erhnam Djinn +4 U Eye for an Eye +13 C Fishliver Oil +13+ C Fishliver Oil +63 U Flying Carpet +14 C Flying Men +49 C Ghazban Ogre +15 C Giant Tortoise +15+ C Giant Tortoise +26 R Guardian Beast +27 C Hasran Ogress +27+ C Hasran Ogress +39 C Hurr Jackal +50 R Ifh-Biff Efreet +16 R Island Fish Jasconius +75 R Island of Wak-Wak +64 R Jandor's Ring +65 R Jandor's Saddlebags +66 U Jeweled Bird +5 R Jihad +28 R Junun Efreet +29 R Juzam Djinn +30 U Khabal Ghoul +6 R King Suleiman +40 C Kird Ape +76 U Library of Alexandria +41 U Magnetic Mountain +17 U Merchant Ship +51 C Metamorphosis +42 R Mijae Djinn +7 C Moorish Cavalry +7+ C Moorish Cavalry +77 C Mountain +52 C Nafs Asp +52+ C Nafs Asp +78 U Oasis +18 R Old Man of the Sea +31 C Oubliette +31+ C Oubliette +8 C Piety +8+ C Piety +67 R Pyramids +9 R Repentant Blacksmith +68 R Ring of Ma'ruf +43 C Rukh Egg +43+ C Rukh Egg +69 U Sandals of Abdallah +53 C Sandstorm +19 R Serendib Djinn +20 R Serendib Efreet +10 R Shahrazad +21 U Sindbad +54 R Singing Tree +32 U Sorceress Queen +33 C Stone-Throwing Devils +33+ C Stone-Throwing Devils +22 C Unstable Mutation +11 C War Elephant +11+ C War Elephant +55 C Wyluli Wolf +55+ C Wyluli Wolf +44 R Ydwen Efreet [tokens] r_4_4_bird_flying diff --git a/forge-gui/res/editions/Arena Beginner Set.txt b/forge-gui/res/editions/Arena Beginner Set.txt index 902ce618a59..e3fcf460b04 100644 --- a/forge-gui/res/editions/Arena Beginner Set.txt +++ b/forge-gui/res/editions/Arena Beginner Set.txt @@ -5,119 +5,119 @@ Name=Arena Beginner Set Type=Online [cards] -U Affectionate Indrik -U Air Elemental -R Angelic Guardian -U Angelic Reward -U Angel of Vitality -C Armored Whirl Turtle -U Bad Deal -C Baloth Packhunter -C Bombard -U Bond of Discipline -C Burn Bright -C Charging Badger -C Charmed Stray -C Cloudkin Seer -U Colossal Majesty -C Compound Fracture -U Confront the Assault -C Coral Merfolk -C Cruel Cut -R Demon of Loathing -R Epic Proportions -U Eternal Thirst -C Evolving Wilds -C Fearless Halberdier -C Fencing Ace -C Feral Roar -C Forest -C Frilled Sea Serpent -C Generous Stray -R Gigantosaurus -C Glint -U Goblin Gang Leader -C Goblin Gathering -R Goblin Trashmaster -C Goblin Tunneler -R Goring Ceratops -C Greenwood Sentinel -U Hallowed Priest -C Hurloon Minotaur -C Ilysian Caryatid -R Immortal Phoenix -C Impassioned Orator -U Inescapable Blaze -R Inspiring Commander -C Island -C Jungle Delver -C Knight's Pledge -C Krovikan Scoundrel -R Leonin Warleader -C Loxodon Line Breaker -U Malakir Cullblade -C Maniacal Rage -R Mardu Outrider -C Molten Ravager -C Moorland Inquisitor -C Mountain -U Murder -C Nest Robber -R Nightmare -C Nimble Pilferer -C Octoprophet -R Ogre Battledriver -R Overflowing Insight -C Pacifism -C Plains -U Prized Unicorn -C Rabid Bite -C Raging Goblin -U Raid Bombardment -C Raise Dead -R Rampaging Brontodon -C Reduce to Ashes -R Riddlemaster Sphinx -C River's Favor -C Rumbling Baloth -C Sanctuary Cat -C Sanitarium Skeleton -C Savage Gorger -C Scathe Zombies -U Sengir Vampire -U Sentinel Spider -U Serra Angel -C Shock -C Shrine Keeper -R Siege Dragon -C Skeleton Archer -U Sleep -R Soulblade Djinn -R Soulhunter Rakshasa -C Soulmender -C Spiritual Guardian -C Stony Strength -C Storm Strike -C Swamp -C Sworn Guardian -C Tactical Advantage -C Tin Street Cadet -C Titanic Growth -C Treetop Warden -C Typhoid Rats -C Unlikely Aid -C Unsummon -C Vampire Opportunist -U Volcanic Dragon -C Wall of Runes -U Warden of Evos Isle -C Waterkin Shaman -C Waterknot -C Wildwood Patrol -R Windreader Sphinx -U Windstorm Drake -C Winged Words -C Witch's Familiar -C Woodland Mystic -R World Shaper -C Zephyr Gull +89 U Affectionate Indrik +23 U Air Elemental +1 U Angel of Vitality +2 R Angelic Guardian +3 U Angelic Reward +24 C Armored Whirl Turtle +45 U Bad Deal +90 C Baloth Packhunter +67 C Bombard +4 U Bond of Discipline +68 C Burn Bright +91 C Charging Badger +5 C Charmed Stray +25 C Cloudkin Seer +92 U Colossal Majesty +46 C Compound Fracture +6 U Confront the Assault +26 C Coral Merfolk +47 C Cruel Cut +48 R Demon of Loathing +93 R Epic Proportions +49 U Eternal Thirst +111 C Evolving Wilds +69 C Fearless Halberdier +7 C Fencing Ace +94 C Feral Roar +112 C Forest +27 C Frilled Sea Serpent +95 C Generous Stray +96 R Gigantosaurus +28 C Glint +70 U Goblin Gang Leader +71 C Goblin Gathering +72 R Goblin Trashmaster +73 C Goblin Tunneler +8 R Goring Ceratops +97 C Greenwood Sentinel +9 U Hallowed Priest +74 C Hurloon Minotaur +98 C Ilysian Caryatid +75 R Immortal Phoenix +10 C Impassioned Orator +76 U Inescapable Blaze +11 R Inspiring Commander +113 C Island +99 C Jungle Delver +12 C Knight's Pledge +50 C Krovikan Scoundrel +13 R Leonin Warleader +14 C Loxodon Line Breaker +51 U Malakir Cullblade +77 C Maniacal Rage +52 R Mardu Outrider +78 C Molten Ravager +15 C Moorland Inquisitor +114 C Mountain +53 U Murder +79 C Nest Robber +54 R Nightmare +55 C Nimble Pilferer +29 C Octoprophet +80 R Ogre Battledriver +30 R Overflowing Insight +16 C Pacifism +115 C Plains +100 U Prized Unicorn +101 C Rabid Bite +81 C Raging Goblin +82 U Raid Bombardment +56 C Raise Dead +102 R Rampaging Brontodon +83 C Reduce to Ashes +31 R Riddlemaster Sphinx +32 C River's Favor +103 C Rumbling Baloth +17 C Sanctuary Cat +57 C Sanitarium Skeleton +58 C Savage Gorger +59 C Scathe Zombies +60 U Sengir Vampire +104 U Sentinel Spider +18 U Serra Angel +84 C Shock +19 C Shrine Keeper +85 R Siege Dragon +61 C Skeleton Archer +33 U Sleep +34 R Soulblade Djinn +62 R Soulhunter Rakshasa +20 C Soulmender +21 C Spiritual Guardian +105 C Stony Strength +86 C Storm Strike +116 C Swamp +35 C Sworn Guardian +22 C Tactical Advantage +87 C Tin Street Cadet +106 C Titanic Growth +107 C Treetop Warden +63 C Typhoid Rats +64 C Unlikely Aid +36 C Unsummon +65 C Vampire Opportunist +88 U Volcanic Dragon +37 C Wall of Runes +38 U Warden of Evos Isle +39 C Waterkin Shaman +40 C Waterknot +108 C Wildwood Patrol +41 R Windreader Sphinx +42 U Windstorm Drake +43 C Winged Words +66 C Witch's Familiar +109 C Woodland Mystic +110 R World Shaper +44 C Zephyr Gull diff --git a/forge-gui/res/editions/Arena New Player Experience.txt b/forge-gui/res/editions/Arena New Player Experience.txt index 333b7c90d65..70e0ead32cc 100644 --- a/forge-gui/res/editions/Arena New Player Experience.txt +++ b/forge-gui/res/editions/Arena New Player Experience.txt @@ -5,42 +5,42 @@ Name=Arena New Player Experience Type=Online [cards] -C Altar's Reap -U Ambition's Cost -U Angelic Reward -U Blinding Radiance -R Chaos Maw -U Confront the Assault -C Cruel Cut -C Divination -U Doublecast -C Feral Roar -U Goblin Bruiser -U Goblin Gang Leader -U Goblin Grenade -R Inspiring Commander -C Knight's Pledge -C Loxodon Line Breaker -C Miasmic Mummy -C Nimble Pilferer -R Ogre Painbringer -M Overflowing Insight -C Raging Goblin -C Renegade Demon -U Rise from the Grave -C River's Favor -C Rumbling Baloth -C Sanctuary Cat -U Seismic Rupture -U Serra Angel -C Shorecomber Crab -C Shrine Keeper -R Soulhunter Rakshasa -C Spiritual Guardian -C Tactical Advantage -C Take Vengeance -U Titanic Pelagosaur -C Treetop Warden -U Volcanic Dragon -C Waterknot -C Zephyr Gull +24 C Altar's Reap +25 U Ambition's Cost +1 U Angelic Reward +2 U Blinding Radiance +36 R Chaos Maw +3 U Confront the Assault +26 C Cruel Cut +14 C Divination +37 U Doublecast +46 C Feral Roar +39 U Goblin Bruiser +40 U Goblin Gang Leader +41 U Goblin Grenade +4 R Inspiring Commander +5 C Knight's Pledge +7 C Loxodon Line Breaker +29 C Miasmic Mummy +31 C Nimble Pilferer +42 R Ogre Painbringer +16 M Overflowing Insight +43 C Raging Goblin +33 C Renegade Demon +34 U Rise from the Grave +19 C River's Favor +47 C Rumbling Baloth +8 C Sanctuary Cat +44 U Seismic Rupture +9 U Serra Angel +18 C Shorecomber Crab +10 C Shrine Keeper +35 R Soulhunter Rakshasa +11 C Spiritual Guardian +12 C Tactical Advantage +13 C Take Vengeance +19 U Titanic Pelagosaur +48 C Treetop Warden +45 U Volcanic Dragon +22 C Waterknot +23 C Zephyr Gull diff --git a/forge-gui/res/editions/Arena.txt b/forge-gui/res/editions/Arena.txt index d9251b69bb1..f5489964cfe 100644 --- a/forge-gui/res/editions/Arena.txt +++ b/forge-gui/res/editions/Arena.txt @@ -5,5 +5,5 @@ Name=Arena Type=Other [cards] -C Arena -C Sewers of Estark \ No newline at end of file +1 C Arena +2 C Sewers of Estark \ No newline at end of file diff --git a/forge-gui/res/editions/Born of the Gods Promos.txt b/forge-gui/res/editions/Born of the Gods Promos.txt index 08751bd723d..5803d0037f9 100644 --- a/forge-gui/res/editions/Born of the Gods Promos.txt +++ b/forge-gui/res/editions/Born of the Gods Promos.txt @@ -1,7 +1,7 @@ [metadata] Code=PBNG Date=2014-02-01 -Name=Born of the Gods Promos +Name=Born of the Gods Promos Type=Promos [cards] diff --git a/forge-gui/res/editions/Chronicles.txt b/forge-gui/res/editions/Chronicles.txt index 810f8a9f66b..90b40132ac1 100644 --- a/forge-gui/res/editions/Chronicles.txt +++ b/forge-gui/res/editions/Chronicles.txt @@ -12,131 +12,131 @@ BoosterBox=45 Foil=NotSupported [cards] -U Abu Ja'far -C Active Volcano -R Akron Legionnaire -U Aladdin -R Angelic Voices -R Arcades Sabboth -R Arena of the Ancients -C Argothian Pixies -C Ashnod's Altar -C Ashnod's Transmogrant -R Axelrod Gunnarson -R Ayesha Tanaka -U Azure Drake -U Banshee -R Barl's Cage -U Beasts of Bogardan -R Blood Moon -U Blood of the Martyr -C Bog Rats -R Book of Rass -C Boomerang -R Bronze Horse -C Cat Warriors -R Chromium -R City of Brass -U Cocoon -R Concordant Crossroads -U Craw Giant -C Cuombajj Witches -R Cyclone -C D'Avenant Archer -R Dakkon Blackblade -R Dance of Many -C Dandan -C Divine Offering -C Emerald Dragonfly -U Enchantment Alteration -U Erhnam Djinn -U Fallen Angel -C Feldon's Cane -U Fire Drake -C Fishliver Oil -C Flash Flood -C Fountain of Youth -R Gabriel Angelfire -R Gauntlets of Chaos -C Ghazban Ogre -C Giant Slug -U Goblin Artisans -C Goblin Digging Team -C Goblin Shrine -C Goblins of the Flarg -C Hasran Ogress -R Hell's Caretaker -R Horn of Deafening -C Indestructible Aura -U Ivory Guardians -R Jalum Tome -R Jeweled Bird -R Johan -R Juxtapose -C Keepers of the Faith -U Kei Takahashi -R Land's Edge -C Living Armor -U Marhault Elsdragon -C Metamorphosis -C Mountain Yeti -R Nebuchadnezzar -R Nicol Bolas -R Obelisk of Undoing -R Palladia-Mors -R Petra Sphinx -U Primordial Ooze -U Puppet Master -U Rabid Wombat -R Rakalite -U Recall -C Remove Soul -C Repentant Blacksmith -R Revelation -R Rubinia Soulsinger -C Runesword -R Safe Haven -C Scavenger Folk -R Sentinel -R Serpent Generator -U Shield Wall -U Shimian Night Stalker -U Sivitri Scarzam -R Sol'kanar the Swamp King -R Stangg -U Storm Seeker -U Takklemaggot -R Teleport -U The Fallen -R The Wretched -U Tobias Andrion -U Tor Wauki -C Tormod's Crypt -C Transmutation -R Triassic Egg -U Urza's Mine -U Urza's Mine -U Urza's Mine -U Urza's Mine -U Urza's Power Plant -U Urza's Power Plant -U Urza's Power Plant -U Urza's Power Plant -U Urza's Tower -U Urza's Tower -U Urza's Tower -U Urza's Tower -R Vaevictis Asmadi -R Voodoo Doll -C Wall of Heat -U Wall of Opposition -C Wall of Shadows -C Wall of Vapor -U Wall of Wonder -C War Elephant -U Witch Hunter -R Xira Arien -R Yawgmoth Demon +1 U Abu Ja'far +43 C Active Volcano +2 R Akron Legionnaire +44 U Aladdin +3 R Angelic Voices +71 R Arcades Sabboth +91 R Arena of the Ancients +57 C Argothian Pixies +92 C Ashnod's Altar +93 C Ashnod's Transmogrant +72 R Axelrod Gunnarson +73 R Ayesha Tanaka +15 U Azure Drake +29 U Banshee +94 R Barl's Cage +45 U Beasts of Bogardan +46 R Blood Moon +4 U Blood of the Martyr +30 C Bog Rats +95 R Book of Rass +16 C Boomerang +96 R Bronze Horse +58 C Cat Warriors +74 R Chromium +112 R City of Brass +59 U Cocoon +60 R Concordant Crossroads +61 U Craw Giant +31 C Cuombajj Witches +62 R Cyclone +5 C D'Avenant Archer +75 R Dakkon Blackblade +17 R Dance of Many +18 C Dandan +6 C Divine Offering +63 C Emerald Dragonfly +19 U Enchantment Alteration +64 U Erhnam Djinn +32 U Fallen Angel +97 C Feldon's Cane +47 U Fire Drake +20 C Fishliver Oil +21 C Flash Flood +98 C Fountain of Youth +76 R Gabriel Angelfire +99 R Gauntlets of Chaos +65 C Ghazban Ogre +33 C Giant Slug +48 U Goblin Artisans +49 C Goblin Digging Team +50 C Goblin Shrine +51 C Goblins of the Flarg +34 C Hasran Ogress +35 R Hell's Caretaker +100 R Horn of Deafening +7 C Indestructible Aura +8 U Ivory Guardians +101 R Jalum Tome +102 R Jeweled Bird +77 R Johan +22 R Juxtapose +9 C Keepers of the Faith +78 U Kei Takahashi +52 R Land's Edge +103 C Living Armor +79 U Marhault Elsdragon +66 C Metamorphosis +53 C Mountain Yeti +80 R Nebuchadnezzar +81 R Nicol Bolas +104 R Obelisk of Undoing +82 R Palladia-Mors +10 R Petra Sphinx +54 U Primordial Ooze +23 U Puppet Master +67 U Rabid Wombat +105 R Rakalite +24 U Recall +25 C Remove Soul +11 C Repentant Blacksmith +68 R Revelation +83 R Rubinia Soulsinger +106 C Runesword +113 R Safe Haven +69 C Scavenger Folk +107 R Sentinel +108 R Serpent Generator +12 U Shield Wall +36 U Shimian Night Stalker +84 U Sivitri Scarzam +85 R Sol'kanar the Swamp King +86 R Stangg +70 U Storm Seeker +37 U Takklemaggot +26 R Teleport +38 U The Fallen +39 R The Wretched +87 U Tobias Andrion +88 U Tor Wauki +109 C Tormod's Crypt +40 C Transmutation +110 R Triassic Egg +114a U Urza's Mine +114b U Urza's Mine +114c U Urza's Mine +114d U Urza's Mine +115a U Urza's Power Plant +115b U Urza's Power Plant +115c U Urza's Power Plant +115d U Urza's Power Plant +116a U Urza's Tower +116b U Urza's Tower +116c U Urza's Tower +116d U Urza's Tower +89 R Vaevictis Asmadi +111 R Voodoo Doll +55 C Wall of Heat +56 U Wall of Opposition +41 C Wall of Shadows +27 C Wall of Vapor +28 U Wall of Wonder +13 C War Elephant +14 U Witch Hunter +90 R Xira Arien +42 R Yawgmoth Demon [tokens] stangg_twin diff --git a/forge-gui/res/editions/Commander.txt b/forge-gui/res/editions/Commander.txt index dc7733be874..771027fa2dd 100644 --- a/forge-gui/res/editions/Commander.txt +++ b/forge-gui/res/editions/Commander.txt @@ -348,4 +348,4 @@ g_1_1_snake g_1_1_squirrel g_2_2_wolf ur_5_5_elemental_flying -c_1_1_a_triskelavite_flying_ammo \ No newline at end of file +c_1_1_a_triskelavite_flying_ammo diff --git a/forge-gui/res/editions/DragonCon 1994.txt b/forge-gui/res/editions/DragonCon 1994.txt index 4e92405ce61..4622e671da6 100644 --- a/forge-gui/res/editions/DragonCon 1994.txt +++ b/forge-gui/res/editions/DragonCon 1994.txt @@ -6,4 +6,4 @@ Border=Black Type=Other [cards] -S Nalathni Dragon \ No newline at end of file +1 S Nalathni Dragon \ No newline at end of file diff --git a/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt new file mode 100644 index 00000000000..0cb2aa7abc0 --- /dev/null +++ b/forge-gui/res/editions/Dungeons & Dragons Adventures in the Forgotten Realms.txt @@ -0,0 +1,29 @@ +[metadata] +Code=AFR +Date=2021-07-23 +Name=Dungeons & Dragons: Adventures in the Forgotten Realms +Code2=AFR +MciCode=afr +Type=Expansion + +[cards] +33 U Portable Hole +112 M Lolth, Spider Queen +114 U Power Word Kill +124 R Vorpal Sword +200 U Prosperous Innkeeper +219 U Bruenor Battlehammer +220 R Drizzt Do'Urden +235 M Tiamat +265 L Plains +269 L Island +273 L Swamp +277 L Mountain +281 L Forest +284 M Lolth, Spider Queen +298 M Tiamat +302 U Cloister Gargoyle +337 U Bruenor Battlehammer +338 R Drizzt Do'Urden +377 R Vorpal Sword +396 R Vorpal Sword diff --git a/forge-gui/res/editions/Eighth Edition.txt b/forge-gui/res/editions/Eighth Edition.txt index 74e85840549..c564ffe6387 100644 --- a/forge-gui/res/editions/Eighth Edition.txt +++ b/forge-gui/res/editions/Eighth Edition.txt @@ -89,7 +89,7 @@ ChaosDraftThemes=CORE_SET 129 C Drudge Skeletons 130 C Dusk Imp 184 U Dwarven Demolition Team -C Eager Cadet +S1 C Eager Cadet 131 R Eastern Paladin 324 U Elfhame Palace 18 R Elite Archers @@ -100,7 +100,7 @@ C Eager Cadet 244 R Elvish Piper 245 U Elvish Scrapper 246 R Emperor Crocodile -U Enormous Baloth +S6 U Enormous Baloth 185 U Enrage 300 R Ensnaring Bridge 76 R Evacuation @@ -129,7 +129,7 @@ U Enormous Baloth 253 C Giant Badger 135 C Giant Cockroach 254 C Giant Growth -C Giant Octopus +S3 C Giant Octopus 255 C Giant Spider 20 R Glorious Anthem 21 C Glory Seeker @@ -273,7 +273,7 @@ C Giant Octopus 42 U Sanctimony 43 R Savannah Lions 160 C Scathe Zombies -C Sea Eagle +S4 C Sea Eagle 99 C Sea Monster 218 R Searing Wind 44 U Seasoned Marshal @@ -288,7 +288,7 @@ C Sea Eagle 326 U Shivan Oasis 222 C Shock 223 C Shock Troops -U Silverback Ape +S7 U Silverback Ape 224 C Sizzle 313 R Skull of Orm 164 U Slay @@ -344,14 +344,14 @@ U Silverback Ape 330 U Urza's Tower 170 R Vampiric Spirit 55 C Venerable Monk -U Vengeance +S2 U Vengeance 285 R Verduran Enchantress 286 R Vernal Bloom 319 R Vexing Arcanix 230 U Viashino Sandstalker 171 C Vicious Hunger 287 C Vine Trellis -R Vizzerdrix +S5 R Vizzerdrix 231 C Volcanic Hammer 113 U Wall of Air 320 U Wall of Spears diff --git a/forge-gui/res/editions/Fallen Empires.txt b/forge-gui/res/editions/Fallen Empires.txt index 01e3a7affd7..f0e4563050e 100644 --- a/forge-gui/res/editions/Fallen Empires.txt +++ b/forge-gui/res/editions/Fallen Empires.txt @@ -11,193 +11,193 @@ BoosterBox=60 Foil=NotSupported [cards] -R Aeolipile -C Armor Thrull -C Armor Thrull -C Armor Thrull -C Armor Thrull -R Balm of Restoration -C Basal Thrull -C Basal Thrull -C Basal Thrull -C Basal Thrull -R Bottomless Vault -C Brassclaw Orcs -C Brassclaw Orcs -C Brassclaw Orcs -C Brassclaw Orcs -U Breeding Pit -C Combat Medic -C Combat Medic -C Combat Medic -C Combat Medic -R Conch Horn -U Deep Spawn -C Delif's Cone -R Delif's Cube -R Derelor -R Draconian Cylix -R Dwarven Armorer -U Dwarven Catapult -R Dwarven Hold -U Dwarven Lieutenant -U Dwarven Ruins -C Dwarven Soldier -C Dwarven Soldier -C Dwarven Soldier -R Ebon Praetor -U Ebon Stronghold -C Elven Fortress -C Elven Fortress -C Elven Fortress -C Elven Fortress -R Elven Lyre -R Elvish Farmer -C Elvish Hunter -C Elvish Hunter -C Elvish Hunter -C Elvish Scout -C Elvish Scout -C Elvish Scout -U Farrel's Mantle -C Farrel's Zealot -C Farrel's Zealot -C Farrel's Zealot -U Farrelite Priest -U Feral Thallid -R Fungal Bloom -C Goblin Chirurgeon -C Goblin Chirurgeon -C Goblin Chirurgeon -R Goblin Flotilla -C Goblin Grenade -C Goblin Grenade -C Goblin Grenade -U Goblin Kites -C Goblin War Drums -C Goblin War Drums -C Goblin War Drums -C Goblin War Drums -R Goblin Warrens -R Hand of Justice -U Havenwood Battleground -U Heroism -C High Tide -C High Tide -C High Tide -R Hollow Trees -C Homarid -C Homarid -C Homarid -C Homarid -R Homarid Shaman -U Homarid Spawning Bed -C Homarid Warrior -C Homarid Warrior -C Homarid Warrior -C Hymn to Tourach -C Hymn to Tourach -C Hymn to Tourach -C Hymn to Tourach -C Icatian Infantry -C Icatian Infantry -C Icatian Infantry -C Icatian Infantry -C Icatian Javelineers -C Icatian Javelineers -C Icatian Javelineers -R Icatian Lieutenant -C Icatian Moneychanger -C Icatian Moneychanger -C Icatian Moneychanger -U Icatian Phalanx -U Icatian Priest -C Icatian Scout -C Icatian Scout -C Icatian Scout -C Icatian Scout -R Icatian Skirmishers -R Icatian Store -R Icatian Town -R Implements of Sacrifice -C Initiates of the Ebon Hand -C Initiates of the Ebon Hand -C Initiates of the Ebon Hand -C Merseine -C Merseine -C Merseine -C Merseine -C Mindstab Thrull -C Mindstab Thrull -C Mindstab Thrull -C Necrite -C Necrite -C Necrite -C Night Soil -C Night Soil -C Night Soil -U Orcish Captain -C Orcish Spy -C Orcish Spy -C Orcish Spy -C Orcish Veteran -C Orcish Veteran -C Orcish Veteran -C Orcish Veteran -C Order of Leitbur -C Order of Leitbur -C Order of Leitbur -C Order of the Ebon Hand -C Order of the Ebon Hand -C Order of the Ebon Hand -R Orgg -U Raiding Party -R Rainbow Vale -R Ring of Renewal -R River Merfolk -U Ruins of Trokair -R Sand Silos -U Seasinger -U Soul Exchange -R Spirit Shield -C Spore Cloud -C Spore Cloud -C Spore Cloud -U Spore Flower -U Svyelunite Priest -U Svyelunite Temple -C Thallid -C Thallid -C Thallid -C Thallid -U Thallid Devourer -U Thelon's Chant -R Thelon's Curse -U Thelonite Druid -R Thelonite Monk -C Thorn Thallid -C Thorn Thallid -C Thorn Thallid -C Thorn Thallid -R Thrull Champion -U Thrull Retainer -U Thrull Wizard -C Tidal Flats -C Tidal Flats -C Tidal Flats -U Tidal Influence -U Tourach's Chant -R Tourach's Gate -R Vodalian Knights -C Vodalian Mage -C Vodalian Mage -C Vodalian Mage -C Vodalian Soldiers -C Vodalian Soldiers -C Vodalian Soldiers -C Vodalian Soldiers -R Vodalian War Machine -R Zelyon Sword +81 R Aeolipile +33a C Armor Thrull +33b C Armor Thrull +33c C Armor Thrull +33d C Armor Thrull +82 R Balm of Restoration +34a C Basal Thrull +34b C Basal Thrull +34c C Basal Thrull +34d C Basal Thrull +92 R Bottomless Vault +49a C Brassclaw Orcs +49b C Brassclaw Orcs +49c C Brassclaw Orcs +49d C Brassclaw Orcs +35 U Breeding Pit +1a C Combat Medic +1b C Combat Medic +1c C Combat Medic +1d C Combat Medic +83 R Conch Horn +17 U Deep Spawn +84 C Delif's Cone +85 R Delif's Cube +36 R Derelor +86 R Draconian Cylix +50 R Dwarven Armorer +51 U Dwarven Catapult +93 R Dwarven Hold +52 U Dwarven Lieutenant +94 U Dwarven Ruins +53a C Dwarven Soldier +53b C Dwarven Soldier +53c C Dwarven Soldier +37 R Ebon Praetor +95 U Ebon Stronghold +65a C Elven Fortress +65b C Elven Fortress +65c C Elven Fortress +65d C Elven Fortress +87 R Elven Lyre +66 R Elvish Farmer +67a C Elvish Hunter +67b C Elvish Hunter +67c C Elvish Hunter +68a C Elvish Scout +68b C Elvish Scout +68c C Elvish Scout +2 U Farrel's Mantle +3a C Farrel's Zealot +3b C Farrel's Zealot +3c C Farrel's Zealot +4 U Farrelite Priest +69 U Feral Thallid +70 R Fungal Bloom +54a C Goblin Chirurgeon +54b C Goblin Chirurgeon +54c C Goblin Chirurgeon +55 R Goblin Flotilla +56a C Goblin Grenade +56b C Goblin Grenade +56c C Goblin Grenade +57 U Goblin Kites +58a C Goblin War Drums +58b C Goblin War Drums +58c C Goblin War Drums +58d C Goblin War Drums +59 R Goblin Warrens +5 R Hand of Justice +96 U Havenwood Battleground +6 U Heroism +18a C High Tide +18b C High Tide +18c C High Tide +97 R Hollow Trees +19a C Homarid +19b C Homarid +19c C Homarid +19d C Homarid +20 R Homarid Shaman +21 U Homarid Spawning Bed +22a C Homarid Warrior +22b C Homarid Warrior +22c C Homarid Warrior +38a C Hymn to Tourach +38b C Hymn to Tourach +38c C Hymn to Tourach +38d C Hymn to Tourach +7a C Icatian Infantry +7b C Icatian Infantry +7c C Icatian Infantry +7d C Icatian Infantry +8a C Icatian Javelineers +8b C Icatian Javelineers +8c C Icatian Javelineers +9 R Icatian Lieutenant +10a C Icatian Moneychanger +10b C Icatian Moneychanger +10c C Icatian Moneychanger +11 U Icatian Phalanx +12 U Icatian Priest +13a C Icatian Scout +13b C Icatian Scout +13c C Icatian Scout +13d C Icatian Scout +14 R Icatian Skirmishers +98 R Icatian Store +15 R Icatian Town +88 R Implements of Sacrifice +39a C Initiates of the Ebon Hand +39b C Initiates of the Ebon Hand +39c C Initiates of the Ebon Hand +23a C Merseine +23b C Merseine +23c C Merseine +23d C Merseine +40a C Mindstab Thrull +40b C Mindstab Thrull +40c C Mindstab Thrull +41a C Necrite +41b C Necrite +41c C Necrite +71a C Night Soil +71b C Night Soil +71c C Night Soil +60 U Orcish Captain +61a C Orcish Spy +61b C Orcish Spy +61c C Orcish Spy +62a C Orcish Veteran +62b C Orcish Veteran +62c C Orcish Veteran +62d C Orcish Veteran +16a C Order of Leitbur +16b C Order of Leitbur +16c C Order of Leitbur +42a C Order of the Ebon Hand +42b C Order of the Ebon Hand +42c C Order of the Ebon Hand +63 R Orgg +64 U Raiding Party +99 R Rainbow Vale +89 R Ring of Renewal +24 R River Merfolk +100 U Ruins of Trokair +101 R Sand Silos +25 U Seasinger +43 U Soul Exchange +90 R Spirit Shield +72a C Spore Cloud +72b C Spore Cloud +72c C Spore Cloud +73 U Spore Flower +26 U Svyelunite Priest +102 U Svyelunite Temple +74a C Thallid +74b C Thallid +74c C Thallid +74d C Thallid +75 U Thallid Devourer +76 U Thelon's Chant +77 R Thelon's Curse +78 U Thelonite Druid +79 R Thelonite Monk +80a C Thorn Thallid +80b C Thorn Thallid +80c C Thorn Thallid +80d C Thorn Thallid +44 R Thrull Champion +45 U Thrull Retainer +46 U Thrull Wizard +27a C Tidal Flats +27b C Tidal Flats +27c C Tidal Flats +28 U Tidal Influence +47 U Tourach's Chant +48 R Tourach's Gate +29 R Vodalian Knights +30a C Vodalian Mage +30b C Vodalian Mage +30c C Vodalian Mage +31a C Vodalian Soldiers +31b C Vodalian Soldiers +31c C Vodalian Soldiers +31d C Vodalian Soldiers +32 R Vodalian War Machine +91 R Zelyon Sword [tokens] w_1_1_citizen diff --git a/forge-gui/res/editions/Fifth Edition.txt b/forge-gui/res/editions/Fifth Edition.txt index e64a00f7bc9..8a607f6a792 100644 --- a/forge-gui/res/editions/Fifth Edition.txt +++ b/forge-gui/res/editions/Fifth Edition.txt @@ -12,455 +12,455 @@ Foil=NotSupported ChaosDraftThemes=CORE_SET [cards] -U AEther Storm -U Abbey Gargoyles -U Abyssal Specter -R Adarkar Wastes -U Air Elemental -R Akron Legionnaire -C Alabaster Potion -R Aladdin's Ring -C Ambush Party -C Amulet of Kroog -R An-Havva Constable -U Angry Mob -U Animate Dead -R Animate Wall -R Ankh of Mishra -U Anti-Magic Aura -U Arenson's Aura -R Armageddon -C Armor of Faith -U Ashes to Ashes -U Ashnod's Altar -C Ashnod's Transmogrant -R Aspect of Wolf -U Atog -C Aurochs -C Aysen Bureaucrats -U Azure Drake -R Bad Moon -R Ball Lightning -C Barbed Sextant -R Barl's Cage -C Battering Ram -C Benalish Hero -U Binding Grasp -C Bird Maiden -R Birds of Paradise -U Black Knight -C Blessed Wine -U Blight -R Blinking Spirit -C Blood Lust -C Bog Imp -C Bog Rats -U Bog Wraith -C Boomerang -R Bottle of Suleiman -R Bottomless Vault -C Brainstorm -C Brainwash -C Brassclaw Orcs -U Breeding Pit -R Broken Visage -C Brothers of Fire -R Brushland -C Carapace -R Caribou Range -U Carrion Ants -U Castle -C Cat Warriors -U Cave People -C Chub Toad -U Circle of Protection: Artifacts -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -R City of Brass -C Clay Statue -C Cloak of Confusion -R Clockwork Beast -U Clockwork Steed -R Cockatrice -R Colossus of Sardia -U Conquer -R Coral Helm -C Counterspell -U Craw Giant -C Craw Wurm -R Crimson Manticore -R Crown of the Ages -U Crumble -R Crusade -U Crystal Rod -U Cursed Land -C D'Avenant Archer -R Dance of Many -R Dancing Scimitar -C Dandan -C Dark Maze -C Dark Ritual -C Death Speakers -C Death Ward -U Deathgrip -R Deflection -R Derelor -U Desert Twister -U Detonate -U Diabolic Machine -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -C Divine Offering -U Divine Transformation -R Dragon Engine -C Drain Life -R Drain Power -C Drudge Skeletons -C Durkwood Boars -U Dust to Dust -U Dwarven Catapult -R Dwarven Hold -U Dwarven Ruins -C Dwarven Soldier -C Dwarven Warriors -R Earthquake -U Ebon Stronghold -R Elder Druid -R Elkin Bottle -U Elven Riders -R Elvish Archers -U Energy Flux -C Enervate -C Erg Raiders -C Errantry -C Eternal Warrior -U Evil Eye of Orms-by-Gore -U Evil Presence -R Eye for an Eye -U Fallen Angel -C Fear -U Feedback -U Feldon's Cane -U Fellwar Stone -R Feroz's Ban -U Fire Drake -C Fireball -C Firebreathing -U Flame Spirit -C Flare -U Flashfires -C Flight -C Flood -R Flying Carpet -C Fog -C Force Spike -R Force of Nature -L Forest -L Forest -L Forest -L Forest -R Forget -U Fountain of Youth -C Foxfire -C Frozen Shade -C Funeral March -R Fungusaur -U Fyndhorn Elder -R Game of Chaos -C Gaseous Form -R Gauntlets of Chaos -C Ghazban Ogre -C Giant Growth -C Giant Spider -C Giant Strength -U Glacial Wall -U Glasses of Urza -U Gloom -C Goblin Digging Team -C Goblin Hero -R Goblin King -C Goblin War Drums -R Goblin Warrens -C Grapeshot Catapult -U Greater Realm of Preservation -U Greater Werewolf -C Grizzly Bears -U Havenwood Battleground -C Heal -C Healing Salve -R Hecatomb -R Helm of Chatzuk -C Hill Giant -C Hipparion -R Hollow Trees -C Holy Strength -C Homarid Warrior -C Howl from Beyond -R Howling Mine -C Hungry Mist -R Hurkyl's Recall -C Hurloon Minotaur -U Hurricane -U Hydroblast -U Icatian Phalanx -C Icatian Scout -R Icatian Store -R Icatian Town -U Ice Floe -C Imposing Visage -C Incinerate -R Inferno -R Infinite Hourglass -C Initiates of the Ebon Hand -U Instill Energy -U Iron Star -R Ironclaw Curse -C Ironclaw Orcs -C Ironroot Treefolk -L Island -L Island -L Island -L Island -R Island Sanctuary -U Ivory Cup -U Ivory Guardians -R Jade Monolith -R Jalum Tome -R Jandor's Saddlebags -R Jayemdae Tome -R Jester's Cap -U Johtull Wurm -R Jokulhaups -U Joven's Tools -U Justice -R Juxtapose -U Karma -R Karplusan Forest -U Keldon Warlord -U Killer Bees -U Kismet -C Kjeldoran Dead -R Kjeldoran Royal Guard -U Kjeldoran Skycaptain -U Knight of Stromgald -C Krovikan Fetish -C Krovikan Sorcerer -C Labyrinth Minotaur -U Leshrac's Rite -R Leviathan -C Ley Druid -R Lhurgoyf -U Library of Leng -U Lifeforce -U Lifetap -R Living Artifact -R Living Lands -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -C Lost Soul -U Lure -R Magical Hack -R Magus of the Unseen -R Mana Clash -R Mana Flare -R Mana Vault -R Manabarbs -C Marsh Viper -R Meekstone -C Memory Lapse -C Merfolk of the Pearl Trident -C Mesa Falcon -C Mesa Pegasus -R Millstone -U Mind Bomb -C Mind Ravel -U Mind Warp -C Mindstab Thrull -U Mole Worms -C Mons's Goblin Raiders -L Mountain -L Mountain -L Mountain -L Mountain -C Mountain Goat -C Murk Dwellers -C Nature's Lore -C Necrite -R Necropotence -R Nether Shadow -R Nevinyrral's Disk -R Nightmare -R Obelisk of Undoing -U Orcish Artillery -U Orcish Captain -C Orcish Conscripts -C Orcish Farmer -U Orcish Oriflamme -R Orcish Squatters -R Order of the Sacred Torch -U Order of the White Shield -R Orgg -U Ornithopter -C Panic -C Paralyze -C Pearled Unicorn -R Pentagram of the Ages -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -C Pikemen -R Pirate Ship -C Pit Scorpion -C Plague Rats -L Plains -L Plains -L Plains -L Plains -C Portent -U Power Sink -R Pox -C Pradesh Gypsies -R Primal Clay -R Primal Order -U Primordial Ooze -C Prismatic Ward -C Prodigal Sorcerer -C Psychic Venom -U Pyroblast -U Pyrotechnics -U Rabid Wombat -U Radjan Spirit -R Rag Man -C Raise Dead -C Ray of Command -R Recall -C Reef Pirates -C Regeneration -C Remove Soul -C Repentant Blacksmith -R Reverse Damage -R Righteousness -U Rod of Ruin -U Ruins of Trokair -C Sabretooth Tiger -U Sacred Boon -C Samite Healer -R Sand Silos -C Scaled Wurm -C Scathe Zombies -C Scavenger Folk -C Scryb Sprites -C Sea Serpent -U Sea Spirit -U Sea Sprite -U Seasinger -U Segovian Leviathan -R Sengir Autocrat -R Seraph -R Serpent Generator -U Serra Bestiary -U Serra Paladin -C Shanodin Dryads -U Shapeshifter -C Shatter -U Shatterstorm -C Shield Bearer -C Shield Wall -R Shivan Dragon -C Shrink -R Sibilant Spirit -U Skull Catapult -R Sleight of Mind -R Smoke -R Sorceress Queen -C Soul Barrier -U Soul Net -C Spell Blast -U Spirit Link -R Stampede -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -U Stone Spirit -C Stream of Life -R Stromgald Cabal -R Sulfurous Springs -U Svyelunite Temple -L Swamp -L Swamp -L Swamp -L Swamp -R Sylvan Library -C Tarpan -U Tawnos's Weaponry -C Terror -C The Brute -R The Hive -R The Wretched -U Thicket Basilisk -U Throne of Bone -U Thrull Retainer -R Time Bomb -R Time Elemental -R Titania's Song -C Torture -C Touch of Death -C Tranquility -R Truce -U Tsunami -C Tundra Wolves -C Twiddle -R Underground River -C Unholy Strength -C Unstable Mutation -C Unsummon -U Untamed Wilds -C Updraft -R Urza's Avenger -U Urza's Bauble -C Urza's Mine -C Urza's Power Plant -C Urza's Tower -C Vampire Bats -C Venom -R Verduran Enchantress -C Vodalian Soldiers -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Fire -C Wall of Spears -U Wall of Stone -U Wall of Swords -U Wanderlust -C War Mammoth -R Warp Artifact -C Weakness -U Whirling Dervish -U White Knight -C Wild Growth -U Wind Spirit -R Winds of Change -U Winter Blast -R Winter Orb -U Wolverine Pack -U Wooden Sphere -U Word of Blasting -R Wrath of God -R Wyluli Wolf -R Xenic Poltergeist -C Zephyr Falcon -R Zombie Master -R Zur's Weirding +1 U Abbey Gargoyles +139 U Abyssal Specter +410 R Adarkar Wastes +70 U Aether Storm +71 U Air Elemental +2 R Akron Legionnaire +3 C Alabaster Potion +346 R Aladdin's Ring +208 C Ambush Party +347 C Amulet of Kroog +4 U Angry Mob +277 R An-Havva Constable +140 U Animate Dead +5 R Animate Wall +348 R Ankh of Mishra +72 U Anti-Magic Aura +6 U Arenson's Aura +7 R Armageddon +8 C Armor of Faith +141 U Ashes to Ashes +349 U Ashnod's Altar +350 C Ashnod's Transmogrant +278 R Aspect of Wolf +209 U Atog +279 C Aurochs +9 C Aysen Bureaucrats +73 U Azure Drake +142 R Bad Moon +210 R Ball Lightning +351 C Barbed Sextant +352 R Barl's Cage +353 C Battering Ram +10 C Benalish Hero +74 U Binding Grasp +211 C Bird Maiden +280 R Birds of Paradise +143 U Black Knight +11 C Blessed Wine +144 U Blight +12 R Blinking Spirit +212 C Blood Lust +145 C Bog Imp +146 C Bog Rats +147 U Bog Wraith +75 C Boomerang +354 R Bottle of Suleiman +411 R Bottomless Vault +76 C Brainstorm +13 C Brainwash +213 C Brassclaw Orcs +148 U Breeding Pit +149 R Broken Visage +214 C Brothers of Fire +412 R Brushland +281 C Carapace +14 R Caribou Range +150 U Carrion Ants +15 U Castle +282 C Cat Warriors +215 U Cave People +283 C Chub Toad +16 U Circle of Protection: Artifacts +17 C Circle of Protection: Black +18 C Circle of Protection: Blue +19 C Circle of Protection: Green +20 C Circle of Protection: Red +21 C Circle of Protection: White +413 R City of Brass +355 C Clay Statue +151 C Cloak of Confusion +356 R Clockwork Beast +357 U Clockwork Steed +284 R Cockatrice +358 R Colossus of Sardia +216 U Conquer +359 R Coral Helm +77 C Counterspell +285 U Craw Giant +286 C Craw Wurm +217 R Crimson Manticore +360 R Crown of the Ages +287 U Crumble +22 R Crusade +361 U Crystal Rod +152 U Cursed Land +78 R Dance of Many +362 R Dancing Scimitar +79 C Dandan +80 C Dark Maze +153 C Dark Ritual +23 C D'Avenant Archer +154 U Deathgrip +24 C Death Speakers +25 C Death Ward +81 R Deflection +155 R Derelor +288 U Desert Twister +218 U Detonate +363 U Diabolic Machine +364 R Dingus Egg +26 C Disenchant +219 C Disintegrate +365 R Disrupting Scepter +27 C Divine Offering +28 U Divine Transformation +366 R Dragon Engine +156 C Drain Life +82 R Drain Power +157 C Drudge Skeletons +289 C Durkwood Boars +29 U Dust to Dust +220 U Dwarven Catapult +414 R Dwarven Hold +415 U Dwarven Ruins +221 C Dwarven Soldier +222 C Dwarven Warriors +223 R Earthquake +416 U Ebon Stronghold +290 R Elder Druid +367 R Elkin Bottle +291 U Elven Riders +292 R Elvish Archers +83 U Energy Flux +84 C Enervate +158 C Erg Raiders +224 C Errantry +225 C Eternal Warrior +159 U Evil Eye of Orms-by-Gore +160 U Evil Presence +30 R Eye for an Eye +161 U Fallen Angel +162 C Fear +85 U Feedback +368 U Feldon's Cane +369 U Fellwar Stone +370 R Feroz's Ban +227 C Fireball +228 C Firebreathing +226 U Fire Drake +229 U Flame Spirit +230 C Flare +231 U Flashfires +86 C Flight +87 C Flood +371 R Flying Carpet +293 C Fog +294 R Force of Nature +88 C Force Spike +446 L Forest +447 L Forest +448 L Forest +449 L Forest +89 R Forget +372 U Fountain of Youth +295 C Foxfire +163 C Frozen Shade +164 C Funeral March +296 R Fungusaur +297 U Fyndhorn Elder +232 R Game of Chaos +90 C Gaseous Form +373 R Gauntlets of Chaos +298 C Ghazban Ogre +299 C Giant Growth +300 C Giant Spider +233 C Giant Strength +91 U Glacial Wall +374 U Glasses of Urza +165 U Gloom +234 C Goblin Digging Team +235 C Goblin Hero +236 R Goblin King +237 C Goblin War Drums +238 R Goblin Warrens +375 C Grapeshot Catapult +31 U Greater Realm of Preservation +166 U Greater Werewolf +301 C Grizzly Bears +417 U Havenwood Battleground +32 C Heal +33 C Healing Salve +167 R Hecatomb +376 R Helm of Chatzuk +239 C Hill Giant +34 C Hipparion +418 R Hollow Trees +35 C Holy Strength +92 C Homarid Warrior +168 C Howl from Beyond +377 R Howling Mine +302 C Hungry Mist +93 R Hurkyl's Recall +240 C Hurloon Minotaur +303 U Hurricane +94 U Hydroblast +36 U Icatian Phalanx +37 C Icatian Scout +419 R Icatian Store +38 R Icatian Town +420 U Ice Floe +241 C Imposing Visage +242 C Incinerate +243 R Inferno +378 R Infinite Hourglass +169 C Initiates of the Ebon Hand +304 U Instill Energy +244 R Ironclaw Curse +245 C Ironclaw Orcs +305 C Ironroot Treefolk +379 U Iron Star +434 L Island +435 L Island +436 L Island +437 L Island +39 R Island Sanctuary +380 U Ivory Cup +40 U Ivory Guardians +381 R Jade Monolith +382 R Jalum Tome +383 R Jandor's Saddlebags +384 R Jayemdae Tome +385 R Jester's Cap +306 U Johtull Wurm +246 R Jokulhaups +386 U Joven's Tools +41 U Justice +95 R Juxtapose +42 U Karma +421 R Karplusan Forest +247 U Keldon Warlord +307 U Killer Bees +43 U Kismet +170 C Kjeldoran Dead +44 R Kjeldoran Royal Guard +45 U Kjeldoran Skycaptain +171 U Knight of Stromgald +172 C Krovikan Fetish +96 C Krovikan Sorcerer +97 C Labyrinth Minotaur +173 U Leshrac's Rite +98 R Leviathan +308 C Ley Druid +309 R Lhurgoyf +387 U Library of Leng +310 U Lifeforce +99 U Lifetap +311 R Living Artifact +312 R Living Lands +313 C Llanowar Elves +100 R Lord of Atlantis +174 R Lord of the Pit +175 C Lost Soul +314 U Lure +101 R Magical Hack +102 R Magus of the Unseen +250 R Manabarbs +248 R Mana Clash +249 R Mana Flare +388 R Mana Vault +315 C Marsh Viper +389 R Meekstone +103 C Memory Lapse +104 C Merfolk of the Pearl Trident +46 C Mesa Falcon +47 C Mesa Pegasus +390 R Millstone +105 U Mind Bomb +176 C Mind Ravel +178 C Mindstab Thrull +177 U Mind Warp +179 U Mole Worms +251 C Mons's Goblin Raiders +442 L Mountain +443 L Mountain +444 L Mountain +445 L Mountain +252 C Mountain Goat +180 C Murk Dwellers +316 C Nature's Lore +181 C Necrite +182 R Necropotence +183 R Nether Shadow +391 R Nevinyrral's Disk +184 R Nightmare +392 R Obelisk of Undoing +253 U Orcish Artillery +254 U Orcish Captain +255 C Orcish Conscripts +256 C Orcish Farmer +257 U Orcish Oriflamme +258 R Orcish Squatters +48 R Order of the Sacred Torch +49 U Order of the White Shield +259 R Orgg +393 U Ornithopter +260 C Panic +185 C Paralyze +50 C Pearled Unicorn +394 R Pentagram of the Ages +51 R Personal Incarnation +186 C Pestilence +106 U Phantasmal Forces +107 C Phantasmal Terrain +108 U Phantom Monster +52 C Pikemen +109 R Pirate Ship +187 C Pit Scorpion +188 C Plague Rats +430 L Plains +431 L Plains +432 L Plains +433 L Plains +110 C Portent +111 U Power Sink +189 R Pox +317 C Pradesh Gypsies +395 R Primal Clay +318 R Primal Order +261 U Primordial Ooze +53 C Prismatic Ward +112 C Prodigal Sorcerer +113 C Psychic Venom +262 U Pyroblast +263 U Pyrotechnics +319 U Rabid Wombat +320 U Radjan Spirit +190 R Rag Man +191 C Raise Dead +114 C Ray of Command +115 R Recall +116 C Reef Pirates +321 C Regeneration +117 C Remove Soul +54 C Repentant Blacksmith +55 R Reverse Damage +56 R Righteousness +396 U Rod of Ruin +422 U Ruins of Trokair +264 C Sabretooth Tiger +57 U Sacred Boon +58 C Samite Healer +423 R Sand Silos +322 C Scaled Wurm +192 C Scathe Zombies +323 C Scavenger Folk +324 C Scryb Sprites +118 C Sea Serpent +121 U Seasinger +119 U Sea Spirit +120 U Sea Sprite +122 U Segovian Leviathan +193 R Sengir Autocrat +59 R Seraph +397 R Serpent Generator +60 U Serra Bestiary +61 U Serra Paladin +325 C Shanodin Dryads +398 U Shapeshifter +265 C Shatter +266 U Shatterstorm +62 C Shield Bearer +63 C Shield Wall +267 R Shivan Dragon +326 C Shrink +123 R Sibilant Spirit +399 U Skull Catapult +124 R Sleight of Mind +268 R Smoke +194 R Sorceress Queen +125 C Soul Barrier +400 U Soul Net +126 C Spell Blast +64 U Spirit Link +327 R Stampede +127 R Stasis +128 U Steal Artifact +269 U Stone Giant +270 C Stone Rain +271 U Stone Spirit +328 C Stream of Life +195 R Stromgald Cabal +424 R Sulfurous Springs +425 U Svyelunite Temple +438 L Swamp +439 L Swamp +440 L Swamp +441 L Swamp +329 R Sylvan Library +330 C Tarpan +401 U Tawnos's Weaponry +196 C Terror +272 C The Brute +402 R The Hive +197 R The Wretched +331 U Thicket Basilisk +403 U Throne of Bone +198 U Thrull Retainer +404 R Time Bomb +129 R Time Elemental +332 R Titania's Song +199 C Torture +200 C Touch of Death +333 C Tranquility +65 R Truce +334 U Tsunami +66 C Tundra Wolves +130 C Twiddle +426 R Underground River +201 C Unholy Strength +131 C Unstable Mutation +132 C Unsummon +335 U Untamed Wilds +133 C Updraft +405 R Urza's Avenger +406 U Urza's Bauble +427 C Urza's Mine +428 C Urza's Power Plant +429 C Urza's Tower +202 C Vampire Bats +336 C Venom +337 R Verduran Enchantress +134 C Vodalian Soldiers +135 U Wall of Air +203 U Wall of Bone +338 U Wall of Brambles +273 U Wall of Fire +407 C Wall of Spears +274 U Wall of Stone +67 U Wall of Swords +339 U Wanderlust +340 C War Mammoth +204 R Warp Artifact +205 C Weakness +341 U Whirling Dervish +68 U White Knight +342 C Wild Growth +275 R Winds of Change +136 U Wind Spirit +343 U Winter Blast +408 R Winter Orb +344 U Wolverine Pack +409 U Wooden Sphere +276 U Word of Blasting +69 R Wrath of God +345 R Wyluli Wolf +206 R Xenic Poltergeist +137 C Zephyr Falcon +207 R Zombie Master +138 R Zur's Weirding [tokens] wasp diff --git a/forge-gui/res/editions/Final Sacrifice.txt b/forge-gui/res/editions/Final Sacrifice.txt index 7a203ea494f..6da6b0ec27d 100644 --- a/forge-gui/res/editions/Final Sacrifice.txt +++ b/forge-gui/res/editions/Final Sacrifice.txt @@ -5,4 +5,4 @@ Name=Final Sacrifice Type=Other [cards] -C Mana Crypt \ No newline at end of file +5 C Mana Crypt \ No newline at end of file diff --git a/forge-gui/res/editions/Fourth Edition.txt b/forge-gui/res/editions/Fourth Edition.txt index 6f17253c343..f931e29a581 100644 --- a/forge-gui/res/editions/Fourth Edition.txt +++ b/forge-gui/res/editions/Fourth Edition.txt @@ -12,384 +12,384 @@ Foil=NotSupported ChaosDraftThemes=CORE_SET [cards] -U Abomination -U Air Elemental -C Alabaster Potion -R Aladdin's Lamp -R Aladdin's Ring -U Ali Baba -C Amrou Kithkin -C Amulet of Kroog -U Angry Mob -U Animate Artifact -U Animate Dead -R Animate Wall -R Ankh of Mishra -C Apprentice Wizard -R Armageddon -R Armageddon Clock -U Ashes to Ashes -U Ashnod's Battle Gear -R Aspect of Wolf -U Backfire -R Bad Moon -R Balance -R Ball Lightning -C Battering Ram -C Benalish Hero -C Bird Maiden -R Birds of Paradise -U Black Knight -R Black Mana Battery -U Black Vise -U Black Ward -R Blessing -U Blight -C Blood Lust -C Blue Elemental Blast -R Blue Mana Battery -U Blue Ward -C Bog Imp -U Bog Wraith -R Bottle of Suleiman -C Brainwash -U Brass Man -R Bronze Tablet -C Brothers of Fire -U Burrowing -C Carnivorous Plant -U Carrion Ants -U Castle -U Cave People -U Celestial Prism -U Channel -R Chaoslace -U Circle of Protection: Artifacts -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -C Clay Statue -R Clockwork Avian -R Clockwork Beast -R Cockatrice -R Colossus of Sardia -U Conservator -U Control Magic -U Conversion -R Coral Helm -R Cosmic Horror -U Counterspell -C Craw Wurm -C Creature Bond -R Crimson Manticore -U Crumble -R Crusade -U Crystal Rod -U Cursed Land -U Cursed Rack -C Cyclopean Mummy -R Dancing Scimitar -C Dark Ritual -C Death Ward -U Deathgrip -R Deathlace -U Desert Twister -U Detonate -U Diabolic Machine -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -U Divine Transformation -R Dragon Engine -U Dragon Whelp -C Drain Life -R Drain Power -C Drudge Skeletons -C Durkwood Boars -C Dwarven Warriors -U Earth Elemental -R Earthquake -R Ebony Horse -R El-Hajjaj -R Elder Land Wurm -U Elven Riders -R Elvish Archers -U Energy Flux -C Energy Tap -C Erg Raiders -C Erosion -C Eternal Warrior -U Evil Presence -R Eye for an Eye -C Fear -U Feedback -U Fellwar Stone -U Fire Elemental -C Fireball -C Firebreathing -C Fissure -U Flashfires -C Flight -C Flood -R Flying Carpet -C Fog -R Force of Nature -L Forest -L Forest -L Forest -C Fortified Area -C Frozen Shade -R Fungusaur -R Gaea's Liege -C Gaseous Form -U Ghost Ship -C Giant Growth -C Giant Spider -C Giant Strength -C Giant Tortoise -U Glasses of Urza -U Gloom -U Goblin Balloon Brigade -R Goblin King -C Goblin Rock Sled -C Grapeshot Catapult -C Gray Ogre -R Greed -R Green Mana Battery -U Green Ward -C Grizzly Bears -C Healing Salve -R Helm of Chatzuk -C Hill Giant -C Holy Armor -C Holy Strength -C Howl from Beyond -R Howling Mine -R Hurkyl's Recall -C Hurloon Minotaur -R Hurr Jackal -U Hurricane -U Hypnotic Specter -C Immolation -R Inferno -U Instill Energy -U Iron Star -C Ironclaw Orcs -C Ironroot Treefolk -L Island -L Island -L Island -R Island Fish Jasconius -R Island Sanctuary -U Ivory Cup -R Ivory Tower -R Jade Monolith -R Jandor's Saddlebags -R Jayemdae Tome -C Jump -U Junun Efreet -U Karma -U Keldon Warlord -U Killer Bees -U Kismet -R Kormus Bell -C Land Leeches -R Land Tax -R Leviathan -U Ley Druid -U Library of Leng -U Lifeforce -R Lifelace -U Lifetap -C Lightning Bolt -R Living Artifact -R Living Lands -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -C Lost Soul -U Lure -R Magical Hack -R Magnetic Mountain -R Mahamoti Djinn -R Mana Clash -R Mana Flare -R Mana Short -R Mana Vault -R Manabarbs -C Marsh Gas -C Marsh Viper -R Meekstone -C Merfolk of the Pearl Trident -C Mesa Pegasus -R Millstone -U Mind Bomb -R Mind Twist -U Mishra's Factory -R Mishra's War Machine -C Mons's Goblin Raiders -C Morale -L Mountain -L Mountain -L Mountain -C Murk Dwellers -C Nafs Asp -R Nether Shadow -R Nevinyrral's Disk -R Nightmare -R Northern Paladin -U Oasis -U Obsianus Golem -R Onulet -U Orcish Artillery -U Orcish Oriflamme -U Ornithopter -U Osai Vultures -C Paralyze -C Pearled Unicorn -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -C Piety -C Pikemen -R Pirate Ship -C Pit Scorpion -C Plague Rats -L Plains -L Plains -L Plains -C Power Leak -C Power Sink -R Power Surge -C Pradesh Gypsies -R Primal Clay -C Prodigal Sorcerer -R Psionic Entity -C Psychic Venom -R Purelace -U Pyrotechnics -U Radjan Spirit -R Rag Man -C Raise Dead -R Rebirth -C Red Elemental Blast -R Red Mana Battery -U Red Ward -C Regeneration -R Relic Bind -R Reverse Damage -R Righteousness -U Rod of Ruin -R Royal Assassin -C Samite Healer -C Sandstorm -R Savannah Lions -C Scathe Zombies -U Scavenging Ghoul -C Scryb Sprites -C Sea Serpent -C Seeker -U Segovian Leviathan -U Sengir Vampire -U Serra Angel -C Shanodin Dryads -U Shapeshifter -C Shatter -R Shivan Dragon -U Simulacrum -U Sindbad -U Siren's Call -C Sisters of the Flame -R Sleight of Mind -R Smoke -R Sorceress Queen -U Soul Net -C Spell Blast -U Spirit Link -U Spirit Shackle -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -C Stream of Life -U Strip Mine -R Sunglasses of Urza -C Sunken City -L Swamp -L Swamp -L Swamp -U Swords to Plowshares -R Sylvan Library -U Tawnos's Wand -U Tawnos's Weaponry -R Tempest Efreet -C Terror -R Tetravus -C The Brute -R The Hive -U The Rack -U Thicket Basilisk -R Thoughtlace -U Throne of Bone -R Timber Wolves -R Time Elemental -R Titania's Song -C Tranquility -R Triskelion -U Tsunami -C Tundra Wolves -U Tunnel -C Twiddle -U Uncle Istvan -C Unholy Strength -C Unstable Mutation -C Unsummon -U Untamed Wilds -R Urza's Avenger -U Uthden Troll -C Vampire Bats -C Venom -R Verduran Enchantress -U Visions -R Volcanic Eruption -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Dust -U Wall of Fire -U Wall of Ice -C Wall of Spears -U Wall of Stone -U Wall of Swords -U Wall of Water -C Wall of Wood -U Wanderlust -C War Mammoth -R Warp Artifact -U Water Elemental -C Weakness -R Web -U Whirling Dervish -U White Knight -R White Mana Battery -U White Ward -C Wild Growth -R Will-o'-the-Wisp -R Winds of Change -U Winter Blast -R Winter Orb -U Wooden Sphere -C Word of Binding -R Wrath of God -R Xenic Poltergeist -C Yotian Soldier -C Zephyr Falcon -R Zombie Master +117 U Abomination +59 U Air Elemental +1 C Alabaster Potion +291 R Aladdin's Lamp +292 R Aladdin's Ring +175 U Ali Baba +2 C Amrou Kithkin +293 C Amulet of Kroog +3 U Angry Mob +60 U Animate Artifact +118 U Animate Dead +4 R Animate Wall +294 R Ankh of Mishra +61 C Apprentice Wizard +5 R Armageddon +295 R Armageddon Clock +119 U Ashes to Ashes +296 U Ashnod's Battle Gear +233 R Aspect of Wolf +62 U Backfire +120 R Bad Moon +6 R Balance +176 R Ball Lightning +297 C Battering Ram +7 C Benalish Hero +177 C Bird Maiden +234 R Birds of Paradise +121 U Black Knight +298 R Black Mana Battery +299 U Black Vise +8 U Black Ward +9 R Blessing +122 U Blight +178 C Blood Lust +63 C Blue Elemental Blast +300 R Blue Mana Battery +10 U Blue Ward +123 C Bog Imp +124 U Bog Wraith +301 R Bottle of Suleiman +11 C Brainwash +302 U Brass Man +303 R Bronze Tablet +179 C Brothers of Fire +180 U Burrowing +235 C Carnivorous Plant +125 U Carrion Ants +12 U Castle +181 U Cave People +304 U Celestial Prism +236 U Channel +182 R Chaoslace +13 U Circle of Protection: Artifacts +14 C Circle of Protection: Black +15 C Circle of Protection: Blue +16 C Circle of Protection: Green +17 C Circle of Protection: Red +18 C Circle of Protection: White +305 C Clay Statue +306 R Clockwork Avian +307 R Clockwork Beast +237 R Cockatrice +308 R Colossus of Sardia +309 U Conservator +64 U Control Magic +19 U Conversion +310 R Coral Helm +126 R Cosmic Horror +65 U Counterspell +238 C Craw Wurm +66 C Creature Bond +183 R Crimson Manticore +239 U Crumble +20 R Crusade +311 U Crystal Rod +127 U Cursed Land +312 U Cursed Rack +128 C Cyclopean Mummy +313 R Dancing Scimitar +129 C Dark Ritual +21 C Death Ward +130 U Deathgrip +131 R Deathlace +240 U Desert Twister +184 U Detonate +314 U Diabolic Machine +315 R Dingus Egg +22 C Disenchant +185 C Disintegrate +316 R Disrupting Scepter +23 U Divine Transformation +317 R Dragon Engine +186 U Dragon Whelp +132 C Drain Life +67 R Drain Power +133 C Drudge Skeletons +241 C Durkwood Boars +187 C Dwarven Warriors +188 U Earth Elemental +189 R Earthquake +318 R Ebony Horse +134 R El-Hajjaj +24 R Elder Land Wurm +242 U Elven Riders +243 R Elvish Archers +68 U Energy Flux +69 C Energy Tap +135 C Erg Raiders +70 C Erosion +190 C Eternal Warrior +136 U Evil Presence +25 R Eye for an Eye +137 C Fear +71 U Feedback +319 U Fellwar Stone +191 U Fire Elemental +192 C Fireball +193 C Firebreathing +194 C Fissure +195 U Flashfires +72 C Flight +73 C Flood +320 R Flying Carpet +244 C Fog +245 R Force of Nature +376 L Forest +377 L Forest +378 L Forest +26 C Fortified Area +138 C Frozen Shade +246 R Fungusaur +247 R Gaea's Liege +74 C Gaseous Form +75 U Ghost Ship +248 C Giant Growth +249 C Giant Spider +196 C Giant Strength +76 C Giant Tortoise +321 U Glasses of Urza +139 U Gloom +197 U Goblin Balloon Brigade +198 R Goblin King +199 C Goblin Rock Sled +322 C Grapeshot Catapult +200 C Gray Ogre +140 R Greed +323 R Green Mana Battery +27 U Green Ward +250 C Grizzly Bears +28 C Healing Salve +324 R Helm of Chatzuk +201 C Hill Giant +29 C Holy Armor +30 C Holy Strength +141 C Howl from Beyond +325 R Howling Mine +77 R Hurkyl's Recall +202 C Hurloon Minotaur +203 R Hurr Jackal +251 U Hurricane +142 U Hypnotic Specter +204 C Immolation +205 R Inferno +252 U Instill Energy +326 U Iron Star +206 C Ironclaw Orcs +253 C Ironroot Treefolk +367 L Island +368 L Island +369 L Island +78 R Island Fish Jasconius +31 R Island Sanctuary +327 U Ivory Cup +328 R Ivory Tower +329 R Jade Monolith +330 R Jandor's Saddlebags +331 R Jayemdae Tome +79 C Jump +143 U Junun Efreet +32 U Karma +207 U Keldon Warlord +254 U Killer Bees +33 U Kismet +332 R Kormus Bell +255 C Land Leeches +34 R Land Tax +80 R Leviathan +256 U Ley Druid +333 U Library of Leng +257 U Lifeforce +258 R Lifelace +81 U Lifetap +208 C Lightning Bolt +259 R Living Artifact +260 R Living Lands +261 C Llanowar Elves +82 R Lord of Atlantis +144 R Lord of the Pit +145 C Lost Soul +262 U Lure +83 R Magical Hack +209 R Magnetic Mountain +84 R Mahamoti Djinn +210 R Mana Clash +211 R Mana Flare +85 R Mana Short +334 R Mana Vault +212 R Manabarbs +146 C Marsh Gas +263 C Marsh Viper +335 R Meekstone +86 C Merfolk of the Pearl Trident +35 C Mesa Pegasus +336 R Millstone +87 U Mind Bomb +147 R Mind Twist +361 U Mishra's Factory +337 R Mishra's War Machine +213 C Mons's Goblin Raiders +36 C Morale +373 L Mountain +374 L Mountain +375 L Mountain +148 C Murk Dwellers +264 C Nafs Asp +149 R Nether Shadow +338 R Nevinyrral's Disk +150 R Nightmare +37 R Northern Paladin +362 U Oasis +339 U Obsianus Golem +340 R Onulet +214 U Orcish Artillery +215 U Orcish Oriflamme +341 U Ornithopter +38 U Osai Vultures +151 C Paralyze +39 C Pearled Unicorn +40 R Personal Incarnation +152 C Pestilence +88 U Phantasmal Forces +89 C Phantasmal Terrain +90 U Phantom Monster +41 C Piety +42 C Pikemen +91 R Pirate Ship +153 C Pit Scorpion +154 C Plague Rats +364 L Plains +365 L Plains +366 L Plains +92 C Power Leak +93 C Power Sink +216 R Power Surge +265 C Pradesh Gypsies +342 R Primal Clay +94 C Prodigal Sorcerer +95 R Psionic Entity +96 C Psychic Venom +43 R Purelace +217 U Pyrotechnics +266 U Radjan Spirit +155 R Rag Man +156 C Raise Dead +267 R Rebirth +218 C Red Elemental Blast +343 R Red Mana Battery +44 U Red Ward +268 C Regeneration +97 R Relic Bind +45 R Reverse Damage +46 R Righteousness +344 U Rod of Ruin +157 R Royal Assassin +47 C Samite Healer +269 C Sandstorm +48 R Savannah Lions +158 C Scathe Zombies +159 U Scavenging Ghoul +270 C Scryb Sprites +98 C Sea Serpent +49 C Seeker +99 U Segovian Leviathan +160 U Sengir Vampire +50 U Serra Angel +271 C Shanodin Dryads +345 U Shapeshifter +219 C Shatter +220 R Shivan Dragon +161 U Simulacrum +100 U Sindbad +101 U Siren's Call +221 C Sisters of the Flame +102 R Sleight of Mind +222 R Smoke +162 R Sorceress Queen +346 U Soul Net +103 C Spell Blast +51 U Spirit Link +163 U Spirit Shackle +104 R Stasis +105 U Steal Artifact +223 U Stone Giant +224 C Stone Rain +272 C Stream of Life +363 U Strip Mine +347 R Sunglasses of Urza +106 C Sunken City +370 L Swamp +371 L Swamp +372 L Swamp +52 U Swords to Plowshares +273 R Sylvan Library +348 U Tawnos's Wand +349 U Tawnos's Weaponry +225 R Tempest Efreet +164 C Terror +350 R Tetravus +226 C The Brute +351 R The Hive +352 U The Rack +274 U Thicket Basilisk +107 R Thoughtlace +353 U Throne of Bone +275 R Timber Wolves +108 R Time Elemental +276 R Titania's Song +277 C Tranquility +354 R Triskelion +278 U Tsunami +53 C Tundra Wolves +227 U Tunnel +109 C Twiddle +165 U Uncle Istvan +166 C Unholy Strength +110 C Unstable Mutation +111 C Unsummon +279 U Untamed Wilds +355 R Urza's Avenger +228 U Uthden Troll +167 C Vampire Bats +280 C Venom +281 R Verduran Enchantress +54 U Visions +112 R Volcanic Eruption +113 U Wall of Air +168 U Wall of Bone +282 U Wall of Brambles +229 U Wall of Dust +230 U Wall of Fire +283 U Wall of Ice +356 C Wall of Spears +231 U Wall of Stone +55 U Wall of Swords +114 U Wall of Water +284 C Wall of Wood +285 U Wanderlust +286 C War Mammoth +169 R Warp Artifact +115 U Water Elemental +170 C Weakness +287 R Web +288 U Whirling Dervish +56 U White Knight +357 R White Mana Battery +57 U White Ward +289 C Wild Growth +171 R Will-o'-the-Wisp +232 R Winds of Change +290 U Winter Blast +358 R Winter Orb +359 U Wooden Sphere +172 C Word of Binding +58 R Wrath of God +173 R Xenic Poltergeist +360 C Yotian Soldier +116 C Zephyr Falcon +174 R Zombie Master [tokens] wasp diff --git a/forge-gui/res/editions/Grand Prix Promos.txt b/forge-gui/res/editions/Grand Prix Promos.txt index e0c4685f1c7..63431088e4f 100644 --- a/forge-gui/res/editions/Grand Prix Promos.txt +++ b/forge-gui/res/editions/Grand Prix Promos.txt @@ -7,23 +7,23 @@ MciCode=pgpx Type=Other [cards] -R Spiritmonger -R Call of the Herd -R Chrome Mox -R Umezawa's Jitte -R Maelstrom Pulse -R Goblin Guide -R Lotus Cobra -M Primeval Titan -R All Is Dust -M Batterskull -M Griselbrand -R Stoneforge Mystic -R Sword of Feast and Famine -M Progenitus -R Mutavault -L Plains -L Island -L Swamp -L Mountain -L Forest \ No newline at end of file +2007 R Spiritmonger +2008 R Call of the Herd +2009 R Chrome Mox +2010 R Umezawa's Jitte +2011 R Maelstrom Pulse +2012a R Goblin Guide +2012b R Lotus Cobra +2013a M Primeval Titan +2013b R All Is Dust +2014 M Batterskull +2015 M Griselbrand +2016 R Stoneforge Mystic +2016b R Sword of Feast and Famine +2017 M Progenitus +2018 R Mutavault +2018a L Plains +2018b L Island +2018c L Swamp +2018d L Mountain +2018f L Forest \ No newline at end of file diff --git a/forge-gui/res/editions/Historic Anthology 5.txt b/forge-gui/res/editions/Historic Anthology 5.txt new file mode 100644 index 00000000000..4c4c1dc6608 --- /dev/null +++ b/forge-gui/res/editions/Historic Anthology 5.txt @@ -0,0 +1,32 @@ +[metadata] +Code=HA5 +Date=2021-05-27 +Name=Historic Anthology 5 +Type=Online + +[cards] +1 C Court Homunculus +2 M Elesh Norn, Grand Cenobite +3 U Intangible Virtue +4 C Ray of Revelation +5 M Jin-Gitaxias, Core Augur +6 C Merfolk Looter +7 U Reverse Engineer +8 R Stifle +9 U Whirler Rogue +10 M Sheoldred, Whispering One +11 C Vault Skirge +12 U Ancient Grudge +13 R Dragonstorm +14 U Trash for Treasure +15 M Urabrask the Hidden +16 C Into the North +17 M Vorinclex, Voice of Hunger +18 R Ojutai's Command +19 R Silumgar's Command +20 R Kolaghan's Command +21 R Atarka's Command +22 R Dromoka's Command +23 C Grisly Salvage +24 C Ichor Wellspring +25 C Relic of Progenitus diff --git a/forge-gui/res/editions/Homelands.txt b/forge-gui/res/editions/Homelands.txt index 2121c3a4640..4eb9cdefcfc 100644 --- a/forge-gui/res/editions/Homelands.txt +++ b/forge-gui/res/editions/Homelands.txt @@ -11,146 +11,146 @@ BoosterBox=60 Foil=NotSupported [cards] -U AEther Storm -U Abbey Gargoyles -C Abbey Matron -C Abbey Matron -C Aliban's Tower -C Aliban's Tower -C Ambush -C Ambush Party -C Ambush Party -R An-Havva Constable -U An-Havva Inn -U An-Havva Township -R An-Zerrin Ruins -R Anaba Ancestor -C Anaba Bodyguard -C Anaba Bodyguard -C Anaba Shaman -C Anaba Shaman -R Anaba Spirit Crafter -R Apocalypse Chime -R Autumn Willow -U Aysen Abbey -C Aysen Bureaucrats -C Aysen Bureaucrats -R Aysen Crusader -R Aysen Highway -R Baki's Curse -R Baron Sengir -R Beast Walkers -R Black Carriage -R Broken Visage -C Carapace -C Carapace -U Castle Sengir -C Cemetery Gate -C Cemetery Gate -R Chain Stasis -C Chandler -C Clockwork Gnomes -C Clockwork Steed -C Clockwork Swarm -C Coral Reef -C Dark Maze -C Dark Maze -R Daughter of Autumn -U Death Speakers -R Didgeridoo -U Drudge Spell -C Dry Spell -C Dry Spell -R Dwarven Pony -R Dwarven Sea Clan -C Dwarven Trader -C Dwarven Trader -C Ebony Rhino -U Eron the Relentless -U Evaporate -R Faerie Noble -C Feast of the Unicorn -C Feast of the Unicorn -R Feroz's Ban -C Folk of An-Havva -C Folk of An-Havva -R Forget -C Funeral March -U Ghost Hounds -C Giant Albatross -C Giant Albatross -U Giant Oyster -R Grandmother Sengir -C Greater Werewolf -R Hazduhr the Abbot -C Headstone -R Heart Wolf -C Hungry Mist -C Hungry Mist -U Ihsan's Shade -U Irini Sengir -R Ironclaw Curse -C Jinx -C Joven -C Joven's Ferrets -U Joven's Tools -R Koskun Falls -U Koskun Keep -C Labyrinth Minotaur -C Labyrinth Minotaur -C Leaping Lizard -R Leeches -R Mammoth Harness -R Marjhan -C Memory Lapse -C Memory Lapse -C Merchant Scroll -C Mesa Falcon -C Mesa Falcon -R Mystic Decree -R Narwhal -U Orcish Mine -R Primal Order -C Prophecy -U Rashka the Slayer -C Reef Pirates -C Reef Pirates -C Renewal -U Retribution -R Reveka, Wizard Savant -U Root Spider -U Roots -C Roterothopter -R Rysorian Badger -C Samite Alchemist -C Samite Alchemist -U Sea Sprite -U Sea Troll -U Sengir Autocrat -C Sengir Bats -C Sengir Bats -R Serra Aviary -C Serra Bestiary -U Serra Inquisitors -C Serra Paladin -C Serrated Arrows -C Shrink -C Shrink -R Soraya the Falconer -U Spectral Bears -R Timmerian Fiends -C Torture -C Torture -C Trade Caravan -C Trade Caravan -R Truce -R Veldrane of Sengir -R Wall of Kelp -C Willow Faerie -C Willow Faerie -R Willow Priestess -R Winter Sky -U Wizards' School +21 U Aether Storm +1 U Abbey Gargoyles +2a C Abbey Matron +2b C Abbey Matron +61a C Aliban's Tower +61b C Aliban's Tower +62 C Ambush +63a C Ambush Party +63b C Ambush Party +81 R An-Havva Constable +82 U An-Havva Inn +111 U An-Havva Township +64 R An-Zerrin Ruins +65 R Anaba Ancestor +66a C Anaba Bodyguard +66b C Anaba Bodyguard +67a C Anaba Shaman +67b C Anaba Shaman +68 R Anaba Spirit Crafter +101 R Apocalypse Chime +83 R Autumn Willow +112 U Aysen Abbey +3a C Aysen Bureaucrats +3b C Aysen Bureaucrats +4 R Aysen Crusader +5 R Aysen Highway +22 R Baki's Curse +41 R Baron Sengir +6 R Beast Walkers +42 R Black Carriage +43 R Broken Visage +84a C Carapace +84b C Carapace +113 U Castle Sengir +44a C Cemetery Gate +44b C Cemetery Gate +23 R Chain Stasis +69 C Chandler +102 C Clockwork Gnomes +103 C Clockwork Steed +104 C Clockwork Swarm +24 C Coral Reef +25a C Dark Maze +25b C Dark Maze +85 R Daughter of Autumn +7 U Death Speakers +105 R Didgeridoo +45 U Drudge Spell +46a C Dry Spell +46b C Dry Spell +70 R Dwarven Pony +71 R Dwarven Sea Clan +72a C Dwarven Trader +72b C Dwarven Trader +106 C Ebony Rhino +73 U Eron the Relentless +74 U Evaporate +86 R Faerie Noble +47a C Feast of the Unicorn +47b C Feast of the Unicorn +107 R Feroz's Ban +87a C Folk of An-Havva +87b C Folk of An-Havva +26 R Forget +48 C Funeral March +49 U Ghost Hounds +27a C Giant Albatross +27b C Giant Albatross +28 U Giant Oyster +50 R Grandmother Sengir +51 C Greater Werewolf +8 R Hazduhr the Abbot +52 C Headstone +75 R Heart Wolf +88a C Hungry Mist +88b C Hungry Mist +53 U Ihsan's Shade +54 U Irini Sengir +76 R Ironclaw Curse +29 C Jinx +77 C Joven +89 C Joven's Ferrets +108 U Joven's Tools +55 R Koskun Falls +114 U Koskun Keep +30a C Labyrinth Minotaur +30b C Labyrinth Minotaur +90 C Leaping Lizard +9 R Leeches +91 R Mammoth Harness +31 R Marjhan +32a C Memory Lapse +32b C Memory Lapse +33 C Merchant Scroll +10a C Mesa Falcon +10b C Mesa Falcon +34 R Mystic Decree +35 R Narwhal +78 U Orcish Mine +92 R Primal Order +11 C Prophecy +12 U Rashka the Slayer +36a C Reef Pirates +36b C Reef Pirates +93 C Renewal +79 U Retribution +37 R Reveka, Wizard Savant +94 U Root Spider +95 U Roots +109 C Roterothopter +96 R Rysorian Badger +13a C Samite Alchemist +13b C Samite Alchemist +38 U Sea Sprite +39 U Sea Troll +56 U Sengir Autocrat +57a C Sengir Bats +57b C Sengir Bats +14 R Serra Aviary +15 C Serra Bestiary +16 U Serra Inquisitors +17 C Serra Paladin +110 C Serrated Arrows +97a C Shrink +97b C Shrink +18 R Soraya the Falconer +98 U Spectral Bears +58 R Timmerian Fiends +59a C Torture +59b C Torture +19a C Trade Caravan +19b C Trade Caravan +20 R Truce +60 R Veldrane of Sengir +40 R Wall of Kelp +99a C Willow Faerie +99b C Willow Faerie +100 R Willow Priestess +80 R Winter Sky +115 U Wizards' School [tokens] kelp diff --git a/forge-gui/res/editions/Ice Age.txt b/forge-gui/res/editions/Ice Age.txt index 73c067e13c8..e8d452ad06d 100644 --- a/forge-gui/res/editions/Ice Age.txt +++ b/forge-gui/res/editions/Ice Age.txt @@ -10,389 +10,389 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U Abyssal Specter -U Adarkar Sentinel -C Adarkar Unicorn -R Adarkar Wastes -R Aegis of the Meek -U Aggression -R Altar of Bone -R Amulet of Quoz -U Anarchy -C Arctic Foxes -U Arcum's Sleigh -U Arcum's Weathervane -U Arcum's Whistle -C Arenson's Aura -C Armor of Faith -C Arnjlot's Ascent -U Ashen Ghoul -C Aurochs -U Avalanche -C Balduvian Barbarians -C Balduvian Bears -U Balduvian Conjurer -R Balduvian Hydra -C Balduvian Shaman -C Barbarian Guides -C Barbed Sextant -U Baton of Morale -U Battle Cry -C Battle Frenzy -U Binding Grasp -U Black Scarab -C Blessed Wine -R Blinking Spirit -R Blizzard -U Blue Scarab -C Bone Shaman -C Brainstorm -R Brand of Ill Omen -U Breath of Dreams -C Brine Shaman -C Brown Ouphe -R Brushland -C Burnt Offering -R Call to Arms -R Caribou Range -R Celestial Sword -U Centaur Archer -R Chaos Lord -R Chaos Moon -R Chromatic Armor -C Chub Toad -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -C Clairvoyance -C Cloak of Confusion -U Cold Snap -U Conquer -C Cooperation -C Counterspell -R Crown of the Ages -R Curse of Marit Lage -U Dance of the Dead -C Dark Banishing -C Dark Ritual -C Death Ward -R Deflection -U Demonic Consultation -R Despotic Scepter -U Diabolic Vision -C Dire Wolves -C Disenchant -R Dread Wight -U Dreams of the Dead -U Drift of the Dead -U Drought -R Dwarven Armory -R Earthlink -C Earthlore -R Elder Druid -R Elemental Augury -R Elkin Bottle -C Elvish Healer -R Enduring Renewal -R Energy Storm -C Enervate -C Errant Minion -C Errantry -C Essence Filter -C Essence Flare -U Essence Vortex -U Fanatical Fever -C Fear -R Fiery Justice -U Fire Covenant -U Flame Spirit -C Flare -R Flooded Woodlands -R Flow of Maggots -C Folk of the Pines -R Forbidden Lore -U Force Void -L Forest -L Forest -L Forest -U Forgotten Lore -R Formation -C Foul Familiar -C Foxfire -U Freyalise Supplicant -U Freyalise's Charm -R Freyalise's Winds -U Fumarole -C Fylgja -U Fyndhorn Bow -C Fyndhorn Brownie -U Fyndhorn Elder -C Fyndhorn Elves -R Fyndhorn Pollen -R Game of Chaos -C Gangrenous Zombies -C Gaze of Pain -R General Jarkeld -R Ghostly Flame -C Giant Growth -U Giant Trap Door Spider -U Glacial Chasm -R Glacial Crevasses -U Glacial Wall -R Glaciers -R Goblin Lyre -U Goblin Mutant -C Goblin Sappers -C Goblin Ski Patrol -U Goblin Snowman -C Gorilla Pack -R Gravebind -U Green Scarab -C Grizzled Wolverine -U Hallowed Ground -R Halls of Mist -C Heal -R Hecatomb -U Hematite Talisman -U Hipparion -C Hoar Shade -R Hot Springs -C Howl from Beyond -U Hurricane -U Hyalopterous Lemure -C Hydroblast -U Hymn of Rebirth -R Ice Cauldron -U Ice Floe -U Iceberg -U Icequake -U Icy Manipulator -R Icy Prison -C Illusionary Forces -R Illusionary Presence -U Illusionary Terrain -C Illusionary Wall -R Illusions of Grandeur -C Imposing Visage -C Incinerate -R Infernal Darkness -R Infernal Denizen -R Infinite Hourglass -C Infuse -L Island -L Island -L Island -R Jester's Cap -R Jester's Mask -U Jeweled Amulet -U Johtull Wurm -R Jokulhaups -C Juniper Order Druid -U Justice -R Karplusan Forest -U Karplusan Giant -R Karplusan Yeti -C Kelsinko Ranger -C Kjeldoran Dead -U Kjeldoran Elite Guard -U Kjeldoran Frostbeast -C Kjeldoran Guard -R Kjeldoran Knight -R Kjeldoran Phalanx -R Kjeldoran Royal Guard -U Kjeldoran Skycaptain -C Kjeldoran Skyknight -C Kjeldoran Warrior -U Knight of Stromgald -U Krovikan Elementalist -C Krovikan Fetish -C Krovikan Sorcerer -U Krovikan Vampire -R Land Cap -U Lapis Lazuli Talisman -C Lava Burst -R Lava Tubes -C Legions of Lim-Dul -U Leshrac's Rite -U Leshrac's Sigil -R Lhurgoyf -R Lightning Blow -C Lim-Dul's Cohort -U Lim-Dul's Hex -R Lost Order of Jarkeld -U Lure -U Maddening Wind -R Magus of the Unseen -U Malachite Talisman -R Marton Stromgald -U Melee -U Melting -R Mercenaries -R Merieke Ri Berit -R Mesmeric Trance -C Meteor Shower -C Mind Ravel -U Mind Warp -R Mind Whip -R Minion of Leshrac -R Minion of Tevesh Szat -C Mistfolk -U Mole Worms -R Monsoon -C Moor Fiend -L Mountain -L Mountain -L Mountain -C Mountain Goat -R Mountain Titan -R Mudslide -R Musician -R Mystic Might -C Mystic Remora -U Nacre Talisman -R Naked Singularity -U Nature's Lore -R Necropotence -C Norritt -R Oath of Lim-Dul -U Onyx Talisman -U Orcish Cannoneers -C Orcish Conscripts -C Orcish Farmer -U Orcish Healer -R Orcish Librarian -C Orcish Lumberjack -R Orcish Squatters -R Order of the Sacred Torch -U Order of the White Shield -R Pale Bears -C Panic -R Pentagram of the Ages -C Pestilence Rats -U Phantasmal Mount -U Pit Trap -L Plains -L Plains -L Plains -R Polar Kraken -C Portent -C Power Sink -R Pox -C Prismatic Ward -R Pygmy Allosaurus -C Pyknite -C Pyroblast -U Pyroclasm -C Rally -C Ray of Command -C Ray of Erasure -R Reality Twist -R Reclamation -U Red Scarab -C Regeneration -C Rime Dryad -R Ritual of Subdual -R River Delta -R Runed Arch -C Sabretooth Tiger -U Sacred Boon -C Scaled Wurm -U Sea Spirit -C Seizures -R Seraph -C Shambling Strider -C Shatter -C Shield Bearer -U Shield of the Ages -R Shyft -R Sibilant Spirit -U Silver Erne -R Skeleton Ship -U Skull Catapult -U Sleight of Mind -C Snow Devil -R Snow Fortress -U Snow Hound -L Snow-Covered Forest -L Snow-Covered Island -L Snow-Covered Mountain -L Snow-Covered Plains -L Snow-Covered Swamp -R Snowblind -C Snowfall -R Soldevi Golem -U Soldevi Machinist -U Soldevi Simulacrum -C Songs of the Damned -U Soul Barrier -C Soul Burn -C Soul Kiss -U Spectral Shield -R Spoils of Evil -R Spoils of War -R Staff of the Ages -R Stampede -U Stench of Evil -C Stone Rain -U Stone Spirit -C Stonehands -R Storm Spirit -R Stormbind -R Stromgald Cabal -R Stunted Growth -R Sulfurous Springs -U Sunstone -L Swamp -L Swamp -L Swamp -U Swords to Plowshares -C Tarpan -U Thermokarst -U Thoughtleech -U Thunder Wall -R Timberline Ridge -R Time Bomb -C Tinder Wall -C Tor Giant -R Total War -C Touch of Death -U Touch of Vitae -R Trailblazer -R Underground River -U Updraft -U Urza's Bauble -R Veldt -U Venomous Breath -U Vertigo -R Vexing Arcanix -R Vibrating Sphere -U Walking Wall -U Wall of Lava -U Wall of Pine Needles -U Wall of Shields -U War Chariot -C Warning -U Whalebone Glider -U White Scarab -U Whiteout -R Wiitigo -C Wild Growth -U Wind Spirit -U Wings of Aesthir -R Winter's Chill -U Withering Wisps -C Woolly Mammoths -C Woolly Spider -U Word of Blasting -C Word of Undoing -R Wrath of Marit Lage -U Yavimaya Gnats -R Zur's Weirding -C Zuran Enchanter -U Zuran Orb -C Zuran Spellcaster +113 U Abyssal Specter +306 U Adarkar Sentinel +1 C Adarkar Unicorn +351 R Adarkar Wastes +307 R Aegis of the Meek +169 U Aggression +281 R Altar of Bone +308 R Amulet of Quoz +170 U Anarchy +2 C Arctic Foxes +309 U Arcum's Sleigh +310 U Arcum's Weathervane +311 U Arcum's Whistle +3 C Arenson's Aura +4 C Armor of Faith +57 C Arnjlot's Ascent +114 U Ashen Ghoul +225 C Aurochs +171 U Avalanche +172 C Balduvian Barbarians +226 C Balduvian Bears +58 U Balduvian Conjurer +173 R Balduvian Hydra +59 C Balduvian Shaman +174 C Barbarian Guides +312 C Barbed Sextant +313 U Baton of Morale +5 U Battle Cry +175 C Battle Frenzy +60 U Binding Grasp +6 U Black Scarab +7 C Blessed Wine +8 R Blinking Spirit +227 R Blizzard +9 U Blue Scarab +176 C Bone Shaman +61 C Brainstorm +177 R Brand of Ill Omen +62 U Breath of Dreams +115 C Brine Shaman +228 C Brown Ouphe +352 R Brushland +116 C Burnt Offering +10 R Call to Arms +11 R Caribou Range +314 R Celestial Sword +282 U Centaur Archer +178 R Chaos Lord +179 R Chaos Moon +283 R Chromatic Armor +229 C Chub Toad +12 C Circle of Protection: Black +13 C Circle of Protection: Blue +14 C Circle of Protection: Green +15 C Circle of Protection: Red +16 C Circle of Protection: White +63 C Clairvoyance +117 C Cloak of Confusion +17 U Cold Snap +180 U Conquer +18 C Cooperation +64 C Counterspell +315 R Crown of the Ages +181 R Curse of Marit Lage +118 U Dance of the Dead +119 C Dark Banishing +120 C Dark Ritual +19 C Death Ward +65 R Deflection +121 U Demonic Consultation +316 R Despotic Scepter +284 U Diabolic Vision +230 C Dire Wolves +20 C Disenchant +122 R Dread Wight +66 U Dreams of the Dead +123 U Drift of the Dead +21 U Drought +182 R Dwarven Armory +285 R Earthlink +231 C Earthlore +232 R Elder Druid +286 R Elemental Augury +317 R Elkin Bottle +22 C Elvish Healer +23 R Enduring Renewal +24 R Energy Storm +67 C Enervate +68 C Errant Minion +183 C Errantry +233 C Essence Filter +69 C Essence Flare +287 U Essence Vortex +234 U Fanatical Fever +124 C Fear +288 R Fiery Justice +289 U Fire Covenant +184 U Flame Spirit +185 C Flare +290 R Flooded Woodlands +125 R Flow of Maggots +235 C Folk of the Pines +236 R Forbidden Lore +70 U Force Void +380 L Forest +381 L Forest +382 L Forest +237 U Forgotten Lore +25 R Formation +126 C Foul Familiar +238 C Foxfire +239 U Freyalise Supplicant +240 U Freyalise's Charm +241 R Freyalise's Winds +291 U Fumarole +26 C Fylgja +318 U Fyndhorn Bow +242 C Fyndhorn Brownie +243 U Fyndhorn Elder +244 C Fyndhorn Elves +245 R Fyndhorn Pollen +186 R Game of Chaos +127 C Gangrenous Zombies +128 C Gaze of Pain +27 R General Jarkeld +292 R Ghostly Flame +246 C Giant Growth +293 U Giant Trap Door Spider +353 U Glacial Chasm +187 R Glacial Crevasses +71 U Glacial Wall +294 R Glaciers +319 R Goblin Lyre +188 U Goblin Mutant +189 C Goblin Sappers +190 C Goblin Ski Patrol +191 U Goblin Snowman +247 C Gorilla Pack +129 R Gravebind +28 U Green Scarab +192 C Grizzled Wolverine +29 U Hallowed Ground +354 R Halls of Mist +30 C Heal +130 R Hecatomb +320 U Hematite Talisman +31 U Hipparion +131 C Hoar Shade +248 R Hot Springs +132 C Howl from Beyond +249 U Hurricane +133 U Hyalopterous Lemure +72 C Hydroblast +295 U Hymn of Rebirth +321 R Ice Cauldron +355 U Ice Floe +73 U Iceberg +134 U Icequake +322 U Icy Manipulator +74 R Icy Prison +75 C Illusionary Forces +76 R Illusionary Presence +77 U Illusionary Terrain +78 C Illusionary Wall +79 R Illusions of Grandeur +193 C Imposing Visage +194 C Incinerate +135 R Infernal Darkness +136 R Infernal Denizen +323 R Infinite Hourglass +80 C Infuse +368 L Island +369 L Island +370 L Island +324 R Jester's Cap +325 R Jester's Mask +326 U Jeweled Amulet +250 U Johtull Wurm +195 R Jokulhaups +251 C Juniper Order Druid +32 U Justice +356 R Karplusan Forest +196 U Karplusan Giant +197 R Karplusan Yeti +33 C Kelsinko Ranger +137 C Kjeldoran Dead +34 U Kjeldoran Elite Guard +296 U Kjeldoran Frostbeast +35 C Kjeldoran Guard +36 R Kjeldoran Knight +37 R Kjeldoran Phalanx +38 R Kjeldoran Royal Guard +39 U Kjeldoran Skycaptain +40 C Kjeldoran Skyknight +41 C Kjeldoran Warrior +138 U Knight of Stromgald +139 U Krovikan Elementalist +140 C Krovikan Fetish +81 C Krovikan Sorcerer +141 U Krovikan Vampire +357 R Land Cap +327 U Lapis Lazuli Talisman +198 C Lava Burst +358 R Lava Tubes +142 C Legions of Lim-Dul +143 U Leshrac's Rite +144 U Leshrac's Sigil +252 R Lhurgoyf +42 R Lightning Blow +145 C Lim-Dul's Cohort +146 U Lim-Dul's Hex +43 R Lost Order of Jarkeld +253 U Lure +254 U Maddening Wind +82 R Magus of the Unseen +328 U Malachite Talisman +199 R Marton Stromgald +200 U Melee +201 U Melting +44 R Mercenaries +297 R Merieke Ri Berit +83 R Mesmeric Trance +202 C Meteor Shower +147 C Mind Ravel +148 U Mind Warp +149 R Mind Whip +150 R Minion of Leshrac +151 R Minion of Tevesh Szat +84 C Mistfolk +152 U Mole Worms +298 R Monsoon +153 C Moor Fiend +376 L Mountain +377 L Mountain +378 L Mountain +203 C Mountain Goat +299 R Mountain Titan +204 R Mudslide +85 R Musician +86 R Mystic Might +87 C Mystic Remora +329 U Nacre Talisman +330 R Naked Singularity +255 U Nature's Lore +154 R Necropotence +155 C Norritt +156 R Oath of Lim-Dul +331 U Onyx Talisman +205 U Orcish Cannoneers +206 C Orcish Conscripts +207 C Orcish Farmer +208 U Orcish Healer +209 R Orcish Librarian +210 C Orcish Lumberjack +211 R Orcish Squatters +45 R Order of the Sacred Torch +46 U Order of the White Shield +256 R Pale Bears +212 C Panic +332 R Pentagram of the Ages +157 C Pestilence Rats +88 U Phantasmal Mount +333 U Pit Trap +364 L Plains +365 L Plains +366 L Plains +89 R Polar Kraken +90 C Portent +91 C Power Sink +158 R Pox +47 C Prismatic Ward +257 R Pygmy Allosaurus +258 C Pyknite +213 C Pyroblast +214 U Pyroclasm +48 C Rally +92 C Ray of Command +93 C Ray of Erasure +94 R Reality Twist +300 R Reclamation +49 U Red Scarab +259 C Regeneration +260 C Rime Dryad +261 R Ritual of Subdual +359 R River Delta +334 R Runed Arch +215 C Sabretooth Tiger +50 U Sacred Boon +262 C Scaled Wurm +95 U Sea Spirit +159 C Seizures +51 R Seraph +263 C Shambling Strider +216 C Shatter +52 C Shield Bearer +335 U Shield of the Ages +96 R Shyft +97 R Sibilant Spirit +98 U Silver Erne +301 R Skeleton Ship +336 U Skull Catapult +99 U Sleight of Mind +100 C Snow Devil +337 R Snow Fortress +53 U Snow Hound +383 L Snow-Covered Forest +371 L Snow-Covered Island +379 L Snow-Covered Mountain +367 L Snow-Covered Plains +372 L Snow-Covered Swamp +264 R Snowblind +101 C Snowfall +338 R Soldevi Golem +102 U Soldevi Machinist +339 U Soldevi Simulacrum +160 C Songs of the Damned +103 U Soul Barrier +161 C Soul Burn +162 C Soul Kiss +302 U Spectral Shield +163 R Spoils of Evil +164 R Spoils of War +340 R Staff of the Ages +265 R Stampede +165 U Stench of Evil +217 C Stone Rain +218 U Stone Spirit +219 C Stonehands +303 R Storm Spirit +304 R Stormbind +166 R Stromgald Cabal +266 R Stunted Growth +360 R Sulfurous Springs +341 U Sunstone +373 L Swamp +374 L Swamp +375 L Swamp +54 U Swords to Plowshares +267 C Tarpan +268 U Thermokarst +269 U Thoughtleech +104 U Thunder Wall +361 R Timberline Ridge +342 R Time Bomb +270 C Tinder Wall +220 C Tor Giant +221 R Total War +167 C Touch of Death +271 U Touch of Vitae +272 R Trailblazer +362 R Underground River +105 U Updraft +343 U Urza's Bauble +363 R Veldt +273 U Venomous Breath +222 U Vertigo +344 R Vexing Arcanix +345 R Vibrating Sphere +346 U Walking Wall +223 U Wall of Lava +274 U Wall of Pine Needles +347 U Wall of Shields +348 U War Chariot +55 C Warning +349 U Whalebone Glider +56 U White Scarab +275 U Whiteout +276 R Wiitigo +277 C Wild Growth +106 U Wind Spirit +305 U Wings of Aesthir +107 R Winter's Chill +168 U Withering Wisps +278 C Woolly Mammoths +279 C Woolly Spider +224 U Word of Blasting +108 C Word of Undoing +109 R Wrath of Marit Lage +280 U Yavimaya Gnats +110 R Zur's Weirding +111 C Zuran Enchanter +350 U Zuran Orb +112 C Zuran Spellcaster [tokens] -w_0_1_caribou \ No newline at end of file +w_0_1_caribou diff --git a/forge-gui/res/editions/Jumpstart Arena Exclusives.txt b/forge-gui/res/editions/Jumpstart Arena Exclusives.txt index 911d06de235..a8ab0bd6ddc 100644 --- a/forge-gui/res/editions/Jumpstart Arena Exclusives.txt +++ b/forge-gui/res/editions/Jumpstart Arena Exclusives.txt @@ -5,21 +5,21 @@ Name=Jumpstart Arena Exclusives Type=Online [cards] -R Archon of Sun's Grace -C Audacious Thief -U Banishing Light -U Bond of Revival -R Carnifex Demon -R Doomed Necromancer -U Dryad Greenseeker -U Fanatic of Mogis -R Gadwick, the Wizened -U Goblin Oriflamme -R Lightning Serpent -U Lightning Strike -C Pollenbright Druid -C Prey Upon -C Scorching Dragonfire -R Serra's Guardian -U Weight of Memory -R Woe Strider +3 R Archon of Sun's Grace +84 C Audacious Thief +4 U Banishing Light +80 U Bond of Revival +57 R Carnifex Demon +137 R Doomed Necromancer +178 U Dryad Greenseeker +121 U Fanatic of Mogis +48 R Gadwick, the Wizened +130 U Goblin Oriflamme +88 R Lightning Serpent +152 U Lightning Strike +173 C Pollenbright Druid +143 C Prey Upon +139 C Scorching Dragonfire +310 R Serra's Guardian +74 U Weight of Memory +123 R Woe Strider diff --git a/forge-gui/res/editions/Legacy Championship.txt b/forge-gui/res/editions/Legacy Championship.txt new file mode 100644 index 00000000000..2df32789602 --- /dev/null +++ b/forge-gui/res/editions/Legacy Championship.txt @@ -0,0 +1,22 @@ +[metadata] +Code=OLGC +Date=2011-01-01 +Name=Legacy Championship +Type=Promos + +[cards] +2011 R Force of Will +2012 R Brainstorm +2013 U Wasteland +2014 M Gaea's Cradle +2015 M Tundra +2016 M Underground Sea +2017 M Badlands +2018 M Taiga +2019 M Savannah +2020 M Scrubland +2021 M Plateau +2022 M Volcanic Island +2023 M Tropical Island +2024 M Bayou +2025 M City of Traitors diff --git a/forge-gui/res/editions/Legends.txt b/forge-gui/res/editions/Legends.txt index de1f5666433..7ce30bc8a17 100644 --- a/forge-gui/res/editions/Legends.txt +++ b/forge-gui/res/editions/Legends.txt @@ -10,316 +10,316 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U AErathi Berserker -U Abomination -R Acid Rain -C Active Volcano -R Adun Oakenshield -U Adventurers' Guildhouse -C Aisling Leprechaun -R Akron Legionnaire -R Al-abara's Carpet -C Alabaster Potion -R Alchor's Tomb -R All Hallow's Eve -C Amrou Kithkin -R Angelic Voices -R Angus Mackenzie -C Anti-Magic Aura -U Arboria -R Arcades Sabboth -R Arena of the Ancients -C Avoid Fate -R Axelrod Gunnarson -R Ayesha Tanaka -U Azure Drake -U Backdraft -U Backfire -C Barbary Apes -U Barktooth Warbeard -R Bartel Runeaxe -U Beasts of Bogardan -U Black Mana Battery -C Blazing Effigy -U Blight -U Blood Lust -U Blue Mana Battery -C Boomerang -R Boris Devilboon -U Brine Hag -R Bronze Horse -R Carrion Ants -C Cat Warriors -U Cathedral of Serra -R Caverns of Despair -C Chain Lightning -R Chains of Mephistopheles -R Chromium -R Cleanse -C Clergy of the Holy Nimbus -U Cocoon -R Concordant Crossroads -R Cosmic Horror -U Craw Giant -U Crevasse -C Crimson Kobolds -R Crimson Manticore -C Crookshank Kobolds -C Cyclopean Mummy -C D'Avenant Archer -R Dakkon Blackblade -C Darkness -U Deadfall -U Demonic Torment -C Devouring Deep -R Disharmony -R Divine Intervention -C Divine Offering -R Divine Transformation -U Dream Coat -C Durkwood Boars -U Dwarven Song -R Elder Land Wurm -R Elder Spawn -R Elven Riders -C Emerald Dragonfly -C Enchanted Being -C Enchantment Alteration -C Energy Tap -C Equinox -U Eternal Warrior -R Eureka -U Evil Eye of Orms-by-Gore -U Fallen Angel -R Falling Star -C Feint -R Field of Dreams -C Fire Sprites -R Firestorm Phoenix -C Flash Counter -C Flash Flood -U Floral Spuzzem -C Force Spike -R Forethought Amulet -U Fortified Area -U Frost Giant -R Gabriel Angelfire -C Gaseous Form -R Gauntlets of Chaos -C Ghosts of the Damned -C Giant Slug -C Giant Strength -C Giant Turtle -C Glyph of Delusion -C Glyph of Destruction -C Glyph of Doom -C Glyph of Life -C Glyph of Reincarnation -R Gosta Dirk -R Gravity Sphere -U Great Defender -U Great Wall -U Greater Realm of Preservation -R Greed -U Green Mana Battery -R Gwendlyn Di Corci -R Halfdane -U Hammerheim -R Hazezon Tamar -C Headless Horseman -U Heaven's Gate -C Hell Swarm -R Hell's Caretaker -R Hellfire -C Holy Day -R Horn of Deafening -C Hornet Cobra -U Horror of Horrors -U Hunding Gjornersen -U Hyperion Blacksmith -U Ichneumon Druid -C Immolation -R Imprison -R In the Eye of Chaos -C Indestructible Aura -U Infernal Medusa -R Infinite Authority -R Invoke Prejudice -U Ivory Guardians -R Jacques le Vert -U Jasmine Boreal -U Jedit Ojanen -U Jerrard of the Closed Fist -R Johan -R Jovial Evil -R Juxtapose -U Karakas -U Kasimir the Lone Wolf -C Keepers of the Faith -R Kei Takahashi -R Killer Bees -U Kismet -R Knowledge Vault -U Kobold Drill Sergeant -R Kobold Overlord -U Kobold Taskmaster -C Kobolds of Kher Keep -U Kry Shield -R Lady Caleria -R Lady Evangela -U Lady Orca -R Land Equilibrium -U Land Tax -R Land's Edge -U Lesser Werewolf -U Life Chisel -R Life Matrix -R Lifeblood -R Living Plane -R Livonya Silone -U Lord Magnus -C Lost Soul -U Mana Drain -R Mana Matrix -U Marble Priest -U Marhault Elsdragon -R Master of the Hunt -R Mirror Universe -R Moat -R Mold Demon -C Moss Monster -U Mountain Stronghold -U Mountain Yeti -R Nebuchadnezzar -R Nether Void -R Nicol Bolas -R North Star -R Nova Pentacle -C Osai Vultures -R Palladia-Mors -U Part Water -U Pavel Maliki -U Pendelhaven -R Petra Sphinx -C Pit Scorpion -R Pixie Queen -R Planar Gate -U Pradesh Gypsies -U Presence of the Master -U Primordial Ooze -U Princess Lucrezia -R Psionic Entity -C Psychic Purge -U Puppet Master -C Pyrotechnics -U Quagmire -R Quarum Trench Gnomes -U Rabid Wombat -U Radjan Spirit -C Raging Bull -R Ragnar -U Ramirez DePietro -R Ramses Overdark -R Rapid Fire -R Rasputin Dreamweaver -R Rebirth -R Recall -U Red Mana Battery -U Reincarnation -U Relic Barrier -U Relic Bind -C Remove Enchantments -C Remove Soul -U Reset -R Revelation -R Reverberation -U Righteous Avengers -R Ring of Immortals -U Riven Turnbull -R Rohgahh of Kher Keep -R Rubinia Soulsinger -C Rust -U Sea Kings' Blessing -U Seafarer's Quay -U Seeker -U Segovian Leviathan -R Sentinel -R Serpent Generator -C Shelkin Brownie -U Shield Wall -U Shimian Night Stalker -U Silhouette -U Sir Shandlar of Eberyn -U Sivitri Scarzam -R Sol'kanar the Swamp King -U Spectral Cloak -R Spinal Villain -U Spirit Link -C Spirit Shackle -R Spiritual Sanctuary -R Stangg -U Storm Seeker -R Storm World -C Subdue -U Sunastian Falconer -R Sword of the Ages -U Sylvan Library -U Sylvan Paradise -C Syphon Soul -U Takklemaggot -R Telekinesis -R Teleport -R Tempest Efreet -R Tetsuo Umezawa -R The Abyss -C The Brute -U The Lady of the Mountain -R The Tabernacle at Pendrell Vale -R The Wretched -R Thunder Spirit -R Time Elemental -U Tobias Andrion -U Tolaria -U Tor Wauki -U Torsten Von Ursus -U Touch of Darkness -C Transmutation -R Triassic Egg -R Tuknir Deathlock -C Tundra Wolves -R Typhoon -U Undertow -U Underworld Dreams -U Unholy Citadel -U Untamed Wilds -R Ur-Drago -U Urborg -R Vaevictis Asmadi -C Vampire Bats -C Venarian Gold -U Visions -R Voodoo Doll -C Walking Dead -C Wall of Caltrops -U Wall of Dust -C Wall of Earth -C Wall of Heat -U Wall of Light -R Wall of Opposition -U Wall of Putrid Flesh -C Wall of Shadows -U Wall of Tombstones -C Wall of Vapor -U Wall of Wonder -U Whirling Dervish -U White Mana Battery -R Willow Satyr -U Winds of Change -R Winter Blast -C Wolverine Pack -R Wood Elemental -R Xira Arien -C Zephyr Falcon +131 U AErathi Berserker +87 U Abomination +44 R Acid Rain +130 C Active Volcano +216 R Adun Oakenshield +300 U Adventurers' Guildhouse +173 C Aisling Leprechaun +1 R Akron Legionnaire +271 R Al-abara's Carpet +2 C Alabaster Potion +272 R Alchor's Tomb +88 R All Hallow's Eve +3 C Amrou Kithkin +4 R Angelic Voices +217 R Angus Mackenzie +45 C Anti-Magic Aura +174 U Arboria +218 R Arcades Sabboth +273 R Arena of the Ancients +175 C Avoid Fate +219 R Axelrod Gunnarson +220 R Ayesha Tanaka +46 U Azure Drake +132 U Backdraft +47 U Backfire +176 C Barbary Apes +221 U Barktooth Warbeard +222 R Bartel Runeaxe +133 U Beasts of Bogardan +274 U Black Mana Battery +134 C Blazing Effigy +89 U Blight +135 U Blood Lust +275 U Blue Mana Battery +48 C Boomerang +223 R Boris Devilboon +49 U Brine Hag +276 R Bronze Horse +90 R Carrion Ants +177 C Cat Warriors +301 U Cathedral of Serra +136 R Caverns of Despair +137 C Chain Lightning +91 R Chains of Mephistopheles +224 R Chromium +5 R Cleanse +6 C Clergy of the Holy Nimbus +178 U Cocoon +179 R Concordant Crossroads +92 R Cosmic Horror +180 U Craw Giant +138 U Crevasse +139 C Crimson Kobolds +140 R Crimson Manticore +141 C Crookshank Kobolds +93 C Cyclopean Mummy +7 C D'Avenant Archer +225 R Dakkon Blackblade +94 C Darkness +181 U Deadfall +95 U Demonic Torment +50 C Devouring Deep +142 R Disharmony +8 R Divine Intervention +9 C Divine Offering +10 R Divine Transformation +51 U Dream Coat +182 C Durkwood Boars +143 U Dwarven Song +11 R Elder Land Wurm +52 R Elder Spawn +183 R Elven Riders +184 C Emerald Dragonfly +12 C Enchanted Being +53 C Enchantment Alteration +54 C Energy Tap +13 C Equinox +144 U Eternal Warrior +185 R Eureka +96 U Evil Eye of Orms-by-Gore +97 U Fallen Angel +145 R Falling Star +146 C Feint +55 R Field of Dreams +186 C Fire Sprites +147 R Firestorm Phoenix +56 C Flash Counter +57 C Flash Flood +187 U Floral Spuzzem +58 C Force Spike +277 R Forethought Amulet +14 U Fortified Area +148 U Frost Giant +226 R Gabriel Angelfire +59 C Gaseous Form +278 R Gauntlets of Chaos +98 C Ghosts of the Damned +99 C Giant Slug +149 C Giant Strength +188 C Giant Turtle +60 C Glyph of Delusion +150 C Glyph of Destruction +100 C Glyph of Doom +15 C Glyph of Life +189 C Glyph of Reincarnation +227 R Gosta Dirk +151 R Gravity Sphere +16 U Great Defender +17 U Great Wall +18 U Greater Realm of Preservation +101 R Greed +279 U Green Mana Battery +228 R Gwendlyn Di Corci +229 R Halfdane +302 U Hammerheim +230 R Hazezon Tamar +102 C Headless Horseman +19 U Heaven's Gate +103 C Hell Swarm +104 R Hell's Caretaker +105 R Hellfire +20 C Holy Day +280 R Horn of Deafening +190 C Hornet Cobra +106 U Horror of Horrors +231 U Hunding Gjornersen +152 U Hyperion Blacksmith +191 U Ichneumon Druid +153 C Immolation +107 R Imprison +61 R In the Eye of Chaos +21 C Indestructible Aura +108 U Infernal Medusa +22 R Infinite Authority +62 R Invoke Prejudice +23 U Ivory Guardians +232 R Jacques le Vert +233 U Jasmine Boreal +234 U Jedit Ojanen +235 U Jerrard of the Closed Fist +236 R Johan +109 R Jovial Evil +63 R Juxtapose +303 U Karakas +237 U Kasimir the Lone Wolf +24 C Keepers of the Faith +238 R Kei Takahashi +192 R Killer Bees +25 U Kismet +281 R Knowledge Vault +154 U Kobold Drill Sergeant +155 R Kobold Overlord +156 U Kobold Taskmaster +157 C Kobolds of Kher Keep +282 U Kry Shield +239 R Lady Caleria +240 R Lady Evangela +241 U Lady Orca +64 R Land Equilibrium +26 U Land Tax +158 R Land's Edge +110 U Lesser Werewolf +283 U Life Chisel +284 R Life Matrix +27 R Lifeblood +193 R Living Plane +242 R Livonya Silone +243 U Lord Magnus +111 C Lost Soul +65 U Mana Drain +285 R Mana Matrix +286 U Marble Priest +244 U Marhault Elsdragon +194 R Master of the Hunt +287 R Mirror Universe +28 R Moat +112 R Mold Demon +195 C Moss Monster +304 U Mountain Stronghold +159 U Mountain Yeti +245 R Nebuchadnezzar +113 R Nether Void +246 R Nicol Bolas +288 R North Star +289 R Nova Pentacle +29 C Osai Vultures +247 R Palladia-Mors +66 U Part Water +248 U Pavel Maliki +305 U Pendelhaven +30 R Petra Sphinx +114 C Pit Scorpion +196 R Pixie Queen +290 R Planar Gate +197 U Pradesh Gypsies +31 U Presence of the Master +160 U Primordial Ooze +249 U Princess Lucrezia +67 R Psionic Entity +68 C Psychic Purge +69 U Puppet Master +161 C Pyrotechnics +115 U Quagmire +162 R Quarum Trench Gnomes +198 U Rabid Wombat +199 U Radjan Spirit +163 C Raging Bull +250 R Ragnar +251 U Ramirez DePietro +252 R Ramses Overdark +32 R Rapid Fire +253 R Rasputin Dreamweaver +200 R Rebirth +70 R Recall +291 U Red Mana Battery +201 U Reincarnation +292 U Relic Barrier +71 U Relic Bind +33 C Remove Enchantments +72 C Remove Soul +73 U Reset +202 R Revelation +74 R Reverberation +34 U Righteous Avengers +293 R Ring of Immortals +254 U Riven Turnbull +255 R Rohgahh of Kher Keep +256 R Rubinia Soulsinger +203 C Rust +75 U Sea Kings' Blessing +306 U Seafarer's Quay +35 U Seeker +76 U Segovian Leviathan +294 R Sentinel +295 R Serpent Generator +204 C Shelkin Brownie +36 U Shield Wall +116 U Shimian Night Stalker +77 U Silhouette +257 U Sir Shandlar of Eberyn +258 U Sivitri Scarzam +259 R Sol'kanar the Swamp King +78 U Spectral Cloak +164 R Spinal Villain +37 U Spirit Link +117 C Spirit Shackle +38 R Spiritual Sanctuary +260 R Stangg +205 U Storm Seeker +165 R Storm World +206 C Subdue +261 U Sunastian Falconer +296 R Sword of the Ages +207 U Sylvan Library +208 U Sylvan Paradise +118 C Syphon Soul +119 U Takklemaggot +79 R Telekinesis +80 R Teleport +166 R Tempest Efreet +262 R Tetsuo Umezawa +120 R The Abyss +167 C The Brute +263 U The Lady of the Mountain +307 R The Tabernacle at Pendrell Vale +121 R The Wretched +39 R Thunder Spirit +81 R Time Elemental +264 U Tobias Andrion +308 U Tolaria +265 U Tor Wauki +266 U Torsten Von Ursus +122 U Touch of Darkness +123 C Transmutation +297 R Triassic Egg +267 R Tuknir Deathlock +40 C Tundra Wolves +209 R Typhoon +82 U Undertow +124 U Underworld Dreams +309 U Unholy Citadel +210 U Untamed Wilds +268 R Ur-Drago +310 U Urborg +269 R Vaevictis Asmadi +125 C Vampire Bats +83 C Venarian Gold +41 U Visions +298 R Voodoo Doll +126 C Walking Dead +42 C Wall of Caltrops +168 U Wall of Dust +169 C Wall of Earth +170 C Wall of Heat +43 U Wall of Light +171 R Wall of Opposition +127 U Wall of Putrid Flesh +128 C Wall of Shadows +129 U Wall of Tombstones +84 C Wall of Vapor +85 U Wall of Wonder +211 U Whirling Dervish +299 U White Mana Battery +212 R Willow Satyr +172 U Winds of Change +213 R Winter Blast +214 C Wolverine Pack +215 R Wood Elemental +270 R Xira Arien +86 C Zephyr Falcon [tokens] wasp diff --git a/forge-gui/res/editions/Limited Edition Alpha.txt b/forge-gui/res/editions/Limited Edition Alpha.txt index 02f0565e5c5..f98ef63056d 100644 --- a/forge-gui/res/editions/Limited Edition Alpha.txt +++ b/forge-gui/res/editions/Limited Edition Alpha.txt @@ -10,301 +10,301 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U Air Elemental -R Ancestral Recall -U Animate Artifact -U Animate Dead -R Animate Wall -R Ankh of Mishra -R Armageddon -R Aspect of Wolf -R Bad Moon -R Badlands -R Balance -U Basalt Monolith -R Bayou -C Benalish Hero -U Berserk -R Birds of Paradise -U Black Knight -R Black Lotus -U Black Vise -U Black Ward -R Blaze of Glory -R Blessing -C Blue Elemental Blast -U Blue Ward -U Bog Wraith -R Braingeyser -U Burrowing -U Camouflage -U Castle -U Celestial Prism -U Channel -R Chaos Orb -R Chaoslace -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -R Clockwork Beast -U Clone -R Cockatrice -U Consecrate Land -U Conservator -R Contract from Below -U Control Magic -U Conversion -U Copper Tablet -R Copy Artifact -U Counterspell -C Craw Wurm -C Creature Bond -R Crusade -U Crystal Rod -U Cursed Land -R Cyclopean Tomb -C Dark Ritual -R Darkpact -C Death Ward -U Deathgrip -R Deathlace -R Demonic Attorney -R Demonic Hordes -U Demonic Tutor -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -U Dragon Whelp -C Drain Life -R Drain Power -C Drudge Skeletons -U Dwarven Demolition Team -C Dwarven Warriors -U Earth Elemental -C Earthbind -R Earthquake -R Elvish Archers -U Evil Presence -C False Orders -R Farmstead -R Fastbond -C Fear -U Feedback -U Fire Elemental -C Fireball -C Firebreathing -U Flashfires -C Flight -C Fog -R Force of Nature -R Forcefield -L Forest -L Forest -R Fork -C Frozen Shade -R Fungusaur -R Gaea's Liege -R Gauntlet of Might -C Giant Growth -C Giant Spider -U Glasses of Urza -U Gloom -U Goblin Balloon Brigade -R Goblin King -R Granite Gargoyle -C Gray Ogre -U Green Ward -C Grizzly Bears -C Guardian Angel -C Healing Salve -R Helm of Chatzuk -C Hill Giant -C Holy Armor -C Holy Strength -C Howl from Beyond -R Howling Mine -C Hurloon Minotaur -U Hurricane -U Hypnotic Specter -U Ice Storm -U Icy Manipulator -R Illusionary Mask -U Instill Energy -C Invisibility -U Iron Star -C Ironclaw Orcs -C Ironroot Treefolk -L Island -L Island -R Island Sanctuary -U Ivory Cup -R Jade Monolith -U Jade Statue -R Jayemdae Tome -U Juggernaut -C Jump -U Karma -U Keldon Warlord -R Kormus Bell -R Kudzu -U Lance -U Ley Druid -U Library of Leng -R Lich -U Lifeforce -R Lifelace -U Lifetap -C Lightning Bolt -R Living Artifact -R Living Lands -U Living Wall -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -U Lure -R Magical Hack -R Mahamoti Djinn -R Mana Flare -R Mana Short -R Mana Vault -R Manabarbs -R Meekstone -C Merfolk of the Pearl Trident -C Mesa Pegasus -R Mind Twist -C Mons's Goblin Raiders -L Mountain -L Mountain -R Mox Emerald -R Mox Jet -R Mox Pearl -R Mox Ruby -R Mox Sapphire -R Natural Selection -R Nether Shadow -U Nettling Imp -R Nevinyrral's Disk -R Nightmare -R Northern Paladin -U Obsianus Golem -U Orcish Artillery -U Orcish Oriflamme -C Paralyze -C Pearled Unicorn -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -R Pirate Ship -C Plague Rats -L Plains -L Plains -R Plateau -C Power Leak -C Power Sink -R Power Surge -C Prodigal Sorcerer -U Psionic Blast -C Psychic Venom -R Purelace -R Raging River -C Raise Dead -C Red Elemental Blast -U Red Ward -C Regeneration -U Regrowth -U Resurrection -R Reverse Damage -R Righteousness -R Roc of Kher Ridges -R Rock Hydra -U Rod of Ruin -R Royal Assassin -U Sacrifice -C Samite Healer -R Savannah -R Savannah Lions -C Scathe Zombies -U Scavenging Ghoul -R Scrubland -C Scryb Sprites -C Sea Serpent -R Sedge Troll -U Sengir Vampire -U Serra Angel -C Shanodin Dryads -C Shatter -R Shivan Dragon -U Simulacrum -C Sinkhole -U Siren's Call -R Sleight of Mind -R Smoke -U Sol Ring -U Soul Net -C Spell Blast -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -C Stream of Life -R Sunglasses of Urza -L Swamp -L Swamp -U Swords to Plowshares -R Taiga -C Terror -R The Hive -U Thicket Basilisk -R Thoughtlace -U Throne of Bone -R Timber Wolves -R Time Vault -R Time Walk -R Timetwister -C Tranquility -R Tropical Island -U Tsunami -R Tundra -U Tunnel -C Twiddle -R Two-Headed Giant of Foriys -R Underground Sea -C Unholy Strength -C Unsummon -U Uthden Troll -R Verduran Enchantress -R Vesuvan Doppelganger -R Veteran Bodyguard -R Volcanic Eruption -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Fire -U Wall of Ice -U Wall of Stone -U Wall of Swords -U Wall of Water -C Wall of Wood -U Wanderlust -C War Mammoth -R Warp Artifact -U Water Elemental -C Weakness -R Web -R Wheel of Fortune -U White Knight -U White Ward -C Wild Growth -R Will-o'-the-Wisp -R Winter Orb -U Wooden Sphere -R Word of Command -R Wrath of God -R Zombie Master +46 U Air Elemental +47 R Ancestral Recall +48 U Animate Artifact +92 U Animate Dead +1 R Animate Wall +230 R Ankh of Mishra +2 R Armageddon +184 R Aspect of Wolf +93 R Bad Moon +277 R Badlands +3 R Balance +231 U Basalt Monolith +278 R Bayou +4 C Benalish Hero +185 U Berserk +186 R Birds of Paradise +94 U Black Knight +232 R Black Lotus +233 U Black Vise +5 U Black Ward +6 R Blaze of Glory +7 R Blessing +49 C Blue Elemental Blast +8 U Blue Ward +95 U Bog Wraith +50 R Braingeyser +138 U Burrowing +187 U Camouflage +9 U Castle +234 U Celestial Prism +188 U Channel +235 R Chaos Orb +139 R Chaoslace +10 C Circle of Protection: Blue +11 C Circle of Protection: Green +12 C Circle of Protection: Red +13 C Circle of Protection: White +236 R Clockwork Beast +51 U Clone +189 R Cockatrice +14 U Consecrate Land +237 U Conservator +96 R Contract from Below +52 U Control Magic +15 U Conversion +238 U Copper Tablet +53 R Copy Artifact +54 U Counterspell +190 C Craw Wurm +55 C Creature Bond +16 R Crusade +239 U Crystal Rod +97 U Cursed Land +240 R Cyclopean Tomb +98 C Dark Ritual +99 R Darkpact +17 C Death Ward +100 U Deathgrip +101 R Deathlace +102 R Demonic Attorney +103 R Demonic Hordes +104 U Demonic Tutor +241 R Dingus Egg +18 C Disenchant +140 C Disintegrate +242 R Disrupting Scepter +141 U Dragon Whelp +105 C Drain Life +56 R Drain Power +106 C Drudge Skeletons +142 U Dwarven Demolition Team +143 C Dwarven Warriors +144 U Earth Elemental +145 C Earthbind +146 R Earthquake +191 R Elvish Archers +107 U Evil Presence +147 C False Orders +19 R Farmstead +192 R Fastbond +108 C Fear +57 U Feedback +148 U Fire Elemental +149 C Fireball +150 C Firebreathing +151 U Flashfires +58 C Flight +193 C Fog +194 R Force of Nature +243 R Forcefield +294 L Forest +295 L Forest +152 R Fork +109 C Frozen Shade +195 R Fungusaur +196 R Gaea's Liege +244 R Gauntlet of Might +197 C Giant Growth +198 C Giant Spider +245 U Glasses of Urza +110 U Gloom +153 U Goblin Balloon Brigade +154 R Goblin King +155 R Granite Gargoyle +156 C Gray Ogre +20 U Green Ward +199 C Grizzly Bears +21 C Guardian Angel +22 C Healing Salve +246 R Helm of Chatzuk +157 C Hill Giant +23 C Holy Armor +24 C Holy Strength +111 C Howl from Beyond +247 R Howling Mine +158 C Hurloon Minotaur +200 U Hurricane +112 U Hypnotic Specter +201 U Ice Storm +248 U Icy Manipulator +249 R Illusionary Mask +202 U Instill Energy +59 C Invisibility +250 U Iron Star +159 C Ironclaw Orcs +203 C Ironroot Treefolk +288 L Island +289 L Island +25 R Island Sanctuary +251 U Ivory Cup +252 R Jade Monolith +253 U Jade Statue +254 R Jayemdae Tome +255 U Juggernaut +60 C Jump +26 U Karma +160 U Keldon Warlord +256 R Kormus Bell +204 R Kudzu +27 U Lance +205 U Ley Druid +257 U Library of Leng +113 R Lich +206 U Lifeforce +207 R Lifelace +61 U Lifetap +161 C Lightning Bolt +208 R Living Artifact +209 R Living Lands +258 U Living Wall +210 C Llanowar Elves +62 R Lord of Atlantis +114 R Lord of the Pit +211 U Lure +63 R Magical Hack +64 R Mahamoti Djinn +162 R Mana Flare +65 R Mana Short +259 R Mana Vault +163 R Manabarbs +260 R Meekstone +66 C Merfolk of the Pearl Trident +28 C Mesa Pegasus +115 R Mind Twist +164 C Mons's Goblin Raiders +292 L Mountain +293 L Mountain +261 R Mox Emerald +262 R Mox Jet +263 R Mox Pearl +264 R Mox Ruby +265 R Mox Sapphire +212 R Natural Selection +116 R Nether Shadow +117 U Nettling Imp +266 R Nevinyrral's Disk +118 R Nightmare +29 R Northern Paladin +267 U Obsianus Golem +165 U Orcish Artillery +166 U Orcish Oriflamme +119 C Paralyze +30 C Pearled Unicorn +31 R Personal Incarnation +120 C Pestilence +67 U Phantasmal Forces +68 C Phantasmal Terrain +69 U Phantom Monster +70 R Pirate Ship +121 C Plague Rats +286 L Plains +287 L Plains +279 R Plateau +71 C Power Leak +72 C Power Sink +167 R Power Surge +73 C Prodigal Sorcerer +74 U Psionic Blast +75 C Psychic Venom +32 R Purelace +168 R Raging River +122 C Raise Dead +169 C Red Elemental Blast +33 U Red Ward +213 C Regeneration +214 U Regrowth +34 U Resurrection +35 R Reverse Damage +36 R Righteousness +170 R Roc of Kher Ridges +171 R Rock Hydra +268 U Rod of Ruin +123 R Royal Assassin +124 U Sacrifice +37 C Samite Healer +280 R Savannah +38 R Savannah Lions +125 C Scathe Zombies +126 U Scavenging Ghoul +281 R Scrubland +215 C Scryb Sprites +76 C Sea Serpent +172 R Sedge Troll +127 U Sengir Vampire +39 U Serra Angel +216 C Shanodin Dryads +173 C Shatter +174 R Shivan Dragon +128 U Simulacrum +129 C Sinkhole +77 U Siren's Call +78 R Sleight of Mind +175 R Smoke +269 U Sol Ring +270 U Soul Net +79 C Spell Blast +80 R Stasis +81 U Steal Artifact +176 U Stone Giant +177 C Stone Rain +217 C Stream of Life +271 R Sunglasses of Urza +290 L Swamp +291 L Swamp +40 U Swords to Plowshares +282 R Taiga +130 C Terror +272 R The Hive +218 U Thicket Basilisk +82 R Thoughtlace +273 U Throne of Bone +219 R Timber Wolves +274 R Time Vault +83 R Time Walk +84 R Timetwister +220 C Tranquility +283 R Tropical Island +221 U Tsunami +284 R Tundra +178 U Tunnel +85 C Twiddle +179 R Two-Headed Giant of Foriys +285 R Underground Sea +131 C Unholy Strength +86 C Unsummon +180 U Uthden Troll +222 R Verduran Enchantress +87 R Vesuvan Doppelganger +41 R Veteran Bodyguard +88 R Volcanic Eruption +89 U Wall of Air +132 U Wall of Bone +223 U Wall of Brambles +181 U Wall of Fire +224 U Wall of Ice +182 U Wall of Stone +42 U Wall of Swords +90 U Wall of Water +225 C Wall of Wood +226 U Wanderlust +227 C War Mammoth +133 R Warp Artifact +91 U Water Elemental +134 C Weakness +228 R Web +183 R Wheel of Fortune +43 U White Knight +44 U White Ward +229 C Wild Growth +135 R Will-o'-the-Wisp +275 R Winter Orb +276 U Wooden Sphere +136 R Word of Command +45 R Wrath of God +137 R Zombie Master [tokens] wasp \ No newline at end of file diff --git a/forge-gui/res/editions/Limited Edition Beta.txt b/forge-gui/res/editions/Limited Edition Beta.txt index c428fa67b8f..a8230bf8cb2 100644 --- a/forge-gui/res/editions/Limited Edition Beta.txt +++ b/forge-gui/res/editions/Limited Edition Beta.txt @@ -11,308 +11,308 @@ Foil=NotSupported ChaosDraftThemes=CORE_SET [cards] -U Air Elemental -R Ancestral Recall -U Animate Artifact -U Animate Dead -R Animate Wall -R Ankh of Mishra -R Armageddon -R Aspect of Wolf -R Bad Moon -R Badlands -R Balance -U Basalt Monolith -R Bayou -C Benalish Hero -U Berserk -R Birds of Paradise -U Black Knight -R Black Lotus -U Black Vise -U Black Ward -R Blaze of Glory -R Blessing -C Blue Elemental Blast -U Blue Ward -U Bog Wraith -R Braingeyser -U Burrowing -U Camouflage -U Castle -U Celestial Prism -U Channel -R Chaos Orb -R Chaoslace -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -R Clockwork Beast -U Clone -R Cockatrice -U Consecrate Land -U Conservator -R Contract from Below -U Control Magic -U Conversion -U Copper Tablet -R Copy Artifact -U Counterspell -C Craw Wurm -C Creature Bond -R Crusade -U Crystal Rod -U Cursed Land -R Cyclopean Tomb -C Dark Ritual -R Darkpact -C Death Ward -U Deathgrip -R Deathlace -R Demonic Attorney -R Demonic Hordes -U Demonic Tutor -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -U Dragon Whelp -C Drain Life -R Drain Power -C Drudge Skeletons -U Dwarven Demolition Team -C Dwarven Warriors -U Earth Elemental -C Earthbind -R Earthquake -R Elvish Archers -U Evil Presence -C False Orders -R Farmstead -R Fastbond -C Fear -U Feedback -U Fire Elemental -C Fireball -C Firebreathing -U Flashfires -C Flight -C Fog -R Force of Nature -R Forcefield -L Forest -L Forest -L Forest -R Fork -C Frozen Shade -R Fungusaur -R Gaea's Liege -R Gauntlet of Might -C Giant Growth -C Giant Spider -U Glasses of Urza -U Gloom -U Goblin Balloon Brigade -R Goblin King -R Granite Gargoyle -C Gray Ogre -U Green Ward -C Grizzly Bears -C Guardian Angel -C Healing Salve -R Helm of Chatzuk -C Hill Giant -C Holy Armor -C Holy Strength -C Howl from Beyond -R Howling Mine -C Hurloon Minotaur -U Hurricane -U Hypnotic Specter -U Ice Storm -U Icy Manipulator -R Illusionary Mask -U Instill Energy -C Invisibility -U Iron Star -C Ironclaw Orcs -C Ironroot Treefolk -L Island -L Island -L Island -R Island Sanctuary -U Ivory Cup -R Jade Monolith -U Jade Statue -R Jayemdae Tome -U Juggernaut -C Jump -U Karma -U Keldon Warlord -R Kormus Bell -R Kudzu -U Lance -U Ley Druid -U Library of Leng -R Lich -U Lifeforce -R Lifelace -U Lifetap -C Lightning Bolt -R Living Artifact -R Living Lands -U Living Wall -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -U Lure -R Magical Hack -R Mahamoti Djinn -R Mana Flare -R Mana Short -R Mana Vault -R Manabarbs -R Meekstone -C Merfolk of the Pearl Trident -C Mesa Pegasus -R Mind Twist -C Mons's Goblin Raiders -L Mountain -L Mountain -L Mountain -R Mox Emerald -R Mox Jet -R Mox Pearl -R Mox Ruby -R Mox Sapphire -R Natural Selection -R Nether Shadow -U Nettling Imp -R Nevinyrral's Disk -R Nightmare -R Northern Paladin -U Obsianus Golem -U Orcish Artillery -U Orcish Oriflamme -C Paralyze -C Pearled Unicorn -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -R Pirate Ship -C Plague Rats -L Plains -L Plains -L Plains -R Plateau -C Power Leak -C Power Sink -R Power Surge -C Prodigal Sorcerer -U Psionic Blast -C Psychic Venom -R Purelace -R Raging River -C Raise Dead -C Red Elemental Blast -U Red Ward -C Regeneration -U Regrowth -U Resurrection -R Reverse Damage -R Righteousness -R Roc of Kher Ridges -R Rock Hydra -U Rod of Ruin -R Royal Assassin -U Sacrifice -C Samite Healer -R Savannah -R Savannah Lions -C Scathe Zombies -U Scavenging Ghoul -R Scrubland -C Scryb Sprites -C Sea Serpent -R Sedge Troll -U Sengir Vampire -U Serra Angel -C Shanodin Dryads -C Shatter -R Shivan Dragon -U Simulacrum -C Sinkhole -U Siren's Call -R Sleight of Mind -R Smoke -U Sol Ring -U Soul Net -C Spell Blast -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -C Stream of Life -R Sunglasses of Urza -L Swamp -L Swamp -L Swamp -U Swords to Plowshares -R Taiga -C Terror -R The Hive -U Thicket Basilisk -R Thoughtlace -U Throne of Bone -R Timber Wolves -R Time Vault -R Time Walk -R Timetwister -C Tranquility -R Tropical Island -U Tsunami -R Tundra -U Tunnel -C Twiddle -R Two-Headed Giant of Foriys -R Underground Sea -C Unholy Strength -C Unsummon -U Uthden Troll -R Verduran Enchantress -R Vesuvan Doppelganger -R Veteran Bodyguard -R Volcanic Eruption -R Volcanic Island -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Fire -U Wall of Ice -U Wall of Stone -U Wall of Swords -U Wall of Water -C Wall of Wood -U Wanderlust -C War Mammoth -R Warp Artifact -U Water Elemental -C Weakness -R Web -R Wheel of Fortune -U White Knight -U White Ward -C Wild Growth -R Will-o'-the-Wisp -R Winter Orb -U Wooden Sphere -R Word of Command -R Wrath of God -R Zombie Master +47 U Air Elemental +48 R Ancestral Recall +49 U Animate Artifact +93 U Animate Dead +1 R Animate Wall +231 R Ankh of Mishra +2 R Armageddon +185 R Aspect of Wolf +94 R Bad Moon +278 R Badlands +3 R Balance +232 U Basalt Monolith +279 R Bayou +4 C Benalish Hero +186 U Berserk +187 R Birds of Paradise +95 U Black Knight +233 R Black Lotus +234 U Black Vise +5 U Black Ward +6 R Blaze of Glory +7 R Blessing +50 C Blue Elemental Blast +8 U Blue Ward +96 U Bog Wraith +51 R Braingeyser +139 U Burrowing +188 U Camouflage +9 U Castle +235 U Celestial Prism +189 U Channel +236 R Chaos Orb +140 R Chaoslace +10 C Circle of Protection: Black +11 C Circle of Protection: Blue +12 C Circle of Protection: Green +13 C Circle of Protection: Red +14 C Circle of Protection: White +237 R Clockwork Beast +52 U Clone +190 R Cockatrice +15 U Consecrate Land +238 U Conservator +97 R Contract from Below +53 U Control Magic +16 U Conversion +239 U Copper Tablet +54 R Copy Artifact +55 U Counterspell +191 C Craw Wurm +56 C Creature Bond +17 R Crusade +240 U Crystal Rod +98 U Cursed Land +241 R Cyclopean Tomb +99 C Dark Ritual +100 R Darkpact +18 C Death Ward +101 U Deathgrip +102 R Deathlace +103 R Demonic Attorney +104 R Demonic Hordes +105 U Demonic Tutor +242 R Dingus Egg +19 C Disenchant +141 C Disintegrate +243 R Disrupting Scepter +142 U Dragon Whelp +106 C Drain Life +57 R Drain Power +107 C Drudge Skeletons +143 U Dwarven Demolition Team +144 C Dwarven Warriors +145 U Earth Elemental +146 C Earthbind +147 R Earthquake +192 R Elvish Archers +108 U Evil Presence +148 C False Orders +20 R Farmstead +193 R Fastbond +109 C Fear +58 U Feedback +149 U Fire Elemental +150 C Fireball +151 C Firebreathing +152 U Flashfires +59 C Flight +194 C Fog +195 R Force of Nature +244 R Forcefield +300 L Forest +301 L Forest +302 L Forest +153 R Fork +110 C Frozen Shade +196 R Fungusaur +197 R Gaea's Liege +245 R Gauntlet of Might +198 C Giant Growth +199 C Giant Spider +246 U Glasses of Urza +111 U Gloom +154 U Goblin Balloon Brigade +155 R Goblin King +156 R Granite Gargoyle +157 C Gray Ogre +21 U Green Ward +200 C Grizzly Bears +22 C Guardian Angel +23 C Healing Salve +247 R Helm of Chatzuk +158 C Hill Giant +24 C Holy Armor +25 C Holy Strength +112 C Howl from Beyond +248 R Howling Mine +159 C Hurloon Minotaur +201 U Hurricane +113 U Hypnotic Specter +202 U Ice Storm +249 U Icy Manipulator +250 R Illusionary Mask +203 U Instill Energy +60 C Invisibility +251 U Iron Star +160 C Ironclaw Orcs +204 C Ironroot Treefolk +291 L Island +292 L Island +293 L Island +26 R Island Sanctuary +252 U Ivory Cup +253 R Jade Monolith +254 U Jade Statue +255 R Jayemdae Tome +256 U Juggernaut +61 C Jump +27 U Karma +161 U Keldon Warlord +257 R Kormus Bell +205 R Kudzu +28 U Lance +206 U Ley Druid +258 U Library of Leng +114 R Lich +207 U Lifeforce +208 R Lifelace +62 U Lifetap +162 C Lightning Bolt +209 R Living Artifact +210 R Living Lands +259 U Living Wall +211 C Llanowar Elves +63 R Lord of Atlantis +115 R Lord of the Pit +212 U Lure +64 R Magical Hack +65 R Mahamoti Djinn +163 R Mana Flare +66 R Mana Short +260 R Mana Vault +164 R Manabarbs +261 R Meekstone +67 C Merfolk of the Pearl Trident +29 C Mesa Pegasus +116 R Mind Twist +165 C Mons's Goblin Raiders +297 L Mountain +298 L Mountain +299 L Mountain +262 R Mox Emerald +263 R Mox Jet +264 R Mox Pearl +265 R Mox Ruby +266 R Mox Sapphire +213 R Natural Selection +117 R Nether Shadow +118 U Nettling Imp +267 R Nevinyrral's Disk +119 R Nightmare +30 R Northern Paladin +268 U Obsianus Golem +166 U Orcish Artillery +167 U Orcish Oriflamme +120 C Paralyze +31 C Pearled Unicorn +32 R Personal Incarnation +121 C Pestilence +68 U Phantasmal Forces +69 C Phantasmal Terrain +70 U Phantom Monster +71 R Pirate Ship +122 C Plague Rats +288 L Plains +289 L Plains +290 L Plains +280 R Plateau +72 C Power Leak +73 C Power Sink +168 R Power Surge +74 C Prodigal Sorcerer +75 U Psionic Blast +76 C Psychic Venom +33 R Purelace +169 R Raging River +123 C Raise Dead +170 C Red Elemental Blast +34 U Red Ward +214 C Regeneration +215 U Regrowth +35 U Resurrection +36 R Reverse Damage +37 R Righteousness +171 R Roc of Kher Ridges +172 R Rock Hydra +269 U Rod of Ruin +124 R Royal Assassin +125 U Sacrifice +38 C Samite Healer +281 R Savannah +39 R Savannah Lions +126 C Scathe Zombies +127 U Scavenging Ghoul +282 R Scrubland +216 C Scryb Sprites +77 C Sea Serpent +173 R Sedge Troll +128 U Sengir Vampire +40 U Serra Angel +217 C Shanodin Dryads +174 C Shatter +175 R Shivan Dragon +129 U Simulacrum +130 C Sinkhole +78 U Siren's Call +79 R Sleight of Mind +176 R Smoke +270 U Sol Ring +271 U Soul Net +80 C Spell Blast +81 R Stasis +82 U Steal Artifact +177 U Stone Giant +178 C Stone Rain +218 C Stream of Life +272 R Sunglasses of Urza +294 L Swamp +295 L Swamp +296 L Swamp +41 U Swords to Plowshares +283 R Taiga +131 C Terror +273 R The Hive +219 U Thicket Basilisk +83 R Thoughtlace +274 U Throne of Bone +220 R Timber Wolves +275 R Time Vault +84 R Time Walk +85 R Timetwister +221 C Tranquility +284 R Tropical Island +222 U Tsunami +285 R Tundra +179 U Tunnel +86 C Twiddle +180 R Two-Headed Giant of Foriys +286 R Underground Sea +132 C Unholy Strength +87 C Unsummon +181 U Uthden Troll +223 R Verduran Enchantress +88 R Vesuvan Doppelganger +42 R Veteran Bodyguard +89 R Volcanic Eruption +287 R Volcanic Island +90 U Wall of Air +133 U Wall of Bone +224 U Wall of Brambles +182 U Wall of Fire +225 U Wall of Ice +183 U Wall of Stone +43 U Wall of Swords +91 U Wall of Water +226 C Wall of Wood +227 U Wanderlust +228 C War Mammoth +134 R Warp Artifact +92 U Water Elemental +135 C Weakness +229 R Web +184 R Wheel of Fortune +44 U White Knight +45 U White Ward +230 C Wild Growth +136 R Will-o'-the-Wisp +276 R Winter Orb +277 U Wooden Sphere +137 R Word of Command +46 R Wrath of God +138 R Zombie Master [tokens] wasp \ No newline at end of file diff --git a/forge-gui/res/editions/Mirage.txt b/forge-gui/res/editions/Mirage.txt index 1f800e6b4db..4b261e18246 100644 --- a/forge-gui/res/editions/Mirage.txt +++ b/forge-gui/res/editions/Mirage.txt @@ -10,356 +10,356 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -R Abyssal Hunter -R Acidic Dagger -R Afiya Grove -U Afterlife -C Agility -C Alarum -U Aleatory -R Amber Prison -R Amulet of Unmaking -R Ancestral Memories -C Armor of Thorns -C Armorer Guildmage -R Ashen Powder -R Asmira, Holy Avenger -R Auspicious Ancestor -C Azimaet Drake -U Bad River -U Barbed Foliage -U Barbed-Back Wurm -R Barreling Attack -U Basalt Golem -C Bay Falcon -R Bazaar of Wonders -C Benevolent Unicorn -R Benthic Djinn -C Binding Agony -U Blighted Shaman -U Blind Fury -U Blinding Light -C Blistering Barrier -C Bone Harvest -R Bone Mask -C Boomerang -C Breathstealer -R Brushwagg -C Builder's Bane -U Burning Palm Efreet -C Burning Shield Askari -R Cadaverous Bloom -C Cadaverous Knight -R Canopy Dragon -R Carrion -R Catacomb Dragon -R Celestial Dawn -U Cerulean Wyvern -C Chaos Charm -R Chaosphere -U Charcoal Diamond -U Chariot of the Sun -C Choking Sands -U Cinder Cloud -R Circle of Despair -C Civic Guildmage -C Cloak of Invisibility -U Consuming Ferocity -U Coral Fighters -C Crash of Rhinos -R Crimson Hellkite -U Crimson Roc -U Crypt Cobra -U Crystal Golem -U Crystal Vein -R Cursed Totem -R Cycle of Life -R Daring Apprentice -C Dark Banishing -C Dark Ritual -C Dazzling Beauty -U Decomposition -U Delirium -C Dirtwater Wraith -R Discordant Spirit -C Disempower -C Disenchant -U Dissipate -C Divine Offering -R Divine Retribution -C Drain Life -U Dread Specter -C Dream Cache -C Dream Fighter -U Dwarven Miner -C Dwarven Nomad -R Early Harvest -C Ebony Charm -C Ekundu Cyclops -C Ekundu Griffin -U Elixir of Vitality -R Emberwilde Caliph -R Emberwilde Djinn -R Energy Bolt -R Energy Vortex -C Enfeeblement -U Enlightened Tutor -U Ersatz Gnomes -U Ether Well -R Ethereal Champion -U Fallow Earth -U Favorable Destiny -U Femeref Archers -C Femeref Healer -C Femeref Knight -C Femeref Scouts -C Feral Shadow -C Fetid Horror -R Final Fortune -U Fire Diamond -C Firebreathing -U Flame Elemental -C Flare -R Flash -U Flood Plain -U Floodgate -C Fog -U Foratog -R Forbidden Crypt -L Forest -L Forest -L Forest -L Forest -R Forsaken Wastes -R Frenetic Efreet -C Giant Mantis -C Gibbering Hyenas -C Goblin Elite Infantry -U Goblin Scouts -U Goblin Soothsayer -C Goblin Tinkerer -C Granger Guildmage -U Grasslands -C Grave Servitude -C Gravebane Zombie -R Grim Feast -R Grinning Totem -R Hakim, Loreweaver -R Hall of Gemstone -R Hammer of Bogardan -R Harbinger of Night -U Harbor Guardian -U Harmattan Efreet -U Haunting Apparition -U Hazerider Drake -C Healing Salve -R Hivis of the Scale -U Horrible Hordes -U Igneous Golem -R Illicit Auction -U Illumination -C Incinerate -R Infernal Contract -U Iron Tusk Elephant -L Island -L Island -L Island -L Island -C Ivory Charm -R Jabari's Influence -C Jolrael's Centaur -C Jolt -R Jungle Patrol -U Jungle Troll -C Jungle Wurm -U Kaervek's Hex -U Kaervek's Purge -C Kaervek's Torch -U Karoo Meerkat -R Kukemssa Pirates -C Kukemssa Serpent -U Lead Golem -R Leering Gargoyle -C Lightning Reflexes -R Lion's Eye Diamond -U Locust Swarm -R Lure of Prey -R Malignant Growth -U Mana Prism -U Mangara's Blessing -U Mangara's Equity -R Mangara's Tome -U Marble Diamond -R Maro -U Meddle -U Melesse Spirit -C Memory Lapse -C Merfolk Raiders -C Merfolk Seer -U Mind Bend -U Mind Harness -R Mindbender Spores -U Mire Shade -R Misers' Cage -R Mist Dragon -U Moss Diamond -L Mountain -L Mountain -L Mountain -L Mountain -U Mountain Valley -U Mtenda Griffin -C Mtenda Herder -C Mtenda Lion -U Mystical Tutor -R Natural Balance -U Nettletooth Djinn -C Noble Elephant -U Nocturnal Raid -R Null Chamber -C Pacifism -U Painful Memories -U Patagia Golem -R Paupers' Cage -R Pearl Dragon -R Phyrexian Dreadnought -R Phyrexian Purge -R Phyrexian Tribute -U Phyrexian Vault -L Plains -L Plains -L Plains -L Plains -R Political Trickery -R Polymorph -C Power Sink -R Preferred Selection -U Prismatic Boon -C Prismatic Circle -R Prismatic Lace -R Psychic Transfer -R Purgatory -R Purraj of Urborg -C Pyric Salamander -C Quirion Elves -U Radiant Essence -C Raging Spirit -C Rampant Growth -R Rashida Scalebane -U Ravenous Vampire -C Ray of Command -R Razor Pendulum -C Reality Ripple -R Reckless Embermage -R Reflect Damage -C Regeneration -U Reign of Chaos -U Reign of Terror -R Reparations -C Restless Dead -C Ritual of Steel -R Rock Basilisk -U Rocky Tar Pit -U Roots of Life -C Sabertooth Cobra -R Sacred Mesa -U Sand Golem -C Sandbar Crocodile -C Sandstorm -C Sapphire Charm -U Savage Twister -R Sawback Manticore -C Sea Scryer -U Sealed Fate -C Searing Spear Askari -C Seedling Charm -R Seeds of Innocence -C Serene Heart -C Sewer Rats -C Shadow Guildmage -U Shadowbane -R Shallow Grave -C Shaper Guildmage -U Shauku's Minion -R Shauku, Endbringer -R Shimmer -R Sidar Jabari -U Sirocco -C Skulking Ghost -U Sky Diamond -C Soar -R Soul Echo -U Soul Rend -C Soulshriek -U Spatial Binding -R Spectral Guardian -R Spirit of the Night -C Spitting Earth -C Stalking Tiger -C Stone Rain -U Stupor -R Subterranean Spirit -R Sunweb -U Superior Numbers -U Suq'Ata Firewalker -L Swamp -L Swamp -L Swamp -L Swamp -R Tainted Specter -C Talruum Minotaur -R Taniwha -R Teeka's Dragon -C Teferi's Curse -C Teferi's Drake -R Teferi's Imp -R Teferi's Isle -R Telim'Tor -U Telim'Tor's Darts -R Telim'Tor's Edict -C Teremko Griffin -C Thirst -U Tidal Wave -R Tombstone Stairwell -R Torrent of Lava -C Tranquil Domain -U Tropical Storm -C Uktabi Faerie -R Uktabi Wildcats -U Unerring Sling -R Unfulfilled Desires -U Unseen Walker -U Unyaro Bee Sting -U Unyaro Griffin -C Urborg Panther -U Vaporous Djinn -R Ventifact Bottle -C Viashino Warrior -U Vigilant Martyr -C Village Elder -U Vitalizing Cascade -R Volcanic Dragon -U Volcanic Geyser -R Waiting in the Weeds -C Wall of Corpses -C Wall of Resistance -C Wall of Roots -C Ward of Lights -R Warping Wurm -U Wave Elemental -R Wellspring -C Wild Elephant -U Wildfire Emissary -U Windreaper Falcon -U Withering Boon -U Worldly Tutor -R Yare -U Zebra Unicorn -U Zhalfirin Commander -C Zhalfirin Knight -R Zirilan of the Claw -U Zombie Mob -R Zuberi, Golden Feather +103 R Abyssal Hunter +291 R Acidic Dagger +205 R Afiya Grove +1 U Afterlife +154 C Agility +2 C Alarum +155 U Aleatory +292 R Amber Prison +293 R Amulet of Unmaking +52 R Ancestral Memories +206 C Armor of Thorns +156 C Armorer Guildmage +104 R Ashen Powder +256 R Asmira, Holy Avenger +3 R Auspicious Ancestor +53 C Azimaet Drake +324 U Bad River +207 U Barbed Foliage +105 U Barbed-Back Wurm +157 R Barreling Attack +294 U Basalt Golem +54 C Bay Falcon +55 R Bazaar of Wonders +4 C Benevolent Unicorn +257 R Benthic Djinn +106 C Binding Agony +107 U Blighted Shaman +158 U Blind Fury +5 U Blinding Light +159 C Blistering Barrier +108 C Bone Harvest +295 R Bone Mask +56 C Boomerang +109 C Breathstealer +208 R Brushwagg +160 C Builder's Bane +161 U Burning Palm Efreet +162 C Burning Shield Askari +258 R Cadaverous Bloom +110 C Cadaverous Knight +209 R Canopy Dragon +111 R Carrion +112 R Catacomb Dragon +6 R Celestial Dawn +57 U Cerulean Wyvern +163 C Chaos Charm +164 R Chaosphere +296 U Charcoal Diamond +297 U Chariot of the Sun +113 C Choking Sands +165 U Cinder Cloud +259 R Circle of Despair +7 C Civic Guildmage +58 C Cloak of Invisibility +166 U Consuming Ferocity +59 U Coral Fighters +210 C Crash of Rhinos +167 R Crimson Hellkite +168 U Crimson Roc +114 U Crypt Cobra +298 U Crystal Golem +325 U Crystal Vein +299 R Cursed Totem +211 R Cycle of Life +60 R Daring Apprentice +115 C Dark Banishing +116 C Dark Ritual +8 C Dazzling Beauty +212 U Decomposition +260 U Delirium +117 C Dirtwater Wraith +261 R Discordant Spirit +9 C Disempower +10 C Disenchant +61 U Dissipate +11 C Divine Offering +12 R Divine Retribution +118 C Drain Life +119 U Dread Specter +62 C Dream Cache +63 C Dream Fighter +169 U Dwarven Miner +170 C Dwarven Nomad +213 R Early Harvest +120 C Ebony Charm +171 C Ekundu Cyclops +13 C Ekundu Griffin +300 U Elixir of Vitality +262 R Emberwilde Caliph +172 R Emberwilde Djinn +263 R Energy Bolt +64 R Energy Vortex +121 C Enfeeblement +14 U Enlightened Tutor +301 U Ersatz Gnomes +65 U Ether Well +15 R Ethereal Champion +214 U Fallow Earth +16 U Favorable Destiny +215 U Femeref Archers +17 C Femeref Healer +18 C Femeref Knight +19 C Femeref Scouts +122 C Feral Shadow +123 C Fetid Horror +173 R Final Fortune +302 U Fire Diamond +174 C Firebreathing +175 U Flame Elemental +176 C Flare +66 R Flash +326 U Flood Plain +67 U Floodgate +216 C Fog +217 U Foratog +124 R Forbidden Crypt +347 L Forest +348 L Forest +349 L Forest +350 L Forest +125 R Forsaken Wastes +264 R Frenetic Efreet +218 C Giant Mantis +219 C Gibbering Hyenas +177 C Goblin Elite Infantry +178 U Goblin Scouts +179 U Goblin Soothsayer +180 C Goblin Tinkerer +220 C Granger Guildmage +327 U Grasslands +126 C Grave Servitude +127 C Gravebane Zombie +265 R Grim Feast +303 R Grinning Totem +68 R Hakim, Loreweaver +221 R Hall of Gemstone +181 R Hammer of Bogardan +128 R Harbinger of Night +266 U Harbor Guardian +69 U Harmattan Efreet +267 U Haunting Apparition +268 U Hazerider Drake +20 C Healing Salve +182 R Hivis of the Scale +304 U Horrible Hordes +305 U Igneous Golem +183 R Illicit Auction +21 U Illumination +184 C Incinerate +129 R Infernal Contract +22 U Iron Tusk Elephant +335 L Island +336 L Island +337 L Island +338 L Island +23 C Ivory Charm +24 R Jabari's Influence +222 C Jolrael's Centaur +70 C Jolt +223 R Jungle Patrol +269 U Jungle Troll +224 C Jungle Wurm +130 U Kaervek's Hex +270 U Kaervek's Purge +185 C Kaervek's Torch +225 U Karoo Meerkat +71 R Kukemssa Pirates +72 C Kukemssa Serpent +306 U Lead Golem +271 R Leering Gargoyle +186 C Lightning Reflexes +307 R Lion's Eye Diamond +226 U Locust Swarm +227 R Lure of Prey +272 R Malignant Growth +308 U Mana Prism +25 U Mangara's Blessing +26 U Mangara's Equity +309 R Mangara's Tome +310 U Marble Diamond +228 R Maro +73 U Meddle +27 U Melesse Spirit +74 C Memory Lapse +75 C Merfolk Raiders +76 C Merfolk Seer +77 U Mind Bend +78 U Mind Harness +229 R Mindbender Spores +131 U Mire Shade +311 R Misers' Cage +79 R Mist Dragon +312 U Moss Diamond +343 L Mountain +344 L Mountain +345 L Mountain +346 L Mountain +328 U Mountain Valley +28 U Mtenda Griffin +29 C Mtenda Herder +230 C Mtenda Lion +80 U Mystical Tutor +231 R Natural Balance +232 U Nettletooth Djinn +30 C Noble Elephant +132 U Nocturnal Raid +31 R Null Chamber +32 C Pacifism +133 U Painful Memories +313 U Patagia Golem +314 R Paupers' Cage +33 R Pearl Dragon +315 R Phyrexian Dreadnought +273 R Phyrexian Purge +134 R Phyrexian Tribute +316 U Phyrexian Vault +331 L Plains +332 L Plains +333 L Plains +334 L Plains +81 R Political Trickery +82 R Polymorph +83 C Power Sink +233 R Preferred Selection +274 U Prismatic Boon +34 C Prismatic Circle +84 R Prismatic Lace +85 R Psychic Transfer +275 R Purgatory +135 R Purraj of Urborg +187 C Pyric Salamander +234 C Quirion Elves +276 U Radiant Essence +188 C Raging Spirit +235 C Rampant Growth +35 R Rashida Scalebane +136 U Ravenous Vampire +86 C Ray of Command +317 R Razor Pendulum +87 C Reality Ripple +189 R Reckless Embermage +277 R Reflect Damage +236 C Regeneration +190 U Reign of Chaos +137 U Reign of Terror +278 R Reparations +138 C Restless Dead +36 C Ritual of Steel +279 R Rock Basilisk +329 U Rocky Tar Pit +237 U Roots of Life +238 C Sabertooth Cobra +37 R Sacred Mesa +318 U Sand Golem +88 C Sandbar Crocodile +239 C Sandstorm +89 C Sapphire Charm +280 U Savage Twister +281 R Sawback Manticore +90 C Sea Scryer +282 U Sealed Fate +191 C Searing Spear Askari +240 C Seedling Charm +241 R Seeds of Innocence +242 C Serene Heart +139 C Sewer Rats +140 C Shadow Guildmage +38 U Shadowbane +141 R Shallow Grave +91 C Shaper Guildmage +142 R Shauku, Endbringer +283 U Shauku's Minion +92 R Shimmer +39 R Sidar Jabari +192 U Sirocco +143 C Skulking Ghost +319 U Sky Diamond +93 C Soar +40 R Soul Echo +144 U Soul Rend +145 C Soulshriek +284 U Spatial Binding +41 R Spectral Guardian +146 R Spirit of the Night +193 C Spitting Earth +243 C Stalking Tiger +194 C Stone Rain +147 U Stupor +195 R Subterranean Spirit +42 R Sunweb +244 U Superior Numbers +94 U Suq'Ata Firewalker +339 L Swamp +340 L Swamp +341 L Swamp +342 L Swamp +148 R Tainted Specter +196 C Talruum Minotaur +95 R Taniwha +320 R Teeka's Dragon +96 C Teferi's Curse +97 C Teferi's Drake +98 R Teferi's Imp +330 R Teferi's Isle +197 R Telim'Tor +321 U Telim'Tor's Darts +198 R Telim'Tor's Edict +43 C Teremko Griffin +99 C Thirst +100 U Tidal Wave +149 R Tombstone Stairwell +199 R Torrent of Lava +245 C Tranquil Domain +246 U Tropical Storm +247 C Uktabi Faerie +248 R Uktabi Wildcats +322 U Unerring Sling +285 R Unfulfilled Desires +249 U Unseen Walker +250 U Unyaro Bee Sting +44 U Unyaro Griffin +150 C Urborg Panther +101 U Vaporous Djinn +323 R Ventifact Bottle +200 C Viashino Warrior +45 U Vigilant Martyr +251 C Village Elder +286 U Vitalizing Cascade +201 R Volcanic Dragon +202 U Volcanic Geyser +252 R Waiting in the Weeds +151 C Wall of Corpses +46 C Wall of Resistance +253 C Wall of Roots +47 C Ward of Lights +287 R Warping Wurm +102 U Wave Elemental +288 R Wellspring +254 C Wild Elephant +203 U Wildfire Emissary +289 U Windreaper Falcon +152 U Withering Boon +255 U Worldly Tutor +48 R Yare +290 U Zebra Unicorn +49 U Zhalfirin Commander +50 C Zhalfirin Knight +204 R Zirilan of the Claw +153 U Zombie Mob +51 R Zuberi, Golden Feather [tokens] tombspawn diff --git a/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt new file mode 100644 index 00000000000..53da157f1cc --- /dev/null +++ b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt @@ -0,0 +1,47 @@ +[metadata] +Code=RMH1 +Date=2021-06-18 +Name=Modern Horizons 1 Timeshifts +Type=Other + +[cards] +1 U Ephemerate +2 U Generous Gift +3 R Giver of Runes +4 U King of the Pride +5 M Ranger-Captain of Eos +6 R Sisay, Weatherlight Captain +7 R Archmage's Charm +8 U Faerie Seer +9 R Force of Negation +10 U Tribute Mage +11 M Urza, Lord High Artificer +12 U Changeling Outcast +13 U Defile +14 R Plague Engineer +15 U Undead Augur +16 R Goblin Engineer +17 U Magmatic Sinkhole +18 U Shenanigans +19 R Ayula, Queen Among Bears +20 R Deep Forest Hermit +21 R Force of Vigor +22 U Llanowar Tribe +23 U Scale Up +24 U Weather the Storm +25 U Etchings of the Chosen +26 M The First Sliver +27 R Ice-Fang Coatl +28 U Ingenious Infiltrator +29 U Lavabelly Sliver +30 U Soulherder +31 M Sword of Sinew and Steel +32 M Sword of Truth and Justice +33 U Talisman of Conviction +34 U Talisman of Creativity +35 U Talisman of Curiosity +36 U Talisman of Hierarchy +37 U Talisman of Resilience +38 U Universal Automaton +39 R Hall of Heliod's Generosity +40 R Prismatic Vista diff --git a/forge-gui/res/editions/Modern Horizons 2.txt b/forge-gui/res/editions/Modern Horizons 2.txt new file mode 100644 index 00000000000..22caf80cf26 --- /dev/null +++ b/forge-gui/res/editions/Modern Horizons 2.txt @@ -0,0 +1,677 @@ +[metadata] +Code=MH2 +Date=2021-06-18 +Name=Modern Horizons 2 +Code2=MH2 +MciCode=mh2 +Type=Other +Booster=10 Common:fromSheet("MH2 cards"), 3 Uncommon:fromSheet("MH2 cards"), 1 RareMythic:fromSheet("MH2 cards"), 1 fromSheet("MH2 Lands") +BoosterReplaceSlotFromPrintSheet=MH2 NewToModern +BoosterBox=36 +ChaosDraftThemes=MASTERS_SET + +[cards] +1 U Abiding Grace +2 U Arcbound Javelineer +3 C Arcbound Mouser +4 C Arcbound Prototype +5 U Barbed Spike +6 C Blacksmith's Skill +7 U Blossoming Calm +8 C Break Ties +9 U Caprichrome +10 U Constable of the Realm +11 C Disciple of the Sun +12 R Esper Sentinel +13 C Fairgrounds Patrol +14 U Glorious Enforcer +15 C Guardian Kirin +16 U Healer's Flock +17 C Knighted Myr +18 C Landscaper Colos +19 C Late to Dinner +20 C Lens Flare +21 C Marble Gargoyle +22 R Nykthos Paragon +23 R Out of Time +24 C Piercing Rays +25 U Prismatic Ending +26 R Resurgent Belief +27 R Sanctifier en-Vec +28 U Scour the Desert +29 R Search the Premises +30 M Serra's Emissary +31 U Skyblade's Boon +32 M Solitude +33 C Soul of Migration +34 U Thraben Watcher +35 R Timeless Dragon +36 C Unbounded Potential +37 C Aeromoeba +38 C Burdened Aerialist +39 R Dress Down +40 C Etherium Spinner +41 U Filigree Attendant +42 C Floodhound +43 C Foul Watcher +44 R Fractured Sanity +45 U Ghost-Lit Drifter +46 C Hard Evidence +47 R Inevitable Betrayal +48 U Junk Winder +49 C Lose Focus +50 U Lucid Dreams +51 C Mental Journey +52 M Murktide Regent +53 U Mystic Redaction +54 C Parcel Myr +55 C Phantasmal Dreadmaw +56 U Raving Visionary +57 C Recalibrate +58 R Rise and Shine +59 R Rishadan Dockhand +60 U Said // Done +61 U Scuttletide +62 C Shattered Ego +63 C So Shiny +64 U Specimen Collector +65 C Steelfin Whale +66 C Step Through +67 M Subtlety +68 R Suspend +69 M Svyelun of Sea and Sky +70 U Sweep the Skies +71 R Thought Monitor +72 U Tide Shaper +73 U Vedalken Infiltrator +74 U Archfiend of Sorrows +75 M Archon of Cruelty +76 C Bone Shards +77 U Break the Ice +78 C Cabal Initiate +79 U Clattering Augur +80 R Damn +81 R Dauthi Voidwalker +82 C Discerning Taste +83 C Echoing Return +84 U Feast of Sanity +85 U Flay Essence +86 C Gilt-Blade Prowler +87 M Grief +88 C Hell Mongrel +89 C Kitchen Imp +90 U Legion Vanguard +91 C Loathsome Curator +92 R Magus of the Bridge +93 R Necrogoyf +94 U Necromancer's Familiar +95 C Nested Shambler +96 R Persist +97 R Profane Tutor +98 U Radiant Epicure +99 C Sinister Starfish +100 U Sudden Edict +101 C Tizerus Charger +102 M Tourach, Dread Cantor +103 C Tourach's Canticle +104 C Tragic Fall +105 U Underworld Hermit +106 R Unmarked Grave +107 C Vermin Gorger +108 U Vile Entomber +109 C World-Weary +110 U Young Necromancer +111 C Arcbound Slasher +112 C Arcbound Tracker +113 U Arcbound Whelp +114 C Battle Plan +115 U Blazing Rootwalla +116 R Bloodbraid Marauder +117 R Breya's Apprentice +118 R Calibrated Blast +119 U Captain Ripley Vance +120 R Chef's Kiss +121 U Dragon's Rage Channeler +122 C Faithless Salvaging +123 U Fast // Furious +124 U Flame Blitz +125 U Flametongue Yearling +126 M Fury +127 C Galvanic Relay +128 C Gargadon +129 R Glimpse of Tomorrow +130 U Goblin Traprunner +131 C Gouged Zealot +132 R Harmonic Prodigy +133 U Kaleidoscorch +134 C Lightning Spear +135 C Mine Collapse +136 C Mount Velus Manticore +137 R Obsidian Charmaw +138 M Ragavan, Nimble Pilferer +139 C Revolutionist +140 C Skophos Reaver +141 U Slag Strider +142 U Spreading Insurrection +143 U Strike It Rich +144 C Tavern Scoundrel +145 C Unholy Heat +146 C Viashino Lashclaw +147 C Abundant Harvest +148 R Aeve, Progenitor Ooze +149 C Bannerhide Krushok +150 U Blessed Respite +151 M Chatterfang, Squirrel General +152 C Chatterstorm +153 R Chitterspitter +154 C Crack Open +155 C Deepwood Denizen +156 C Duskshell Crawler +157 M Endurance +158 U Fae Offering +159 C Flourishing Strike +160 U Foundation Breaker +161 C Funnel-Web Recluse +162 R Gaea's Will +163 C Glimmer Bairn +164 U Glinting Creeper +165 U Herd Baloth +166 R Ignoble Hierarch +167 C Jade Avenger +168 C Jewel-Eyed Cobra +169 C Orchard Strider +170 C Rift Sower +171 R Sanctum Weaver +172 U Scurry Oak +173 C Smell Fear +174 U Squirrel Sanctuary +175 U Squirrel Sovereign +176 R Sylvan Anthem +177 U Terramorph +178 M Thrasta, Tempest's Roar +179 U Timeless Witness +180 U Tireless Provisioner +181 C Urban Daggertooth +182 R Verdant Command +183 U Wren's Run Hydra +184 U Arcbound Shikari +185 U Arcus Acolyte +186 R Asmoranomardicadaistinaculdacar +187 C Breathless Knight +188 C Captured by Lagacs +189 R Carth the Lion +190 C Chrome Courier +191 U Combine Chrysalis +192 M Dakkon, Shadow Slayer +193 C Dihada's Ploy +194 C Drey Keeper +195 U Ethersworn Sphinx +196 C Foundry Helix +197 M Garth One-Eye +198 R General Ferrous Rokiric +199 M Geyadrone Dihada +200 C Goblin Anarchomancer +201 U Graceful Restoration +202 M Grist, the Hunger Tide +203 U Lazotep Chancellor +204 R Lonis, Cryptozoologist +205 R Master of Death +206 R Moderation +207 R Piru, the Volatile +208 R Priest of Fell Rites +209 U Prophetic Titan +210 U Rakdos Headliner +211 U Ravenous Squirrel +212 U Road // Ruin +213 C Storm God's Oracle +214 R Sythis, Harvest's Hand +215 C Terminal Agony +216 R Territorial Kavu +217 C Wavesifter +218 R Yusri, Fortune's Flame +219 R Academy Manufactor +220 U Altar of the Goyf +221 U Batterbone +222 C Bottle Golems +223 U Brainstone +224 R Dermotaxi +225 R Diamond Lion +226 C Fodder Tosser +227 M Kaldra Compleat +228 U Liquimetal Torque +229 U Monoskelion +230 C Myr Scrapling +231 R Nettlecyst +232 C Ornithopter of Paradise +233 U Sanctuary Raptor +234 M Scion of Draco +235 C Sojourner's Companion +236 R Sol Talisman +237 U Steel Dromedary +238 M Sword of Hearth and Home +239 C Tormod's Cryptkeeper +240 U The Underworld Cookbook +241 U Vectis Gloves +242 R Void Mirror +243 R Zabaz, the Glimmerwasp + +[special slot] +244 R Arid Mesa +245 C Darkmoss Bridge +246 C Drossforge Bridge +247 C Goldmire Bridge +248 R Marsh Flats +249 C Mistvault Bridge +250 R Misty Rainforest +251 U Power Depot +252 C Razortide Bridge +253 C Rustvale Bridge +254 R Scalding Tarn +255 C Silverbluff Bridge +256 C Slagwoods Bridge +257 C Tanglepool Bridge +258 C Thornglint Bridge +259 R Urza's Saga +260 R Verdant Catacombs +261 R Yavimaya, Cradle of Growth +262 U Angelic Curator +263 R Karmic Guide +264 U Seal of Cleansing +265 R Solitary Confinement +266 U Soul Snare +267 U Counterspell +268 U Sea Drake +269 U Seal of Removal +270 R Upheaval +271 R Wonder +272 U Bone Shredder +273 R Braids, Cabal Minion +274 U Greed +275 R Patriarch's Bidding +276 U Skirge Familiar +277 R Chance Encounter +278 U Flame Rift +279 R Goblin Bombardment +280 U Gorilla Shaman +281 M Imperial Recruiter +282 U Mogg Salvage +283 R Enchantress's Presence +284 U Hunting Pack +285 U Quirion Ranger +286 R Squirrel Mob +287 M Titania, Protector of Argoth +288 U Yavimaya Elder +289 R Chainer, Nightmare Adept +290 R Fire // Ice +291 M Mirari's Wake +292 R Shardless Agent +293 R Sterling Grove +294 R Vindicate +295 R Cursed Totem +296 U Extruder +297 U Millikin +298 R Nevinyrral's Disk +299 U Patchwork Gnomes +300 U Zuran Orb +301 M Cabal Coffers +302 U Mishra's Factory +303 R Riptide Laboratory + +[alternate art] +304 M Dakkon, Shadow Slayer +305 M Geyadrone Dihada +306 M Grist, the Hunger Tide +307 M Solitude +308 R Counterspell +309 M Subtlety +310 M Svyelun of Sea and Sky +311 M Grief +312 M Tourach, Dread Cantor +313 M Fury +314 M Imperial Recruiter +315 M Ragavan, Nimble Pilferer +316 M Chatterfang, Squirrel General +317 M Endurance +318 M Thrasta, Tempest's Roar +319 M Titania, Protector of Argoth +320 M Mirari's Wake +321 R Shardless Agent +322 R Vindicate +323 M Scion of Draco +324 M Sword of Hearth and Home +325 M Cabal Coffers +326 R Mishra's Factory + +[showcase] +327 U Blossoming Calm +328 R Esper Sentinel +329 C Late to Dinner +330 C Lens Flare +331 R Nykthos Paragon +332 R Search the Premises +333 M Serra's Emissary +334 R Dress Down +335 C Floodhound +336 R Fractured Sanity +337 M Murktide Regent +338 U Mystic Redaction +339 C Phantasmal Dreadmaw +340 R Rise and Shine +341 R Thought Monitor +342 M Archon of Cruelty +343 C Kitchen Imp +344 R Magus of the Bridge +345 R Persist +346 U Sudden Edict +347 U Underworld Hermit +348 C World-Weary +349 C Faithless Salvaging +350 U Flametongue Yearling +351 C Gargadon +352 R Harmonic Prodigy +353 R Obsidian Charmaw +354 C Abundant Harvest +355 R Ignoble Hierarch +356 C Jade Avenger +357 R Sylvan Anthem +358 U Timeless Witness +359 R Verdant Command +360 U Arcbound Shikari +361 U Arcus Acolyte +362 U Combine Chrysalis +363 M Dakkon, Shadow Slayer +364 U Ethersworn Sphinx +365 M Garth One-Eye +366 R General Ferrous Rokiric +367 M Geyadrone Dihada +368 M Grist, the Hunger Tide +369 U Lazotep Chancellor +370 R Lonis, Cryptozoologist +371 R Moderation +372 R Priest of Fell Rites +373 U Prophetic Titan +374 U Rakdos Headliner +375 U Ravenous Squirrel +376 U Road // Ruin +377 R Sythis, Harvest's Hand +378 R Dermotaxi +379 M Kaldra Compleat +380 R Urza's Saga + +[alternate frame] +381 C Blacksmith's Skill +382 C Marble Gargoyle +383 R Out of Time +384 U Prismatic Ending +385 R Resurgent Belief +386 R Sanctifier en-Vec +387 U Soul Snare +388 R Timeless Dragon +389 C Aeromoeba +390 R Inevitable Betrayal +391 R Rishadan Dockhand +392 C Step Through +393 M Svyelun of Sea and Sky +394 U Tide Shaper +395 C Bone Shards +396 R Damn +397 R Dauthi Voidwalker +398 R Necrogoyf +399 C Nested Shambler +400 R Persist +401 R Profane Tutor +402 M Tourach, Dread Cantor +403 U Vile Entomber +404 U Blazing Rootwalla +405 R Calibrated Blast +406 C Galvanic Relay +407 R Glimpse of Tomorrow +408 C Mine Collapse +409 R Aeve, Progenitor Ooze +410 M Chatterfang, Squirrel General +411 C Chatterstorm +412 R Gaea's Will +413 C Glimmer Bairn +414 R Ignoble Hierarch +415 U Squirrel Sovereign +416 M Titania, Protector of Argoth +417 R Asmoranomardicadaistinaculdacar +418 R Carth the Lion +419 R Chainer, Nightmare Adept +420 M Garth One-Eye +421 C Goblin Anarchomancer +422 R Piru, the Volatile +423 R Shardless Agent +424 C Terminal Agony +425 R Territorial Kavu +426 U Brainstone +427 R Diamond Lion +428 U Liquimetal Torque +429 U Monoskelion +430 C Ornithopter of Paradise +431 M Scion of Draco +432 R Sol Talisman +433 M Sword of Hearth and Home +434 U The Underworld Cookbook +435 R Void Mirror +436 R Arid Mesa +437 R Marsh Flats +438 R Misty Rainforest +439 R Scalding Tarn +440 R Verdant Catacombs +441 R Yavimaya, Cradle of Growth + +[extended art] +442 R Out of Time +443 R Resurgent Belief +444 R Sanctifier en-Vec +445 R Timeless Dragon +446 R Inevitable Betrayal +447 R Rishadan Dockhand +448 R Suspend +449 R Damn +450 R Dauthi Voidwalker +451 R Necrogoyf +452 R Profane Tutor +453 R Unmarked Grave +454 R Bloodbraid Marauder +455 R Breya's Apprentice +456 R Calibrated Blast +457 R Chef's Kiss +458 R Glimpse of Tomorrow +459 R Aeve, Progenitor Ooze +460 R Chitterspitter +461 R Gaea's Will +462 R Sanctum Weaver +463 R Asmoranomardicadaistinaculdacar +464 R Carth the Lion +465 R Master of Death +466 R Piru, the Volatile +467 R Territorial Kavu +468 R Yusri, Fortune's Flame +469 R Academy Manufactor +470 R Diamond Lion +471 R Nettlecyst +472 R Sol Talisman +473 R Void Mirror +474 R Zabaz, the Glimmerwasp +475 R Arid Mesa +476 R Marsh Flats +477 R Misty Rainforest +478 R Scalding Tarn +479 R Verdant Catacombs +480 R Yavimaya, Cradle of Growth + +[promo] +481 L Plains +482 L Plains +483 L Island +484 L Island +485 L Swamp +486 L Swamp +487 L Mountain +488 L Mountain +489 L Forest +490 L Forest + +[buy a box] +491 M Sanctum Prelate + +[bundle] +492 R Yusri, Fortune's Flame + +[Lands] +19 Arid Mesa|MH2|1 +1 Arid Mesa|MH2|2 +100 Darkmoss Bridge|MH2|1 +100 Drossforge Bridge|MH2|1 +100 Goldmire Bridge|MH2|1 +19 Marsh Flats|MH2|1 +1 Marsh Flats|MH2|2 +100 Mistvault Bridge|MH2|1 +19 Misty Rainforest|MH2|1 +1 Misty Rainforest|MH2|2 +60 Power Depot|MH2|1 +100 Razortide Bridge|MH2|1 +100 Rustvale Bridge|MH2|1 +19 Scalding Tarn|MH2|1 +1 Scalding Tarn|MH2|2 +100 Silverbluff Bridge|MH2|1 +100 Slagwoods Bridge|MH2|1 +100 Tanglepool Bridge|MH2|1 +100 Thornglint Bridge|MH2|1 +20 Urza's Saga|MH2|1 +19 Verdant Catacombs|MH2|1 +1 Verdant Catacombs|MH2|2 +20 Yavimaya, Cradle of Growth|MH2|1 +10 Cabal Coffers|MH2|1 +60 Mishra's Factory|MH2|1 +20 Riptide Laboratory|MH2|1 + +[NewToModern] +6 Angelic Curator|MH2|1 +2 Karmic Guide|MH2|1 +6 Seal of Cleansing|MH2|1 +2 Solitary Confinement|MH2|1 +6 Soul Snare|MH2|1 +6 Counterspell|MH2|1 +6 Sea Drake|MH2|1 +6 Seal of Removal|MH2|1 +2 Upheaval|MH2|1 +2 Wonder|MH2|1 +6 Bone Shredder|MH2|1 +2 Braids, Cabal Minion|MH2|1 +6 Greed|MH2|1 +2 Patriarch's Bidding|MH2|1 +6 Skirge Familiar|MH2|1 +2 Chance Encounter|MH2|1 +6 Flame Rift|MH2|1 +2 Goblin Bombardment|MH2|1 +6 Gorilla Shaman|MH2|1 +1 Imperial Recruiter|MH2|1 +6 Mogg Salvage|MH2|1 +2 Enchantress's Presence|MH2|1 +6 Hunting Pack|MH2|1 +6 Quirion Ranger|MH2|1 +2 Squirrel Mob|MH2|1 +1 Titania, Protector of Argoth|MH2|1 +6 Yavimaya Elder|MH2|1 +2 Chainer, Nightmare Adept|MH2|1 +2 Fire // Ice|MH2|1 +1 Mirari's Wake|MH2|1 +2 Shardless Agent|MH2|1 +2 Sterling Grove|MH2|1 +2 Vindicate|MH2|1 +2 Cursed Totem|MH2|1 +6 Extruder|MH2|1 +6 Millikin|MH2|1 +2 Nevinyrral's Disk|MH2|1 +6 Patchwork Gnomes|MH2|1 +6 Zuran Orb|MH2|1 + +[Secret Cards] +Arid Mesa +Darkmoss Bridge +Drossforge Bridge +Goldmire Bridge +Marsh Flats +Mistvault Bridge +Misty Rainforest +Power Depot +Razortide Bridge +Rustvale Bridge +Scalding Tarn +Silverbluff Bridge +Slagwoods Bridge +Tanglepool Bridge +Thornglint Bridge +Urza's Saga +Verdant Catacombs +Yavimaya, Cradle of Growth +Angelic Curator +Karmic Guide +Seal of Cleansing +Solitary Confinement +Soul Snare +Counterspell +Sea Drake +Seal of Removal +Upheaval +Wonder +Bone Shredder +Braids, Cabal Minion +Greed +Patriarch's Bidding +Skirge Familiar +Chance Encounter +Flame Rift +Goblin Bombardment +Gorilla Shaman +Imperial Recruiter +Mogg Salvage +Enchantress's Presence +Hunting Pack +Quirion Ranger +Squirrel Mob +Titania, Protector of Argoth +Yavimaya Elder +Chainer, Nightmare Adept +Fire // Ice +Mirari's Wake +Shardless Agent +Sterling Grove +Vindicate +Cursed Totem +Extruder +Millikin +Nevinyrral's Disk +Patchwork Gnomes +Zuran Orb +Cabal Coffers +Mishra's Factory +Riptide Laboratory + +[tokens] +b_0_0_germ +b_0_0_zombie_army +b_2_2_zombie +bg_1_1_insect +c_0_0_a_construct_total_artifacts +c_1_1_a_thopter_flying +c_a_clue_draw +c_a_clue_draw +c_a_food_sac +c_a_food_sac +c_a_treasure_sac +c_a_treasure_sac +g_1_1_squirrel +g_4_4_beast +g_5_3_elemental +r_1_1_goblin +rw_4_4_a_golem +u_0_3_crab +u_1_1_bird_flying + +[other] +eternalize_timeless_dragon +eternalize_timeless_witness diff --git a/forge-gui/res/editions/Mythic Edition - War of the Spark.txt b/forge-gui/res/editions/Mythic Edition - War of the Spark.txt index d24eae7ce05..4df3d2dc16b 100644 --- a/forge-gui/res/editions/Mythic Edition - War of the Spark.txt +++ b/forge-gui/res/editions/Mythic Edition - War of the Spark.txt @@ -6,14 +6,14 @@ MciCode=med Type=Other [cards] -M Ugin, the Spirit Dragon -M Gideon Blackblade -M Jace, the Mind Sculptor -M Tezzeret the Seeker -M Garruk, Apex Predator -M Nicol Bolas, Dragon-God -M Nahiri, the Harbinger -M Sarkhan Unbroken +WS1 M Ugin, the Spirit Dragon +WS2 M Gideon Blackblade +WS3 M Jace, the Mind Sculptor +WS4 M Tezzeret the Seeker +WS5 M Garruk, Apex Predator +WS6 M Nicol Bolas, Dragon-God +WS7 M Nahiri, the Harbinger +WS8 M Sarkhan Unbroken [tokens] b_3_3_beast_deathtouch diff --git a/forge-gui/res/editions/Ninth Edition.txt b/forge-gui/res/editions/Ninth Edition.txt index dce5aa6170c..09b6670afc8 100644 --- a/forge-gui/res/editions/Ninth Edition.txt +++ b/forge-gui/res/editions/Ninth Edition.txt @@ -61,7 +61,7 @@ ChaosDraftThemes=CORE_SET 68 U Confiscate 119 U Consume Spirit 120 C Contaminated Bond -C Coral Eel +S3 C Coral Eel 69 C Counsel of the Soratami 70 R Cowardice 71 C Crafty Pathmage @@ -84,7 +84,7 @@ C Coral Eel 296 U Dragon's Claw 74 U Dream Prowler 126 U Drudge Skeletons -C Eager Cadet +S1 C Eager Cadet 235 R Early Harvest 236 U Elvish Bard 237 C Elvish Berserker @@ -93,7 +93,7 @@ C Eager Cadet 240 C Elvish Warrior 241 R Emperor Crocodile 127 C Enfeeblement -U Enormous Baloth +S9 U Enormous Baloth 180 U Enrage 75 R Evacuation 128 U Execute @@ -123,7 +123,7 @@ U Enormous Baloth 188 R Furnace of Rath 133 C Giant Cockroach 243 C Giant Growth -C Giant Octopus +S4 C Giant Octopus 244 C Giant Spider 15 U Gift of Estates 16 R Glorious Anthem @@ -135,7 +135,7 @@ C Giant Octopus 192 R Goblin King 193 C Goblin Mountaineer 194 C Goblin Piker -C Goblin Raider +S8 C Goblin Raider 195 C Goblin Sky Raider 135 R Grave Pact 136 C Gravedigger @@ -157,7 +157,7 @@ C Goblin Raider 141 R Hypnotic Specter 299 U Icy Manipulator 82 R Imaginary Pet -C Index +S5 C Index 21 C Infantry Veteran 22 U Inspirit 337 L Island @@ -296,7 +296,7 @@ C Index 164 U Soul Feast 46 U Soul Warden 309 U Spellbook -C Spined Wurm +S10 C Spined Wurm 165 C Spineless Thug 47 U Spirit Link 221 C Stone Rain @@ -341,13 +341,13 @@ C Spined Wurm 329 U Urza's Tower 277 R Utopia Tree 51 C Venerable Monk -U Vengeance +S2 U Vengeance 278 R Verdant Force 279 R Verduran Enchantress 52 C Veteran Cavalier 225 U Viashino Sandstalker 280 U Viridian Shaman -R Vizzerdrix +S7 R Vizzerdrix 226 C Volcanic Hammer 315 U Vulshok Morningstar 111 C Wanderguard Sentry diff --git a/forge-gui/res/editions/Portal Second Age.txt b/forge-gui/res/editions/Portal Second Age.txt index 5b6dfb621d0..8460a2737d6 100644 --- a/forge-gui/res/editions/Portal Second Age.txt +++ b/forge-gui/res/editions/Portal Second Age.txt @@ -11,168 +11,168 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U Abyssal Nightstalker -U Air Elemental -U Alaborn Cavalier -C Alaborn Grenadier -C Alaborn Musketeer -C Alaborn Trooper -R Alaborn Veteran -U Alaborn Zealot -R Alluring Scent -R Ancient Craving -R Angel of Fury -U Angel of Mercy -C Angelic Blessing -C Angelic Wall -U Apprentice Sorcerer -R Archangel -R Armageddon -U Armored Galleon -U Armored Griffin -C Barbtooth Wurm -U Bargain -C Bear Cub -U Bee Sting -U Blaze -U Bloodcurdling Scream -C Breath of Life -R Brimstone Dragon -U Brutal Nightstalker -C Chorus of Woe -R Coastal Wizard -U Coercion -C Cruel Edict -R Cunning Giant -C Dakmor Bat -U Dakmor Plague -C Dakmor Scorpion -R Dakmor Sorceress -U Dark Offering -R Deathcoil Wurm -U Deep Wood -C Deja Vu -R Denizen of the Deep -R Earthquake -R Exhaustion -C Extinguish -U Eye Spy -C False Summoning -C Festival of Trokin -L Forest -L Forest -L Forest -U Foul Spirit -C Goblin Cavaliers -U Goblin Firestarter -R Goblin General -C Goblin Glider -U Goblin Lore -U Goblin Matron -C Goblin Mountaineer -C Goblin Piker -C Goblin Raider -U Goblin War Cry -C Goblin War Strike -C Golden Bear -C Hand of Death -U Harmony of Nature -R Hidden Horror -R Hurricane -U Ironhoof Ox -L Island -L Island -L Island -U Jagged Lightning -R Just Fate -U Kiss of Death -C Lava Axe -U Lone Wolf -C Lurking Nightstalker -C Lynx -R Magma Giant -C Mind Rot -C Moaning Spirit -C Monstrous Growth -L Mountain -L Mountain -L Mountain -C Muck Rats -U Mystic Denial -C Natural Spring -C Nature's Lore -R Nightstalker Engine -C Norwood Archers -R Norwood Priestess -C Norwood Ranger -C Norwood Riders -C Norwood Warrior -U Obsidian Giant -U Ogre Arsonist -C Ogre Berserker -U Ogre Taskmaster -C Ogre Warrior -C Path of Peace -R Piracy -L Plains -L Plains -L Plains -C Plated Wurm -U Predatory Nightstalker -C Prowling Nightstalker -C Raging Goblin -C Raiding Nightstalker -R Rain of Daggers -C Raise Dead -U Rally the Troops -C Ravenous Rats -R Razorclaw Bear -R Relentless Assault -U Remove -U Renewing Touch -R Return of the Nightstalkers -C Righteous Charge -R Righteous Fury -U River Bear -C Salvage -C Screeching Drake -U Sea Drake -C Sleight of Hand -C Spitting Earth -R Steam Catapult -C Steam Frigate -C Stone Rain -L Swamp -L Swamp -L Swamp -C Swarm of Rats -R Sylvan Basilisk -R Sylvan Yeti -C Talas Air Ship -C Talas Explorer -C Talas Merchant -R Talas Researcher -C Talas Scout -R Talas Warrior -C Temple Acolyte -U Temple Elder -R Temporal Manipulation -U Theft of Dreams -C Tidal Surge -C Time Ebb -C Touch of Brilliance -C Town Sentry -C Tree Monkey -C Tremor -C Trokin High Guard -U Undo -U Untamed Wilds -R Vampiric Spirit -U Vengeance -C Volcanic Hammer -C Volunteer Militia -U Warrior's Stand -C Wild Griffin -U Wild Ox -R Wildfire -C Wind Sail +61 U Abyssal Nightstalker +31 U Air Elemental +1 U Alaborn Cavalier +2 C Alaborn Grenadier +3 C Alaborn Musketeer +4 C Alaborn Trooper +5 R Alaborn Veteran +6 U Alaborn Zealot +121 R Alluring Scent +62 R Ancient Craving +7 R Angel of Fury +8 U Angel of Mercy +9 C Angelic Blessing +10 C Angelic Wall +32 U Apprentice Sorcerer +11 R Archangel +12 R Armageddon +33 U Armored Galleon +13 U Armored Griffin +122 C Barbtooth Wurm +14 U Bargain +123 C Bear Cub +124 U Bee Sting +91 U Blaze +63 U Bloodcurdling Scream +15 C Breath of Life +92 R Brimstone Dragon +64 U Brutal Nightstalker +65 C Chorus of Woe +34 R Coastal Wizard +66 U Coercion +67 C Cruel Edict +93 R Cunning Giant +68 C Dakmor Bat +69 U Dakmor Plague +70 C Dakmor Scorpion +71 R Dakmor Sorceress +72 U Dark Offering +125 R Deathcoil Wurm +126 U Deep Wood +36 C Deja Vu +35 R Denizen of the Deep +94 R Earthquake +37 R Exhaustion +38 C Extinguish +39 U Eye Spy +40 C False Summoning +16 C Festival of Trokin +163 L Forest +164 L Forest +165 L Forest +73 U Foul Spirit +95 C Goblin Cavaliers +96 U Goblin Firestarter +97 R Goblin General +98 C Goblin Glider +99 U Goblin Lore +100 U Goblin Matron +101 C Goblin Mountaineer +102 C Goblin Piker +103 C Goblin Raider +104 U Goblin War Cry +105 C Goblin War Strike +127 C Golden Bear +74 C Hand of Death +128 U Harmony of Nature +75 R Hidden Horror +129 R Hurricane +130 U Ironhoof Ox +154 L Island +155 L Island +156 L Island +106 U Jagged Lightning +17 R Just Fate +76 U Kiss of Death +107 C Lava Axe +131 U Lone Wolf +77 C Lurking Nightstalker +132 C Lynx +108 R Magma Giant +78 C Mind Rot +79 C Moaning Spirit +133 C Monstrous Growth +160 L Mountain +161 L Mountain +162 L Mountain +80 C Muck Rats +41 U Mystic Denial +134 C Natural Spring +135 C Nature's Lore +81 R Nightstalker Engine +136 C Norwood Archers +137 R Norwood Priestess +138 C Norwood Ranger +139 C Norwood Riders +140 C Norwood Warrior +109 U Obsidian Giant +110 U Ogre Arsonist +111 C Ogre Berserker +112 U Ogre Taskmaster +113 C Ogre Warrior +18 C Path of Peace +42 R Piracy +151 L Plains +152 L Plains +153 L Plains +141 C Plated Wurm +82 U Predatory Nightstalker +83 C Prowling Nightstalker +114 C Raging Goblin +84 C Raiding Nightstalker +85 R Rain of Daggers +86 C Raise Dead +19 U Rally the Troops +87 C Ravenous Rats +142 R Razorclaw Bear +115 R Relentless Assault +43 U Remove +143 U Renewing Touch +88 R Return of the Nightstalkers +20 C Righteous Charge +21 R Righteous Fury +144 U River Bear +145 C Salvage +44 C Screeching Drake +45 U Sea Drake +46 C Sleight of Hand +116 C Spitting Earth +22 R Steam Catapult +47 C Steam Frigate +117 C Stone Rain +157 L Swamp +158 L Swamp +159 L Swamp +89 C Swarm of Rats +146 R Sylvan Basilisk +147 R Sylvan Yeti +48 C Talas Air Ship +49 C Talas Explorer +50 C Talas Merchant +51 R Talas Researcher +52 C Talas Scout +53 R Talas Warrior +23 C Temple Acolyte +24 U Temple Elder +54 R Temporal Manipulation +55 U Theft of Dreams +56 C Tidal Surge +57 C Time Ebb +58 C Touch of Brilliance +25 C Town Sentry +148 C Tree Monkey +118 C Tremor +26 C Trokin High Guard +59 U Undo +149 U Untamed Wilds +90 R Vampiric Spirit +27 U Vengeance +119 C Volcanic Hammer +28 C Volunteer Militia +29 U Warrior's Stand +30 C Wild Griffin +150 U Wild Ox +120 R Wildfire +60 C Wind Sail diff --git a/forge-gui/res/editions/Portal.txt b/forge-gui/res/editions/Portal.txt index 0bd9c458e9c..0d5a1d7016a 100644 --- a/forge-gui/res/editions/Portal.txt +++ b/forge-gui/res/editions/Portal.txt @@ -10,225 +10,225 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -R Alabaster Dragon -R Alluring Scent -U Anaconda -U Anaconda -R Ancestral Memories -C Angelic Blessing -R Archangel -U Ardent Militia -R Armageddon -C Armored Pegasus -U Arrogant Vampire -U Assassin's Blade -R Balance of Power -U Baleful Stare -U Bee Sting -U Blaze -U Blaze -R Blessed Reversal -R Blinding Light -C Bog Imp -C Bog Raiders -U Bog Wraith -U Boiling Seas -C Border Guard -C Breath of Life -U Bull Hippo -C Burning Cloak -R Capricious Sorcerer -U Charging Bandits -U Charging Paladin -R Charging Rhino -C Cloak of Feathers -R Cloud Dragon -C Cloud Pirates -U Cloud Spirit -U Command of Unsummoning -C Coral Eel -C Craven Giant -C Craven Knight -R Cruel Bargain -R Cruel Fate -R Cruel Tutor -U Deep Wood -U Deep-Sea Serpent -U Defiant Stand -C Deja Vu -U Desert Drake -R Devastation -C Devoted Hero -R Djinn of the Lamp -R Dread Charge -R Dread Reaper -U Dry Spell -R Earthquake -R Ebon Dragon -C Elite Cat Warrior -C Elite Cat Warrior -C Elven Cache -C Elvish Ranger -R Endless Cockroaches -R Exhaustion -C False Peace -C Feral Shadow -R Final Strike -R Fire Dragon -U Fire Imp -C Fire Snake -R Fire Tempest -U Flashfires -C Fleet-Footed Monk -U Flux -C Foot Soldiers -L Forest -L Forest -L Forest -L Forest -R Forked Lightning -C Fruition -C Giant Octopus -C Giant Spider -R Gift of Estates -C Goblin Bully -C Gorilla Warrior -U Gravedigger -C Grizzly Bears -C Hand of Death -C Hand of Death -R Harsh Justice -C Highland Giant -C Hill Giant -C Horned Turtle -C Howling Fury -U Hulking Cyclops -C Hulking Goblin -R Hurricane -U Ingenious Thief -L Island -L Island -L Island -L Island -C Jungle Lion -C Keen-Eyed Archers -R King's Assassin -C Knight Errant -R Last Chance -C Lava Axe -U Lava Flow -C Lizard Warrior -U Man-o'-War -R Mercenary Knight -C Merfolk of the Pearl Trident -C Mind Knives -C Mind Rot -C Minotaur Warrior -C Mobilize -C Monstrous Growth -C Monstrous Growth -U Moon Sprite -L Mountain -L Mountain -L Mountain -L Mountain -U Mountain Goat -C Muck Rats -U Mystic Denial -R Natural Order -U Natural Spring -R Nature's Cloak -C Nature's Lore -U Nature's Ruin -U Needle Storm -U Noxious Toad -C Omen -C Owl Familiar -C Panther Warriors -C Path of Peace -U Personal Tutor -R Phantom Warrior -R Pillaging Horde -L Plains -L Plains -L Plains -L Plains -U Plant Elemental -R Primeval Force -R Prosperity -R Pyroclasm -C Python -C Raging Cougar -C Raging Goblin -C Raging Goblin -C Raging Minotaur -U Rain of Salt -U Rain of Tears -C Raise Dead -C Redwood Treefolk -C Regal Unicorn -U Renewing Dawn -C Rowan Treefolk -C Sacred Knight -C Sacred Nectar -C Scorching Spear -U Scorching Winds -U Seasoned Marshal -R Serpent Assassin -C Serpent Warrior -C Skeletal Crocodile -C Skeletal Snake -C Snapping Drake -C Sorcerous Sight -C Soul Shred -C Spined Wurm -R Spiritual Guardian -C Spitting Earth -C Spotted Griffin -C Stalking Tiger -U Starlight -U Starlit Angel -C Steadfastness -R Stern Marshal -C Stone Rain -C Storm Crow -R Summer Bloom -L Swamp -L Swamp -L Swamp -L Swamp -R Sylvan Tutor -C Symbol of Unsummoning -R Taunt -R Temporary Truce -U Theft of Dreams -R Thing from the Deep -R Thundering Wurm -R Thundermare -C Tidal Surge -C Time Ebb -C Touch of Brilliance -R Treetop Defense -C Undying Beast -U Untamed Wilds -U Valorous Charge -U Vampiric Feast -C Vampiric Touch -U Venerable Monk -U Vengeance -U Virtue's Ruin -R Volcanic Dragon -C Volcanic Hammer -U Wall of Granite -U Wall of Swords -C Warrior's Charge -C Warrior's Charge -U Whiptail Wurm -R Wicked Pact -C Willow Dryad -C Wind Drake -R Winds of Change -U Winter's Grasp -U Withering Gaze -R Wood Elves -R Wrath of God +1 R Alabaster Dragon +157 R Alluring Scent +158 U Anaconda +158+ U Anaconda +40 R Ancestral Memories +2 C Angelic Blessing +3 R Archangel +4 U Ardent Militia +5 R Armageddon +6 C Armored Pegasus +79 U Arrogant Vampire +80 U Assassin's Blade +41 R Balance of Power +42 U Baleful Stare +159 U Bee Sting +118 U Blaze +118s U Blaze +7 R Blessed Reversal +8 R Blinding Light +81 C Bog Imp +82 C Bog Raiders +83 U Bog Wraith +119 U Boiling Seas +9 C Border Guard +10 C Breath of Life +160 U Bull Hippo +120 C Burning Cloak +43 R Capricious Sorcerer +84 U Charging Bandits +11 U Charging Paladin +161 R Charging Rhino +44 C Cloak of Feathers +45 R Cloud Dragon +46 C Cloud Pirates +47 U Cloud Spirit +48 U Command of Unsummoning +49 C Coral Eel +121 C Craven Giant +85 C Craven Knight +86 R Cruel Bargain +50 R Cruel Fate +87 R Cruel Tutor +51 U Deep-Sea Serpent +162 U Deep Wood +12 U Defiant Stand +53 C Deja Vu +122 U Desert Drake +123 R Devastation +13 C Devoted Hero +52 R Djinn of the Lamp +88 R Dread Charge +89 R Dread Reaper +90 U Dry Spell +124 R Earthquake +91 R Ebon Dragon +163 C Elite Cat Warrior +163+ C Elite Cat Warrior +164 C Elven Cache +165 C Elvish Ranger +92 R Endless Cockroaches +54 R Exhaustion +14 C False Peace +93 C Feral Shadow +94 R Final Strike +125 R Fire Dragon +126 U Fire Imp +127 C Fire Snake +128 R Fire Tempest +129 U Flashfires +15 C Fleet-Footed Monk +55 U Flux +16 C Foot Soldiers +212 L Forest +213 L Forest +214 L Forest +215 L Forest +130 R Forked Lightning +166 C Fruition +56 C Giant Octopus +167 C Giant Spider +17 R Gift of Estates +131 C Goblin Bully +168 C Gorilla Warrior +95 U Gravedigger +169 C Grizzly Bears +96 C Hand of Death +96+ C Hand of Death +18 R Harsh Justice +132 C Highland Giant +133 C Hill Giant +57 C Horned Turtle +97 C Howling Fury +134 U Hulking Cyclops +135 C Hulking Goblin +170 R Hurricane +58 U Ingenious Thief +200 L Island +201 L Island +202 L Island +203 L Island +171 C Jungle Lion +19 C Keen-Eyed Archers +98 R King's Assassin +20 C Knight Errant +136 R Last Chance +137 C Lava Axe +138 U Lava Flow +139 C Lizard Warrior +59 U Man-o'-War +99 R Mercenary Knight +60 C Merfolk of the Pearl Trident +100 C Mind Knives +101 C Mind Rot +140 C Minotaur Warrior +172 C Mobilize +173 C Monstrous Growth +173+ C Monstrous Growth +174 U Moon Sprite +208 L Mountain +209 L Mountain +210 L Mountain +211 L Mountain +141 U Mountain Goat +102 C Muck Rats +61 U Mystic Denial +175 R Natural Order +176 U Natural Spring +177 R Nature's Cloak +178 C Nature's Lore +103 U Nature's Ruin +179 U Needle Storm +104 U Noxious Toad +62 C Omen +63 C Owl Familiar +180 C Panther Warriors +21 C Path of Peace +64 U Personal Tutor +65 R Phantom Warrior +142 R Pillaging Horde +196 L Plains +197 L Plains +198 L Plains +199 L Plains +181 U Plant Elemental +182 R Primeval Force +66 R Prosperity +143 R Pyroclasm +105 C Python +144 C Raging Cougar +145 C Raging Goblin +145+ C Raging Goblin +146 C Raging Minotaur +147 U Rain of Salt +106 U Rain of Tears +107 C Raise Dead +183 C Redwood Treefolk +22 C Regal Unicorn +23 U Renewing Dawn +184 C Rowan Treefolk +24 C Sacred Knight +25 C Sacred Nectar +148 C Scorching Spear +149 U Scorching Winds +26 U Seasoned Marshal +108 R Serpent Assassin +109 C Serpent Warrior +110 C Skeletal Crocodile +111 C Skeletal Snake +67 C Snapping Drake +68 C Sorcerous Sight +112 C Soul Shred +185 C Spined Wurm +27 R Spiritual Guardian +150 C Spitting Earth +28 C Spotted Griffin +186 C Stalking Tiger +29 U Starlight +30 U Starlit Angel +31 C Steadfastness +32 R Stern Marshal +151 C Stone Rain +69 C Storm Crow +187 R Summer Bloom +204 L Swamp +205 L Swamp +206 L Swamp +207 L Swamp +188 R Sylvan Tutor +70 C Symbol of Unsummoning +71 R Taunt +33 R Temporary Truce +72 U Theft of Dreams +73 R Thing from the Deep +189 R Thundering Wurm +152 R Thundermare +74 C Tidal Surge +75 C Time Ebb +76 C Touch of Brilliance +190 R Treetop Defense +113 C Undying Beast +191 U Untamed Wilds +34 U Valorous Charge +114 U Vampiric Feast +115 C Vampiric Touch +35 U Venerable Monk +36 U Vengeance +116 U Virtue's Ruin +153 R Volcanic Dragon +154 C Volcanic Hammer +155 U Wall of Granite +37 U Wall of Swords +38 C Warrior's Charge +38+ C Warrior's Charge +192 U Whiptail Wurm +117 R Wicked Pact +193 C Willow Dryad +77 C Wind Drake +156 R Winds of Change +194 U Winter's Grasp +78 U Withering Gaze +195 R Wood Elves +39 R Wrath of God diff --git a/forge-gui/res/editions/Promo set for Gatherer.txt b/forge-gui/res/editions/Promo set for Gatherer.txt index 52227864c1e..67af01e10cc 100644 --- a/forge-gui/res/editions/Promo set for Gatherer.txt +++ b/forge-gui/res/editions/Promo set for Gatherer.txt @@ -8,30 +8,30 @@ MciCode=mbp Type=Other [cards] -1 S Arena -R Avatar of Hope -R Beast of Burden -R Dirtcowl Wurm -R False Prophet -R Feral Throwback -R Fungal Shambler -8 S Giant Badger -R Glory -R Helm of Kaldra -R Laquatus's Champion -R Lightning Dragon -6 S Mana Crypt -R Monstrous Hound -3 S Nalathni Dragon -R Overtaker -R Questing Phelddagrif -R Raging Kavu -R Rathi Assassin -R Revenant -R Ryusei, the Falling Star -2 S Sewers of Estark -R Shield of Kaldra -R Silent Specter -R Soul Collector -R Sword of Kaldra -7 S Windseeker Centaur +35958 S Arena +32206 R Avatar of Hope +32198 R Beast of Burden +32190 R Dirtcowl Wurm +32200 R False Prophet +36256 R Feral Throwback +36236 R Fungal Shambler +35960 S Giant Badger +36248 R Glory +31989 R Helm of Kaldra +37875 R Laquatus's Champion +32196 R Lightning Dragon +35962 S Mana Crypt +32194 R Monstrous Hound +35956 S Nalathni Dragon +32202 R Overtaker +36234 R Questing Phelddagrif +36206 R Raging Kavu +32204 R Rathi Assassin +32192 R Revenant +32001 R Ryusei, the Falling Star +35964 R Sewers of Estark +31985 R Shield of Kaldra +36252 R Silent Specter +36268 R Soul Collector +31987 R Sword of Kaldra +35966 S Windseeker Centaur diff --git a/forge-gui/res/editions/Resale Promos.txt b/forge-gui/res/editions/Resale Promos.txt index c2d1fb63b54..16a1a022be8 100644 --- a/forge-gui/res/editions/Resale Promos.txt +++ b/forge-gui/res/editions/Resale Promos.txt @@ -23,6 +23,8 @@ Type=Promos 49 R Curator of Mysteries 100 R Etali, Primal Storm 123 R Beast Whisperer +133 R Opportunistic Dragon +140 R Neheb, Dreadhorde Champion 141 R Goblin Chieftain 147 R Bristling Hydra 149 R Atarka, World Render diff --git a/forge-gui/res/editions/Revised Edition.txt b/forge-gui/res/editions/Revised Edition.txt index ccc051bebe1..f5176a06244 100644 --- a/forge-gui/res/editions/Revised Edition.txt +++ b/forge-gui/res/editions/Revised Edition.txt @@ -12,312 +12,312 @@ Foil=NotSupported ChaosDraftThemes=CORE_SET [cards] -U Air Elemental -R Aladdin's Lamp -R Aladdin's Ring -U Animate Artifact -U Animate Dead -R Animate Wall -R Ankh of Mishra -R Armageddon -R Armageddon Clock -R Aspect of Wolf -C Atog -R Bad Moon -R Badlands -R Balance -U Basalt Monolith -R Bayou -C Benalish Hero -R Birds of Paradise -U Black Knight -U Black Vise -U Black Ward -R Blessing -C Blue Elemental Blast -U Blue Ward -U Bog Wraith -R Bottle of Suleiman -R Braingeyser -U Brass Man -U Burrowing -U Castle -U Celestial Prism -U Channel -R Chaoslace -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -R Clockwork Beast -U Clone -R Cockatrice -U Conservator -R Contract from Below -U Control Magic -U Conversion -R Copy Artifact -U Counterspell -C Craw Wurm -C Creature Bond -U Crumble -R Crusade -U Crystal Rod -U Cursed Land -R Dancing Scimitar -C Dark Ritual -R Darkpact -C Death Ward -U Deathgrip -R Deathlace -R Demonic Attorney -R Demonic Hordes -U Demonic Tutor -U Desert Twister -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -R Dragon Engine -U Dragon Whelp -C Drain Life -R Drain Power -C Drudge Skeletons -C Dwarven Warriors -U Dwarven Weaponsmith -U Earth Elemental -C Earthbind -R Earthquake -R Ebony Horse -R El-Hajjaj -R Elvish Archers -U Energy Flux -C Erg Raiders -U Evil Presence -R Eye for an Eye -R Farmstead -R Fastbond -C Fear -U Feedback -U Fire Elemental -C Fireball -C Firebreathing -U Flashfires -C Flight -R Flying Carpet -C Fog -R Force of Nature -L Forest -L Forest -L Forest -R Fork -C Frozen Shade -R Fungusaur -R Gaea's Liege -C Giant Growth -C Giant Spider -U Glasses of Urza -U Gloom -U Goblin Balloon Brigade -R Goblin King -R Granite Gargoyle -C Gray Ogre -U Green Ward -C Grizzly Bears -C Guardian Angel -C Healing Salve -R Helm of Chatzuk -C Hill Giant -C Holy Armor -C Holy Strength -C Howl from Beyond -R Howling Mine -R Hurkyl's Recall -C Hurloon Minotaur -U Hurricane -U Hypnotic Specter -U Instill Energy -U Iron Star -C Ironroot Treefolk -L Island -L Island -L Island -R Island Fish Jasconius -R Island Sanctuary -U Ivory Cup -R Ivory Tower -R Jade Monolith -R Jandor's Ring -R Jandor's Saddlebags -R Jayemdae Tome -U Juggernaut -C Jump -U Karma -U Keldon Warlord -C Kird Ape -R Kormus Bell -R Kudzu -U Lance -U Ley Druid -U Library of Leng -U Lifeforce -R Lifelace -U Lifetap -C Lightning Bolt -R Living Artifact -R Living Lands -U Living Wall -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -U Lure -R Magical Hack -R Magnetic Mountain -R Mahamoti Djinn -R Mana Flare -R Mana Short -R Mana Vault -R Manabarbs -R Meekstone -C Merfolk of the Pearl Trident -C Mesa Pegasus -R Mijae Djinn -R Millstone -R Mind Twist -R Mishra's War Machine -C Mons's Goblin Raiders -L Mountain -L Mountain -L Mountain -R Nether Shadow -U Nettling Imp -R Nevinyrral's Disk -R Nightmare -R Northern Paladin -U Obsianus Golem -R Onulet -U Orcish Artillery -U Orcish Oriflamme -U Ornithopter -C Paralyze -C Pearled Unicorn -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -R Pirate Ship -C Plague Rats -L Plains -L Plains -L Plains -R Plateau -C Power Leak -C Power Sink -R Power Surge -R Primal Clay -C Prodigal Sorcerer -C Psychic Venom -R Purelace -C Raise Dead -C Reconstruction -C Red Elemental Blast -U Red Ward -C Regeneration -U Regrowth -U Resurrection -R Reverse Damage -U Reverse Polarity -R Righteousness -R Roc of Kher Ridges -R Rock Hydra -R Rocket Launcher -U Rod of Ruin -R Royal Assassin -U Sacrifice -C Samite Healer -R Savannah -R Savannah Lions -C Scathe Zombies -U Scavenging Ghoul -R Scrubland -C Scryb Sprites -C Sea Serpent -R Sedge Troll -U Sengir Vampire -R Serendib Efreet -U Serra Angel -C Shanodin Dryads -C Shatter -U Shatterstorm -R Shivan Dragon -U Simulacrum -U Siren's Call -R Sleight of Mind -R Smoke -U Sol Ring -R Sorceress Queen -U Soul Net -C Spell Blast -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -C Stream of Life -R Sunglasses of Urza -L Swamp -L Swamp -L Swamp -U Swords to Plowshares -R Taiga -C Terror -R The Hive -U The Rack -U Thicket Basilisk -R Thoughtlace -U Throne of Bone -R Timber Wolves -R Titania's Song -C Tranquility -R Tropical Island -U Tsunami -R Tundra -U Tunnel -R Underground Sea -C Unholy Strength -C Unstable Mutation -C Unsummon -U Uthden Troll -R Verduran Enchantress -R Vesuvan Doppelganger -R Veteran Bodyguard -R Volcanic Eruption -R Volcanic Island -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Fire -U Wall of Ice -U Wall of Stone -U Wall of Swords -U Wall of Water -C Wall of Wood -U Wanderlust -C War Mammoth -R Warp Artifact -U Water Elemental -C Weakness -R Web -R Wheel of Fortune -U White Knight -U White Ward -C Wild Growth -R Will-o'-the-Wisp -R Winter Orb -U Wooden Sphere -R Wrath of God -R Zombie Master +47 U Air Elemental +231 R Aladdin's Lamp +232 R Aladdin's Ring +48 U Animate Artifact +93 U Animate Dead +1 R Animate Wall +233 R Ankh of Mishra +2 R Armageddon +234 R Armageddon Clock +186 R Aspect of Wolf +139 C Atog +282 R Badlands +94 R Bad Moon +3 R Balance +235 U Basalt Monolith +283 R Bayou +4 C Benalish Hero +187 R Birds of Paradise +95 U Black Knight +236 U Black Vise +5 U Black Ward +6 R Blessing +49 C Blue Elemental Blast +7 U Blue Ward +96 U Bog Wraith +237 R Bottle of Suleiman +50 R Braingeyser +238 U Brass Man +140 U Burrowing +8 U Castle +239 U Celestial Prism +188 U Channel +141 R Chaoslace +9 C Circle of Protection: Black +10 C Circle of Protection: Blue +11 C Circle of Protection: Green +12 C Circle of Protection: Red +13 C Circle of Protection: White +240 R Clockwork Beast +51 U Clone +189 R Cockatrice +241 U Conservator +97 R Contract from Below +52 U Control Magic +14 U Conversion +53 R Copy Artifact +54 U Counterspell +190 C Craw Wurm +55 C Creature Bond +191 U Crumble +15 R Crusade +242 U Crystal Rod +98 U Cursed Land +243 R Dancing Scimitar +100 R Darkpact +99 C Dark Ritual +101 U Deathgrip +102 R Deathlace +16 C Death Ward +103 R Demonic Attorney +104 R Demonic Hordes +105 U Demonic Tutor +192 U Desert Twister +244 R Dingus Egg +17 C Disenchant +142 C Disintegrate +245 R Disrupting Scepter +246 R Dragon Engine +143 U Dragon Whelp +106 C Drain Life +56 R Drain Power +107 C Drudge Skeletons +144 C Dwarven Warriors +145 U Dwarven Weaponsmith +147 C Earthbind +146 U Earth Elemental +148 R Earthquake +247 R Ebony Horse +108 R El-Hajjaj +193 R Elvish Archers +57 U Energy Flux +109 C Erg Raiders +110 U Evil Presence +18 R Eye for an Eye +19 R Farmstead +194 R Fastbond +111 C Fear +58 U Feedback +150 C Fireball +151 C Firebreathing +149 U Fire Elemental +152 U Flashfires +59 C Flight +248 R Flying Carpet +195 C Fog +196 R Force of Nature +304 L Forest +305 L Forest +306 L Forest +153 R Fork +112 C Frozen Shade +197 R Fungusaur +198 R Gaea's Liege +199 C Giant Growth +200 C Giant Spider +249 U Glasses of Urza +113 U Gloom +154 U Goblin Balloon Brigade +155 R Goblin King +156 R Granite Gargoyle +157 C Gray Ogre +20 U Green Ward +201 C Grizzly Bears +21 C Guardian Angel +22 C Healing Salve +250 R Helm of Chatzuk +158 C Hill Giant +23 C Holy Armor +24 C Holy Strength +114 C Howl from Beyond +251 R Howling Mine +60 R Hurkyl's Recall +159 C Hurloon Minotaur +202 U Hurricane +115 U Hypnotic Specter +203 U Instill Energy +204 C Ironroot Treefolk +252 U Iron Star +295 L Island +296 L Island +297 L Island +61 R Island Fish Jasconius +25 R Island Sanctuary +253 U Ivory Cup +254 R Ivory Tower +255 R Jade Monolith +256 R Jandor's Ring +257 R Jandor's Saddlebags +258 R Jayemdae Tome +259 U Juggernaut +62 C Jump +26 U Karma +160 U Keldon Warlord +161 C Kird Ape +260 R Kormus Bell +205 R Kudzu +27 U Lance +206 U Ley Druid +261 U Library of Leng +207 U Lifeforce +208 R Lifelace +63 U Lifetap +162 C Lightning Bolt +209 R Living Artifact +210 R Living Lands +262 U Living Wall +211 C Llanowar Elves +64 R Lord of Atlantis +116 R Lord of the Pit +212 U Lure +65 R Magical Hack +163 R Magnetic Mountain +66 R Mahamoti Djinn +165 R Manabarbs +164 R Mana Flare +67 R Mana Short +263 R Mana Vault +264 R Meekstone +68 C Merfolk of the Pearl Trident +28 C Mesa Pegasus +166 R Mijae Djinn +265 R Millstone +117 R Mind Twist +266 R Mishra's War Machine +167 C Mons's Goblin Raiders +301 L Mountain +302 L Mountain +303 L Mountain +118 R Nether Shadow +119 U Nettling Imp +267 R Nevinyrral's Disk +120 R Nightmare +29 R Northern Paladin +268 U Obsianus Golem +269 R Onulet +168 U Orcish Artillery +169 U Orcish Oriflamme +270 U Ornithopter +121 C Paralyze +30 C Pearled Unicorn +31 R Personal Incarnation +122 C Pestilence +69 U Phantasmal Forces +70 C Phantasmal Terrain +71 U Phantom Monster +72 R Pirate Ship +123 C Plague Rats +292 L Plains +293 L Plains +294 L Plains +284 R Plateau +73 C Power Leak +74 C Power Sink +170 R Power Surge +271 R Primal Clay +75 C Prodigal Sorcerer +76 C Psychic Venom +32 R Purelace +124 C Raise Dead +77 C Reconstruction +171 C Red Elemental Blast +33 U Red Ward +213 C Regeneration +214 U Regrowth +34 U Resurrection +35 R Reverse Damage +36 U Reverse Polarity +37 R Righteousness +272 R Rocket Launcher +173 R Rock Hydra +172 R Roc of Kher Ridges +273 U Rod of Ruin +125 R Royal Assassin +126 U Sacrifice +38 C Samite Healer +285 R Savannah +39 R Savannah Lions +127 C Scathe Zombies +128 U Scavenging Ghoul +286 R Scrubland +215 C Scryb Sprites +78 C Sea Serpent +174 R Sedge Troll +129 U Sengir Vampire +79 R Serendib Efreet +40 U Serra Angel +216 C Shanodin Dryads +175 C Shatter +176 U Shatterstorm +177 R Shivan Dragon +130 U Simulacrum +80 U Siren's Call +81 R Sleight of Mind +178 R Smoke +274 U Sol Ring +131 R Sorceress Queen +275 U Soul Net +82 C Spell Blast +83 R Stasis +84 U Steal Artifact +179 U Stone Giant +180 C Stone Rain +217 C Stream of Life +276 R Sunglasses of Urza +298 L Swamp +299 L Swamp +300 L Swamp +41 U Swords to Plowshares +287 R Taiga +132 C Terror +277 R The Hive +278 U The Rack +218 U Thicket Basilisk +85 R Thoughtlace +279 U Throne of Bone +219 R Timber Wolves +220 R Titania's Song +221 C Tranquility +288 R Tropical Island +222 U Tsunami +289 R Tundra +181 U Tunnel +290 R Underground Sea +133 C Unholy Strength +86 C Unstable Mutation +87 C Unsummon +182 U Uthden Troll +223 R Verduran Enchantress +88 R Vesuvan Doppelganger +42 R Veteran Bodyguard +89 R Volcanic Eruption +291 R Volcanic Island +90 U Wall of Air +134 U Wall of Bone +224 U Wall of Brambles +183 U Wall of Fire +225 U Wall of Ice +184 U Wall of Stone +43 U Wall of Swords +91 U Wall of Water +226 C Wall of Wood +227 U Wanderlust +228 C War Mammoth +135 R Warp Artifact +92 U Water Elemental +136 C Weakness +229 R Web +185 R Wheel of Fortune +44 U White Knight +45 U White Ward +230 C Wild Growth +137 R Will-o'-the-Wisp +280 R Winter Orb +281 U Wooden Sphere +46 R Wrath of God +138 R Zombie Master [tokens] wasp diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index e21e5e4a3a4..4e89abf2ef4 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -58,11 +58,11 @@ Type=Other 60 R Storm Crow 61 R Goblin Snowman 62 R Mudhole -63 L Plains -64 L Island -65 L Swamp -66 L Mountain -67 L Forest +63 R Plains +64 R Island +65 R Swamp +66 R Mountain +67 R Forest 68 M Heliod, God of the Sun 69 M Karametra, God of Harvests 70 M Iroas, God of Victory @@ -240,6 +240,47 @@ Type=Other 537 M Tibalt, the Fiend-Blooded 538 R Evolving Wilds 539 R Swamp +540 C Plains +541 C Plains +542 C Plains +543 C Plains +544 C Plains +545 C Plains +546 C Plains +547 C Plains +548 C Island +549 C Island +550 C Island +551 C Island +552 C Island +553 C Island +554 C Island +555 C Island +556 C Swamp +557 C Swamp +558 C Swamp +559 C Swamp +560 C Swamp +561 C Swamp +562 C Swamp +563 C Swamp +564 C Mountain +565 C Mountain +566 C Mountain +567 C Mountain +568 C Mountain +569 C Mountain +570 C Mountain +571 C Mountain +572 C Forest +573 C Forest +574 C Forest +575 C Forest +576 C Forest +577 C Forest +578 C Forest +579 C Forest + 581 M Lucille [tokens] diff --git a/forge-gui/res/editions/Secret Lair Ultimate Edition.txt b/forge-gui/res/editions/Secret Lair Ultimate Edition.txt index b44d4929a11..d41079080d7 100644 --- a/forge-gui/res/editions/Secret Lair Ultimate Edition.txt +++ b/forge-gui/res/editions/Secret Lair Ultimate Edition.txt @@ -20,3 +20,4 @@ Type=Reprint 18 R Hengegate Pathway 19 R Needleverge Pathway 20 R Riverglide Pathway +404 R Blast Zone diff --git a/forge-gui/res/editions/Shattered Chains.txt b/forge-gui/res/editions/Shattered Chains.txt index 56ec0af74a5..f8f9d2dd9ea 100644 --- a/forge-gui/res/editions/Shattered Chains.txt +++ b/forge-gui/res/editions/Shattered Chains.txt @@ -5,4 +5,4 @@ Name=Shattered Chains Type=Other [cards] -C Giant Badger \ No newline at end of file +4 C Giant Badger \ No newline at end of file diff --git a/forge-gui/res/editions/Starter 2000.txt b/forge-gui/res/editions/Starter 2000.txt index 5f8cd5b2ea3..b31b0fc2e27 100644 --- a/forge-gui/res/editions/Starter 2000.txt +++ b/forge-gui/res/editions/Starter 2000.txt @@ -10,60 +10,60 @@ Foil=OldStyle FoilAlwaysInCommonSlot=False [cards] -C Angelic Blessing -C Armored Pegasus -C Bog Imp -U Breath of Life -C Coercion -C Counterspell -C Disenchant -C Drudge Skeletons -C Durkwood Boars -C Eager Cadet -C Flame Spirit -C Flight -L Forest -L Forest -C Giant Growth -C Giant Octopus -C Goblin Hero -C Hand of Death -C Hero's Resolve -C Inspiration -L Island -L Island -C Knight Errant -C Lava Axe -C Llanowar Elves -C Merfolk of the Pearl Trident -C Mons's Goblin Raiders -C Monstrous Growth -U Moon Sprite -L Mountain -L Mountain -U Obsianus Golem -C Ogre Warrior -U Orcish Oriflamme -L Plains -L Plains -C Prodigal Sorcerer -C Python -U Rod of Ruin -C Royal Falcon -C Samite Healer -C Scathe Zombies -C Sea Eagle -C Shock -U Soul Net -C Spined Wurm -C Stone Rain -L Swamp -L Swamp -C Terror -C Time Ebb -R Trained Orgg -C Venerable Monk -R Vizzerdrix -C Wild Griffin -C Willow Elf -C Wind Drake +1 C Angelic Blessing +2 C Armored Pegasus +3 C Bog Imp +4 U Breath of Life +5 C Coercion +6 C Counterspell +7 C Disenchant +8 C Drudge Skeletons +9 C Durkwood Boars +10 C Eager Cadet +11 C Flame Spirit +12 C Flight +13 L Forest +14 L Forest +15 C Giant Growth +16 C Giant Octopus +17 C Goblin Hero +18 C Hand of Death +19 C Hero's Resolve +20 C Inspiration +21 L Island +22 L Island +23 C Knight Errant +24 C Lava Axe +25 C Llanowar Elves +26 C Merfolk of the Pearl Trident +27 C Mons's Goblin Raiders +28 C Monstrous Growth +29 U Moon Sprite +30 L Mountain +31 L Mountain +32 U Obsianus Golem +33 C Ogre Warrior +34 U Orcish Oriflamme +35 L Plains +36 L Plains +37 C Prodigal Sorcerer +38 C Python +39 U Rod of Ruin +40 C Royal Falcon +41 C Samite Healer +42 C Scathe Zombies +43 C Sea Eagle +44 C Shock +45 U Soul Net +46 C Spined Wurm +47 C Stone Rain +48 L Swamp +49 L Swamp +50 C Terror +51 C Time Ebb +52 R Trained Orgg +53 C Venerable Monk +54 R Vizzerdrix +55 C Wild Griffin +56 C Willow Elf +57 C Wind Drake diff --git a/forge-gui/res/editions/Stronghold.txt b/forge-gui/res/editions/Stronghold.txt index 5af90e1b4a1..8c848f31465 100644 --- a/forge-gui/res/editions/Stronghold.txt +++ b/forge-gui/res/editions/Stronghold.txt @@ -10,149 +10,149 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U Acidic Sliver -R Amok -R Awakening -C Bandage -U Bottomless Pit -C Brush with Death -U Bullwhip -R Burgeoning -U Calming Licid -C Cannibalize -R Carnassid -C Change of Heart -C Cloud Spirit -U Constant Mists -U Contemplation -C Contempt -C Conviction -U Convulsing Licid -U Corrupting Licid -C Craven Giant -C Crossbow Ambush -R Crovax the Cursed -U Crystalline Sliver -U Dauthi Trapper -C Death Stroke -R Dream Halls -C Dream Prowler -C Duct Crawler -C Dungeon Shade -U Elven Rite -C Endangered Armodon -R Ensnaring Bridge -R Evacuation -U Fanning the Flames -U Flame Wave -C Fling -C Flowstone Blade -U Flowstone Hellion -R Flowstone Mauler -C Flowstone Shambler -C Foul Imp -C Furnace Spirit -U Gliding Licid -R Grave Pact -C Hammerhead Shark -U Heartstone -U Heat of Battle -R Hermit Druid -U Hesitation -U Hibernation Sliver -R Hidden Retreat -C Honor Guard -R Horn of Greed -U Hornet Cannon -R Intruder Alarm -R Invasion Plans -R Jinxed Ring -C Lab Rats -U Lancers en-Kor -C Leap -C Lowland Basilisk -C Mana Leak -U Mask of the Mimic -U Megrim -C Mind Games -U Mind Peel -R Mindwarper -C Mob Justice -C Mogg Bombers -C Mogg Flunkies -R Mogg Infestation -U Mogg Maniac -C Morgue Thrull -R Mortuary -R Mox Diamond -C Mulch -C Nomads en-Kor -C Overgrowth -R Portcullis -U Primal Rage -C Provoke -R Pursuit of Knowledge -C Rabid Rats -U Ransack -U Rebound -R Reins of Power -R Revenant -R Rolling Stones -R Ruination -R Sacred Ground -C Samite Blessing -U Scapegoat -C Seething Anger -C Serpent Warrior -R Shaman en-Kor -R Shard Phoenix -U Shifting Wall -C Shock -C Sift -R Silver Wyvern -R Skeleton Scavengers -C Skyshroud Archer -C Skyshroud Falcon -C Skyshroud Troopers -R Sliver Queen -C Smite -R Soltari Champion -R Spike Breeder -C Spike Colony -U Spike Feeder -U Spike Soldier -C Spike Worker -C Spindrift Drake -U Spined Sliver -C Spined Wurm -C Spirit en-Kor -R Spitting Hydra -R Stronghold Assassin -U Stronghold Taskmaster -R Sword of the Chosen -U Temper -U Tempting Licid -R Thalakos Deceiver -C Tidal Surge -C Tidal Warrior -C Torment -C Tortured Existence -C Venerable Monk -R Verdant Touch -U Victual Sliver -R Volrath's Gardens -R Volrath's Laboratory -R Volrath's Shapeshifter -R Volrath's Stronghold -U Walking Dream -U Wall of Blossoms -U Wall of Essence -U Wall of Razors -U Wall of Souls -U Wall of Tears -R Warrior Angel -U Warrior en-Kor -C Youthful Knight +126 U Acidic Sliver +76 R Amok +101 R Awakening +1 C Bandage +51 U Bottomless Pit +52 C Brush with Death +132 U Bullwhip +102 R Burgeoning +2 U Calming Licid +53 C Cannibalize +103 R Carnassid +3 C Change of Heart +26 C Cloud Spirit +104 U Constant Mists +4 U Contemplation +27 C Contempt +5 C Conviction +77 U Convulsing Licid +54 U Corrupting Licid +78 C Craven Giant +105 C Crossbow Ambush +55 R Crovax the Cursed +127 U Crystalline Sliver +56 U Dauthi Trapper +57 C Death Stroke +28 R Dream Halls +29 C Dream Prowler +79 C Duct Crawler +58 C Dungeon Shade +106 U Elven Rite +107 C Endangered Armodon +133 R Ensnaring Bridge +30 R Evacuation +80 U Fanning the Flames +81 U Flame Wave +82 C Fling +83 C Flowstone Blade +84 U Flowstone Hellion +85 R Flowstone Mauler +86 C Flowstone Shambler +59 C Foul Imp +87 C Furnace Spirit +31 U Gliding Licid +60 R Grave Pact +32 C Hammerhead Shark +134 U Heartstone +88 U Heat of Battle +108 R Hermit Druid +33 U Hesitation +128 U Hibernation Sliver +6 R Hidden Retreat +7 C Honor Guard +136 U Hornet Cannon +135 R Horn of Greed +34 R Intruder Alarm +89 R Invasion Plans +137 R Jinxed Ring +61 C Lab Rats +8 U Lancers en-Kor +35 C Leap +109 C Lowland Basilisk +36 C Mana Leak +37 U Mask of the Mimic +62 U Megrim +38 C Mind Games +63 U Mind Peel +64 R Mindwarper +90 C Mob Justice +91 C Mogg Bombers +92 C Mogg Flunkies +93 R Mogg Infestation +94 U Mogg Maniac +65 C Morgue Thrull +66 R Mortuary +138 R Mox Diamond +110 C Mulch +9 C Nomads en-Kor +111 C Overgrowth +139 R Portcullis +112 U Primal Rage +113 C Provoke +10 R Pursuit of Knowledge +67 C Rabid Rats +39 U Ransack +40 U Rebound +41 R Reins of Power +68 R Revenant +11 R Rolling Stones +95 R Ruination +12 R Sacred Ground +13 C Samite Blessing +14 U Scapegoat +96 C Seething Anger +69 C Serpent Warrior +15 R Shaman en-Kor +97 R Shard Phoenix +140 U Shifting Wall +98 C Shock +42 C Sift +43 R Silver Wyvern +70 R Skeleton Scavengers +114 C Skyshroud Archer +16 C Skyshroud Falcon +115 C Skyshroud Troopers +129 R Sliver Queen +17 C Smite +18 R Soltari Champion +116 R Spike Breeder +117 C Spike Colony +118 U Spike Feeder +119 U Spike Soldier +120 C Spike Worker +44 C Spindrift Drake +130 U Spined Sliver +121 C Spined Wurm +19 C Spirit en-Kor +99 R Spitting Hydra +71 R Stronghold Assassin +72 U Stronghold Taskmaster +141 R Sword of the Chosen +20 U Temper +122 U Tempting Licid +45 R Thalakos Deceiver +46 C Tidal Surge +47 C Tidal Warrior +73 C Torment +74 C Tortured Existence +21 C Venerable Monk +123 R Verdant Touch +131 U Victual Sliver +124 R Volrath's Gardens +142 R Volrath's Laboratory +48 R Volrath's Shapeshifter +143 R Volrath's Stronghold +49 U Walking Dream +125 U Wall of Blossoms +22 U Wall of Essence +100 U Wall of Razors +75 U Wall of Souls +50 U Wall of Tears +24 R Warrior Angel +23 U Warrior en-Kor +25 C Youthful Knight [tokens] hornet diff --git a/forge-gui/res/editions/Tempest.txt b/forge-gui/res/editions/Tempest.txt index 1e7246811c2..f409b49e97f 100644 --- a/forge-gui/res/editions/Tempest.txt +++ b/forge-gui/res/editions/Tempest.txt @@ -10,356 +10,356 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -U Abandon Hope -C Advance Scout -C Aftershock -R Altar of Dementia -R Aluren -U Ancient Runes -U Ancient Tomb -U Angelic Protector -C Anoint -U Apes of Rath -R Apocalypse -U Armor Sliver -C Armored Pegasus -R Auratog -R Avenging Angel -U Barbed Sliver -C Bayou Dragonfly -R Bellowing Fiend -R Benthic Behemoth -C Blood Frenzy -C Blood Pet -U Boil -R Booby Trap -U Bottle Gnomes -R Bounty Hunter -C Broken Fall -R Caldera Lake -C Canopy Spider -R Canyon Drake -C Canyon Wildcat -C Capsize -R Carrionette -R Chaotic Goo -U Charging Rhino -U Chill -U Choke -U Cinder Marsh -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: Shadow -C Circle of Protection: White -C Clergy en-Vec -C Clot Sliver -C Cloudchaser Eagle -C Coercion -R Coffin Queen -C Coiled Tinviper -R Cold Storage -R Commander Greven il-Vec -R Corpse Dance -C Counterspell -R Crazed Armodon -C Crown of Flames -R Cursed Scroll -C Dark Banishing -C Dark Ritual -C Darkling Stalker -U Dauthi Embrace -U Dauthi Ghoul -C Dauthi Horror -C Dauthi Marauder -U Dauthi Mercenary -U Dauthi Mindripper -C Dauthi Slayer -R Deadshot -R Death Pits of Rath -C Diabolic Edict -R Dirtcowl Wurm -C Disenchant -U Dismiss -C Disturbed Burial -R Dracoplasm -U Dread of Night -C Dream Cache -R Dregs of Sorrow -R Duplicity -R Earthcraft -R Echo Chamber -R Eladamri's Vineyard -R Eladamri, Lord of Leaves -C Elite Javelineer -R Elven Warhounds -C Elvish Fury -R Emerald Medallion -R Emmessi Tome -C Endless Scream -R Energizer -C Enfeeblement -U Enraging Licid -R Ertai's Meddling -R Escaped Shapeshifter -U Essence Bottle -C Evincar's Justice -U Excavator -R Extinction -R Fevered Convulsions -R Field of Souls -U Fighting Drake -U Firefly -C Fireslinger -U Flailing Drake -U Flickering Ward -C Flowstone Giant -U Flowstone Salamander -R Flowstone Sculpture -R Flowstone Wyvern -R Fool's Tome -L Forest -L Forest -L Forest -L Forest -C Frog Tongue -R Fugitive Druid -R Furnace of Rath -U Fylamarid -U Gallantry -C Gaseous Form -R Gerrard's Battle Cry -U Ghost Town -C Giant Crab -C Giant Strength -U Goblin Bombardment -C Gravedigger -R Grindstone -R Hand to Hand -R Hanna's Custody -U Harrow -U Havoc -C Heart Sliver -C Heartwood Dryad -R Heartwood Giant -U Heartwood Treefolk -R Helm of Possession -C Hero's Resolve -U Horned Sliver -C Horned Turtle -R Humility -U Imps' Taunt -U Insight -U Interdict -R Intuition -U Invulnerability -L Island -L Island -L Island -L Island -U Jackal Pup -R Jet Medallion -R Jinxed Idol -R Kezzerdrix -C Kindle -U Knight of Dawn -U Knight of Dusk -U Krakilin -U Leeching Licid -U Legacy's Allure -U Legerdemain -U Light of Day -C Lightning Blast -C Lightning Elemental -R Living Death -U Lobotomy -C Lotus Petal -C Lowland Giant -R Maddening Imp -R Magmasaur -R Magnetic Web -R Mana Severance -C Manakin -C Manta Riders -R Marble Titan -C Marsh Lurker -C Master Decoy -R Mawcor -U Maze of Shadows -R Meditate -C Metallic Sliver -U Mindwhip Sliver -R Minion of the Wastes -R Mirri's Guile -U Mnemonic Sliver -U Mogg Cannon -C Mogg Conscripts -C Mogg Fanatic -U Mogg Hollows -C Mogg Raider -U Mogg Squad -R Mongrel Pack -L Mountain -L Mountain -L Mountain -L Mountain -C Mounted Archers -C Muscle Sliver -C Natural Spring -R Nature's Revolt -U Needle Storm -R No Quarter -U Nurturing Licid -U Opportunist -R Oracle en-Vec -U Orim's Prayer -R Orim, Samite Healer -U Overrun -C Pacifism -R Pallimud -U Patchwork Gnomes -R Pearl Medallion -R Pegasus Refuge -U Perish -R Phyrexian Grimoire -U Phyrexian Hulk -U Phyrexian Splicer -C Pincher Beetles -R Pine Barrens -C Pit Imp -L Plains -L Plains -L Plains -L Plains -C Power Sink -R Precognition -U Propaganda -U Puppet Strings -U Quickening Licid -U Rain of Tears -C Rampant Growth -U Ranger en-Vec -R Rathi Dragon -C Rats of Rath -C Reality Anchor -U Reanimate -U Reap -U Reckless Spite -R Recycle -R Reflecting Pool -U Renegade Warlord -U Repentance -C Respite -C Rolling Thunder -R Root Maze -C Rootbreaker Wurm -C Rootwalla -U Rootwater Depths -U Rootwater Diver -C Rootwater Hunter -R Rootwater Matriarch -R Rootwater Shaman -R Ruby Medallion -R Sacred Guide -C Sadistic Glee -R Safeguard -R Salt Flats -C Sandstone Warrior -R Sapphire Medallion -R Sarcomancy -R Scabland -R Scalding Tongs -R Scorched Earth -U Scragnoth -U Screeching Harpy -R Scroll Rack -C Sea Monster -U Searing Touch -C Seeker of Skybreak -U Segmented Wurm -R Selenia, Dark Angel -U Serene Offering -C Servant of Volrath -C Shadow Rift -U Shadowstorm -C Shatter -C Shimmering Wings -R Shocker -U Sky Spirit -U Skyshroud Condor -C Skyshroud Elf -R Skyshroud Forest -C Skyshroud Ranger -C Skyshroud Troll -U Skyshroud Vampire -U Soltari Crusader -R Soltari Emissary -C Soltari Foot Soldier -R Soltari Guerrillas -C Soltari Lancer -U Soltari Monk -U Soltari Priest -C Soltari Trooper -U Souldrinker -C Spell Blast -C Spike Drone -C Spinal Graft -R Spirit Mirror -U Spontaneous Combustion -C Squee's Toy -U Stalking Stones -R Starke of Rath -R Static Orb -U Staunch Defenders -U Steal Enchantment -U Stinging Licid -C Stone Rain -U Storm Front -C Stun -U Sudden Impact -L Swamp -L Swamp -L Swamp -L Swamp -U Tahngarth's Rage -C Talon Sliver -U Telethopter -U Thalakos Dreamsower -U Thalakos Lowlands -C Thalakos Mistfolk -C Thalakos Seer -C Thalakos Sentry -R Thumbscrews -C Time Ebb -R Time Warp -R Tooth and Claw -R Torture Chamber -R Tradewind Rider -C Trained Armodon -C Tranquility -U Trumpeting Armodon -C Twitch -R Unstable Shapeshifter -U Vec Townships -R Verdant Force -U Verdigris -R Vhati il-Dal -C Volrath's Curse -C Wall of Diffusion -U Warmth -U Wasteland -U Watchdog -R Whim of Volrath -U Whispers of the Muse -U Wild Wurm -U Wind Dancer -C Wind Drake -R Winds of Rath -C Winged Sliver -U Winter's Grasp -R Wood Sage -U Worthy Cause +107 U Abandon Hope +1 C Advance Scout +160 C Aftershock +276 R Altar of Dementia +213 R Aluren +161 U Ancient Runes +315 U Ancient Tomb +2 U Angelic Protector +3 C Anoint +214 U Apes of Rath +162 R Apocalypse +5 C Armored Pegasus +4 U Armor Sliver +6 R Auratog +7 R Avenging Angel +163 U Barbed Sliver +215 C Bayou Dragonfly +108 R Bellowing Fiend +54 R Benthic Behemoth +164 C Blood Frenzy +109 C Blood Pet +165 U Boil +277 R Booby Trap +278 U Bottle Gnomes +110 R Bounty Hunter +216 C Broken Fall +316 R Caldera Lake +217 C Canopy Spider +166 R Canyon Drake +167 C Canyon Wildcat +55 C Capsize +111 R Carrionette +168 R Chaotic Goo +218 U Charging Rhino +56 U Chill +219 U Choke +317 U Cinder Marsh +8 C Circle of Protection: Black +9 C Circle of Protection: Blue +10 C Circle of Protection: Green +11 C Circle of Protection: Red +12 C Circle of Protection: Shadow +13 C Circle of Protection: White +14 C Clergy en-Vec +112 C Clot Sliver +15 C Cloudchaser Eagle +113 C Coercion +114 R Coffin Queen +279 C Coiled Tinviper +280 R Cold Storage +115 R Commander Greven il-Vec +116 R Corpse Dance +57 C Counterspell +220 R Crazed Armodon +169 C Crown of Flames +281 R Cursed Scroll +117 C Dark Banishing +119 C Darkling Stalker +118 C Dark Ritual +120 U Dauthi Embrace +121 U Dauthi Ghoul +122 C Dauthi Horror +123 C Dauthi Marauder +124 U Dauthi Mercenary +125 U Dauthi Mindripper +126 C Dauthi Slayer +170 R Deadshot +127 R Death Pits of Rath +128 C Diabolic Edict +221 R Dirtcowl Wurm +16 C Disenchant +58 U Dismiss +129 C Disturbed Burial +266 R Dracoplasm +130 U Dread of Night +59 C Dream Cache +131 R Dregs of Sorrow +60 R Duplicity +222 R Earthcraft +282 R Echo Chamber +224 R Eladamri, Lord of Leaves +223 R Eladamri's Vineyard +17 C Elite Javelineer +225 R Elven Warhounds +226 C Elvish Fury +283 R Emerald Medallion +284 R Emmessi Tome +132 C Endless Scream +285 R Energizer +133 C Enfeeblement +171 U Enraging Licid +61 R Ertai's Meddling +62 R Escaped Shapeshifter +286 U Essence Bottle +134 C Evincar's Justice +287 U Excavator +135 R Extinction +136 R Fevered Convulsions +18 R Field of Souls +63 U Fighting Drake +172 U Firefly +173 C Fireslinger +227 U Flailing Drake +19 U Flickering Ward +174 C Flowstone Giant +175 U Flowstone Salamander +288 R Flowstone Sculpture +176 R Flowstone Wyvern +289 R Fool's Tome +347 L Forest +348 L Forest +349 L Forest +350 L Forest +228 C Frog Tongue +229 R Fugitive Druid +177 R Furnace of Rath +64 U Fylamarid +20 U Gallantry +65 C Gaseous Form +21 R Gerrard's Battle Cry +318 U Ghost Town +66 C Giant Crab +178 C Giant Strength +179 U Goblin Bombardment +137 C Gravedigger +290 R Grindstone +180 R Hand to Hand +22 R Hanna's Custody +230 U Harrow +181 U Havoc +182 C Heart Sliver +231 C Heartwood Dryad +232 R Heartwood Giant +233 U Heartwood Treefolk +291 R Helm of Possession +23 C Hero's Resolve +234 U Horned Sliver +67 C Horned Turtle +24 R Humility +138 U Imps' Taunt +68 U Insight +69 U Interdict +70 R Intuition +25 U Invulnerability +335 L Island +336 L Island +337 L Island +338 L Island +183 U Jackal Pup +292 R Jet Medallion +293 R Jinxed Idol +139 R Kezzerdrix +184 C Kindle +26 U Knight of Dawn +140 U Knight of Dusk +235 U Krakilin +141 U Leeching Licid +71 U Legacy's Allure +72 U Legerdemain +185 C Lightning Blast +186 C Lightning Elemental +27 U Light of Day +142 R Living Death +267 U Lobotomy +294 C Lotus Petal +187 C Lowland Giant +143 R Maddening Imp +188 R Magmasaur +295 R Magnetic Web +296 C Manakin +73 R Mana Severance +74 C Manta Riders +28 R Marble Titan +144 C Marsh Lurker +29 C Master Decoy +75 R Mawcor +319 U Maze of Shadows +76 R Meditate +297 C Metallic Sliver +145 U Mindwhip Sliver +146 R Minion of the Wastes +236 R Mirri's Guile +77 U Mnemonic Sliver +298 U Mogg Cannon +189 C Mogg Conscripts +190 C Mogg Fanatic +320 U Mogg Hollows +191 C Mogg Raider +192 U Mogg Squad +237 R Mongrel Pack +343 L Mountain +344 L Mountain +345 L Mountain +346 L Mountain +30 C Mounted Archers +238 C Muscle Sliver +239 C Natural Spring +240 R Nature's Revolt +241 U Needle Storm +193 R No Quarter +242 U Nurturing Licid +194 U Opportunist +31 R Oracle en-Vec +33 R Orim, Samite Healer +32 U Orim's Prayer +243 U Overrun +34 C Pacifism +195 R Pallimud +299 U Patchwork Gnomes +300 R Pearl Medallion +35 R Pegasus Refuge +147 U Perish +301 R Phyrexian Grimoire +302 U Phyrexian Hulk +303 U Phyrexian Splicer +244 C Pincher Beetles +321 R Pine Barrens +148 C Pit Imp +331 L Plains +332 L Plains +333 L Plains +334 L Plains +78 C Power Sink +79 R Precognition +80 U Propaganda +304 U Puppet Strings +36 U Quickening Licid +149 U Rain of Tears +245 C Rampant Growth +268 U Ranger en-Vec +196 R Rathi Dragon +150 C Rats of Rath +246 C Reality Anchor +151 U Reanimate +247 U Reap +152 U Reckless Spite +248 R Recycle +322 R Reflecting Pool +197 U Renegade Warlord +37 U Repentance +249 C Respite +198 C Rolling Thunder +251 C Rootbreaker Wurm +250 R Root Maze +252 C Rootwalla +323 U Rootwater Depths +81 U Rootwater Diver +82 C Rootwater Hunter +83 R Rootwater Matriarch +84 R Rootwater Shaman +305 R Ruby Medallion +38 R Sacred Guide +153 C Sadistic Glee +39 R Safeguard +324 R Salt Flats +199 C Sandstone Warrior +306 R Sapphire Medallion +154 R Sarcomancy +325 R Scabland +307 R Scalding Tongs +200 R Scorched Earth +253 U Scragnoth +155 U Screeching Harpy +308 R Scroll Rack +85 C Sea Monster +201 U Searing Touch +254 C Seeker of Skybreak +269 U Segmented Wurm +270 R Selenia, Dark Angel +40 U Serene Offering +156 C Servant of Volrath +86 C Shadow Rift +202 U Shadowstorm +203 C Shatter +87 C Shimmering Wings +204 R Shocker +88 U Skyshroud Condor +255 C Skyshroud Elf +326 R Skyshroud Forest +256 C Skyshroud Ranger +257 C Skyshroud Troll +157 U Skyshroud Vampire +271 U Sky Spirit +41 U Soltari Crusader +42 R Soltari Emissary +43 C Soltari Foot Soldier +272 R Soltari Guerrillas +44 C Soltari Lancer +45 U Soltari Monk +46 U Soltari Priest +47 C Soltari Trooper +158 U Souldrinker +89 C Spell Blast +258 C Spike Drone +159 C Spinal Graft +48 R Spirit Mirror +273 U Spontaneous Combustion +309 C Squee's Toy +327 U Stalking Stones +205 R Starke of Rath +310 R Static Orb +49 U Staunch Defenders +90 U Steal Enchantment +91 U Stinging Licid +206 C Stone Rain +259 U Storm Front +207 C Stun +208 U Sudden Impact +339 L Swamp +340 L Swamp +341 L Swamp +342 L Swamp +209 U Tahngarth's Rage +50 C Talon Sliver +311 U Telethopter +92 U Thalakos Dreamsower +328 U Thalakos Lowlands +93 C Thalakos Mistfolk +94 C Thalakos Seer +95 C Thalakos Sentry +312 R Thumbscrews +96 C Time Ebb +97 R Time Warp +210 R Tooth and Claw +313 R Torture Chamber +98 R Tradewind Rider +260 C Trained Armodon +261 C Tranquility +262 U Trumpeting Armodon +99 C Twitch +100 R Unstable Shapeshifter +329 U Vec Townships +263 R Verdant Force +264 U Verdigris +274 R Vhati il-Dal +101 C Volrath's Curse +211 C Wall of Diffusion +51 U Warmth +330 U Wasteland +314 U Watchdog +102 R Whim of Volrath +103 U Whispers of the Muse +212 U Wild Wurm +104 U Wind Dancer +105 C Wind Drake +52 R Winds of Rath +106 C Winged Sliver +265 U Winter's Grasp +275 R Wood Sage +53 U Worthy Cause [tokens] carnivore diff --git a/forge-gui/res/editions/The Dark.txt b/forge-gui/res/editions/The Dark.txt index 804545d9120..2be09ea2272 100644 --- a/forge-gui/res/editions/The Dark.txt +++ b/forge-gui/res/editions/The Dark.txt @@ -11,122 +11,122 @@ BoosterBox=60 Foil=NotSupported [cards] -U Amnesia -U Angry Mob -R Apprentice Wizard -C Ashes to Ashes -R Ball Lightning -U Banshee -R Barl's Cage -R Blood Moon -U Blood of the Martyr -C Bog Imp -C Bog Rats -U Bone Flute -U Book of Rass -C Brainwash -U Brothers of Fire -C Carnivorous Plant -U Cave People -R City of Shadows -R Cleansing -U Coal Golem -U Curse Artifact -R Dance of Many -C Dark Heart of the Wood -U Dark Sphere -C Deep Water -U Diabolic Machine -C Drowned -C Dust to Dust -U Eater of the Dead -U Electric Eel -U Elves of Deep Shadow -C Erosion -R Eternal Flame -R Exorcist -U Fasting -U Fellwar Stone -C Festival -U Fire Drake -U Fire and Brimstone -C Fissure -U Flood -U Fountain of Youth -R Frankenstein's Monster -C Gaea's Touch -C Ghost Ship -C Giant Shark -C Goblin Caves -C Goblin Digging Team -C Goblin Hero -C Goblin Rock Sled -C Goblin Shrine -R Goblin Wizard -C Goblins of the Flarg -R Grave Robbers -R Hidden Path -C Holy Light -R Inferno -C Inquisition -R Knights of Thorn -C Land Leeches -R Leviathan -U Living Armor -R Lurker -R Mana Clash -R Mana Vortex -C Marsh Gas -C Marsh Goblins -C Marsh Viper -R Martyr's Cry -U Maze of Ith -U Merfolk Assassin -R Mind Bomb -C Miracle Worker -C Morale -C Murk Dwellers -R Nameless Race -U Necropolis -R Niall Silvain -U Orc General -U People of the Woods -C Pikemen -R Preacher -R Psychic Allergy -R Rag Man -U Reflecting Mirror -C Riptide -U Runesword -R Safe Haven -C Savaen Elves -U Scarecrow -R Scarwood Bandits -C Scarwood Goblins -U Scarwood Hag -C Scavenger Folk -R Season of the Witch -U Sisters of the Flame -U Skull of Orm -R Sorrow's Path -U Spitting Slug -C Squire -U Standing Stones -R Stone Calendar -C Sunken City -U Tangle Kelp -U The Fallen -U Tivadar's Crusade -U Tormod's Crypt -U Tower of Coireall -R Tracker -U Uncle Istvan -C Venom -U Wand of Ith -U War Barge -C Water Wurm -U Whippoorwill -R Witch Hunter -C Word of Binding -R Worms of the Earth -R Wormwood Treefolk +20 U Amnesia +1 U Angry Mob +21 R Apprentice Wizard +39 C Ashes to Ashes +57 R Ball Lightning +40 U Banshee +96 R Barl's Cage +58 R Blood Moon +2 U Blood of the Martyr +41 C Bog Imp +42 C Bog Rats +97 U Bone Flute +98 U Book of Rass +3 C Brainwash +59 U Brothers of Fire +75 C Carnivorous Plant +60 U Cave People +116 R City of Shadows +4 R Cleansing +99 U Coal Golem +43 U Curse Artifact +22 R Dance of Many +95 C Dark Heart of the Wood +100 U Dark Sphere +23 C Deep Water +101 U Diabolic Machine +24 C Drowned +5 C Dust to Dust +44 U Eater of the Dead +25 U Electric Eel +76 U Elves of Deep Shadow +26 C Erosion +61 R Eternal Flame +6 R Exorcist +7 U Fasting +102 U Fellwar Stone +8 C Festival +9 U Fire and Brimstone +62 U Fire Drake +63 C Fissure +27 U Flood +103 U Fountain of Youth +45 R Frankenstein's Monster +77 C Gaea's Touch +28 C Ghost Ship +29 C Giant Shark +64 C Goblin Caves +65 C Goblin Digging Team +66 C Goblin Hero +67 C Goblin Rock Sled +68 C Goblin Shrine +70 C Goblins of the Flarg +69 R Goblin Wizard +46 R Grave Robbers +78 R Hidden Path +10 C Holy Light +71 R Inferno +47 C Inquisition +11 R Knights of Thorn +79 C Land Leeches +30 R Leviathan +104 U Living Armor +80 R Lurker +72 R Mana Clash +31 R Mana Vortex +48 C Marsh Gas +93 C Marsh Goblins +81 C Marsh Viper +12 R Martyr's Cry +117 U Maze of Ith +32 U Merfolk Assassin +33 R Mind Bomb +13 C Miracle Worker +14 C Morale +49 C Murk Dwellers +50 R Nameless Race +105 U Necropolis +82 R Niall Silvain +73 U Orc General +83 U People of the Woods +15 C Pikemen +16 R Preacher +34 R Psychic Allergy +51 R Rag Man +106 U Reflecting Mirror +35 C Riptide +107 U Runesword +118 R Safe Haven +84 C Savaen Elves +108 U Scarecrow +85 R Scarwood Bandits +94 C Scarwood Goblins +86 U Scarwood Hag +87 C Scavenger Folk +52 R Season of the Witch +74 U Sisters of the Flame +109 U Skull of Orm +119 R Sorrow's Path +88 U Spitting Slug +17 C Squire +110 U Standing Stones +111 R Stone Calendar +36 C Sunken City +37 U Tangle Kelp +53 U The Fallen +18 U Tivadar's Crusade +112 U Tormod's Crypt +113 U Tower of Coireall +89 R Tracker +54 U Uncle Istvan +90 C Venom +114 U Wand of Ith +115 U War Barge +38 C Water Wurm +91 U Whippoorwill +19 R Witch Hunter +55 C Word of Binding +56 R Worms of the Earth +92 R Wormwood Treefolk diff --git a/forge-gui/res/editions/Unlimited Edition.txt b/forge-gui/res/editions/Unlimited Edition.txt index 54e891f24bf..c510946589c 100644 --- a/forge-gui/res/editions/Unlimited Edition.txt +++ b/forge-gui/res/editions/Unlimited Edition.txt @@ -12,308 +12,308 @@ Foil=NotSupported ChaosDraftThemes=CORE_SET [cards] -U Air Elemental -R Ancestral Recall -U Animate Artifact -U Animate Dead -R Animate Wall -R Ankh of Mishra -R Armageddon -R Aspect of Wolf -R Bad Moon -R Badlands -R Balance -U Basalt Monolith -R Bayou -C Benalish Hero -U Berserk -R Birds of Paradise -U Black Knight -R Black Lotus -U Black Vise -U Black Ward -R Blaze of Glory -R Blessing -C Blue Elemental Blast -U Blue Ward -U Bog Wraith -R Braingeyser -U Burrowing -U Camouflage -U Castle -U Celestial Prism -U Channel -R Chaos Orb -R Chaoslace -C Circle of Protection: Black -C Circle of Protection: Blue -C Circle of Protection: Green -C Circle of Protection: Red -C Circle of Protection: White -R Clockwork Beast -U Clone -R Cockatrice -U Consecrate Land -U Conservator -R Contract from Below -U Control Magic -U Conversion -U Copper Tablet -R Copy Artifact -U Counterspell -C Craw Wurm -C Creature Bond -R Crusade -U Crystal Rod -U Cursed Land -R Cyclopean Tomb -C Dark Ritual -R Darkpact -C Death Ward -U Deathgrip -R Deathlace -R Demonic Attorney -R Demonic Hordes -U Demonic Tutor -R Dingus Egg -C Disenchant -C Disintegrate -R Disrupting Scepter -U Dragon Whelp -C Drain Life -R Drain Power -C Drudge Skeletons -U Dwarven Demolition Team -C Dwarven Warriors -U Earth Elemental -C Earthbind -R Earthquake -R Elvish Archers -U Evil Presence -C False Orders -R Farmstead -R Fastbond -C Fear -U Feedback -U Fire Elemental -C Fireball -C Firebreathing -U Flashfires -C Flight -C Fog -R Force of Nature -R Forcefield -L Forest -L Forest -L Forest -R Fork -C Frozen Shade -R Fungusaur -R Gaea's Liege -R Gauntlet of Might -C Giant Growth -C Giant Spider -U Glasses of Urza -U Gloom -U Goblin Balloon Brigade -R Goblin King -R Granite Gargoyle -C Gray Ogre -U Green Ward -C Grizzly Bears -C Guardian Angel -C Healing Salve -R Helm of Chatzuk -C Hill Giant -C Holy Armor -C Holy Strength -C Howl from Beyond -R Howling Mine -C Hurloon Minotaur -U Hurricane -U Hypnotic Specter -U Ice Storm -U Icy Manipulator -R Illusionary Mask -U Instill Energy -C Invisibility -U Iron Star -C Ironclaw Orcs -C Ironroot Treefolk -L Island -L Island -L Island -R Island Sanctuary -U Ivory Cup -R Jade Monolith -U Jade Statue -R Jayemdae Tome -U Juggernaut -C Jump -U Karma -U Keldon Warlord -R Kormus Bell -R Kudzu -U Lance -U Ley Druid -U Library of Leng -R Lich -U Lifeforce -R Lifelace -U Lifetap -C Lightning Bolt -R Living Artifact -R Living Lands -U Living Wall -C Llanowar Elves -R Lord of Atlantis -R Lord of the Pit -U Lure -R Magical Hack -R Mahamoti Djinn -R Mana Flare -R Mana Short -R Mana Vault -R Manabarbs -R Meekstone -C Merfolk of the Pearl Trident -C Mesa Pegasus -R Mind Twist -C Mons's Goblin Raiders -L Mountain -L Mountain -L Mountain -R Mox Emerald -R Mox Jet -R Mox Pearl -R Mox Ruby -R Mox Sapphire -R Natural Selection -R Nether Shadow -U Nettling Imp -R Nevinyrral's Disk -R Nightmare -R Northern Paladin -U Obsianus Golem -U Orcish Artillery -U Orcish Oriflamme -C Paralyze -C Pearled Unicorn -R Personal Incarnation -C Pestilence -U Phantasmal Forces -C Phantasmal Terrain -U Phantom Monster -R Pirate Ship -C Plague Rats -L Plains -L Plains -L Plains -R Plateau -C Power Leak -C Power Sink -R Power Surge -C Prodigal Sorcerer -U Psionic Blast -C Psychic Venom -R Purelace -R Raging River -C Raise Dead -C Red Elemental Blast -U Red Ward -C Regeneration -U Regrowth -U Resurrection -R Reverse Damage -R Righteousness -R Roc of Kher Ridges -R Rock Hydra -U Rod of Ruin -R Royal Assassin -U Sacrifice -C Samite Healer -R Savannah -R Savannah Lions -C Scathe Zombies -U Scavenging Ghoul -R Scrubland -C Scryb Sprites -C Sea Serpent -R Sedge Troll -U Sengir Vampire -U Serra Angel -C Shanodin Dryads -C Shatter -R Shivan Dragon -U Simulacrum -C Sinkhole -U Siren's Call -R Sleight of Mind -R Smoke -U Sol Ring -U Soul Net -C Spell Blast -R Stasis -U Steal Artifact -U Stone Giant -C Stone Rain -C Stream of Life -R Sunglasses of Urza -L Swamp -L Swamp -L Swamp -U Swords to Plowshares -R Taiga -C Terror -R The Hive -U Thicket Basilisk -R Thoughtlace -U Throne of Bone -R Timber Wolves -R Time Vault -R Time Walk -R Timetwister -C Tranquility -R Tropical Island -U Tsunami -R Tundra -U Tunnel -C Twiddle -R Two-Headed Giant of Foriys -R Underground Sea -C Unholy Strength -C Unsummon -U Uthden Troll -R Verduran Enchantress -R Vesuvan Doppelganger -R Veteran Bodyguard -R Volcanic Eruption -R Volcanic Island -U Wall of Air -U Wall of Bone -U Wall of Brambles -U Wall of Fire -U Wall of Ice -U Wall of Stone -U Wall of Swords -U Wall of Water -C Wall of Wood -U Wanderlust -C War Mammoth -R Warp Artifact -U Water Elemental -C Weakness -R Web -R Wheel of Fortune -U White Knight -U White Ward -C Wild Growth -R Will-o'-the-Wisp -R Winter Orb -U Wooden Sphere -R Word of Command -R Wrath of God -R Zombie Master +47 U Air Elemental +48 R Ancestral Recall +49 U Animate Artifact +93 U Animate Dead +1 R Animate Wall +231 R Ankh of Mishra +2 R Armageddon +185 R Aspect of Wolf +278 R Badlands +94 R Bad Moon +3 R Balance +232 U Basalt Monolith +279 R Bayou +4 C Benalish Hero +186 U Berserk +187 R Birds of Paradise +95 U Black Knight +233 R Black Lotus +234 U Black Vise +5 U Black Ward +6 R Blaze of Glory +7 R Blessing +50 C Blue Elemental Blast +8 U Blue Ward +96 U Bog Wraith +51 R Braingeyser +139 U Burrowing +188 U Camouflage +9 U Castle +235 U Celestial Prism +189 U Channel +140 R Chaoslace +236 R Chaos Orb +10 C Circle of Protection: Black +11 C Circle of Protection: Blue +12 C Circle of Protection: Green +13 C Circle of Protection: Red +14 C Circle of Protection: White +237 R Clockwork Beast +52 U Clone +190 R Cockatrice +15 U Consecrate Land +238 U Conservator +97 R Contract from Below +53 U Control Magic +16 U Conversion +239 U Copper Tablet +54 R Copy Artifact +55 U Counterspell +191 C Craw Wurm +56 C Creature Bond +17 R Crusade +240 U Crystal Rod +98 U Cursed Land +241 R Cyclopean Tomb +100 R Darkpact +99 C Dark Ritual +101 U Deathgrip +102 R Deathlace +18 C Death Ward +103 R Demonic Attorney +104 R Demonic Hordes +105 U Demonic Tutor +242 R Dingus Egg +19 C Disenchant +141 C Disintegrate +243 R Disrupting Scepter +142 U Dragon Whelp +106 C Drain Life +57 R Drain Power +107 C Drudge Skeletons +143 U Dwarven Demolition Team +144 C Dwarven Warriors +146 C Earthbind +145 U Earth Elemental +147 R Earthquake +192 R Elvish Archers +108 U Evil Presence +148 C False Orders +20 R Farmstead +193 R Fastbond +109 C Fear +58 U Feedback +150 C Fireball +151 C Firebreathing +149 U Fire Elemental +152 U Flashfires +59 C Flight +194 C Fog +244 R Forcefield +195 R Force of Nature +300 L Forest +301 L Forest +302 L Forest +153 R Fork +110 C Frozen Shade +196 R Fungusaur +197 R Gaea's Liege +245 R Gauntlet of Might +198 C Giant Growth +199 C Giant Spider +246 U Glasses of Urza +111 U Gloom +154 U Goblin Balloon Brigade +155 R Goblin King +156 R Granite Gargoyle +157 C Gray Ogre +21 U Green Ward +200 C Grizzly Bears +22 C Guardian Angel +23 C Healing Salve +247 R Helm of Chatzuk +158 C Hill Giant +24 C Holy Armor +25 C Holy Strength +112 C Howl from Beyond +248 R Howling Mine +159 C Hurloon Minotaur +201 U Hurricane +113 U Hypnotic Specter +202 U Ice Storm +249 U Icy Manipulator +250 R Illusionary Mask +203 U Instill Energy +60 C Invisibility +160 C Ironclaw Orcs +204 C Ironroot Treefolk +251 U Iron Star +291 L Island +292 L Island +293 L Island +26 R Island Sanctuary +252 U Ivory Cup +253 R Jade Monolith +254 U Jade Statue +255 R Jayemdae Tome +256 U Juggernaut +61 C Jump +27 U Karma +161 U Keldon Warlord +257 R Kormus Bell +205 R Kudzu +28 U Lance +206 U Ley Druid +258 U Library of Leng +114 R Lich +207 U Lifeforce +208 R Lifelace +62 U Lifetap +162 C Lightning Bolt +209 R Living Artifact +210 R Living Lands +259 U Living Wall +211 C Llanowar Elves +63 R Lord of Atlantis +115 R Lord of the Pit +212 U Lure +64 R Magical Hack +65 R Mahamoti Djinn +164 R Manabarbs +163 R Mana Flare +66 R Mana Short +260 R Mana Vault +261 R Meekstone +67 C Merfolk of the Pearl Trident +29 C Mesa Pegasus +116 R Mind Twist +165 C Mons's Goblin Raiders +297 L Mountain +298 L Mountain +299 L Mountain +262 R Mox Emerald +263 R Mox Jet +264 R Mox Pearl +265 R Mox Ruby +266 R Mox Sapphire +213 R Natural Selection +117 R Nether Shadow +118 U Nettling Imp +267 R Nevinyrral's Disk +119 R Nightmare +30 R Northern Paladin +268 U Obsianus Golem +166 U Orcish Artillery +167 U Orcish Oriflamme +120 C Paralyze +31 C Pearled Unicorn +32 R Personal Incarnation +121 C Pestilence +68 U Phantasmal Forces +69 C Phantasmal Terrain +70 U Phantom Monster +71 R Pirate Ship +122 C Plague Rats +288 L Plains +289 L Plains +290 L Plains +280 R Plateau +72 C Power Leak +73 C Power Sink +168 R Power Surge +74 C Prodigal Sorcerer +75 U Psionic Blast +76 C Psychic Venom +33 R Purelace +169 R Raging River +123 C Raise Dead +170 C Red Elemental Blast +34 U Red Ward +214 C Regeneration +215 U Regrowth +35 U Resurrection +36 R Reverse Damage +37 R Righteousness +172 R Rock Hydra +171 R Roc of Kher Ridges +269 U Rod of Ruin +124 R Royal Assassin +125 U Sacrifice +38 C Samite Healer +281 R Savannah +39 R Savannah Lions +126 C Scathe Zombies +127 U Scavenging Ghoul +282 R Scrubland +216 C Scryb Sprites +77 C Sea Serpent +173 R Sedge Troll +128 U Sengir Vampire +40 U Serra Angel +217 C Shanodin Dryads +174 C Shatter +175 R Shivan Dragon +129 U Simulacrum +130 C Sinkhole +78 U Siren's Call +79 R Sleight of Mind +176 R Smoke +270 U Sol Ring +271 U Soul Net +80 C Spell Blast +81 R Stasis +82 U Steal Artifact +177 U Stone Giant +178 C Stone Rain +218 C Stream of Life +272 R Sunglasses of Urza +294 L Swamp +295 L Swamp +296 L Swamp +41 U Swords to Plowshares +283 R Taiga +131 C Terror +273 R The Hive +219 U Thicket Basilisk +83 R Thoughtlace +274 U Throne of Bone +220 R Timber Wolves +85 R Timetwister +275 R Time Vault +84 R Time Walk +221 C Tranquility +284 R Tropical Island +222 U Tsunami +285 R Tundra +179 U Tunnel +86 C Twiddle +180 R Two-Headed Giant of Foriys +286 R Underground Sea +132 C Unholy Strength +87 C Unsummon +181 U Uthden Troll +223 R Verduran Enchantress +88 R Vesuvan Doppelganger +42 R Veteran Bodyguard +89 R Volcanic Eruption +287 R Volcanic Island +90 U Wall of Air +133 U Wall of Bone +224 U Wall of Brambles +182 U Wall of Fire +225 U Wall of Ice +183 U Wall of Stone +43 U Wall of Swords +91 U Wall of Water +226 C Wall of Wood +227 U Wanderlust +228 C War Mammoth +134 R Warp Artifact +92 U Water Elemental +135 C Weakness +229 R Web +184 R Wheel of Fortune +44 U White Knight +45 U White Ward +230 C Wild Growth +136 R Will-o'-the-Wisp +276 R Winter Orb +277 U Wooden Sphere +137 R Word of Command +46 R Wrath of God +138 R Zombie Master [tokens] wasp \ No newline at end of file diff --git a/forge-gui/res/editions/Unstable.txt b/forge-gui/res/editions/Unstable.txt index a83388e68ae..ac769b77036 100644 --- a/forge-gui/res/editions/Unstable.txt +++ b/forge-gui/res/editions/Unstable.txt @@ -10,22 +10,22 @@ Booster=11 Common, 3 Uncommon, 1 Rare FoilAlwaysInCommonSlot=False [cards] -3 C Amateur Auteur -3 C Amateur Auteur -3 C Amateur Auteur -3 C Amateur Auteur +3a C Amateur Auteur +3b C Amateur Auteur +3c C Amateur Auteur +3d C Amateur Auteur 6 M Do-It-Yourself Seraph 7 U Gimme Five 8 C GO TO JAIL 9 U Half-Kitten, Half- 10 C Humming- 11 R Jackknight -U Knight of the Kitchen Sink A -U Knight of the Kitchen Sink B -U Knight of the Kitchen Sink C -U Knight of the Kitchen Sink D -U Knight of the Kitchen Sink E -U Knight of the Kitchen Sink F +12a U Knight of the Kitchen Sink A +12b U Knight of the Kitchen Sink B +12c U Knight of the Kitchen Sink C +12d U Knight of the Kitchen Sink D +12e U Knight of the Kitchen Sink E +12f U Knight of the Kitchen Sink F 13 U Knight of the Widget 14 U Midlife Upgrade 15 R Oddly Uneven @@ -54,10 +54,10 @@ U Knight of the Kitchen Sink F 38 C Magic Word 39 C Mer Man 40 U More or Less -C Novellamental -C Novellamental -C Novellamental -C Novellamental +41a C Novellamental +41b C Novellamental +41c C Novellamental +41d C Novellamental 42 C Numbing Jellyfish 43 U S.N.E.A.K. Dispatcher 44 U Socketed Sprocketer @@ -65,20 +65,20 @@ C Novellamental 46 U Spy Eye 47 U Suspicious Nanny 48 C Time Out -R Very Cryptic Command A -R Very Cryptic Command B -R Very Cryptic Command C -R Very Cryptic Command D -R Very Cryptic Command E -R Very Cryptic Command F +49a R Very Cryptic Command A +49b R Very Cryptic Command B +49c R Very Cryptic Command C +49d R Very Cryptic Command D +49e R Very Cryptic Command E +49f R Very Cryptic Command F 50 C Wall of Fortune 51 C Big Boa Constrictor 52 C capital offense 53 C Dirty Rat -C Extremely Slow Zombie -C Extremely Slow Zombie -C Extremely Slow Zombie -C Extremely Slow Zombie +54a C Extremely Slow Zombie +54b C Extremely Slow Zombie +54c C Extremely Slow Zombie +54d C Extremely Slow Zombie 55 C Finders, Keepers 56 R Hangman 57 C Hazmat Suit (Used) @@ -91,12 +91,12 @@ C Extremely Slow Zombie 64 U Overt Operative 65 U "Rumors of My Death..." 66 U Skull Saucer -U Sly Spy A -U Sly Spy B -U Sly Spy C -U Sly Spy D -U Sly Spy E -U Sly Spy F +67a U Sly Spy A +67b U Sly Spy B +67c U Sly Spy C +67d U Sly Spy D +67e U Sly Spy E +67f U Sly Spy F 68 C Snickering Squirrel 69 R Spike, Tournament Grinder 70 U Squirrel-Powered Scheme @@ -111,12 +111,12 @@ U Sly Spy F 79 C Common Iguana 80 R The Countdown Is at One 81 C Feisty Stegosaurus -U Garbage Elemental A -U Garbage Elemental B -U Garbage Elemental C -U Garbage Elemental D -U Garbage Elemental E -U Garbage Elemental F +82a U Garbage Elemental A +82b U Garbage Elemental B +82c U Garbage Elemental C +82d U Garbage Elemental D +82e U Garbage Elemental E +82f U Garbage Elemental F 83 U Goblin Haberdasher 84 U Half-Orc, Half- 85 C Hammer Helper @@ -132,18 +132,18 @@ U Garbage Elemental F 95 U Steamflogger Temp 96 U Steamfloggery 97 U Super-Duper Death Ray -C Target Minotaur -C Target Minotaur -C Target Minotaur -C Target Minotaur +98a C Target Minotaur +98b C Target Minotaur +98c C Target Minotaur +98d C Target Minotaur 99 R Three-Headed Goblin 100 C Work a Double 101 C Wrench-Rigger 102 R As Luck Would Have It -C Beast in Show -C Beast in Show -C Beast in Show -C Beast in Show +103a C Beast in Show +103b C Beast in Show +103c C Beast in Show +103d C Beast in Show 104 U Chittering Doom 105 U Clever Combo 106 U Druid of the Sacred Beaker @@ -153,12 +153,12 @@ C Beast in Show 110 U Ground Pounder 111 U Half-Squirrel, Half- 112 R Hydradoodle -R Ineffable Blessing A -R Ineffable Blessing B -R Ineffable Blessing C -R Ineffable Blessing D -R Ineffable Blessing E -R Ineffable Blessing F +113a R Ineffable Blessing A +113b R Ineffable Blessing B +113c R Ineffable Blessing C +113d R Ineffable Blessing D +113e R Ineffable Blessing E +113f R Ineffable Blessing F 114 C Joyride Rigger 115 U Monkey- 116 C Mother Kangaroo @@ -190,17 +190,17 @@ R Ineffable Blessing F 142 U Clock of DOOOOOOOOOOOOM! 143 U Cogmentor 144 U Contraption Cannon -C Curious Killbot -C Delighted Killbot -C Despondent Killbot -C Enraged Killbot +145a C Curious Killbot +145b C Delighted Killbot +145c C Despondent Killbot +145d C Enraged Killbot 146 U Entirely Normal Armchair -R Everythingamajig A -R Everythingamajig B -R Everythingamajig C -R Everythingamajig D -R Everythingamajig E -R Everythingamajig F +147a R Everythingamajig A +147b R Everythingamajig B +147c R Everythingamajig C +147d R Everythingamajig D +147e R Everythingamajig E +147f R Everythingamajig F 148 C Gnome-Made Engine 149 R Handy Dandy Clone Machine 150 R Kindslaver @@ -218,11 +218,11 @@ R Everythingamajig F 162 U Steel Squirrel 163 M Sword of Dungeons & Dragons 164 C Voracious Vacuum -C Secret Base -C Secret Base -C Secret Base -C Secret Base -C Secret Base +165a C Secret Base +165b C Secret Base +165c C Secret Base +165d C Secret Base +165e C Secret Base 166 R Watermarket 167 U Accessories to Murder 168 C Applied Aeronautics diff --git a/forge-gui/res/editions/Vintage Championship.txt b/forge-gui/res/editions/Vintage Championship.txt new file mode 100644 index 00000000000..b5bd983a08e --- /dev/null +++ b/forge-gui/res/editions/Vintage Championship.txt @@ -0,0 +1,30 @@ +[metadata] +Code=OVNT +Date=2003-01-01 +Name=Vintage Championship +Type=Promos + +[cards] +2003 R Black Lotus +2004 R Timetwister +2005 R Ancestral Recall +2006 R Mox Pearl +2007 R Mox Jet +2008 R Mox Ruby +2009 R Mox Emerald +2010 R Mox Sapphire +2011 R Time Walk +2012 R Timetwister +2013 R Ancestral Recall +2014 M Mox Pearl +2015 M Mox Emerald +2016 M Mox Jet +2017 M Mox Sapphire +2018 M Mox Ruby +2019 M Black Lotus +2020 M Ancestral Recall +2021 M Timetwister +2022 M Time Walk +2023 M Mox Pearl +2024 M Mox Sapphire +2025 M Mox Jet diff --git a/forge-gui/res/editions/Visions.txt b/forge-gui/res/editions/Visions.txt index 3e314351ab8..82b463dee1b 100644 --- a/forge-gui/res/editions/Visions.txt +++ b/forge-gui/res/editions/Visions.txt @@ -10,173 +10,173 @@ Booster=11 Common, 3 Uncommon, 1 Rare Foil=NotSupported [cards] -R Aku Djinn -R Anvil of Bogardan -R Archangel -U Army Ants -C Betrayal -U Blanket of Night -R Bogardan Phoenix -U Brass-Talon Chimera -R Breathstealer's Crypt -C Breezekeeper -U Brood of Cockroaches -C Bull Elephant -R Chronatog -R City of Solitude -C Cloud Elemental -C Coercion -U Coral Atoll -R Corrosion -U Creeping Mold -C Crypt Rats -U Daraja Griffin -C Dark Privilege -C Death Watch -R Desertion -U Desolation -R Diamond Kaleidoscope -U Dormant Volcano -U Dragon Mask -U Dream Tides -C Dwarven Vigilantes -U Elephant Grass -R Elkin Lair -C Elven Cache -C Emerald Charm -R Equipoise -U Everglades -R Eye of Singularity -C Fallen Askari -R Femeref Enchantress -C Feral Instinct -C Fireblast -R Firestorm Hellkite -R Flooded Shoreline -R Forbidden Ritual -U Foreshadow -C Freewind Falcon -C Funeral Charm -C Giant Caterpillar -U Goblin Recruiter -C Goblin Swine-Rider -C Gossamer Chains -R Griffin Canyon -R Guiding Spirit -C Hearth Charm -U Heat Wave -U Helm of Awakening -U Honorable Passage -C Hope Charm -U Hulking Cyclops -C Impulse -C Infantry Veteran -C Infernal Harvest -C Inspiration -U Iron-Heart Chimera -C Jamuraan Lion -U Juju Bubble -U Jungle Basin -R Kaervek's Spite -U Karoo -R Katabatic Winds -C Keeper of Kookus -C King Cheetah -C Knight of Valor -C Knight of the Mists -R Kookus -U Kyscu Drake -U Lead-Belly Chimera -R Lichenthrope -R Lightning Cloud -U Longbow Archer -U Magma Mine -C Man-o'-War -U Matopi Golem -U Miraculous Recovery -U Mob Mentality -C Mortal Wound -U Mundungu -C Mystic Veil -R Natural Order -U Necromancy -R Necrosavant -U Nekrataal -R Ogre Enforcer -U Ovinomancer -C Panther Warriors -C Parapet -U Peace Talks -R Phyrexian Marauder -C Phyrexian Walker -R Pillar Tombs of Aku -U Prosperity -R Pygmy Hippo -C Python -U Quicksand -R Quirion Druid -C Quirion Ranger -C Raging Gorilla -R Rainbow Efreet -R Relentless Assault -U Relic Ward -C Remedy -C Resistance Fighter -R Retribution of the Meek -C Righteous Aura -R Righteous War -C River Boa -C Rock Slide -R Rowen -R Sands of Time -U Scalebane's Elite -U Shimmering Efreet -C Shrieking Drake -U Simoon -C Sisay's Ring -R Snake Basket -C Solfatara -C Song of Blood -C Spider Climb -U Spitting Drake -R Squandered Resources -U Stampeding Wildebeests -R Suleiman's Legacy -U Summer Bloom -C Sun Clasp -U Suq'Ata Assassin -C Suq'Ata Lancer -C Talruum Champion -U Talruum Piper -C Tar Pit Warrior -U Teferi's Honor Guard -R Teferi's Puzzle Box -R Teferi's Realm -U Tempest Drake -R Three Wishes -U Time and Tide -U Tin-Wing Chimera -R Tithe -C Tremor -R Triangle of War -U Uktabi Orangutan -R Undiscovered Paradise -C Undo -C Urborg Mindsucker -R Vampiric Tutor -U Vampirism -C Vanishing -U Viashino Sandstalker -R Viashivan Dragon -C Vision Charm -C Wake of Vultures -R Wand of Denial -C Warrior's Honor -C Warthog -U Waterspout Djinn -C Wicked Reward -U Wind Shear -R Zhalfirin Crusader +51 R Aku Djinn +141 R Anvil of Bogardan +1 R Archangel +126 U Army Ants +26 C Betrayal +52 U Blanket of Night +76 R Bogardan Phoenix +142 U Brass-Talon Chimera +127 R Breathstealer's Crypt +27 C Breezekeeper +53 U Brood of Cockroaches +101 C Bull Elephant +28 R Chronatog +102 R City of Solitude +29 C Cloud Elemental +54 C Coercion +160 U Coral Atoll +128 R Corrosion +103 U Creeping Mold +55 C Crypt Rats +2 U Daraja Griffin +56 C Dark Privilege +57 C Death Watch +30 R Desertion +58 U Desolation +143 R Diamond Kaleidoscope +161 U Dormant Volcano +144 U Dragon Mask +31 U Dream Tides +77 C Dwarven Vigilantes +104 U Elephant Grass +78 R Elkin Lair +105 C Elven Cache +106 C Emerald Charm +3 R Equipoise +162 U Everglades +4 R Eye of Singularity +59 C Fallen Askari +129 R Femeref Enchantress +107 C Feral Instinct +79 C Fireblast +130 R Firestorm Hellkite +32 R Flooded Shoreline +60 R Forbidden Ritual +33 U Foreshadow +5 C Freewind Falcon +61 C Funeral Charm +108 C Giant Caterpillar +80 U Goblin Recruiter +81 C Goblin Swine-Rider +6 C Gossamer Chains +163 R Griffin Canyon +131 R Guiding Spirit +82 C Hearth Charm +83 U Heat Wave +145 U Helm of Awakening +7 U Honorable Passage +8 C Hope Charm +84 U Hulking Cyclops +34 C Impulse +9 C Infantry Veteran +62 C Infernal Harvest +35 C Inspiration +146 U Iron-Heart Chimera +10 C Jamuraan Lion +147 U Juju Bubble +164 U Jungle Basin +63 R Kaervek's Spite +165 U Karoo +109 R Katabatic Winds +85 C Keeper of Kookus +110 C King Cheetah +36 C Knight of the Mists +11 C Knight of Valor +86 R Kookus +111 U Kyscu Drake +148 U Lead-Belly Chimera +112 R Lichenthrope +87 R Lightning Cloud +12 U Longbow Archer +149 U Magma Mine +37 C Man-o'-War +150 U Matopi Golem +13 U Miraculous Recovery +88 U Mob Mentality +113 C Mortal Wound +132 U Mundungu +38 C Mystic Veil +114 R Natural Order +64 U Necromancy +65 R Necrosavant +66 U Nekrataal +89 R Ogre Enforcer +39 U Ovinomancer +115 C Panther Warriors +14 C Parapet +15 U Peace Talks +151 R Phyrexian Marauder +152 C Phyrexian Walker +67 R Pillar Tombs of Aku +40 U Prosperity +133 R Pygmy Hippo +68 C Python +166 U Quicksand +116 R Quirion Druid +117 C Quirion Ranger +90 C Raging Gorilla +41 R Rainbow Efreet +91 R Relentless Assault +16 U Relic Ward +17 C Remedy +18 C Resistance Fighter +19 R Retribution of the Meek +20 C Righteous Aura +134 R Righteous War +118 C River Boa +92 C Rock Slide +119 R Rowen +153 R Sands of Time +135 U Scalebane's Elite +42 U Shimmering Efreet +43 C Shrieking Drake +136 U Simoon +154 C Sisay's Ring +155 R Snake Basket +93 C Solfatara +94 C Song of Blood +120 C Spider Climb +95 U Spitting Drake +137 R Squandered Resources +121 U Stampeding Wildebeests +138 R Suleiman's Legacy +122 U Summer Bloom +21 C Sun Clasp +69 U Suq'Ata Assassin +96 C Suq'Ata Lancer +97 C Talruum Champion +98 U Talruum Piper +70 C Tar Pit Warrior +22 U Teferi's Honor Guard +156 R Teferi's Puzzle Box +44 R Teferi's Realm +139 U Tempest Drake +45 R Three Wishes +46 U Time and Tide +157 U Tin-Wing Chimera +23 R Tithe +99 C Tremor +158 R Triangle of War +123 U Uktabi Orangutan +167 R Undiscovered Paradise +47 C Undo +71 C Urborg Mindsucker +72 R Vampiric Tutor +73 U Vampirism +48 C Vanishing +100 U Viashino Sandstalker +140 R Viashivan Dragon +49 C Vision Charm +74 C Wake of Vultures +159 R Wand of Denial +24 C Warrior's Honor +124 C Warthog +50 U Waterspout Djinn +75 C Wicked Reward +125 U Wind Shear +25 R Zhalfirin Crusader [tokens] butterfly diff --git a/forge-gui/res/editions/Weatherlight.txt b/forge-gui/res/editions/Weatherlight.txt index c6b40184429..c8252fa839b 100644 --- a/forge-gui/res/editions/Weatherlight.txt +++ b/forge-gui/res/editions/Weatherlight.txt @@ -11,173 +11,173 @@ Foil=NotSupported ChaosDraftThemes=GRAVEYARD_MATTERS [cards] -U AEther Flash -U Abduction -R Abeyance -C Abjure -R Aboroth -C Abyssal Gatekeeper -U Agonizing Memories -R Alabaster Dragon -C Alms -R Ancestral Knowledge -C Angelic Renewal -C Apathy -U Arctic Wolves -C Ardent Militia -U Argivian Find -U Argivian Restoration -U Aura of Silence -R Avizoa -U Barishi -C Barrow Ghoul -C Benalish Infantry -C Benalish Knight -C Benalish Missionary -C Betrothed of Fire -C Bloodrock Cyclops -C Blossoming Wreath -C Bogardan Firefiend -C Boiling Blood -R Bone Dancer -R Bosium Strip -C Briar Shield -R Bubble Matrix -U Buried Alive -R Call of the Wild -U Chimeric Sphere -C Choking Vines -U Cinder Giant -C Cinder Wall -U Circling Vultures -U Cloud Djinn -C Coils of the Medusa -U Cone of Flame -R Debt of Loyalty -R Dense Foliage -U Desperate Gambit -U Dingus Staff -C Disrupt -R Doomsday -U Downdraft -C Duskrider Falcon -C Dwarven Berserker -R Dwarven Thaumaturgist -C Empyrial Armor -R Ertai's Familiar -U Fallow Wurm -U Familiar Ground -C Fatal Blow -R Fervor -U Festering Evil -C Fire Whip -R Firestorm -C Fit of Rage -C Fledgling Djinn -C Flux -C Fog Elemental -U Foriysian Brigade -R Fungus Elemental -U Gaea's Blessing -R Gallowbraid -U Gemstone Mine -U Gerrard's Wisdom -R Goblin Bomb -U Goblin Grenadiers -C Goblin Vandal -C Guided Strike -C Harvest Wurm -C Haunting Misery -R Heart of Bogardan -R Heat Stroke -C Heavy Ballista -U Hidden Horror -U Hurloon Shaman -R Infernal Tribute -R Inner Sanctum -U Jabari's Banner -C Jangling Automaton -C Kithkin Armor -U Lava Hounds -C Lava Storm -R Liege of the Hollows -U Llanowar Behemoth -C Llanowar Druid -C Llanowar Sentinel -R Lotus Vale -C Mana Chains -R Mana Web -C Manta Ray -R Maraxus of Keld -U Master of Arms -C Merfolk Traders -C Mind Stone -U Mischievous Poltergeist -U Mistmoon Griffin -R Morinfen -R Mwonvuli Ooze -C Nature's Kiss -R Nature's Resurgence -U Necratog -U Noble Benefactor -R Null Rod -U Odylic Wraith -C Ophidian -U Orcish Settlers -R Paradigm Shift -R Peacekeeper -R Pendrell Mists -U Phantom Warrior -C Phantom Wings -U Phyrexian Furnace -R Psychic Vortex -C Razortooth Rats -C Redwood Treefolk -U Relearn -U Revered Unicorn -U Roc Hatchling -C Rogue Elephant -C Sage Owl -C Sawtooth Ogre -R Scorched Ruins -R Serenity -U Serra's Blessing -U Serrated Biskelion -C Shadow Rider -C Shattered Crypt -C Soul Shepherd -R Southern Paladin -C Spinning Darkness -U Steel Golem -U Strands of Night -U Straw Golem -C Striped Bears -U Sylvan Hierophant -R Tariff -U Teferi's Veil -C Tendrils of Despair -U Thran Forge -R Thran Tome -C Thunderbolt -R Thundermare -U Timid Drake -C Tolarian Drake -R Tolarian Entrancer -R Tolarian Serpent -U Touchstone -R Tranquil Grove -C Uktabi Efreet -R Urborg Justice -R Urborg Stalker -U Veteran Explorer -C Vitalize -U Vodalian Illusionist -U Volunteer Reserves -R Wave of Terror -R Well of Knowledge -R Winding Canyons -R Xanthic Statue -C Zombie Scavengers +30 U Abduction +1 R Abeyance +31 C Abjure +117 R Aboroth +59 C Abyssal Gatekeeper +88 U Aether Flash +60 U Agonizing Memories +2 R Alabaster Dragon +3 C Alms +32 R Ancestral Knowledge +4 C Angelic Renewal +33 C Apathy +118 U Arctic Wolves +5 C Ardent Militia +6 U Argivian Find +34 U Argivian Restoration +7 U Aura of Silence +35 R Avizoa +119 U Barishi +61 C Barrow Ghoul +8 C Benalish Infantry +9 C Benalish Knight +10 C Benalish Missionary +89 C Betrothed of Fire +90 C Bloodrock Cyclops +120 C Blossoming Wreath +91 C Bogardan Firefiend +92 C Boiling Blood +62 R Bone Dancer +147 R Bosium Strip +121 C Briar Shield +146 R Bubble Matrix +63 U Buried Alive +122 R Call of the Wild +148 U Chimeric Sphere +123 C Choking Vines +93 U Cinder Giant +94 C Cinder Wall +64 U Circling Vultures +36 U Cloud Djinn +65 C Coils of the Medusa +95 U Cone of Flame +11 R Debt of Loyalty +124 R Dense Foliage +96 U Desperate Gambit +149 U Dingus Staff +37 C Disrupt +66 R Doomsday +125 U Downdraft +12 C Duskrider Falcon +97 C Dwarven Berserker +98 R Dwarven Thaumaturgist +13 C Empyrial Armor +38 R Ertai's Familiar +126 U Fallow Wurm +127 U Familiar Ground +67 C Fatal Blow +99 R Fervor +68 U Festering Evil +101 R Firestorm +100 C Fire Whip +102 C Fit of Rage +69 C Fledgling Djinn +39 C Flux +40 C Fog Elemental +14 U Foriysian Brigade +128 R Fungus Elemental +129 U Gaea's Blessing +70 R Gallowbraid +164 U Gemstone Mine +15 U Gerrard's Wisdom +103 R Goblin Bomb +104 U Goblin Grenadiers +105 C Goblin Vandal +16 C Guided Strike +130 C Harvest Wurm +71 C Haunting Misery +106 R Heart of Bogardan +107 R Heat Stroke +17 C Heavy Ballista +72 U Hidden Horror +108 U Hurloon Shaman +73 R Infernal Tribute +18 R Inner Sanctum +150 U Jabari's Banner +151 C Jangling Automaton +19 C Kithkin Armor +109 U Lava Hounds +110 C Lava Storm +131 R Liege of the Hollows +132 U Llanowar Behemoth +133 C Llanowar Druid +134 C Llanowar Sentinel +165 R Lotus Vale +41 C Mana Chains +152 R Mana Web +42 C Manta Ray +111 R Maraxus of Keld +20 U Master of Arms +43 C Merfolk Traders +153 C Mind Stone +74 U Mischievous Poltergeist +21 U Mistmoon Griffin +75 R Morinfen +135 R Mwonvuli Ooze +136 C Nature's Kiss +137 R Nature's Resurgence +76 U Necratog +44 U Noble Benefactor +154 R Null Rod +77 U Odylic Wraith +45 C Ophidian +112 U Orcish Settlers +46 R Paradigm Shift +22 R Peacekeeper +47 R Pendrell Mists +48 U Phantom Warrior +49 C Phantom Wings +155 U Phyrexian Furnace +50 R Psychic Vortex +78 C Razortooth Rats +138 C Redwood Treefolk +51 U Relearn +23 U Revered Unicorn +113 U Roc Hatchling +139 C Rogue Elephant +52 C Sage Owl +114 C Sawtooth Ogre +166 R Scorched Ruins +24 R Serenity +25 U Serra's Blessing +156 U Serrated Biskelion +79 C Shadow Rider +80 C Shattered Crypt +26 C Soul Shepherd +27 R Southern Paladin +81 C Spinning Darkness +157 U Steel Golem +82 U Strands of Night +158 U Straw Golem +140 C Striped Bears +141 U Sylvan Hierophant +28 R Tariff +53 U Teferi's Veil +83 C Tendrils of Despair +159 U Thran Forge +160 R Thran Tome +115 C Thunderbolt +116 R Thundermare +54 U Timid Drake +55 C Tolarian Drake +56 R Tolarian Entrancer +57 R Tolarian Serpent +161 U Touchstone +142 R Tranquil Grove +143 C Uktabi Efreet +84 R Urborg Justice +85 R Urborg Stalker +144 U Veteran Explorer +145 C Vitalize +58 U Vodalian Illusionist +29 U Volunteer Reserves +86 R Wave of Terror +162 R Well of Knowledge +167 R Winding Canyons +163 R Xanthic Statue +87 C Zombie Scavengers [tokens] g_1_1_squirrel \ No newline at end of file diff --git a/forge-gui/res/editions/Whispering Woods.txt b/forge-gui/res/editions/Whispering Woods.txt index 283347efbe9..f0a70f1c63d 100644 --- a/forge-gui/res/editions/Whispering Woods.txt +++ b/forge-gui/res/editions/Whispering Woods.txt @@ -5,4 +5,4 @@ Name=Whispering Woods Type=Other [cards] -C Windseeker Centaur \ No newline at end of file +3 C Windseeker Centaur \ No newline at end of file diff --git a/forge-gui/res/editions/Wizards Play Network 2021.txt b/forge-gui/res/editions/Wizards Play Network 2021.txt new file mode 100644 index 00000000000..46b8d8aa19a --- /dev/null +++ b/forge-gui/res/editions/Wizards Play Network 2021.txt @@ -0,0 +1,8 @@ +[metadata] +Code=PWP21 +Date=2021-06-18 +Name=Wizards Play Network 2021 +Type=Promos + +[cards] +1 R Fabled Passage diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2011-06-17.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2011-06-17.txt new file mode 100644 index 00000000000..13f22c1bd1b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2011-06-17.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander +Type:Historic +Subtype:Legacy +Effective:2011-06-17 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2011-07-15.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2011-07-15.txt index 3d12943f080..7e860a829fb 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2011-07-15.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2011-07-15.txt @@ -3,5 +3,5 @@ Name:Legacy, 2012 Core Set Type:Historic Subtype:Legacy Effective:2011-07-15 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2011-09-30.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2011-09-30.txt index f1e2426a908..9418291acce 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2011-09-30.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2011-09-30.txt @@ -3,5 +3,5 @@ Name:Legacy, Innistrad Type:Historic Subtype:Legacy Effective:2011-09-30 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2011-10-01.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2011-10-01.txt index 1357070d90c..03a08b92f10 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2011-10-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2011-10-01.txt @@ -3,5 +3,5 @@ Name:Legacy, 10/01/11 Type:Historic Subtype:Legacy Effective:2011-10-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2012-02-03.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2012-02-03.txt index ab6aebb1722..76d53193743 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2012-02-03.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2012-02-03.txt @@ -3,5 +3,5 @@ Name:Legacy, Dark Ascension Type:Historic Subtype:Legacy Effective:2012-02-03 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2012-05-04.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2012-05-04.txt index 1ac17e9c6a4..c496496c92e 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2012-05-04.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2012-05-04.txt @@ -3,5 +3,5 @@ Name:Legacy, Avacyn Restored Type:Historic Subtype:Legacy Effective:2012-05-04 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Land Tax, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2012-06-29.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2012-06-29.txt index 08a9fa0e7a5..25f4a8e3900 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2012-06-29.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2012-06-29.txt @@ -3,5 +3,5 @@ Name:Legacy, 06/29/12 Type:Historic Subtype:Legacy Effective:2012-06-29 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2012-07-13.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2012-07-13.txt index 10d42eb6094..7cc84349965 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2012-07-13.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2012-07-13.txt @@ -3,5 +3,5 @@ Name:Legacy, 2013 Core Set Type:Historic Subtype:Legacy Effective:2012-07-13 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2012-10-05.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2012-10-05.txt index 5aaf53f8dce..ec4717c93c9 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2012-10-05.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2012-10-05.txt @@ -3,5 +3,5 @@ Name:Legacy, Return to Ravnica Type:Historic Subtype:Legacy Effective:2012-10-05 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2013-02-01.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2013-02-01.txt index 43e2b4c84bd..42c270d27cc 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2013-02-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2013-02-01.txt @@ -3,5 +3,5 @@ Name:Legacy, Gatecrash Type:Historic Subtype:Legacy Effective:2013-02-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2013-05-03.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2013-05-03.txt index 4da68528f4c..614cc890796 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2013-05-03.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2013-05-03.txt @@ -3,5 +3,5 @@ Name:Legacy, Dragon's Maze Type:Historic Subtype:Legacy Effective:2013-05-03 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2013-07-19.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2013-07-19.txt index b2a5c0c1892..9754ba8545c 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2013-07-19.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2013-07-19.txt @@ -3,5 +3,5 @@ Name:Legacy, 2014 Core Set Type:Historic Subtype:Legacy Effective:2013-07-19 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2013-09-23.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2013-09-23.txt index d10fdde593d..84764ef0bcd 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2013-09-23.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2013-09-23.txt @@ -3,5 +3,5 @@ Name:Legacy, Theros Type:Historic Subtype:Legacy Effective:2013-09-23 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2013-11-01.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2013-11-01.txt new file mode 100644 index 00000000000..095d83e392e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2013-11-01.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2013 +Type:Historic +Subtype:Legacy +Effective:2013-09-23 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2014-02-07.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2014-02-07.txt index fafdc994caa..1179837bca6 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2014-02-07.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2014-02-07.txt @@ -3,5 +3,5 @@ Name:Legacy, Born of the Gods Type:Historic Subtype:Legacy Effective:2014-02-07 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2014-05-02.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2014-05-02.txt index 9ad71875f56..6b9f8c732b4 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2014-05-02.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2014-05-02.txt @@ -3,5 +3,5 @@ Name:Legacy, Journey into Nyx Type:Historic Subtype:Legacy Effective:2014-05-02 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2014-07-18.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2014-07-18.txt index 653f447c793..8ce624dc898 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2014-07-18.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2014-07-18.txt @@ -3,5 +3,5 @@ Name:Legacy, 2015 Core Set Type:Historic Subtype:Legacy Effective:2014-07-18 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2014-09-26.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2014-09-26.txt index 75da5b90b96..4ec4eb60be3 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2014-09-26.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2014-09-26.txt @@ -3,5 +3,5 @@ Name:Legacy, Khans of Tarkir Type:Historic Subtype:Legacy Effective:2014-09-26 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2014-11-07.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2014-11-07.txt new file mode 100644 index 00000000000..bc2a641bebe --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2014-11-07.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2014 +Type:Historic +Subtype:Legacy +Effective:2014-11-07 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Vampiric Tutor, Wheel of Fortune, Windfall, Worldgorger Dragon, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2015-01-23.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2015-01-23.txt index d51cb807981..2d5e7ec9352 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2015-01-23.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2015-01-23.txt @@ -3,5 +3,5 @@ Name:Legacy, Fate Reforged Type:Historic Subtype:Legacy Effective:2015-01-23 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2015-03-27.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2015-03-27.txt index cf1b08e9483..fcaef47d785 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2015-03-27.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2015-03-27.txt @@ -3,5 +3,5 @@ Name:Legacy, Dragons of Tarkir Type:Historic Subtype:Legacy Effective:2015-03-27 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2015-07-17.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2015-07-17.txt index 4be50647009..4e1f057c3e9 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2015-07-17.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2015-07-17.txt @@ -3,5 +3,5 @@ Name:Legacy, Magic Origins Type:Historic Subtype:Legacy Effective:2015-07-17 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Black Vise, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2015-10-02.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2015-10-02.txt index 6bd097b1e05..6e52833b124 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2015-10-02.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2015-10-02.txt @@ -3,5 +3,5 @@ Name:Legacy, Battle for Zendikar Type:Historic Subtype:Legacy Effective:2015-10-02 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2015-11-13.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2015-11-13.txt new file mode 100644 index 00000000000..32d0a38792e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2015-11-13.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2015 +Type:Historic +Subtype:Legacy +Effective:2015-11-13 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2016-01-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2016-01-22.txt index e564ac8d465..a95c32706f2 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2016-01-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2016-01-22.txt @@ -3,5 +3,5 @@ Name:Legacy, Oath of the Gatewatch Type:Historic Subtype:Legacy Effective:2016-01-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2016-04-08.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2016-04-08.txt index 6f27c0d848c..c9d066fe810 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2016-04-08.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2016-04-08.txt @@ -3,5 +3,5 @@ Name:Legacy, Shadows over Innistrad Type:Historic Subtype:Legacy Effective:2016-04-08 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2016-07-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2016-07-22.txt index 4e1bb9fa9e7..cb679270623 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2016-07-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2016-07-22.txt @@ -3,5 +3,5 @@ Name:Legacy, Eldritch Moon Type:Historic Subtype:Legacy Effective:2016-07-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2016-09-30.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2016-09-30.txt index 547d426b7e8..8b165364fad 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2016-09-30.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2016-09-30.txt @@ -3,5 +3,5 @@ Name:Legacy, Kaladesh Type:Historic Subtype:Legacy Effective:2016-09-30 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2016-11-11.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2016-11-11.txt new file mode 100644 index 00000000000..c5140146e43 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2016-11-11.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2016 +Type:Historic +Subtype:Legacy +Effective:2016-11-11 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-01-20.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-01-20.txt index afb53f9a95f..37194b4e9bf 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2017-01-20.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-01-20.txt @@ -3,5 +3,5 @@ Name:Legacy, Aether Revolt Type:Historic Subtype:Legacy Effective:2017-01-20 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-24.txt index 0a24152499c..8c93477f39c 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-24.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-24.txt @@ -3,5 +3,5 @@ Name:Legacy, 04/24/17 Type:Historic Subtype:Legacy Effective:2017-04-24 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-28.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-28.txt index ada4fb78447..8e48d63a698 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-28.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-04-28.txt @@ -3,5 +3,5 @@ Name:Legacy, Amonkhet Type:Historic Subtype:Legacy Effective:2017-04-28 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-07-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-07-14.txt index bafbf01a534..e30172edcdd 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2017-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-07-14.txt @@ -3,5 +3,5 @@ Name:Legacy, Hour of Devastation Type:Historic Subtype:Legacy Effective:2017-07-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-08-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-08-25.txt new file mode 100644 index 00000000000..f372695dcf5 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-08-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2017 +Type:Historic +Subtype:Legacy +Effective:2017-08-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2017-09-29.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2017-09-29.txt index 42808487e32..d4f6d46d287 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2017-09-29.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2017-09-29.txt @@ -3,5 +3,5 @@ Name:Legacy, Ixalan Type:Historic Subtype:Legacy Effective:2017-09-29 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-01-19.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-01-19.txt index 4469e160da8..d31bcd0f762 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-01-19.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-01-19.txt @@ -3,5 +3,5 @@ Name:Legacy, Rivals of Ixalan Type:Historic Subtype:Legacy Effective:2018-01-19 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-04-27.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-04-27.txt index 6c356bf0704..3210d63dee1 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-04-27.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-04-27.txt @@ -3,5 +3,5 @@ Name:Legacy, Dominaria Type:Historic Subtype:Legacy Effective:2018-04-27 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt index ee23213ddf6..0f50a2b2500 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-06-22.txt @@ -3,5 +3,5 @@ Name:Legacy, Jiang Yanggu & Mu Yanling Type:Historic Subtype:Legacy Effective:2018-06-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt index 701f7dd49ff..224e3e19a8c 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-06.txt @@ -3,5 +3,5 @@ Name:Legacy, 07/06/18 Type:Historic Subtype:Legacy Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt index 772b6362eec..253c154e82a 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-07-14.txt @@ -3,5 +3,5 @@ Name:Legacy, Core Set 2019 Type:Historic Subtype:Legacy Effective:2018-07-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-08-10.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-08-10.txt new file mode 100644 index 00000000000..9311649039b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-08-10.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2018 +Type:Historic +Subtype:Legacy +Effective:2018-08-10 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt index 7e9a7f13a54..db23116c422 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-10-06.txt @@ -3,5 +3,5 @@ Name:Legacy, Guilds of Ravnica Type:Historic Subtype:Legacy Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystial Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt index ede9f897a3b..8a78ca0d608 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2018-11-16.txt @@ -3,5 +3,5 @@ Name:Legacy, Gift Pack 2018 Type:Historic Subtype:Legacy Effective:2018-16-16 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt index efacdd5ed6f..5c77b68ca9a 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-01-25.txt @@ -3,5 +3,5 @@ Name:Legacy, Ravnica Allegiance Type:Historic Subtype:Legacy Effective:2019-01-25 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt index cd5c2c9382c..494ec6d0c73 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-05-24.txt @@ -3,5 +3,5 @@ Name:Legacy, War of the Spark Type:Historic Subtype:Legacy Effective:2019-05-24 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt index 870516080f9..4b25370da7f 100644 --- a/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-06-14.txt @@ -3,5 +3,5 @@ Name:Legacy, Modern Horizons Type:Historic Subtype:Legacy Effective:2019-06-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, MH1 -Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will \ No newline at end of file +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-07-12.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-07-12.txt new file mode 100644 index 00000000000..2fb283a2954 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-07-12.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Core Set 2020 +Type:Historic +Subtype:Legacy +Effective:2019-07-12 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-08-23.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-08-23.txt new file mode 100644 index 00000000000..0cf0146550a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-08-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander 2019 +Type:Historic +Subtype:Legacy +Effective:2019-08-23 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-10-04.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-10-04.txt new file mode 100644 index 00000000000..b275da15352 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-10-04.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Throne of Eldraine +Type:Historic +Subtype:Legacy +Effective:2019-10-04 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2019-11-22.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2019-11-22.txt new file mode 100644 index 00000000000..df8be2a0ad4 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2019-11-22.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, 11/22/19 +Type:Historic +Subtype:Legacy +Effective:2019-11-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Wrenn and Six, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-01-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-01-24.txt new file mode 100644 index 00000000000..c9de133eae7 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-01-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Theros Beyond Death +Type:Historic +Subtype:Legacy +Effective:2020-01-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Vampiric Tutor, Wheel of Fortune, Windfall, Wrenn and Six, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-03-10.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-03-10.txt new file mode 100644 index 00000000000..7524c10ad7a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-03-10.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, 3/10/20 +Type:Historic +Subtype:Legacy +Effective:2020-03-10 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Underworld Breach, Vampiric Tutor, Wheel of Fortune, Windfall, Wrenn and Six, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-04-24.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-04-24.txt new file mode 100644 index 00000000000..b83e210713f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-04-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Ikoria Lair of Behemoths +Type:Historic +Subtype:Legacy +Effective:2020-04-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20 +Banned:Amulet of Quoz, Ancestral Recall, Balance, Bazaar of Baghdad, Black Lotus, Bronze Tablet, Channel, Chaos Orb, Contract from Below, Darkpact, Deathrite Shaman, Demonic Attorney, Demonic Consultation, Demonic Tutor, Dig Through Time, Earthcraft, Falling Star, Fastbond, Flash, Frantic Search, Gitaxian Probe, Goblin Recruiter, Gush, Hermit Druid, Imperial Seal, Jeweled Bird, Library of Alexandria, Mana Crypt, Mana Drain, Mana Vault, Memory Jar, Mental Misstep, Mind Twist, Mind's Desire, Mishra's Workshop, Mox Emerald, Mox Jet, Mox Pearl, Mox Ruby, Mox Sapphire, Mystical Tutor, Necropotence, Oath of Druids, Rebirth, Sensei's Divining Top, Shahrazad, Skullclamp, Sol Ring, Strip Mine, Survival of the Fittest, Tempest Efreet, Time Vault, Time Walk, Timetwister, Timmerian Fiends, Tinker, Tolarian Academy, Treasure Cruise, Underworld Breach, Vampiric Tutor, Wheel of Fortune, Windfall, Wrenn and Six, Yawgmoth's Bargain, Yawgmoth's Will diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-05-18.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-05-18.txt new file mode 100644 index 00000000000..7110cad6470 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-05-18.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, 5/18/20 +Type:Historic +Subtype:Legacy +Effective:2020-05-18 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20 +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-03.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-03.txt new file mode 100644 index 00000000000..a0224e0cd1b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Core Set 2021 +Type:Historic +Subtype:Legacy +Effective:2020-07-03 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21 +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-17.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-17.txt new file mode 100644 index 00000000000..cdb6390a476 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-07-17.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Jumpstart +Type:Historic +Subtype:Legacy +Effective:2020-07-17 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-09-25.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-09-25.txt new file mode 100644 index 00000000000..e2c4953285a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-09-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Zendikar Rising +Type:Historic +Subtype:Legacy +Effective:2020-09-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2020-11-20.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2020-11-20.txt new file mode 100644 index 00000000000..ea2b26c588f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2020-11-20.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Commander Legends +Type:Historic +Subtype:Legacy +Effective:2020-11-20 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-05.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-05.txt new file mode 100644 index 00000000000..36ffc7cae35 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-05.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Kaldheim +Type:Historic +Subtype:Legacy +Effective:2021-02-05 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC +Banned:Amulet of Quoz; Ancestral Recall; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach; Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-15.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-15.txt new file mode 100644 index 00000000000..22b61472125 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2021-02-15.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, 2/15/21 +Type:Historic +Subtype:Legacy +Effective:2021-02-15 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC +Banned:Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Dreadhorde Arcanist; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Oko, Thief of Crowns; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach, Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Legacy/2021-04-23.txt b/forge-gui/res/formats/Historic/DCI/Legacy/2021-04-23.txt new file mode 100644 index 00000000000..a4779c2cd6e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Legacy/2021-04-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Legacy, Strixhaven School of Mages +Type:Historic +Subtype:Legacy +Effective:2021-04-23 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, GRN, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC, STX, C21 +Banned:Amulet of Quoz; Ancestral Recall; Arcum's Astrolabe; Balance; Bazaar of Baghdad; Black Lotus; Bronze Tablet; Channel; Chaos Orb; Contract from Below; Darkpact; Deathrite Shaman; Demonic Attorney; Demonic Consultation; Demonic Tutor; Dig Through Time; Dreadhorde Arcanist; Earthcraft; Falling Star; Fastbond; Flash; Frantic Search; Gitaxian Probe; Goblin Recruiter; Gush; Hermit Druid; Imperial Seal; Jeweled Bird; Library of Alexandria; Lurrus of the Dream-Den; Mana Crypt; Mana Drain; Mana Vault; Memory Jar; Mental Misstep; Mind Twist; Mind's Desire; Mishra's Workshop; Mox Emerald; Mox Jet; Mox Pearl; Mox Ruby; Mox Sapphire; Mystical Tutor; Necropotence; Oath of Druids; Oko, Thief of Crowns; Rebirth; Sensei's Divining Top; Shahrazad; Skullclamp; Sol Ring; Strip Mine; Survival of the Fittest; Tempest Efreet; Time Vault; Time Walk; Timetwister; Timmerian Fiends; Tinker; Tolarian Academy; Treasure Cruise; Underworld Breach, Vampiric Tutor; Wheel of Fortune; Windfall; Wrenn and Six; Yawgmoth's Bargain; Yawgmoth's Will; Zirda, the Dawnwaker diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-07-12.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-07-12.txt new file mode 100644 index 00000000000..b7be276f5c8 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-07-12.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Core Set 2020 +Type:Historic +Subtype:Modern +Effective:2019-07-12 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Stoneforge Mystic; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-08-30.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-08-30.txt new file mode 100644 index 00000000000..ff24c4d1cde --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-08-30.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, 08/30/19 +Type:Historic +Subtype:Modern +Effective:2019-08-30 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2019-10-04.txt b/forge-gui/res/formats/Historic/DCI/Modern/2019-10-04.txt new file mode 100644 index 00000000000..5e4641dbcb0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2019-10-04.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Throne of Eldraine +Type:Historic +Subtype:Modern +Effective:2019-10-04 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-01-14.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-01-14.txt new file mode 100644 index 00000000000..de074a859bf --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-01-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, 1/14/20 +Type:Historic +Subtype:Modern +Effective:2020-01-14 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-01-24.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-01-24.txt new file mode 100644 index 00000000000..9c44c6c41b7 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-01-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Theros Beyond Death +Type:Historic +Subtype:Modern +Effective:2020-01-24 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-04-24.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-04-24.txt new file mode 100644 index 00000000000..5f438817dcc --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-04-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Ikoria Lair of Behemoths +Type:Historic +Subtype:Modern +Effective:2020-04-24 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-07-03.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-07-03.txt new file mode 100644 index 00000000000..10f95a306d1 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-07-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Core Set 2021 +Type:Historic +Subtype:Modern +Effective:2020-07-03 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21 +Banned:Ancient Den; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-07-13.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-07-13.txt new file mode 100644 index 00000000000..f3722d75b4d --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-07-13.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, 7/13/20 +Type:Historic +Subtype:Modern +Effective:2020-07-13 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21 +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2020-09-25.txt b/forge-gui/res/formats/Historic/DCI/Modern/2020-09-25.txt new file mode 100644 index 00000000000..cf4fd8f026f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2020-09-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Zendikar Rising +Type:Historic +Subtype:Modern +Effective:2020-09-25 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2021-02-05.txt b/forge-gui/res/formats/Historic/DCI/Modern/2021-02-05.txt new file mode 100644 index 00000000000..1dd7c3519c9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2021-02-05.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Kaldheim +Type:Historic +Subtype:Modern +Effective:2021-02-05 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Skullclamp; Splinter Twin; Summer Bloom; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2021-02-15.txt b/forge-gui/res/formats/Historic/DCI/Modern/2021-02-15.txt new file mode 100644 index 00000000000..230537b245d --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2021-02-15.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, 2/15/21 +Type:Historic +Subtype:Modern +Effective:2021-02-15 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Uro, Titan of Nature's Wrath; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Modern/2021-04-23.txt b/forge-gui/res/formats/Historic/DCI/Modern/2021-04-23.txt new file mode 100644 index 00000000000..f240bc51139 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Modern/2021-04-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Modern, Strixhaven School of Mages +Type:Historic +Subtype:Modern +Effective:2021-04-23 +Sets:8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, MH1, M20, ELD, THB, IKO, M21, ZNR, KHM, STX +Banned:Ancient Den; Arcum's Astrolabe; Birthing Pod; Blazing Shoal; Bridge from Below; Chrome Mox; Cloudpost; Dark Depths; Deathrite Shaman; Dig Through Time; Dread Return; Eye of Ugin; Faithless Looting; Field of the Dead; Gitaxian Probe; Glimpse of Nature; Golgari Grave-Troll; Great Furnace; Green Sun's Zenith; Hogaak, Arisen Necropolis; Hypergenesis; Krark-Clan Ironworks; Mental Misstep; Mox Opal; Mycosynth Lattice; Mystic Sanctuary; Oko, Thief of Crowns; Ponder; Preordain; Punishing Fire; Rite of Flame; Seat of the Synod; Second Sunrise; Seething Song; Sensei's Divining Top; Simian Spirit Guide; Skullclamp; Splinter Twin; Summer Bloom; Tibalt's Trickery; Treasure Cruise; Tree of Tales; Umezawa's Jitte; Uro, Titan of Nature's Wrath; Vault of Whispers diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2019-10-25.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2019-10-25.txt new file mode 100644 index 00000000000..dfe5bca1e0d --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pauper/2019-10-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Pauper, 10/25/19 +Type:Historic +Subtype:Custom +Effective:2019-10-25 +Rarities:L, C +Banned:Arcum's Astrolabe; Gush; Gitaxian Probe; Daze diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2020-01-14.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2020-01-14.txt new file mode 100644 index 00000000000..3a8f56dbd56 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pauper/2020-01-14.txt @@ -0,0 +1,7 @@ +[format] +Name:Pauper, 01/14/20 +Type:Historic +Subtype:Custom +Effective:2020-01-14 +Rarities:L, C +Banned:Arcum's Astrolabe; Daze; Fall from Favor; Gush; Gitaxian Probe diff --git a/forge-gui/res/formats/Historic/DCI/Pauper/2020-07-13.txt b/forge-gui/res/formats/Historic/DCI/Pauper/2020-07-13.txt new file mode 100644 index 00000000000..8c6cdadd3e1 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pauper/2020-07-13.txt @@ -0,0 +1,7 @@ +[format] +Name:Pauper, 07/13/20 +Type:Historic +Subtype:Custom +Effective:2020-07-13 +Rarities:L, C +Banned:Arcum's Astrolabe; Daze; Expedition Map; Fall from Favor; Gush; Gitaxian Probe; Mystic Sanctuary diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2019-10-23.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2019-10-23.txt new file mode 100644 index 00000000000..4378c09f73b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2019-10-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer +Type:Historic +Subtype:Pioneer +Effective:2019-10-23 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD +Banned:Bloodstained Mire, Flooded Strand, Polluted Delta, Windswept Heath, Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2019-11-08.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2019-11-08.txt new file mode 100644 index 00000000000..945f3cdd3a9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2019-11-08.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, 11/4/19 +Type:Historic +Subtype:Pioneer +Effective:2019-11-04 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD +Banned:Bloodstained Mire, Felidar Guardian, Flooded Strand, Leyline of Abundance, Oath of Nissa, Polluted Delta, Windswept Heath, Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-01-24.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-01-24.txt new file mode 100644 index 00000000000..6094ad16f12 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-01-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Theros Beyond Death +Type:Historic +Subtype:Pioneer +Effective:2020-01-24 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB +Banned:Bloodstained Mire, Felidar Guardian, Flooded Strand, Leyline of Abundance, Oath of Nissa, Polluted Delta, Windswept Heath, Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-04-24.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-04-24.txt new file mode 100644 index 00000000000..c6596efb79b --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-04-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Ikoria Lair of Behemoths +Type:Historic +Subtype:Pioneer +Effective:2020-04-24 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO +Banned:Bloodstained Mire, Felidar Guardian, Flooded Strand, Leyline of Abundance, Oath of Nissa, Polluted Delta, Windswept Heath, Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-03.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-03.txt new file mode 100644 index 00000000000..a1e5a5c7381 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Core Set 2021 +Type:Historic +Subtype:Pioneer +Effective:2020-07-03 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21 +Banned:Bloodstained Mire, Felidar Guardian, Flooded Strand, Leyline of Abundance, Oath of Nissa, Polluted Delta, Windswept Heath, Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-13.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-13.txt new file mode 100644 index 00000000000..21a94b7893e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-07-13.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, 7/13/20 +Type:Historic +Subtype:Pioneer +Effective:2020-07-13 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21 +Banned:Bloodstained Mire; Felidar Guardian; Flooded Strand; Leyline of Abundance; Polluted Delta; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-08-03.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-08-03.txt new file mode 100644 index 00000000000..6aeec588da4 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-08-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, 8/3/20 +Type:Historic +Subtype:Pioneer +Effective:2020-08-03 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21 +Banned:Bloodstained Mire; Felidar Guardian; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Polluted Delta; Underworld Breach; Walking Ballista; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2020-09-25.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-09-25.txt new file mode 100644 index 00000000000..10f90cea51a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2020-09-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Zendikar Rising +Type:Historic +Subtype:Pioneer +Effective:2020-09-25 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR +Banned:Bloodstained Mire; Felidar Guardian; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Polluted Delta; Underworld Breach; Walking Ballista; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-05.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-05.txt new file mode 100644 index 00000000000..f039924aca0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-05.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Kaldheim +Type:Historic +Subtype:Pioneer +Effective:2021-02-05 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM +Banned:Bloodstained Mire; Felidar Guardian; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Polluted Delta; Underworld Breach; Walking Ballista; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-15.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-15.txt new file mode 100644 index 00000000000..fe0452fdf49 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-02-15.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, 2/15/21 +Type:Historic +Subtype:Pioneer +Effective:2021-02-15 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM +Banned:Balustrade Spy; Bloodstained Mire; Felidar Guardian; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Polluted Delta; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Walking Ballista; Wilderness Reclamation; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Pioneer/2021-04-23.txt b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-04-23.txt new file mode 100644 index 00000000000..557b14d79dd --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Pioneer/2021-04-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Pioneer, Strixhaven School of Mages +Type:Historic +Subtype:Pioneer +Effective:2021-04-23 +Sets:RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, GRN, G18, RNA, WAR, M20, ELD, THB, IKO, M21, ZNR, KHM, STX +Banned:Balustrade Spy; Bloodstained Mire; Felidar Guardian; Flooded Strand; Inverter of Truth; Kethis, the Hidden Hand; Leyline of Abundance; Polluted Delta; Teferi, Time Raveler; Undercity Informer; Underworld Breach; Uro, Titan of Nature's Wrath; Walking Ballista; Wilderness Reclamation; Windswept Heath; Wooded Foothills diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-07-12.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-07-12.txt new file mode 100644 index 00000000000..170f5a37906 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-07-12.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Core Set 2020 +Type:Historic +Subtype:Standard +Effective:2019-07-12 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20 +Banned:Rampaging Ferocidon diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-08-30.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-08-30.txt new file mode 100644 index 00000000000..7ac9f932311 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-08-30.txt @@ -0,0 +1,6 @@ +[format] +Name:Standard, 8/30/19 +Type:Historic +Subtype:Standard +Effective:2019-08-30 +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20 diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-10-04.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-10-04.txt new file mode 100644 index 00000000000..b8941a1931a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-10-04.txt @@ -0,0 +1,6 @@ +[format] +Name:Standard, Throne of Eldraine +Type:Historic +Subtype:Standard +Effective:2019-10-04 +Sets:GRN, RNA, WAR, M20, ELD diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-10-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-10-25.txt new file mode 100644 index 00000000000..b47b964901f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-10-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 10/25/19 +Type:Historic +Subtype:Standard +Effective:2019-10-25 +Sets:GRN, RNA, WAR, M20, ELD +Banned: Field of the Dead diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2019-11-22.txt b/forge-gui/res/formats/Historic/DCI/Standard/2019-11-22.txt new file mode 100644 index 00000000000..b79c115c52c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2019-11-22.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 11/22/19 +Type:Historic +Subtype:Standard +Effective:2019-11-22 +Sets:GRN, RNA, WAR, M20, ELD +Banned: Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-01-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-01-24.txt new file mode 100644 index 00000000000..f7a270982be --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-01-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Theros Beyond Death +Type:Historic +Subtype:Standard +Effective:2020-01-24 +Sets:GRN, RNA, WAR, M20, ELD, THB +Banned: Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-04-24.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-04-24.txt new file mode 100644 index 00000000000..491120a91fc --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-04-24.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Ikoria Lair of Behemoths +Type:Historic +Subtype:Standard +Effective:2020-04-24 +Sets:GRN, RNA, WAR, M20, ELD, THB, IKO +Banned: Field of the Dead; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-06-01.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-06-01.txt new file mode 100644 index 00000000000..620e422e6f9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-06-01.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 6/1/20 +Type:Historic +Subtype:Standard +Effective:2020-06-01 +Sets:GRN, RNA, WAR, M20, ELD, THB, IKO +Banned: Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-07-03.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-07-03.txt new file mode 100644 index 00000000000..1692a024e0d --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-07-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Core Set 2021 +Type:Historic +Subtype:Standard +Effective:2020-07-03 +Sets:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 +Banned: Agent of Treachery; Field of the Dead; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Veil of Summer diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-08-03.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-08-03.txt new file mode 100644 index 00000000000..70fe15acd40 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-08-03.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 8/3/20 +Type:Historic +Subtype:Standard +Effective:2020-08-03 +Sets:GRN, RNA, WAR, M20, ELD, THB, IKO, M21 +Banned: Agent of Treachery; Cauldron Familiar; Field of the Dead; Fires of Invention; Growth Spiral; Oko, Thief of Crowns; Once Upon a Time; Teferi, Time Raveler; Veil of Summer; Wilderness Reclamation diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-09-25.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-09-25.txt new file mode 100644 index 00000000000..91221055b5a --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-09-25.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Zendikar Rising +Type:Historic +Subtype:Standard +Effective:2020-09-25 +Sets:ELD, THB, IKO, M21, ZNR +Banned: Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-09-28.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-09-28.txt new file mode 100644 index 00000000000..ddf20330a77 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-09-28.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 9/28/20 +Type:Historic +Subtype:Standard +Effective:2020-09-28 +Sets:ELD, THB, IKO, M21, ZNR +Banned: Cauldron Familiar; Fires of Invention; Oko, Thief of Crowns; Once Upon a Time; Uro, Titan of Nature's Wrath diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2020-10-12.txt b/forge-gui/res/formats/Historic/DCI/Standard/2020-10-12.txt new file mode 100644 index 00000000000..d68e1cf4131 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2020-10-12.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, 10/12/20 +Type:Historic +Subtype:Standard +Effective:2020-10-12 +Sets:ELD, THB, IKO, M21, ZNR +Banned: Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2021-02-05.txt b/forge-gui/res/formats/Historic/DCI/Standard/2021-02-05.txt new file mode 100644 index 00000000000..e597acd9844 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2021-02-05.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Kaldheim +Type:Historic +Subtype:Standard +Effective:2021-02-05 +Sets:ELD, THB, IKO, M21, ZNR, KHM +Banned: Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath diff --git a/forge-gui/res/formats/Historic/DCI/Standard/2021-04-23.txt b/forge-gui/res/formats/Historic/DCI/Standard/2021-04-23.txt new file mode 100644 index 00000000000..be40180ba1f --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Standard/2021-04-23.txt @@ -0,0 +1,7 @@ +[format] +Name:Standard, Strixhaven School of Mages +Type:Historic +Subtype:Standard +Effective:2021-04-23 +Sets:ELD, THB, IKO, M21, ZNR, KHM, STX +Banned: Cauldron Familiar; Escape to the Wilds; Fires of Invention; Lucky Clover; Oko, Thief of Crowns; Omnath, Locus of Creation; Once Upon a Time; Uro, Titan of Nature's Wrath diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2011-06-17.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2011-06-17.txt new file mode 100644 index 00000000000..9cfb43d21bf --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2011-06-17.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander +Type:Historic +Subtype:Vintage +Effective:2011-06-17 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fact or Fiction, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2011-07-15.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2011-07-15.txt index 2c0f575cde4..0d710fa08ed 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2011-07-15.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2011-07-15.txt @@ -3,6 +3,6 @@ Name:Vintage, 2012 Core Set Type:Historic Subtype:Vintage Effective:2011-07-15 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fact or Fiction, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2011-09-30.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2011-09-30.txt index 40e42077817..e855cacd86c 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2011-09-30.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2011-09-30.txt @@ -3,6 +3,6 @@ Name:Vintage, Innistrad Type:Historic Subtype:Vintage Effective:2011-09-30 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fact or Fiction, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2011-10-01.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2011-10-01.txt index 23330947673..db334862dbf 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2011-10-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2011-10-01.txt @@ -3,6 +3,6 @@ Name:Vintage, 10/01/11 Type:Historic Subtype:Vintage Effective:2011-10-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2012-02-03.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2012-02-03.txt index 62d63145aad..fd07ecea458 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2012-02-03.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2012-02-03.txt @@ -3,6 +3,6 @@ Name:Vintage, Dark Ascension Type:Historic Subtype:Vintage Effective:2012-02-03 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2012-05-04.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2012-05-04.txt index c7afafbfdd7..a9652edc555 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2012-05-04.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2012-05-04.txt @@ -3,6 +3,6 @@ Name:Vintage, Avacyn Restored Type:Historic Subtype:Vintage Effective:2012-05-04 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2012-07-13.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2012-07-13.txt index 649db302700..d18ce137d86 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2012-07-13.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2012-07-13.txt @@ -3,6 +3,6 @@ Name:Vintage, 2013 Core Set Type:Historic Subtype:Vintage Effective:2012-07-13 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Burning Wish, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-01.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-01.txt index 9129270df30..d278956d089 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-01.txt @@ -3,6 +3,6 @@ Name:Vintage, 10/01/12 Type:Historic Subtype:Vintage Effective:2012-10-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-05.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-05.txt index c2c060d1dd2..1e9b62f205a 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-05.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2012-10-05.txt @@ -3,6 +3,6 @@ Name:Vintage, Return to Ravnica Type:Historic Subtype:Vintage Effective:2012-10-05 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2013-02-01.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2013-02-01.txt index 395b536b08f..993b3891da3 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2013-02-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2013-02-01.txt @@ -3,6 +3,6 @@ Name:Vintage, Gatecrash Type:Historic Subtype:Vintage Effective:2013-02-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Regrowth, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2013-05-03.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2013-05-03.txt index 2c42e356976..e96edb83a10 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2013-05-03.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2013-05-03.txt @@ -3,6 +3,6 @@ Name:Vintage, Dragon's Maze Type:Historic Subtype:Vintage Effective:2013-05-03 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2013-07-19.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2013-07-19.txt index 54d5f5dd603..31ea90bb883 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2013-07-19.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2013-07-19.txt @@ -3,6 +3,6 @@ Name:Vintage, 2014 Core Set Type:Historic Subtype:Vintage Effective:2013-07-19 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2013-09-23.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2013-09-23.txt index 7961b14c60d..90b8b82b70f 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2013-09-23.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2013-09-23.txt @@ -3,6 +3,6 @@ Name:Vintage, Theros Type:Historic Subtype:Vintage Effective:2013-09-23 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2013-11-01.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2013-11-01.txt new file mode 100644 index 00000000000..712adc01501 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2013-11-01.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2013 +Type:Historic +Subtype:Vintage +Effective:2013-11-01 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2014-02-07.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2014-02-07.txt index 4d36fd07e93..4cd49257db4 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2014-02-07.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2014-02-07.txt @@ -3,6 +3,6 @@ Name:Vintage, Born of the Gods Type:Historic Subtype:Vintage Effective:2014-02-07 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2014-05-02.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2014-05-02.txt index 196bda8af88..62a53303af9 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2014-05-02.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2014-05-02.txt @@ -3,6 +3,6 @@ Name:Vintage, Journey into Nyx Type:Historic Subtype:Vintage Effective:2014-05-02 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2014-07-18.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2014-07-18.txt index a78382dd822..0f6efafcb32 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2014-07-18.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2014-07-18.txt @@ -3,6 +3,6 @@ Name:Vintage, 2015 Core Set Type:Historic Subtype:Vintage Effective:2014-07-18 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2014-09-26.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2014-09-26.txt index bfcf43eb8eb..d6fd5914f5f 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2014-09-26.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2014-09-26.txt @@ -3,6 +3,6 @@ Name:Vintage, Khans of Tarkir Type:Historic Subtype:Vintage Effective:2014-09-26 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2014-11-07.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2014-11-07.txt new file mode 100644 index 00000000000..3a2ef119283 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2014-11-07.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2014 +Type:Historic +Subtype:Vintage +Effective:2014-11-07 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2015-01-23.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2015-01-23.txt index 13adb53c3d7..08cdbd2ee88 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2015-01-23.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2015-01-23.txt @@ -3,6 +3,6 @@ Name:Vintage, Fate Reforged Type:Historic Subtype:Vintage Effective:2015-01-23 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2015-03-27.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2015-03-27.txt index e3bb84a371e..e581e290067 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2015-03-27.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2015-03-27.txt @@ -3,6 +3,6 @@ Name:Vintage, Dragons of Tarkir Type:Historic Subtype:Vintage Effective:2015-03-27 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2015-07-17.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2015-07-17.txt index d5994fddf72..cb931b50cc2 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2015-07-17.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2015-07-17.txt @@ -3,6 +3,6 @@ Name:Vintage, Magic Origins Type:Historic Subtype:Vintage Effective:2015-07-17 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Channel, Demonic Consultation, Demonic Tutor, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thirst for Knowledge, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2015-10-02.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2015-10-02.txt index e694374504a..d84c104bfa4 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2015-10-02.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2015-10-02.txt @@ -3,6 +3,6 @@ Name:Vintage, Battle for Zendikar Type:Historic Subtype:Vintage Effective:2015-10-02 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2015-11-13.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2015-11-13.txt new file mode 100644 index 00000000000..1c86e8ae993 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2015-11-13.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2015 +Type:Historic +Subtype:Vintage +Effective:2015-11-13 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2016-01-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2016-01-22.txt index aef7a48cd83..21157d06551 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2016-01-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2016-01-22.txt @@ -3,6 +3,6 @@ Name:Vintage, Oath of the Gatewatch Type:Historic Subtype:Vintage Effective:2016-01-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2016-04-08.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2016-04-08.txt index 15a6905dfef..2eb1ba0734e 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2016-04-08.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2016-04-08.txt @@ -3,6 +3,6 @@ Name:Vintage, Shadows over Innistrad Type:Historic Subtype:Vintage Effective:2016-04-08 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2016-07-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2016-07-22.txt index bd20881ea48..97cf6a7b938 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2016-07-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2016-07-22.txt @@ -3,6 +3,6 @@ Name:Vintage, Eldritch Moon Type:Historic Subtype:Vintage Effective:2016-07-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2016-09-30.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2016-09-30.txt index 038974ee4c2..468225cc776 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2016-09-30.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2016-09-30.txt @@ -3,6 +3,6 @@ Name:Vintage, Kaladesh Type:Historic Subtype:Vintage Effective:2016-09-30 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2016-11-11.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2016-11-11.txt new file mode 100644 index 00000000000..b1e46064480 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2016-11-11.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2016 +Type:Historic +Subtype:Vintage +Effective:2016-11-11 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-01-20.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-01-20.txt index 462a464fd6d..7ad28aeff50 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-01-20.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-01-20.txt @@ -3,6 +3,6 @@ Name:Vintage, Aether Revolt Type:Historic Subtype:Vintage Effective:2017-01-20 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-24.txt index bc90d8a09f4..419ec12ddbf 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-24.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-24.txt @@ -3,6 +3,6 @@ Name:Vintage, 04/24/17 Type:Historic Subtype:Vintage Effective:2017-04-24 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-28.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-28.txt index 381d6211951..57f8a89ff1e 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-28.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-04-28.txt @@ -3,6 +3,6 @@ Name:Vintage, Amonkhet Type:Historic Subtype:Vintage Effective:2017-04-28 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-07-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-07-14.txt index 383b32c509f..e36c44b1bff 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-07-14.txt @@ -3,6 +3,6 @@ Name:Vintage, Hour of Devastation Type:Historic Subtype:Vintage Effective:2017-07-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-08-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-08-25.txt new file mode 100644 index 00000000000..8ed36645a3e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-08-25.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2017 +Type:Historic +Subtype:Vintage +Effective:2017-08-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Bargain, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-01.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-01.txt index 8fdb2de99dd..6bd8fbdadef 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-01.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-01.txt @@ -3,6 +3,6 @@ Name:Vintage, 09/01/17 Type:Historic Subtype:Vintage Effective:2017-09-01 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-29.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-29.txt index 2b59890cd9b..a2b052c8b24 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-29.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2017-09-29.txt @@ -3,6 +3,6 @@ Name:Vintage, Ixalan Type:Historic Subtype:Vintage Effective:2017-09-29 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-01-19.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-01-19.txt index b6da1f5a80c..3c41f1121d5 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-01-19.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-01-19.txt @@ -3,6 +3,6 @@ Name:Vintage, Rivals of Ixalan Type:Historic Subtype:Vintage Effective:2018-01-19 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-04-27.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-04-27.txt index 9c8d27ff668..c252550c7b4 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-04-27.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-04-27.txt @@ -3,6 +3,6 @@ Name:Vintage, Dominaria Type:Historic Subtype:Vintage Effective:2018-04-27 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt index 5e0a2aeeb16..a78b8e6b92f 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-06-22.txt @@ -3,6 +3,6 @@ Name:Vintage, Jiang Yanggu & Mu Yanling Type:Historic Subtype:Vintage Effective:2018-06-22 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt index 1e46ab461f3..08ed16bed83 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-07-14.txt @@ -3,6 +3,6 @@ Name:Vintage, Core Set 2019 Type:Historic Subtype:Vintage Effective:2018-07-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-08-10.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-08-10.txt new file mode 100644 index 00000000000..383ce83e81e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-08-10.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2018 +Type:Historic +Subtype:Vintage +Effective:2018-08-10 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt index 335b48aab8f..fbc373cf739 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-10-06.txt @@ -3,6 +3,6 @@ Name:Vintage, Guilds of Ravnica Type:Historic Subtype:Vintage Effective:2018-10-06 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt index 85472a7163e..6fc87641172 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2018-11-16.txt @@ -3,6 +3,6 @@ Name:Vintage, Gift Pack 2018 Type:Historic Subtype:Vintage Effective:2018-11-16 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt index abb5d3902b8..46a5b3c8999 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-01-25.txt @@ -3,6 +3,6 @@ Name:Vintage, Ravnica Allegiance Type:Historic Subtype:Vintage Effective:2019-01-25 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt index cf7a3a2b78e..ccdf2969d85 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-05-24.txt @@ -3,6 +3,6 @@ Name:Vintage, War of the Spark Type:Historic Subtype:Vintage Effective:2019-05-24 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt index 1f10a6ea9e0..11626efff4e 100644 --- a/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-06-14.txt @@ -3,6 +3,6 @@ Name:Vintage, Modern Horizons Type:Historic Subtype:Vintage Effective:2019-06-14 -Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, BNG, JOU, M15, KTK, FRF, DTK, ORI, BFZ, OGW, W16, SOI, EMN, KLD, AER, W17, AKH, HOU, XLN, RIX, DOM, GS1, M19, G18, RNA, WAR, MH1 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1 Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will -Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends \ No newline at end of file +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-07-12.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-07-12.txt new file mode 100644 index 00000000000..e34598acce7 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-07-12.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Core Set 2020 +Type:Historic +Subtype:Vintage +Effective:2019-07-12 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-23.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-23.txt new file mode 100644 index 00000000000..3f25a0d6204 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-23.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander 2019 +Type:Historic +Subtype:Vintage +Effective:2019-08-23 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19 +Restricted:Ancestral Recall, Balance, Black Lotus, Brainstorm, Chalice of the Void, Channel, Demonic Consultation, Demonic Tutor, Dig Through Time, Fastbond, Flash, Gifts Ungiven, Gitaxian Probe, Gush, Imperial Seal, Library of Alexandria, Lion's Eye Diamond, Lodestone Golem, Lotus Petal, Mana Crypt, Mana Vault, Memory Jar, Merchant Scroll, Mind's Desire, Monastery Mentor, Mox Emerald, Mox Pearl, Mox Ruby, Mox Sapphire, Mox Jet, Mystical Tutor, Necropotence, Ponder, Sol Ring, Strip Mine, Thorn of Amethyst, Timetwister, Time Vault, Time Walk, Tinker, Tolarian Academy, Trinisphere, Vampiric Tutor, Wheel of Fortune, Windfall, Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-30.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-30.txt new file mode 100644 index 00000000000..9efeee9fcf3 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-08-30.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, 08/30/19 +Type:Historic +Subtype:Vintage +Effective:2019-08-30 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-10-04.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-10-04.txt new file mode 100644 index 00000000000..b34f09e6fbb --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-10-04.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Throne of Eldraine +Type:Historic +Subtype:Vintage +Effective:2019-10-04 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2019-11-22.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2019-11-22.txt new file mode 100644 index 00000000000..1aa5d9a9325 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2019-11-22.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, 11/22/19 +Type:Historic +Subtype:Vintage +Effective:2019-11-22 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-01-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-01-24.txt new file mode 100644 index 00000000000..228d847e9da --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-01-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Theros Beyond Death +Type:Historic +Subtype:Vintage +Effective:2020-01-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-03-10.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-03-10.txt new file mode 100644 index 00000000000..7d8409934e9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-03-10.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, 3/10/20 +Type:Historic +Subtype:Vintage +Effective:2020-03-10 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-04-24.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-04-24.txt new file mode 100644 index 00000000000..f4370f373f0 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-04-24.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Ikoria Lair of Behemoths +Type:Historic +Subtype:Vintage +Effective:2020-04-24 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-05-18.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-05-18.txt new file mode 100644 index 00000000000..c349a8ea59c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-05-18.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, 5/18/20 +Type:Historic +Subtype:Vintage +Effective:2020-05-18 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-03.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-03.txt new file mode 100644 index 00000000000..ac91d8032cf --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-03.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Core Set 2021 +Type:Historic +Subtype:Vintage +Effective:2020-07-03 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-17.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-17.txt new file mode 100644 index 00000000000..5fcc09bedc5 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-07-17.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Jumpstart +Type:Historic +Subtype:Vintage +Effective:2020-07-17 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-09-25.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-09-25.txt new file mode 100644 index 00000000000..06c8c167dd9 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-09-25.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Zendikar Rising +Type:Historic +Subtype:Vintage +Effective:2020-09-25 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2020-11-20.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2020-11-20.txt new file mode 100644 index 00000000000..fbf69ecfd01 --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2020-11-20.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Commander Legends +Type:Historic +Subtype:Vintage +Effective:2020-11-20 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-05.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-05.txt new file mode 100644 index 00000000000..4e287246b4e --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-05.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Kaldheim +Type:Historic +Subtype:Vintage +Effective:2021-02-05 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Lurrus of the Dream-Den, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-15.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-15.txt new file mode 100644 index 00000000000..83cc0cc9d8c --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2021-02-15.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, 2/15/21 +Type:Historic +Subtype:Vintage +Effective:2021-02-15 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Historic/DCI/Vintage/2021-04-23.txt b/forge-gui/res/formats/Historic/DCI/Vintage/2021-04-23.txt new file mode 100644 index 00000000000..2e1a30137de --- /dev/null +++ b/forge-gui/res/formats/Historic/DCI/Vintage/2021-04-23.txt @@ -0,0 +1,8 @@ +[format] +Name:Vintage, Strixhaven School of Mages +Type:Historic +Subtype:Vintage +Effective:2021-04-23 +Sets:LEB, 2ED, ARN, DRC94, ATQ, 3ED, LEG, DRK, ARENA, FEM, WW, SHC, FS, 4ED, ICE, CHR, HML, ALL, MIR, VIS, 5ED, WTH, TMP, STH, EXO, USG, ULG, 6ED, UDS, MMQ, NMS, PCY, INV, PLS, 7ED, APC, ODY, TOR, JUD, ONS, LGN, SCG, 8ED, MRD, DST, 5DN, CHK, BOK, SOK, 9ED, POR, PO2, PTK, S99, S00, RAV, GPT, DIS, CSP, TSP, TSB, PLC, FUT, 10E, LRW, MOR, SHM, EVE, ALA, CFX, ARB, M10, ZEN, WWK, ROE, M11, SOM, MBS, NPH, COM, M12, ISD, DKA, AVR, M13, RTR, GTC, DGM, M14, THS, C13, BNG, JOU, M15, KTK, C14, FRF, DTK, ORI, BFZ, C15, OGW, W16, SOI, EMN, KLD, C16, AER, W17, AKH, HOU, C17, XLN, RIX, DOM, GS1, M19, C18, G18, RNA, WAR, MH1, M20, C19, ELD, THB, IKO, C20, M21, JMP, ZNR, ZNC, CMR, KHM, KHC, STX, C21 +Restricted:Ancestral Recall; Balance; Black Lotus; Brainstorm; Chalice of the Void; Channel; Demonic Consultation; Demonic Tutor; Dig Through Time; Flash; Gifts Ungiven; Gitaxian Probe; Golgari Grave-Troll; Gush; Imperial Seal; Karn, the Great Creator; Library of Alexandria; Lion's Eye Diamond; Lodestone Golem; Lotus Petal; Mana Crypt; Mana Vault; Memory Jar; Mental Misstep; Merchant Scroll; Mind's Desire; Monastery Mentor; Mox Emerald; Mox Pearl; Mox Ruby; Mox Sapphire; Mox Jet; Mystic Forge; Mystical Tutor; Narset, Parter of Veils; Necropotence; Ponder; Sol Ring; Strip Mine; Thorn of Amethyst; Timetwister; Time Vault; Time Walk; Tinker; Tolarian Academy; Trinisphere; Vampiric Tutor; Wheel of Fortune; Windfall; Yawgmoth's Will +Banned:Amulet of Quoz, Bronze Tablet, Chaos Orb, Contract from Below, Darkpact, Demonic Attorney, Falling Star, Jeweled Bird, Once Upon a Time, Rebirth, Shahrazad, Stroke of Genius, Tempest Efreet, Timmerian Fiends diff --git a/forge-gui/res/formats/Sanctioned/Historic.txt b/forge-gui/res/formats/Sanctioned/Historic.txt index e84bb3b6334..d7f9cc86434 100644 --- a/forge-gui/res/formats/Sanctioned/Historic.txt +++ b/forge-gui/res/formats/Sanctioned/Historic.txt @@ -4,5 +4,5 @@ Type:Digital Subtype:Arena Effective:2019-11-21 Order:142 -Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR, KLR, KHM, HA4, STX, STA +Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2, IKO, HA3, M21, JMP, AKR, ZNR, KLR, KHM, HA4, STX, STA, HA5 Banned:Agent of Treachery; Channel; Counterspell; Dark Ritual; Demonic Tutor; Field of the Dead; Fires of Invention; Lightning Bolt; Oko, Thief of Crowns; Omnath, Locus of Creation; Natural Order; Nexus of Fate; Once Upon a Time; Swords to Plowshares; Teferi, Time Raveler; Veil of Summer; Uro, Titan of Nature's Wrath; Wilderness Reclamation; Winota, Joiner of Forces diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index 5bfa301d34b..c3031378928 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -117,6 +117,8 @@ cbpCounterDisplayLocation=Markeranzeige Ort cbpGraveyardOrdering=Genaue Reihenfolge im Friedhof einhalten lblAltLifeDisplay=Alternatives Spieler-Layout (Landscape-Modus) nlAltLifeDisplay=Alternative Anzeige von Lebens-, Gift-, Energie- und Erfahrungspunkten. +lblAltZoneTabs=Alternatives Spielerbereich-Layout (Landscape-Modus) +nlAltZoneTabs=Alternative Anzeige von Kartenhand, Friedhof, Bibliothek und Exilzone. lblPreferredArt=Bevorzugter Bildtyp nlPreferredArt=Setzt die bevorzugte Art der Bilder. Troubleshooting=Fehlerbehebung @@ -193,6 +195,8 @@ nlSrOptimize=Setze verschiedene Optionen, um Forge besser für Screenreader lesb KeyboardShortcuts=Tastenkombinationen cbpLandPlayed=Land-kommt-ins-Spiel-Benachrichtigung nlpLandPlayed=Wenn ein Land auf das Spielfeld kommt, wann möchtest du eine Benachrichtigung bekommen: Niemals, immer oder nur bei Aktionen der KI? +cbpSwitchStates=Ändere Kartenstatus +nlSwitchStates=Zeige alternativen Status für jede zweite Kopie in der Deckanzeige. #VSubmenuAchievements.java lblAchievements=Errungenschaften #VSubmenuDownloaders.java @@ -357,6 +361,15 @@ lblTotalDamageText=Gesamtschaden: Unbekannt lblAssignRemainingText=Verteile verbleibenden Schaden unter tödlich Verwundeten lblLethal=Tödlich lblAvailableDamagePoints=Verfügbare Schadenspunkte +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect=Assign {0} by {1} +lblLClickAmountMessage=Left click: Assign 1 {0}. (Left Click + Control): Assign maximum {0} points +lblRClickAmountMessage=Right click: Unassign 1 {0}. (Right Click + Control): Unassign all {0} points. +lblTotalAmountText=Available {0} points: Unknown +lblAvailableAmount=Available {0} points +lblMax=Max +lblShield=shield #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Duell: Zeige Stapelfenster lblSHORTCUT_SHOWCOMBAT=Duell: Zeige Kampffenster @@ -870,8 +883,7 @@ lblSaveLayout=Sichere Layout #GroupDef.java lblColor=Farbe lblColorIdentity=Farbidentität -lblSet=Set -lblSet2=Set +lblSet=Auflage #Set word has different meanings in other languages lblDefault=Standard lblType=Typ @@ -928,7 +940,7 @@ lblCost=Kosten ttCost=Kosten lblDecks=Decks lblDeleteEdit=Löschen/Bearbeiten -lblSetEdition=Mysteriöse Spalte. Wir wissen nicht, wozu sie gut ist. +lblSetEdition=Auflage ttFavorite=Favorit lblFolder=Ordner ttFormats=In welchem Format das Deck legal ist @@ -2026,7 +2038,7 @@ lblNotFoundCustomSealedFiles=Keine angepaßte Sealed-Datei gefunden. lblChooseCustomSealedPool=Wähle angepaßte Sealed-Auswahl lblHowManyBoosterPacks=Wie viele Booster-Packs? #DialogChooseSets.java -lblDisplayRecentSetRepints=Zeige passende Drucke von aktuelleren Sets +lblDisplayRecentSetReprints=Zeige passende Drucke von aktuelleren Sets lblSelectRandomSets=Wähle zufällige Sets lblSelectNumber=Wähle Anzahl lblCore=Haupt @@ -2041,7 +2053,8 @@ lblShowOptions=Zeige Optionen lblHideOptions=Verstecke Optionen lblCoreSets=Hauptsets lblExpansions=Erweiterungen -lblOtherSets=Andere Sets +lblOtherSets=Promos, Online, und Andere Sets +lblCustomSets=Benutzerdefinierte Ausgabe #CMatchUI.java lblAbilities=Fähigkeiten #VAutoYields.java diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 8704ce0a225..bf0758087a0 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -117,6 +117,8 @@ cbpCounterDisplayLocation=Counter Display Location cbpGraveyardOrdering=Allow Ordering Cards Put in Graveyard lblAltLifeDisplay=Alternate Player Layout (Landscape Mode) nlAltLifeDisplay=Enables alternate layout for displaying Player Life, Poison, Energy and Experience counters. +lblAltZoneTabs=Alternate Player Zone Layout (Landscape Mode) +nlAltZoneTabs=Enables alternate layout for displaying Player Hand, Graveyard, Library and Exile zones. lblPreferredArt=Preferred Art nlPreferredArt=Sets the preferred art for cards (RESTART REQUIRED). Troubleshooting=Troubleshooting @@ -193,6 +195,8 @@ nlSrOptimize=Set various options to make FOrge work better with screen readers KeyboardShortcuts=Keyboard Shortcuts cbpLandPlayed=Land entering battlefield notifications nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player +cbpSwitchStates=Switch card states +nlSwitchStates=Display alternate state for every second copy in deck viewers. #VSubmenuAchievements.java lblAchievements=Achievements #VSubmenuDownloaders.java @@ -357,6 +361,15 @@ lblTotalDamageText=Available damage points: Unknown lblAssignRemainingText=Distribute the remaining damage points among lethally wounded entities lblLethal=Lethal lblAvailableDamagePoints=Available damage points +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect=Assign {0} by {1} +lblLClickAmountMessage=Left click: Assign 1 {0}. (Left Click + Control): Assign maximum {0} points. +lblRClickAmountMessage=Right click: Unassign 1 {0}. (Right Click + Control): Unassign all {0} points. +lblTotalAmountText=Available {0} points: Unknown +lblAvailableAmount=Available {0} points +lblMax=Max +lblShield=shield #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Match: show stack panel lblSHORTCUT_SHOWCOMBAT=Match: show combat panel @@ -871,7 +884,6 @@ lblSaveLayout=Save Layout lblColor=Color lblColorIdentity=Color Identity lblSet=Set -lblSet2=Set #Set word has different meanings in other languages lblDefault=Default lblType=Type @@ -922,13 +934,13 @@ lblAIStatus=AI Status lblCMC=Mana Value ttCMC=Mana Value lblCN=CN -ttCN=Collector Number Order +ttCN=Collector Number ttColor=Color lblCost=Cost ttCost=Cost lblDecks=Decks lblDeleteEdit=Delete/Edit -lblSetEdition=Mystery column. We don''t know what it does or if that''s what it should do. +lblSetEdition=Set ttFavorite=Favorite lblFolder=Folder ttFormats=Formats deck is legal in @@ -2026,7 +2038,7 @@ lblNotFoundCustomSealedFiles=No custom sealed files found. lblChooseCustomSealedPool=Choose Custom Sealed Pool lblHowManyBoosterPacks=How many booster packs? #DialogChooseSets.java -lblDisplayRecentSetRepints=Display compatible reprints from more recent sets +lblDisplayRecentSetReprints=Display compatible reprints from more recent sets lblSelectRandomSets=Select Random Sets lblSelectNumber=Number to Select lblCore=Core @@ -2041,7 +2053,8 @@ lblShowOptions=Show Options lblHideOptions=Hide Options lblCoreSets=Core sets lblExpansions=Expansions -lblOtherSets=Other sets +lblOtherSets=Promos, Online, and Other Sets +lblCustomSets=Custom Sets #CMatchUI.java lblAbilities=Abilities #VAutoYields.java diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index 96d8c97c0e4..9ccadd1e336 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -117,6 +117,8 @@ cbpCounterDisplayLocation=Ubicación del contador cbpGraveyardOrdering=Permitir ordenar cartas puestas en el cementerio lblAltLifeDisplay=Diseño alternativo de jugador (Modo apaisado) nlAltLifeDisplay=Permite un diseño alternativo para mostrar los contadores de vida, veneno, energía y experiencia. +lblAltZoneTabs=Alternate Player Zone Layout (Landscape Mode) +nlAltZoneTabs=Enables alternate layout for displaying Player Hand, Graveyard, Library and Exile zones. lblPreferredArt=Preferred Art nlPreferredArt=Sets the preferred art for cards. Troubleshooting=Solución de problemas @@ -193,6 +195,8 @@ nlSrOptimize=Establecer varias opciones para que Forge funcione mejor con los le KeyboardShortcuts=Atajos de teclado cbpLandPlayed=Notificación al entrar una tierra en juego nlpLandPlayed=Elige cuando quieras recibir notificaciones visuales de una tierra que entra en el campo de batalla: Nunca, siempre o sólo para las tierras que entran en el campo de batalla por una acción de un jugador IA. +cbpSwitchStates=Switch card states +nlSwitchStates=Display alternate state for every second copy in deck viewers. #VSubmenuAchievements.java lblAchievements=Trofeos #VSubmenuDownloaders.java @@ -357,6 +361,15 @@ lblTotalDamageText=Puntos de daño disponibles: Desconocido lblAssignRemainingText=Distribuye los puntos de daño restantes entre las entidades letalmente heridas. lblLethal=Letal lblAvailableDamagePoints=Puntos de daño disponibles +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect=Assign {0} by {1} +lblLClickAmountMessage=Left click: Assign 1 {0}. (Left Click + Control): Assign maximum {0} points. +lblRClickAmountMessage=Right click: Unassign 1 {0}. (Right Click + Control): Unassign all {0} points. +lblTotalAmountText=Available {0} points: Unknown +lblAvailableAmount=Available {0} points +lblMax=Max +lblShield=shield #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=Partida: mostrar panel de pila lblSHORTCUT_SHOWCOMBAT=Partida: mostrar panel de combate @@ -871,7 +884,6 @@ lblSaveLayout=Guardar disposición de elementos lblColor=Color lblColorIdentity=Identidad de color lblSet=Edición -lblSet2=Establecer #Set word has different meanings in other languages lblDefault=por defecto lblType=Tipo @@ -922,13 +934,13 @@ lblAIStatus=Estado de la IA lblCMC=CMC ttCMC=Coste de maná convertido lblCN=CN -ttCN=Orden de número de coleccionista +ttCN=Número de coleccionista ttColor=Color lblCost=Coste ttCost=Coste lblDecks=Mazos lblDeleteEdit=Borrar/Editar -lblSetEdition=Columna de misterio. No sabemos lo que hace o si eso es lo que debería hacer. +lblSetEdition=Edición ttFavorite=Favorito lblFolder=Carpeta ttFormats=Formatos de mazo en los que es legal @@ -2026,7 +2038,7 @@ lblNotFoundCustomSealedFiles=No se encontraron archivos de sellado personalizado lblChooseCustomSealedPool=Elige Conjunto de Sellado Personalizado lblHowManyBoosterPacks=¿Cuántos paquetes de refuerzo? #DialogChooseSets.java -lblDisplayRecentSetRepints=Mostrar reimpresiones compatibles de ediciones más recientes +lblDisplayRecentSetReprints=Mostrar reimpresiones compatibles de ediciones más recientes lblSelectRandomSets=Seleccionar ediciones aleatorias lblSelectNumber=Número a seleccionar lblCore=Core @@ -2042,6 +2054,7 @@ lblHideOptions=Esconder opciones lblCoreSets=Ediciones core lblExpansions=Expansiones lblOtherSets=Otras ediciones +lblCustomSets=Ediciones Personalizadas #CMatchUI.java lblAbilities=Habilidades #VAutoYields.java diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index f90f2ee3d06..9c05434f770 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -3,254 +3,258 @@ language.name=Italiano (IT) splash.loading.examining-cards=Caricamento delle carte, esame della cartella splash.loading.cards-folders=Caricamento delle carte dalle cartelle splash.loading.cards-archive=Caricamento delle carte dall''archivio -splash.loading.decks=Caricamento dei deck ... +splash.loading.decks=Caricamento dei mazzi ... splash.loading.processingimagesprites=Elaborazione degli sprite immagini #FControl.java lblOpeningMainWindow=Apertura della finestra principale ... lblCloseScreen=Chiudi schermo txCloseAction1=Forge ora supporta le schede di navigazione che consentono di chiudere e passare facilmente da una schermata all''altra. Di conseguenza, non è più necessario utilizzare il pulsante X in alto a destra per chiudere la schermata corrente e tornare indietro. txCloseAction2=Seleziona cosa vuoi che accada facendo clic sul pulsante X in alto a destra. Questa scelta verrà utilizzata in futuro e questo messaggio non verrà più visualizzato. Puoi modificare questo comportamento in qualsiasi momento nelle Preferenze. -titCloseAction=Seleziona la tua azione ravvicinata +titCloseAction=Seleziona la tua azione di chiusura lblAreYouSureYouWishRestartForge=Sei sicuro di voler riavviare Forge? lblAreYouSureYouWishExitForge=Sei sicuro di voler uscire da Forge? -lblOneOrMoreGamesActive=Uno o più giochi sono attualmente attivi -lblerrLoadingLayoutFile=Impossibile leggere il file di layout %s. Verrà eliminato dopo aver premuto OK. \nIl gioco procederà con il layout predefinito. -lblLoadingQuest=Caricamento quest ... +lblOneOrMoreGamesActive=Una o più partite sono attualmente attive +lblerrLoadingLayoutFile=Impossibile leggere il file di layout %s. Verrà eliminato dopo aver premuto OK.\nIl gioco procederà con il layout predefinito. +lblLoadingQuest=Caricamento avevntura ... #FScreen.java #translate lblHomeWithSpaces,lblDeckEditorWithSpaces need keep spaces in text lblHomeWithSpaces=Home -lblDeckEditorWithSpaces=Deck Editor -lblWorkshop=Workshop -lblBacktoHome=Tornare alla Home -lblCloseEditor=Chiudi Editor -lblCommanderDeckEditor=Commander Deck Editor -lblOathbreakerDeckEditor=Editor del deck Oathbreaker -lblTinyLeadersDeckEditor=Editor del deck Tiny Leaders -lblBrawlDeckEditor=Editor del deck Brawl -lblDraftDeckEditor=Editor del deck Draft -lblSealedDeckEditor=Editor del deck Sealed -lblTokenViewer=Visualizzatore token +lblDeckEditorWithSpaces=Gestione dei mazzi +lblWorkshop=Officina +lblBacktoHome=Torna a Home +lblCloseEditor=Esci dalla gestione +lblCommanderDeckEditor=Gestione dei mazzi Commander +lblOathbreakerDeckEditor=Gestione dei mazzi Oathbreaker +lblTinyLeadersDeckEditor=Gestione dei mazzi Tiny Leaders +lblBrawlDeckEditor=Gestione dei mazzi Brawl +lblDraftDeckEditor=Gestione dei mazzi Draft +lblSealedDeckEditor=Gestione dei mazzi Sealed +lblTokenViewer=Visualizzatore di pedine lblCloseViewer=Chiudi visualizzatore -lblQuestDeckEditor=Editor del deck Quest -lblQuestTournamentDeckEditor=Editor del deck del torneo Quest +lblQuestDeckEditor=Gestione dei Avventura +lblQuestTournamentDeckEditor=Gestione dei mazzi dei tornei Avventura lblSpellShop=Negozio di incantesimi lblLeaveShop=Lascia il negozio lblLeaveDraft=Lascia Draft lblBazaar=Bazar -lblConcedeGame=Concedi il gioco +lblConcedeGame=Concedi la partita txerrFailedtodeletelayoutfile=Impossibile eliminare il file di layout. -lblLeaveBazaar=Leave Bazaar +lblLeaveBazaar=Lascia Bazar #VSubmenuPreferences.java Preferences=Preferenze btnReset=Ripristina impostazioni di default -btnDeleteMatchUI=Ripristina layout partita -btnDeleteEditorUI=Ripristina layout editor -btnDeleteWorkshopUI=Ripristina layout officina +btnDeleteMatchUI=Ripristina il layout della schermata degli incontri +btnDeleteEditorUI=Ripristina il layout della gestione dei mazzi +btnDeleteWorkshopUI=Ripristina il layout dell''officina btnUserProfileUI=Apri la directory degli utenti btnContentDirectoryUI=Apri la directory dei contenuti btnResetJavaFutureCompatibilityWarnings=Ripristina avvisi di compatibilità Java btnClearImageCache=Cancella cache immagini -btnTokenPreviewer=Anteprima token +btnTokenPreviewer=Visualizzatore di pedine btnCopyToClipboard=Copia negli appunti cbpAutoUpdater=Auto updater -nlAutoUpdater=Select the release channel to use for updating Forge +nlAutoUpdater=Seleziona il canale di distribuzione da usare per aggiornare Forge cbpSelectLanguage=Lingua nlSelectLanguage=Seleziona la lingua (parte di gioco esclusa. Ancora in fase di sviluppo) (RIAVVIO NECESSARIO) -cbRemoveSmall=Rimuovi le piccole creature +cbRemoveSmall=Rimuovi le creature piccole cbCardBased=Includi generazione di mazzi basata su carte cbSingletons=Modalità Singleton cbRemoveArtifacts=Rimuovi artefatti -cbAnte=Gioca per Ante -cbAnteMatchRarity=Match Ante Rarity -cbEnableAICheats=Consenti Cheat AI -cbManaBurn=Mana Burn -cbManaLostPrompt=Svuotamento rapido di Mana Pool +cbAnte=Gioca con la posta +cbAnteMatchRarity=Abbina la rarità della posta +cbEnableAICheats=Consenti all''IA di barare +cbManaBurn=Mana burn +cbManaLostPrompt=Avviso svuotamento riserva di mana cbDevMode=Modalità sviluppatore -cbLoadCardsLazily=Carica pazzi gli script delle carte +cbLoadCardsLazily=Carica gli script delle carte lentamente cbLoadHistoricFormats=Carica formati storici -cbWorkshopSyntax=Controllo sintassi per Workshop -cbEnforceDeckLegality=Conformità del deck -cbSideboardForAI=Human Sideboard per AI -cbPerformanceMode=Modalità performante +cbWorkshopSyntax=Controllo sintassi per Officina +cbEnforceDeckLegality=Conformità del mazzo +cbSideboardForAI=Sideboard umana per IA +cbPerformanceMode=Modalità alte prestazioni cbFilteredHands=Mani Filtrate cbImageFetcher=Scarica automaticamente l''arte delle carte mancanti cbCloneImgSource=I cloni usano l''arte della carta originale cbScaleLarger=Ingrandisci l''immagine -cbRenderBlackCardBorders=Rendi i bordi delle carte nere +cbRenderBlackCardBorders=Disegna i bordi neri delle carte cbLargeCardViewers=Usa visualizzatori di carte di grandi dimensioni -cbSmallDeckViewer=Usa il visualizzatore di piccoli deck -cbDisplayFoil=Visualizza foglio di rivestimento -cbRandomFoil=Lamina casuale -cbRandomArtInPools=Randomizza l''arte della carta nei pool di carte generati +cbSmallDeckViewer=Usa il visualizzatore di mazzi piccolo +cbDisplayFoil=Visualizza colorazione foil +cbRandomFoil=Colorazione foil casuale +cbRandomArtInPools=Rendi casuale l''arte delle carte nei gruppi di carte generati cbEnableSounds=Abilita suoni cbEnableMusic=Abilita musica -cbAdjustSoundsVolume=Adjust Sound Volume -cbAdjustMusicVolume=Adjust Music Volume +cbAdjustSoundsVolume=Regola il volume dei suoni +cbAdjustMusicVolume=Regola il volume della musica cbAltSoundSystem=Usa un sistema audio alternativo -cbSROptimize=Optimize UI for screen readers +cbSROptimize=Ottimizza l''interfaccia utente per i lettori di schermo cbUiForTouchScreen=Migliora l''interfaccia utente per i touchscreen -cbTimedTargOverlay=Abilita ottimizzazione overlay di targeting -cbCompactMainMenu=Usa il menu principale della barra laterale compatta -cbDetailedPaymentDesc=Descrizione dell''incantesimo nel prompt di pagamento -cbPromptFreeBlocks=Gestione gratuita dei blocchi +cbTimedTargOverlay=Abilita l''ottimizzazione delle sovraimperssioni per scegliere un bersaglio +cbCompactMainMenu=Usa la barra principale del menu compatta +cbDetailedPaymentDesc=Descrizione della magia nella richiesta di pagamento +cbPromptFreeBlocks=Gestione libera dei blocchi cbPauseWhileMinimized=Pausa se ridotto a icona -cbCompactPrompt=Richiesta compatta -cbEscapeEndsTurn=Utilizzare il tasto Esc per terminare la svolta +cbCompactPrompt=Riquadro messaggi compatto +cbEscapeEndsTurn=Utilizzare il tasto Esc per terminare il turno cbPreselectPrevAbOrder=Preseleziona Ultimo ordine di abilità cbHideReminderText=Nascondi testo promemoria -cbOpenPacksIndiv=Pacchetti aperti singolarmente +cbOpenPacksIndiv=Apri i pacchetti singolarmente cbTokensInSeparateRow=Visualizza token in una riga separata -cbStackCreatures=Stack Creatures +cbStackCreatures=Sovrapponi le creature cbFilterLandsByColorId=Filtra le terre per colore nelle abilità attivate -cbShowStormCount=Mostra conteggio tempesta nel riquadro prompt +cbShowStormCount=Mostra il numero di magie lanciate nel riquadro messaggi cbRemindOnPriority=Avviso visivo alla ricezione della priorità cbUseSentry=Invia automaticamente segnalazioni di bug. cbpGameLogEntryType=Verbosità del registro di gioco -cbpCloseAction=Azione ravvicinata +cbpCloseAction=Chiudi cbpDefaultFontSize=Dimensione carattere predefinita -cbpAiProfiles=Personalità AI -cbpStackAdditions=Stack effect notifications +cbpAiProfiles=Personalità dell''IA +cbpStackAdditions=Notifiche degli effetti in pila cbpDisplayCurrentCardColors=Mostra colore scheda dettagliato -cbpAutoYieldMode=Auto-Yield +cbpAutoYieldMode=Consenso automatico cbpCounterDisplayType=Tipo di display contatore cbpCounterDisplayLocation=Posizione display contatore -cbpGraveyardOrdering=Consenti l''ordinazione di carte messe nel cimitero -lblAltLifeDisplay=Alternate Player Layout (Landscape Mode) -nlAltLifeDisplay=Enables alternate layout for displaying Player Life, Poison, Energy and Experience counters. -lblPreferredArt=Preferred Art -nlPreferredArt=Sets the preferred art for cards. +cbpGraveyardOrdering=Consenti di determinare l''ordine delle carte messe nel cimitero +lblAltLifeDisplay=Layout alternativo del giocatore (modalità panorama) +nlAltLifeDisplay=Abilita un layout alternativo per visalizzare i punti vita e i segnalini veleno, energia ed esperienza di un giocatore. +lblAltZoneTabs=Layout alternativo delle zone di gioco (modalità panorama) +nlAltZoneTabs=Abilita un layout alternativo per visalizzare la mano del giocatore, il cimitero, il grimorio e la zona di esilio. +lblPreferredArt=Illustrazione preferita +nlPreferredArt=Imposta l''illustrazione preferita per le carte Troubleshooting=Risoluzione dei problemi GeneralConfiguration=Configurazione generale lblPlayerName=Nome del giocatore -nlPlayerName=Imposta il nome che ti verrà indicato da Forge durante il gioco. +nlPlayerName=Imposta il nome che userai in Forge durante il gioco. nlCompactMainMenu=Abilitare per una barra laterale efficiente in termini di spazio che visualizza solo un gruppo di menu alla volta (RIAVVIO RICHIESTO). nlUseSentry=Se abilitato, invia automaticamente segnalazioni di bug agli sviluppatori. -GamePlay=gameplay -nlpMulliganRule=Scegli la versione della regola di Mulligan -nlpAiProfiles=Scegli il tuo avversario AI -nlpStackAdditions=Choose when you want to get visual notifications for an effect added to the stack: Never, always, or only for the effects cast/activated by a AI player or triggered by any player -nlAnte=Determina se il gioco è giocato o meno per ante. -nlAnteMatchRarity=Tenta di rendere le ante la stessa rarità per tutti i giocatori. -nlEnableAICheats=Consentire all''intelligenza artificiale di imbrogliare per ottenere un vantaggio (per le personalità che hanno impostato le opzioni di shuffle sheat). +GamePlay=Gameplay +nlpMulliganRule=Scegli il tipo di Mulligan +nlpAiProfiles=Scegli il tuo avversario (IA) +nlpStackAdditions=Scegli quando vuoi ricevere una notifica visiva di un effetto aggiunto alla pila: Mai, sempre, o solo per gli effetti lanciati/attivati da un giocatore IA o innescati da un qualsiasi giocatore +nlAnte=Determina se l''incontro è giocato o meno con la posta. +nlAnteMatchRarity=Tenta di rendere la posta della stessa rarità per tutti i giocatori. +nlEnableAICheats=Consentire all''intelligenza artificiale di imbrogliare per ottenere un vantaggio (per le personalità che hanno impostato le opzioni per barare mescolando le carte). nlManaBurn=Gioca con mana burn (dalle regole pre-Magic 2010). -nlManaLostPrompt=Se abilitato, viene visualizzato un avviso se passare la priorità potrebbe causare la perdita di mana nel pool di mana. +nlManaLostPrompt=Quando abilitato, viene visualizzato un avviso se passare la priorità potrebbe causare la perdita di mana nella riserva di mana. nlEnforceDeckLegality=Fa rispettare la legalità del mazzo relativa a ciascun ambiente (dimensioni minime del mazzo, numero massimo di carte ecc.). -nlSideboardForAI=Consente agli utenti di sideboard con il mazzo AI e sideboard in formati di gioco costruiti. -nlPerformanceMode=Disables additional static abilities checks to speed up the game engine. (Warning: breaks some ''as if had flash'' scenarios when casting cards owned by opponents). -nlFilteredHands=Genera due mani iniziali e mantiene quella con il conteggio della terra più vicino alla media per il mazzo. (Richiede il riavvio) -nlCloneImgSource=Quando abilitati, i cloni useranno la loro arte originale invece di quella della carta clonata. -nlPromptFreeBlocks=Se abilitato, se dovessi pagare 0 per bloccare, paga automaticamente senza sollecito. -nlPauseWhileMinimized=Se abilitato, Forge fa una pausa quando è ridotto a icona (principalmente per AI vs AI). +nlSideboardForAI=Consente agli utenti di gestire la sideboard con il mazzo dell''IA e la propria nei formati di gioco constructed. +nlPerformanceMode=Disabilita delle verifiche aggiuntive delle abilità statiche per velocizzare il motore di gioco. (Attenzione: non fa funzionare correttamente il giocare carte di proprietà di un avversario in contesti "come se avesse lampo"). +nlFilteredHands=Genera due mani iniziali e mantiene quella con il numero di terre più vicino alla media del mazzo. (Richiede il riavvio) +nlCloneImgSource=Se abilitato, i cloni useranno la loro arte originale invece di quella della carta clonata. +nlPromptFreeBlocks=Se abilitato, quando è richiesto un pagamento di 0 per bloccare, paga automaticamente senza chiedere conferma. +nlPauseWhileMinimized=Se abilitato, mette in pausa Forge quando è ridotto a icona (principalmente per IA vs IA). nlEscapeEndsTurn=Se abilitato, il tasto Esc funziona come scorciatoia alternativa per terminare il turno in corso. -nlDetailedPaymentDesc=Quando abilitato, vengono visualizzate descrizioni dettagliate di incantesimi / abilità quando si scelgono obiettivi e si pagano i costi. -nlShowStormCount=Se abilitato, visualizza il conteggio temporale corrente nel riquadro del prompt. -nlRemindOnPriority=Quando abilitato, lampeggia l''area di scelta del giocatore alla ricezione della priorità. +nlDetailedPaymentDesc=Se abilitato, vengono visualizzate descrizioni dettagliate di magie/abilità quando si scelgono bersagli e si pagano i costi. +nlShowStormCount=Se abilitato, visualizza il numero di magie lanciate nel riquadro messaggi. +nlRemindOnPriority=Se abilitato, lampeggia l''area di scelta del giocatore alla ricezione della priorità. nlPreselectPrevAbOrder=Se abilitato, preseleziona l''ultimo ordine di abilità simultaneo definito nella finestra di dialogo degli ordini. nlpGraveyardOrdering=Determina quando lasciare che il giocatore scelga l''ordine delle carte messe simultaneamente nel cimitero (mai, sempre o solo quando gioca con le carte per le quali è importante, ad esempio, Volpath''s Shapeshifter). -nlpAutoYieldMode=Definisce il livello di granularità delle rese automatiche (per abilità unica o per carta unica). +nlpAutoYieldMode=Definisce il livello di granularità dei consensi automatici (per abilità unica o per carta unica). RandomDeckGeneration=Generazione casuale del mazzo nlRemoveSmall=Disabilita le creature 1/1 e 0 / X nei mazzi generati -nlSingletons=Disabilita i duplicati non terrestri nei deck generati +nlSingletons=Disabilita i duplicati non-terra nei deck generati nlRemoveArtifacts=Disabilita le carte artefatto nei mazzi generati nlCardBased=Crea mazzi casuali più sinergici (richiede il riavvio) -DeckEditorOptions=Opzioni dell''editor di deck -nlFilterLandsByColorId=Quando si utilizzano i filtri colore delle carte, filtrare le terre in modo da facilitare la ricerca di terre rilevanti che producono mana. +DeckEditorOptions=Opzioni per la gestione dei mazzi +nlFilterLandsByColorId=Quando si utilizzano i filtri colore delle carte, filtrare le terre in modo da facilitare la ricerca di terre che producono mana di colore rilevante. AdvancedSettings=Impostazioni avanzate nlDevMode=Abilita il menu con funzioni per i test durante lo sviluppo. nlWorkshopSyntax=Abilita il controllo della sintassi degli script delle carte nell''officina. Nota: funzionalità ancora in fase di test! -nlGameLogEntryType=Modifica la quantità di informazioni visualizzate nel registro di gioco. Ordinati per il meno dettagliato. +nlGameLogEntryType=Modifica la quantità di informazioni visualizzate nel registro di gioco. Ordinati dal meno al più dettagliato. nlCloseAction=Cambia ciò che accade quando si fa clic sul pulsante X in alto a destra. nlLoadCardsLazily=Se attivato, Forge caricherà gli script delle carte quando sono necessari anziché all''avvio. (Avvertenza: sperimentale) -nlLoadHistoricFormats=Se attivato, Forge caricherà tutte le definizioni di formato storico, il caricamento potrebbe richiedere un po ''più di tempo all''avvio. +nlLoadHistoricFormats=Se attivato, Forge caricherà tutte le definizioni dei formati storici, il caricamento potrebbe richiedere un po'' più di tempo all''avvio. GraphicOptions=Opzioni grafiche -nlDefaultFontSize=La dimensione del carattere predefinita nell''interfaccia utente. Tutti gli elementi dei caratteri sono ridimensionati rispetto a questo. (Richiede riavvio) -cbpMulliganRule = Mulligan Rule -nlImageFetcher=Consente il recupero in tempo reale delle immagini di carte mancanti da una risorsa online. +nlDefaultFontSize=La dimensione predefinita dei caratteri nell''interfaccia utente. Tutti i caratteri sono ridimensionati rispetto a questo valore. (Richiede riavvio) +cbpMulliganRule=Tipo di Mulligan +nlImageFetcher=Consente il recupero in tempo reale delle immagini mancanti da una risorsa online. nlDisplayFoil=Visualizza le carte foil con l''effetto di sovrapposizione foil visivo. nlRandomFoil=Aggiunge l''effetto foil alle carte casuali. nlScaleLarger=Consente di espandere le immagini delle carte più grandi delle loro dimensioni originali. -nlRenderBlackCardBorders=Rendering di bordi neri attorno alle immagini delle carte. -nlLargeCardViewers=Rende tutti i visualizzatori di schede molto più grandi per l''uso con immagini ad alta risoluzione. Non si adatta a schermi più piccoli. -nlSmallDeckViewer=Imposta la finestra del visualizzatore di deck su 800x600 anziché su una proporzione della dimensione dello schermo. -nlRandomArtInPools=Genera carte con arte casuale in pool di carte generati in modalità limitata. -nlUiForTouchScreen=Aumenta alcuni elementi dell''interfaccia utente per offrire una migliore esperienza sui dispositivi touchscreen. (Richiede riavvio) -nlCompactPrompt=Nascondi l''intestazione e usa caratteri più piccoli nel riquadro Prompt per renderlo più compatto. -nlHideReminderText=Nascondi il testo del promemoria nel riquadro Dettagli scheda. -nlOpenPacksIndiv=Quando si aprono Fat Pack e Booster Box, i booster pack verranno aperti e visualizzati uno alla volta. -nlTokensInSeparateRow=Visualizza pedine in una riga separata sul campo di battaglia sotto le creature non pedina. -nlStackCreatures=Mette sul campo di battaglia creature identiche come terre, artefatti e incantesimi. -nlTimedTargOverlay=Consente l''ottimizzazione basata sull''ottimizzazione dell''overlay di targeting per ridurre l''utilizzo della CPU (disabilitare solo se si verificano problemi con l''hardware precedente, richiede l''avvio di una nuova corrispondenza). -nlCounterDisplayType=Seleziona lo stile del display del contatore in-game per le carte. Basato sul testo è un nuovo display a schede sulle schede. Basato sull''immagine è la vecchia immagine del contatore. Ibrido visualizza entrambi contemporaneamente. -nlCounterDisplayLocation=Determina dove posizionare i contatori basati su testo sulla carta: vicino all''inizio o vicino alla fine. -nlDisplayCurrentCardColors=Visualizza la suddivisione del colore corrente delle carte nel pannello delle informazioni dettagliate sulle carte. +nlRenderBlackCardBorders=Disegna i bordi neri attorno alle immagini delle carte. +nlLargeCardViewers=Rende le anteprime delle carte molto più grandi per l''uso con immagini ad alta risoluzione. Non si adatta a schermi più piccoli. +nlSmallDeckViewer=Imposta la finestra del visualizzatore di mazzi su 800x600 anziché su una proporzione della dimensione dello schermo. +nlRandomArtInPools=Genera carte con arte casuale nei gruppi di carte generati in modalità limited. +nlUiForTouchScreen=Ingrandisce alcuni elementi dell''interfaccia utente per offrire una migliore esperienza sui dispositivi touchscreen. (Richiede riavvio) +nlCompactPrompt=Nascondi l''intestazione e usa caratteri più piccoli nel riquadro messaggi per renderlo più compatto. +nlHideReminderText=Nascondi il testo del promemoria nel riquadro Dettagli carta. +nlOpenPacksIndiv=Quando si aprono Fat Pack e Booster Box, le buste verranno aperte e visualizzate una alla volta. +nlTokensInSeparateRow=Visualizza le pedine in una riga separata sul campo di battaglia sotto alle creature non pedina. +nlStackCreatures=Raggruppa sul campo di battaglia le creature identiche così come con le terre, gli artefatti e gli incantesimi. +nlTimedTargOverlay=Consente l''ottimizzazione in base al carico di lavoro delle sovraimpressioni dei bersagli per ridurre l''utilizzo della CPU (disabilitare solo se si verificano problemi con l''hardware satato, richiede l''avvio di una nuova partita). +nlCounterDisplayType=Seleziona lo stile dei segnalini delle carte nel gioco. Testuale crea una scheda sulle carte. Grafico sono dei segnalini a icona. Ibrido visualizza entrambi contemporaneamente. +nlCounterDisplayLocation=Stabilisce dove posizionare i segnalini testuali sulla carta: vicino al bordo superiore o inferiore. +nlDisplayCurrentCardColors=Visualizza la suddivisione dei colori delle carte nel pannello delle informazioni dettagliate sulle carte. SoundOptions=Opzioni audio nlEnableSounds=Abilita gli effetti sonori durante il gioco nlEnableMusic=Abilita la musica di sottofondo durante il gioco -nlAdjustSoundsVolume=Adjust sound effects volume during the game -nlAdjustMusicVolume=Adjust background music during the game +nlAdjustSoundsVolume=Regola il volume degli effetti sonori durante il gioco +nlAdjustMusicVolume=Regola il volume della musica di sottofondo durante il gioco nlAltSoundSystem=Utilizza il sistema audio alternativo (utilizza solo se hai problemi con l''audio che non viene riprodotto o che scompare) -nlSrOptimize=Set various options to make FOrge work better with screen readers -KeyboardShortcuts=Tasti rapidi -cbpLandPlayed=Land entering battlefield notifications -nlpLandPlayed=Choose when you want to get visual notifications for a land entering the battlefield: Never, always, or only for the lands entering a battlefield because of an action of a AI player +nlSrOptimize=Abilita una serie di opzioni per permettere a Forge di funzionare meglio con gli Screen readers +KeyboardShortcuts=Scorciatoie da tastiera +cbpLandPlayed=Notifiche per le terre che entrano nel campo di battaglia +nlpLandPlayed=Seleziona quando vuoi ricevere delle notifiche per una terra che entra nel campo di battaglia: mai, sempre o solo per una terra che entra in gioco per effetto di un''azione di un giocatore controllato dall''IA +cbpSwitchStates=Scambia stati della carta +nlSwitchStates=Mostra uno stato alternativo per ogni copia ulteriore nella visualizzazione dei mazzi. #VSubmenuAchievements.java -lblAchievements=realizzazioni +lblAchievements=Traguardi #VSubmenuDownloaders.java -btnCheckForUpdates=Check for Updates -btnDownloadSetPics=Scarica LQ Set Pictures -btnDownloadPicsHQ=Scarica le immagini della scheda HQ (molto lento!) -btnDownloadPics=Scarica LQ Card Pictures -btnDownloadQuestImages=Scarica Quest Images -btnDownloadAchievementImages=Scarica Achievement Images +btnCheckForUpdates=Controlla gli aggiornamenti +btnDownloadSetPics=Scarica immagini delle carte a bassa qualità - Tutti le espansioni +btnDownloadPicsHQ=Scarica immagini delle carte ad alta qualità (molto lento!) +btnDownloadPics=Scarica immagini delle carte a bassa qualità +btnDownloadQuestImages=Scarica immagini Avventura +btnDownloadAchievementImages=Scarica immagini dei trofei btnReportBug=Segnalare un bug -btnListImageData=Scheda di audit e dati immagine -lblListImageData=Carte di controllo non implementate da Forge e immagini di carte mancanti +btnListImageData=Verifica i dati e le immagini delle carte +lblListImageData=Verifica le carte non implementate in Forge e le immagini mancanti btnImportPictures=Importa dati btnHowToPlay=Come giocare btnDownloadPrices=Scarica i prezzi delle carte -btnDownloadSkins=Download Skins -btnDownloadCJKFonts=Download CJK Fonts +btnDownloadSkins=Scarica temi +btnDownloadCJKFonts=Scarica font per Cinese-Giapponese-Coreano btnLicensing=Dettagli della licenza -lblCheckForUpdates=Check Forge server to see if there''s a more recent release -lblDownloadPics=Scarica l''immagine della carta predefinita per ogni carta. -lblDownloadPicsHQ=Scarica l''immagine HQ della scheda predefinita per ogni scheda. -lblDownloadSetPics=Scarica tutte le immagini di ogni carta (una per ogni set in cui è apparso la carta) -lblDownloadQuestImages=Scarica i token e le icone utilizzati nella modalità Quest. -lblDownloadAchievementImages=Scarica le immagini degli obiettivi per far risaltare davvero i tuoi trofei. +lblCheckForUpdates=Controlla il server di Forge per vedere se è disponibile una nuova versione +lblDownloadPics=Scarica un''immagine per ciascuna carta +lblDownloadPicsHQ=Scarica un''immagine ad alta qualità per ciascuna carta +lblDownloadSetPics=Scarica tutte le immagini per ciascuna carta (una per ogni espansione in cui è apparsa la carta) +lblDownloadQuestImages=Scarica i segnalini e le icone utilizzati nella modalità Avventura. +lblDownloadAchievementImages=Scarica le immagini dei Traguardi. lblDownloadPrices=Scarica il listino aggiornato per i negozi di carte di gioco. -lblDownloadSkins=Download available skins used in customizing forge appearance. -lblDownloadCJKFonts=Download fonts for locales using CJK glyphs. -lblDownloadCJKFontPrompt=Select a font file to download -lblYourVersionOfJavaIsTooOld=La tua versione di Java è troppo vecchia per utilizzare i downloader di contenuti. +lblDownloadSkins=Scarica i temi disponibili per personalizzare la grafica di Forge +lblDownloadCJKFonts=Scarica i font per le lingue che utilizzano caratteri Cinesi-Giapponesi-Coreani +lblDownloadCJKFontPrompt=Seleziona un font da scaricare +lblYourVersionOfJavaIsTooOld=La tua versione di Java è troppo vecchia per scaricare contenuti aggiuntivi. lblPleaseUpdateToTheLatestVersionOfJava=Si prega di aggiornare all''ultima versione di Java -lblYoureRunning=Stai correndo +lblYoureRunning=Stai utilizzando lblYouNeedAtLeastJavaVersion=È necessaria almeno la versione 1.8.0_101. lblImportPictures=Importa dati da una directory locale. lblReportBug=Qualcosa non funziona? -lblHowToPlay=Le regole del gioco. -lblLicensing=Forgia legale. -ContentDownloaders=Downloader di contenuti +lblHowToPlay=Regole del gioco. +lblLicensing=Licenza di Forge +ContentDownloaders=Scarica contenuti ReleaseNotes=Note di rilascio #CSubmenuPreferences.java CantChangeDevModeWhileNetworkMath=Impossibile modificare DEV_MODE mentre è in corso una partita di rete! CompatibilityWarningsReEnabled=Avvisi di compatibilità riabilitati! -AresetForgeSettingsToDefault=Ciò ripristinerà tutte le preferenze ai loro valori predefiniti e riavvierà Forge. \n \n Ripristina e riavvia Forge? +AresetForgeSettingsToDefault=Questa azione ripristinerà tutte le preferenze ai loro valori predefiniti e riavvierà Forge. \n \n Ripristina e riavvia Forge? TresetForgeSettingsToDefault=Ripristina le impostazioni -AresetDeckEditorLayout=Ciò ripristinerà il layout dello schermo dell''Editor del deck. \n Tutte le viste a schede verranno ripristinate nelle loro posizioni predefinite. \n \n Ripristina il layout? -TresetDeckEditorLayout=Ripristina layout editor deck -OKresetDeckEditorLayout=Il layout dell''Editor di deck è stato ripristinato. -AresetWorkshopLayout=Ciò ripristinerà il layout della schermata dell''officina. \n Tutte le viste a schede verranno ripristinate nelle loro posizioni predefinite. \n \n Ripristina il layout? -TresetWorkshopLayout=Ripristina layout officina +AresetDeckEditorLayout=Ciò ripristinerà il layout dello schermo nella gestione dei mazzi. \n Tutte le schede verranno ripristinate nelle loro posizioni predefinite. \n \n Ripristina il layout? +TresetDeckEditorLayout=Ripristina layout gestione dei mazzi +OKresetDeckEditorLayout=Il layout della gestione dei mazzi è stato ripristinato. +AresetWorkshopLayout=Ciò ripristinerà il layout della schermata dell''officina. \n Tutte le schede verranno ripristinate nelle loro posizioni predefinite. \n \n Ripristina il layout? +TresetWorkshopLayout=Ripristina layout dell''officina OKresetWorkshopLayout=Il layout dell''officina è stato ripristinato. -AresetMatchScreenLayout=Ciò ripristinerà il layout della schermata Match. \n Se si desidera prima salvare il layout corrente, utilizzare la scheda Dock -> opzione Salva layout nella schermata Match. \n \n Ripristinare layout? -TresetMatchScreenLayout=Ripristina layout schermata di corrispondenza -OKresetMatchScreenLayout=Il layout della schermata di corrispondenza è stato ripristinato. +AresetMatchScreenLayout=Ciò ripristinerà il layout della schermata degli incontri. \n Se si desidera prima salvare il layout corrente, utilizzare la scheda Comandi -> opzione Salva layout della schermata di gioco. \n \n Ripristinare layout? +TresetMatchScreenLayout=Ripristina il layout della schermata degli incontri +OKresetMatchScreenLayout=Il layout della schermata degli incontri è stato ripristinato. #EMenuGroup.java lblSanctionedFormats=Formati sanzionati lblOnlineMultiplayer=Multigiocatore online -lblQuestMode=Modalità Quest +lblQuestMode=Modalità Avventura lblPuzzleMode=Modalità puzzle -lblGauntlets=guanti +lblGauntlets=Sfida lblGameSettings=Impostazioni di gioco #VLobby.java lblHeaderConstructedMode=Formato sanzionato: costruito @@ -260,49 +264,49 @@ lblconfirmName=Desideri utilizzare il nome %s o riprovare? lblUseThisName=Usa questo nome lblTryAgain=Riprova lblAddAPlayer=Aggiungi un giocatore -lblVariants=varianti +lblVariants=Varianti lblRandom=Casuale #VSubmenuConstructed.java lblConstructedMode=Modalità costruita lblConstructed=Costruito #PlayerPanel.java lblSelectaDeck=Seleziona un mazzo -lblSelectaSchemeDeck=Seleziona un mazzo di schemi -lblSchemeDeckEditor=Editor del mazzo di schemi +lblSelectaSchemeDeck=Seleziona un mazzo di intrighi +lblSchemeDeckEditor=Gestione di mazzi di intrighi lblSelectaCommanderDeck=Seleziona un mazzo Commander lblSelectaPlanarDeck=Seleziona un mazzo planare -lblPlanarDeckEditor=Editor di deck planari +lblPlanarDeckEditor=Gestione di mazzi planari lblSelectaVanguardAvatar=Seleziona un avatar Vanguard -lblVanguardAvatar=Avatar di avanguardia -lblDeck=ponte -lblSchemeDeck=Schema Deck -lblCommanderDeck=Ponte del comandante +lblVanguardAvatar=Avatar Vanguard +lblDeck=Mazzo +lblSchemeDeck=Mazzo intrighi +lblCommanderDeck=Mazzo Commander lblPlanarDeck=Mazzo Planare -lblVanguard=Avanguardia +lblVanguard=Vanguard lblHuman=Umano -lblAI=AI +lblAI=IA lblOpen=Aperto lblUseSimulation=Usa la simulazione lblGetaNewRandomName=Ottieni un nuovo nome casuale -lblArchenemy=Acerrimo nemico +lblArchenemy=Archenemy lblHeroes=Heroes lblRemove=Rimuovere -ttlblAvatar=L-clic: seleziona avatar. R-clic: randomizza avatar. +ttlblAvatar=L-clic: seleziona avatar. R-clic: avatar casuale. lblReady=Pronto -lblKick=Calcio -lblReallyKick=Calci davvero %s? +lblKick=Scaccia +lblReallyKick=Vuoi davvero scacciare %s? #ForgeMenu.java lblRestart=Ricomincia -lblExit=Uscita +lblExit=Esci #LayoutMenu.java -lblLayout=disposizione +lblLayout=Layout lblView=Visualizza lblFile=File lblTheme=Tema lblBackgroundImage=Immagine di sfondo lblPanelTabs=Schede del pannello lblSaveCurrentLayout=Salva layout corrente -lblRefresh=ricaricare +lblRefresh=Ricarica lblSetWindowSize=Imposta la dimensione della finestra lblChooseNewWindowSize=Scegli una nuova dimensione della finestra lblFullScreen=A schermo intero @@ -311,98 +315,107 @@ lblExitFullScreen=Esci dalla modalità schermo intero lblHelp=Aiuto lblAboutForge=Informazioni su Forge lblTroubleshooting=Risoluzione dei problemi -lblArticles=articoli -lblGettingStarted=Iniziare +lblArticles=Articoli +lblGettingStarted=Per iniziare lblHowtoPlay=Come giocare -lblForgeLicense=Forge License +lblForgeLicense=Licenza di Forge lblReleaseNotes=Note di rilascio #GameMenu.java lblGame=Gioco lblSoundEffects=Effetti sonori -lblUndo=Disfare +lblUndo=Annulla lblAlphaStrike=Alpha Strike -lblEndTurn=Fine turno -lblTargetingArcs=Targeting per archi -lblOff=via -lblCardMouseOver=Cardoverover +lblEndTurn=Concludi il turno +lblTargetingArcs=Indicatori dei bersagli +lblOff=Spento +lblCardMouseOver=Mouse sopra alla carta lblAlwaysOn=Sempre acceso -lblAutoYields=Auto-rendimenti -lblDeckList=Elenco dei mazzi -lblClose=Vicino +lblAutoYields=Consensi automatici +lblDeckList=Lista del mazzo +lblClose=Chiudi lblExitForge=Esci da Forge #ConstructedGameMenu.java lblSelectAvatarFor=Seleziona avatar per %s lblRemoveSmallCreatures=Rimuovi le creature 1/1 e 0 / X nei mazzi generati. lblRemoveArtifacts=Rimuovi le carte artefatto dai mazzi generati. -PreventNonLandDuplicates=Prevenire i duplicati non terrestri nei deck generati. +PreventNonLandDuplicates=Prevenire i duplicati non-terra nei deck generati. #PlayerPanel.java lblName=Nome lblTeam=Squadra #InputConfirmMulligan.java -lblKeep=Mantenere +lblKeep=Tieni lblYouAreGoingFirst=stai andando per primo! lblIsGoingFirst=sta andando per primo lblYouAreGoing=stai andando lblMulligan=Mulligan lblDoYouWantToKeepYourHand=Vuoi tenere la mano? -lblReturnForLondon=Riporta %d carte nella parte inferiore del tuo grimorio +lblReturnForLondon=Poni %d carte in fondo al tuo grimorio lblOk=Ok lblReset=Ripristina lblAuto=Auto #VAssignDamage.java lbLAssignDamageDealtBy=Assegna il danno inflitto da %s -lblLClickDamageMessage=Clic sinistro: assegna 1 danno. (Clic sinistro + Controllo): assegna il danno residuo fino a letale -lblRClickDamageMessage=Tasto destro: Annulla l''assegnazione di 1 danno. (Clic destro + Controllo): Annulla l''assegnazione di tutti i danni. +lblLClickDamageMessage=Clic sinistro: assegna 1 danno. (Ctrl + Clic sinistro): assegna il danno residuo fino al raggiungimento di danno letale +lblRClickDamageMessage=Tasto destro: Annulla l''assegnazione di 1 danno. (Ctrl + Clic destroo): Annulla l''assegnazione di tutto il danno. lblTotalDamageText=Punti di danno disponibili: Sconosciuto lblAssignRemainingText=Distribuire i punti di danno rimanenti tra le entità ferite letalmente lblLethal=Letale -lblAvailableDamagePoints=Available damage points +lblAvailableDamagePoints=Punti danno disponibili +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect=Assign {0} by {1} +lblLClickAmountMessage=Left click: Assign 1 {0}. (Left Click + Control): Assign maximum {0} points. +lblRClickAmountMessage=Right click: Unassign 1 {0}. (Right Click + Control): Unassign all {0} points. +lblTotalAmountText=Available {0} points: Unknown +lblAvailableAmount=Available {0} points +lblMax=Max +lblShield=shield #KeyboardShortcuts.java -lblSHORTCUT_SHOWSTACK=Abbinamento: mostra il pannello dello stack -lblSHORTCUT_SHOWCOMBAT=Abbinamento: mostra il pannello di combattimento -lblSHORTCUT_SHOWCONSOLE=Abbinamento: mostra il pannello della console -lblSHORTCUT_SHOWDEV=Abbinamento: mostra il pannello di sviluppo -lblSHORTCUT_CONCEDE=Abbinamento: concedi il gioco -lblSHORTCUT_ENDTURN=Match: passa la priorità fino all''EOT o al prossimo evento dello stack -lblSHORTCUT_ALPHASTRIKE=Match: Alpha Strike (attacco con tutti i disponibili) -lblSHORTCUT_SHOWTARGETING=Abbinamento: attiva / disattiva il targeting per overlay visivo -lblSHORTCUT_AUTOYIELD_ALWAYS_YES=Abbinamento: abilità di resa automatica in pila (sempre Sì) -lblSHORTCUT_AUTOYIELD_ALWAYS_NO=Abbinamento: abilità di resa automatica in pila (sempre No) -lblSHORTCUT_MACRO_RECORD=Abbina: registra una macro sequenza di azioni -lblSHORTCUT_MACRO_NEXT_ACTION=Abbinamento: esegue l''azione successiva in una macro registrata -lblSHORTCUT_CARD_ZOOM=Abbina: ingrandisce la carta attualmente selezionata +lblSHORTCUT_SHOWSTACK=Incontro: mostra il pannello della pila +lblSHORTCUT_SHOWCOMBAT=Incontro: mostra il pannello di combattimento +lblSHORTCUT_SHOWCONSOLE=Incontro: mostra il pannello della console +lblSHORTCUT_SHOWDEV=Incontro: mostra il pannello per gli sviluppatori +lblSHORTCUT_CONCEDE=Incontro: concedi la partita +lblSHORTCUT_ENDTURN=Incontro: passa la priorità fino alla fine del turno o al prossimo evento della pila +lblSHORTCUT_ALPHASTRIKE=Incontro: Alpha Strike +lblSHORTCUT_SHOWTARGETING=Incontro: attiva / disattiva gli indicatori dei bersagli +lblSHORTCUT_AUTOYIELD_ALWAYS_YES=Incontro: consenso automatico in pila: sempre Sì +lblSHORTCUT_AUTOYIELD_ALWAYS_NO=Incontro: consenso automatico in pila: sempre No +lblSHORTCUT_MACRO_RECORD=Incontro: registra una macro (sequenza di azioni) +lblSHORTCUT_MACRO_NEXT_ACTION=Incontro: esegue l''azione successiva in una macro registrata +lblSHORTCUT_CARD_ZOOM=Incontro: ingrandisce la carta attualmente selezionata #VSubmenuDraft.java lblBoosterDraft=Booster Draft lblHeaderBoosterDraft=Formato sanzionato: Booster Draft -lblPlayAnOpponent=Gioca un avversario -lblPlayMultipleOpponents=Play multiple opponents -lblPlayAll7opponents=Gioca con tutti e gli avversari +lblPlayAnOpponent=Gioca contro un avversario +lblPlayMultipleOpponents=Gioca contro più avversari +lblPlayAll7opponents=Gioca contro tutti gli avversari lblBuildorselectadeck=Costruisci o seleziona un mazzo -lblDraftText1=In modalità Bozza, tre buste vengono ruotate attorno a otto giocatori. +lblDraftText1=In modalità Draft, tre buste vengono fatte girare tra otto giocatori. lblDraftText2=Costruisci un mazzo con le carte che scegli. L''intelligenza artificiale farà lo stesso. -lblDraftText3=Quindi, gioca contro uno o tutti gli avversari AI. -lblNewBoosterDraftGame=Nuovo gioco Booster Draft -lblDraftDecks=Draft Decks +lblDraftText3=Quindi, gioca contro uno o tutti gli avversari IA. +lblNewBoosterDraftGame=Nuovo partita Booster Draft +lblDraftDecks=Mazzi Draft #CSubmenuDraft.java -lblNoDeckSelected=Nessun mazzo selezionato per umano. \n (Potrebbe essere necessario costruire un nuovo mazzo) +lblNoDeckSelected=Nessun mazzo selezionato per il giocatore umano. \n (Potrebbe essere necessario costruire un nuovo mazzo) lblNoDeck=Nessun mazzo -lblChooseDraftFormat=Scegli il formato bozza +lblChooseDraftFormat=Scegli il formato Draft #VSubmenuSealed.java -lblSealedDeck=Ponte sigillato -lblSealedDecks=Mazzi sigillati -lblHeaderSealed=Formato sanzionato: mazzo sigillato -lblSealedText1=Seleziona un gioco o creane uno nuovo -lblSealedText2=In modalità Sealed, costruisci un mazzo da buste potenziate (massimo 10). -lblSealedText3=Costruisci un mazzo dalle carte che ricevi. Un certo numero di avversari AI farà lo stesso. -lblSealedText4=Quindi, puoi giocare contro ciascuno degli avversari AI o uno degli avversari. -btnBuildNewSealedDeck=Costruisci un nuovo mazzo sigillato -lblSealedModeInstruction=SEALED DECK MODE INSTRUCTIONS\r\n\r\nIn Sealed Deck tournaments, each player receives six booster packs from which to build their deck.\r\n\r\nDepending on which sets are to be used in a sealed deck event, the distribution of packs can vary greatly.\r\n\r\nCredit: Wikipedia +lblSealedDeck=Sealed Deck +lblSealedDecks=Sealed Decks +lblHeaderSealed=Formato sanzionato: Sealed Deck +lblSealedText1=Seleziona una partita o creane una nuova +lblSealedText2=In modalità Sealed, costruisci un nuovo mazzo a partire da buste ancora chiuse (massimo 10). +lblSealedText3=Costruisci un mazzo dalle carte che ricevi. Un certo numero di avversari IA farà lo stesso. +lblSealedText4=Quindi, puoi giocare contro ciascuno degli avversari IA o uno degli avversari. +btnBuildNewSealedDeck=Costruisci un nuovo mazzo Sealed Deck +lblSealedModeInstruction=ISTRUZIONI SEALED DECK\r\n\r\nIn un torneo Sealed Deck, ciascun giocatore riceve sei buste con cui costruire il proprio mazzo.\r\n\r\nA seconda delle espansioni scelte per un evento Sealed Deck, la distribuzione delle buste può variare.\r\n\r\nFonte: Wikipedia #FDeckChooser.java lblViewDeck=Visualizza mazzo lblRandomDeck=Mazzo casuale lblRandomColors=Colori casuali lblMustSelectGenerateNewDeck=Devi selezionare qualcosa prima di poter generare un nuovo mazzo. -lblOK=ok +lblOK=OK lblCannotEditDuplicateCustomDeck=non può essere modificato direttamente. Desideri duplicare %s per la modifica come un mazzo utenti personalizzato? lblDuplicateDeck=Mazzo duplicato? lblDuplicate=Duplicare @@ -411,477 +424,476 @@ lblChooseAllowedDeckTypeOpponents=Scegli i tipi di mazzo consentiti per gli avve lblSelectOpponentDeck=Seleziona il mazzo dell''avversario lblGenerateNewDeck=Genera nuovo mazzo lblRandomTheme=Tema casuale -lblTestDeck=Banco di prova -lblLoading=Loading +lblTestDeck=Prova il mazzo +lblLoading=Caricamento in corso #GameType.java lblSealed=Sealed -lblDraft=Bozza +lblDraft=Draft lblWinston=Winston -lblGauntlet=guanto di sfida +lblGauntlet=Sfida lblTournament=Torneo -lblQuest=Ricerca -lblQuestDraft=Quest Draft +lblQuest=Avventura +lblQuestDraft=Avventura Draft lblPlanarConquest=Conquista planare lblPuzzle=Puzzle -lblPuzzleDesc=Risolvi un puzzle dallo stato di gioco indicato -lblDeckManager=Deck Manager -lblVanguardDesc=Each player has a special \"Avatar\" card that affects the game. -lblCommander=Comandante -lblCommanderDesc=Each player has a legendary "General" card which can be cast at any time and determines deck colors. +lblPuzzleDesc=Risolvi un puzzle a partire dalla situazione proposta +lblDeckManager=Gestione dei mazzi +lblVanguardDesc=Ciascun giocatore ha una speciale carta \"Avatar\" che influenza il gioco. +lblCommander=Commander +lblCommanderDesc=Ciascun giocatore ha una carta \"Generale\" leggendaria che può essere giocata in ogni momento e determina i colori del mazzo. lblOathbreaker=Oathbreaker -lblOathbreakerDesc=Each player has a Planeswalker card as their "Oathbreaker" which can be cast at any time and determines deck colors. Each player also has a signature spell that can be cast when their Oathbreaker is on the battlefield. -lblTinyLeaders=Piccoli leader -lblTinyLeadersDesc=Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Each card must have CMC less than 4. -lblBrawl=Rissa -lblBrawlDesc=Each player has a legendary \"General\" card which can be cast at any time and determines deck colors. Only cards legal in Standard may be used. -lblPlaneswalker=planeswalker +lblOathbreakerDesc=Ciascun giocatore ha una carta planewalker detta \"Oathbreaker\" che può essere giocata in ogni momento e determina i colori del mazzo. Ciascun giocatore ha anche una magia distintiva che può essere lanciata quanto il proprio Oathbreaker è nel campo di battaglia +lblTinyLeaders=Tiny Leaders +lblTinyLeadersDesc=Ciascun giocatore ha una carta \"Generale\" leggendaria che può essere giocata in ogni momento e determina i colori del mazzo. Tutte le carte del mazzo devono avere un CMC inferiore a 4. +lblBrawl=Brawl +lblBrawlDesc=Ciascun giocatore ha una carta \"Generale\" leggendaria che può essere giocata in ogni momento e determina i colori del mazzo. Possono essere usate solo carte legali in Standard. +lblPlaneswalker=Planeswalker lblPlaneswalkerDesc=Ogni giocatore ha una carta Planeswalker che può essere lanciata in qualsiasi momento. lblPlanechase=Planechase -lblPlanechaseDesc=Plane cards apply global effects. The Plane card changes when a player rolls \"Planeswalk\" on the planar die. -lblArchenemyDesc=Un giocatore è l''arciere nemico e combatte gli altri giocatori giocando a carte schema. +lblPlanechaseDesc=Le carte Piano hanno un effetto globale. La carta Piano cambia quando un giocatore ottiene \"Planeswalk\" con il dado planare. +lblArchenemyDesc=Un giocatore è l''Archenemy e combatte gli altri giocatori giocando carte Intrigo. lblArchenemyRumble=Archenemy Rumble -lblArchenemyRumbleDesc=Tutti i giocatori sono Archenemies e possono giocare a carte Scheme. +lblArchenemyRumbleDesc=Tutti i giocatori sono Archenemy e possono giocare a carte Intrigo. lblMomirBasic=Momir Basic lblMomirBasicDesc=Ogni giocatore ha un mazzo contenente 60 terre base e l''avatar di Momir Vig. lblMoJhoSto=MoJhoSto -lblMoJhoStoDesc=Ogni giocatore ha un mazzo contenente 60 terre base e gli avatar Momir Vig, Jhoira del Ghitu e Stonehewer Giant. +lblMoJhoStoDesc=Ogni giocatore ha un mazzo contenente 60 terre base e gli avatar Momir Vig, Jhoira dei Ghitu e Gigante Spaccapietre. #VSubmenuDuels.java -lblQuestDuels=Quest Duels -lblQuestModeDuels=Modalità Quest: Duelli +lblQuestDuels=Duelli dell''Avventura +lblQuestModeDuels=Modalità Avventura: Duelli lblSelectNextDuel=Seleziona il tuo prossimo duello. -lblNoDuelDeck=Il mazzo attuale non è stato ancora impostato. +lblNoDuelDeck=Non è stato ancora impostato un mazzo. lblNextChallengeNotYet=La prossima sfida nelle vittorie non è stata ancora impostata. -btnUnlockSets=Sblocca set -btnTravel=Viaggio +btnUnlockSets=Sblocca espansioni +btnTravel=Viaggia btnBazaar=Bazar -btnSpellShop=Negozio di incantesimi -cbSummonPlant=Summon Plant -cbLaunchZeppelin=Avvia Zeppelin +btnSpellShop=Negozio di magie +cbSummonPlant=Evoca una pianta +cbLaunchZeppelin=Lancia dirigibile #VSubmenuQuest.java -lblQuestData=Dati della missione -lblLoadQuestData=Carica dati missione -lblStartanewQuest=Inizia una nuova missione -lblOldQuestData=Vecchi dati delle missioni? Inserisci in %s e riavvia Forge. -questDifficultyEasy=Facile -questDifficultyMedium=medio -questDifficultyHard=Difficile -questDifficultyExpert=Esperto +lblQuestData=Dati dell''Avventura +lblLoadQuestData=Carica dati di un''Avventura +lblStartanewQuest=Nuova Avventura +lblOldQuestData=Vecchi salvataggi Avventura? Copiali in %s e riavvia Forge. +questDifficultyEasy=Novizio +questDifficultyMedium=Apprendista +questDifficultyHard=Esperto +questDifficultyExpert=Maestro rbFantasyMode=Modalità Fantasy -rbCommanderSubformat=Sottomodulo comandante +rbCommanderSubformat=Sottomodulo Commander lblStartingWorld=Mondo di partenza -lblStartingPool=Pool di partenza +lblStartingPool=Gruppo di carte di partenza lblAllCardsAvailable=Tutte le carte saranno disponibili per giocare. -lblStarterEventdeck=Mazzo principiante / evento: +lblStarterEventdeck=Mazzo di partenza / evento: lblSanctionedFormat=Formato sanzionato lblCustomdeck=Mazzo personalizzato lblDefineCustomFormat=Definire il formato personalizzato lblSelectFormat=Seleziona il formato -lblStartWithAllCards=Inizia con tutte le carte nei set selezionati +lblStartWithAllCards=Inizia con tutte le carte nelle espansioni selezionate lblAllowDuplicateCards=Consenti carte duplicate -lblStartingPoolDistribution=Avvio della distribuzione del pool +lblStartingPoolDistribution=Distribuzione delle carte disponibili alla partenza lblChooseDistribution=Scegli la distribuzione lblPrizedCards=Carte pregiate -lblAllCardsAvailableWin=Tutte le carte saranno disponibili per vincere. -lblOnlySetsInStarting=Saranno disponibili solo i set nel pool iniziale. +lblAllCardsAvailableWin=Tutte le carte saranno disponibili come premio. +lblOnlySetsInStarting=Saranno disponibili solo le espansioni nel gruppo iniziale. lblAllowUnlockAdEd=Consenti lo sblocco di edizioni aggiuntive -lblEmbark=Intraprendi! -lblboxCompleteSet=Inizierai la missione con 4 di ogni carta nei set che hai selezionato. -lblboxAllowDuplicates=Quando viene generato il tuo pool di partenza, possono essere inclusi duplicati di carte. -lblSameAsStartingPool=Come il pool iniziale -lblNewLoadQuest=Nuova / Carica Quest +lblEmbark=Avventurati! +lblboxCompleteSet=Inizierai la missione con 4 copie di ogni carta nelle espansioni che hai selezionato. +lblboxAllowDuplicates=Quando viene generato il tuo gruppo di carte di partenza, possono essere inclusi duplicati di carte. +lblSameAsStartingPool=Come il gruppo iniziale +lblNewLoadQuest=Carica Avventura #CSubmenuQChallenges.java -lblLaunchaZeppelin=Lancia uno Zeppelin. -lblPlant=pianta +lblLaunchaZeppelin=Lancia un dirigibile. +lblPlant=Pianta lblChallenges=Le sfide -lblMatchBestof=Abbinamento - Il migliore di -lblDuels=duelli +lblMatchBestof=Incontro - Al meglio di +lblDuels=Duelli #CSubmenuQuestData.java -lblNotFormatDefined=Hai definito il formato personalizzato come non contenente set. \nQuesto sceglierà tutte le edizioni senza restrizioni come premi. \n \nContinuare? +lblNotFormatDefined=La definizione personalizzata del formato non contiene alcuna espansione. \nQuesto renderà disponibili come premi tutte le edizioni senza restrizioni. \n \nContinuare? lbldckStartPool=Non hai selezionato un mazzo per iniziare. -lblCannotStartaQuest=Impossibile avviare una ricerca +lblCannotStartaQuest=Impossibile avviare una Avventura lblFromDeck=Dal mazzo -MsgQuestNewName=I poeti ricorderanno la tua ricerca come -TitQuestNewName=Nome missione -lblQuestNameEmpty=Si prega di specificare un nome per la missione. -lblQuestExists=Esiste già una ricerca con quel nome. Scegli un altro nome per la missione. +MsgQuestNewName=I poeti ricorderanno la tua Avventura come +TitQuestNewName=Nome Avventura +lblQuestNameEmpty=Si prega di specificare un nome per l''avventura. +lblQuestExists=Esiste già una Avventura con quel nome. Scegli un altro nome per favore. #CSubmenuQuestDecks.java lblCreateaDeck=Crea un mazzo. #CSubmenuQuestPrefs.java lblEnteraNumber=Inserisci un numero lblSavefailed=Salvataggio fallito -lblEnteraDecimal=Enter a decimal +lblEnteraDecimal=Inserisci un decimale #DialogChooseFormats.java -cbWantReprints=Consenti ristampe compatibili da altri set +cbWantReprints=Consenti ristampe compatibili da altre edizioni lblChooseFormats=Scegli i formati -lblSanctioned=sanzionato +lblSanctioned=Sanzionato lblOther=Altro -lblHistoric=Storico +lblHistoric=Historic lblCancel=Annulla #DialogChoosePoolDistribution.java lblBlack=Nero lblBlue=Blu -lblGreen=verde +lblGreen=Verde lblRed=Rosso -lblWhite=bianca +lblWhite=Bianco lblColorless=Incolore lblIncludeArtifacts=Includi artefatti lblBalanced=Equilibrato -lblTrueRandom=Vero casuale +lblTrueRandom=Puramente casuale lblSurpriseMe=Sorprendimi -lblBoosters=booster +lblBoosters=Buste lblClearAll=Cancella tutto -lblNumberofBoosters=Numero di ripetitori +lblNumberofBoosters=Numero di buste lblColors=Colori lblnoSettings=Nessuna impostazione disponibile per questa selezione. lblDistribution=Distribuzione lblHoverforDescription=Passa il mouse sopra ciascun elemento per una descrizione più dettagliata. -lblradBalanced=A "Balanced" distribution will provide a roughly equal number of cards in each selected color. -lblradRandom=A "True Random" distribution will be almost entirely randomly selected. This ignores any color selections. -lblradSurpriseMe=This is the same as a "Balanced" distribution, except the colors picked will be random and you will not be told what they are. -lblradBoosters=Ciò ignora tutte le impostazioni di colore e genera invece un pool di carte da un numero specificato di buste. -lblcbxArtifacts=Quando selezionato, gli artefatti saranno inclusi nella piscina indipendentemente dalle selezioni di colore. Questo imita il vecchio comportamento del pool di carte. +lblradBalanced=Una distribuzione "equilibrata" cerca di garantire lo stesso numero di carte per ciascun colore selezionato. +lblradRandom=Una distribuzione "puramente casuale" sarà ottenuta in maniera totalmente casuale, ignorando qualsiasi preferenza di colore. +lblradSurpriseMe=Simile alla distribuzione "equilibrata", ma i colori sono scelti a caso senza comunicarli. +lblradBoosters=Ciò ignora tutte le impostazioni di colore e genera invece un insieme di carte da un numero specificato di buste. +lblcbxArtifacts=Quando selezionato, gli artefatti saranno inclusi indipendentemente dalle selezioni di colore. Questo imita il vecchio comportamento. #VSubmenuChallenges.java -lblQuestChallenges=Sfide della missione +lblQuestChallenges=Sfide dell''Avventura htmlLaunchZeppelin= Launch
Zeppelin -lblQuestModeChallenges=Modalità missione: sfide +lblQuestModeChallenges=Modalità Avventura: Sfide lblWhichChallenge=Quale sfida proverai? #VSubmenuQuestDraft.java -lblTournaments=tornei -lblQuestModeDraftTournament=Modalità Quest: Draft Tournament +lblTournaments=Tornei +lblQuestModeDraftTournament=Modalità Avventura: Tornei Draft lblSelectaTournament=Seleziona un torneo a cui partecipare lblNoTournaments=Al momento non ci sono tornei disponibili. -btnEditDeck=Modifica mazzo +btnEditDeck=Modifica il mazzo btnLeaveTournament=Lascia il torneo btnSpendToken=Spendi token -btnStartMatchSmall=Inizia la prossima partita -lblUndetermined=Indeterminato +btnStartMatchSmall=Inizia il prossimo incontro +lblUndetermined=Non specificato btnSpendTokenTT=Crea un nuovo torneo che può essere giocato immediatamente. lblPastResults=Risultati passati #VSubmenuQuestDecks.java -lblQuestDecks=Mazzi Quest -lblQuestDesc1=Nella modalità Quest, costruisci un mazzo da un inventario limitato. -lblQuestDesc2=Costruisci e migliora i mazzi dalle carte nel tuo inventario delle missioni man mano che cresce. +lblQuestDecks=Mazzi Avventura +lblQuestDesc1=Nella modalità Avventura, costruisci un mazzo da un inventario limitato. +lblQuestDesc2=Costruisci e migliora i mazzi dalle carte nel tuo inventario man mano che cresce. lblQuestDesc3=Quindi, passa al sottomenu Duelli o Sfide per giocare contro avversari IA e sbloccare più carte. lblBuildaNewDeck=Costruisci un nuovo mazzo #Decktype.java lblCustomUserDecks=Mazzi utenti personalizzati lblConstructedDecks=Mazzi costruiti -lblCommanderDecks=Mazzi comandanti -lblRandomCommanderDecks=Mazzi comandanti casuali -lblRandomCommanderCard-basedDecks=Mazzi basati su carte di comandanti casuali +lblCommanderDecks=Mazzi Commander +lblRandomCommanderDecks=Mazzi Commander casuali +lblRandomCommanderCard-basedDecks=Mazzi casuali basati su carte Commander lblOathbreakerDecks=Mazzi Oathbreaker -lblTinyLeadersDecks=Mazzi di piccoli leader -lblBrawlDecks=Mazzi di rissa -lblSchemeDecks=Schema Decks +lblTinyLeadersDecks=Mazzi Tiny Leaders +lblBrawlDecks=Mazzi Brawl +lblSchemeDecks=Mazzi Intrighi lblPlanarDecks=Mazzi Planari lblPreconstructedDecks=Mazzi precostruiti -lblPreconCommanderDecks=Precon Commander Decks -lblQuestOpponentDecks=Mazzi avversari missione +lblPreconCommanderDecks=Mazzi precostruiti Commander +lblQuestOpponentDecks=Mazzi degli avversari (modalità Avventura) lblRandomColorDecks=Mazzi di colori casuali -lblRandomStandardArchetypeDecks=Mazzi archetipici standard casuali -lblRandomPioneerArchetypeDecks=Mazzi di archetipi casuali Pioneer -lblRandomHistoricArchetypeDecks=Random Historic Archetype Decks -lblRandomModernArchetypeDecks=Mazzi di archetipi moderni casuali -lblRandomLegacyArchetypeDecks=Mazzi archetipo Legacy casuali -lblRandomVintageArchetypeDecks=Mazzi di archetipi vintage casuali -lblRandomStandardColorDecks=Mazzi di colori standard casuali -lblRandomModernColorDecks=Mazzi di colori moderni casuali +lblRandomStandardArchetypeDecks=Mazzi casuali - archetipi Standard +lblRandomPioneerArchetypeDecks=Mazzi casuali - archetipi Pioneer +lblRandomHistoricArchetypeDecks=Mazzi casuali - archetipi Historic +lblRandomModernArchetypeDecks=Mazzi casuali - archetipi Modern +lblRandomLegacyArchetypeDecks=Mazzi casuali - archetipi Legacy +lblRandomVintageArchetypeDecks=Mazzi casuali - archetipi Vintage +lblRandomStandardColorDecks=Mazzi di colori casuali Standard +lblRandomModernColorDecks=Mazzi di colori casuali Modern lblRandomThemeDecks=Mazzi tematici casuali lblRandomDecks=Mazzi casuali -lblNetDecks=Net Decks -lblNetCommanderDecks=Mazzi Net Commander -lblNetArchiveStandardDecks=Net Archive Standard Decks -lblNetArchivePioneerDecks=Net Archive Pioneer Decks -lblNetArchiveModernDecks=Net Archive Modern Decks -lblNetArchiveLegacyDecks=Net Archive Legacy Decks -lblNetArchiveVintageDecks=Net Archive Vintage Decks -lblNetArchiveBlockDecks=Net Archive Block Decks +lblNetDecks=Mazzi dalla rete +lblNetCommanderDecks=Mazzi Commander dalla rete +lblNetArchiveStandardDecks=Mazzi Standard dalla rete +lblNetArchivePioneerDecks=Mazzi Pioneer dalla rete +lblNetArchiveModernDecks=Mazzi Modern dalla rete +lblNetArchiveLegacyDecks=Mazzi Legacy dalla rete +lblNetArchiveVintageDecks=Mazzi Vintage dalla rete +lblNetArchiveBlockDecks=Mazzi per Blocco dalla rete #VSubmenuTutorial lblTutorial=Tutorial -lblTutorialMode=Tutorial Mode +lblTutorialMode=Modalità Tutorial #VSubmenuPuzzleSolve.java -lblSolve=Risolvere +lblSolve=Risolvi lblPuzzleModeSolve=Modalità puzzle: risolvi #VSubmenuPuzzleCreate.java lblPuzzleModeCreate=Modalità puzzle: crea -lblCreate=Creare -lblCreateNewPuzzle=Create a New Puzzle -lblCreatePuzzleDest1=In this mode, you will start with a clean battlefield and empty zones. -lblCreatePuzzleDest2=You will need to use the Developer Mode tools to create a game state for your puzzle. -lblCreatePuzzleDest3=Then, use the Dump Game State command to export your game state with metadata template. -lblCreatePuzzleDest4=You can edit the exported file in a text editor to change the puzzle name, description, and objectives. -lblCreatePuzzleDest5=The puzzle file needs to have the .pzl extension and must be placed in res/puzzles. +lblCreate=Crea +lblCreateNewPuzzle=Crea un nuovo Puzzle +lblCreatePuzzleDest1=In questa modalità, inizi con campo di battaglia vuoto, così come le varie zone. +lblCreatePuzzleDest2=Devi usare gli strumenti della modalità Sviluppatore per creare lo stato di gioco del tuo puzzle. +lblCreatePuzzleDest3=Quindi, usa il comando "Scarica stato di gioco" per esportare il tuo stato di gioco con uno schema di metadati.. +lblCreatePuzzleDest4=Puoi modificare il file esportato con un editor di testo per cambiare il nome del puzzle, la descrizione e gli obiettivi. +lblCreatePuzzleDest5=Il puzzle deve avere estensione .pzl e deve essere collocato nella cartella res/puzzles. #VSubmenuGauntletLoad.java -lblQuickGauntlets=Guanti rapidi -lblQuickGauntlet=Guanto rapido -lblLoadGauntlet=Load Gauntlet -lblLoadaGauntlet=Carica un guanto -lblLoadaPreviousGauntlet=Carica un guanto precedente (usa il mazzo con cui è stato avviato) +lblQuickGauntlets=Sfide rapide +lblQuickGauntlet=Sfida rapida +lblLoadGauntlet=Carica sfida +lblLoadaGauntlet=Carica una sfida +lblLoadaPreviousGauntlet=Carica sfida precedente (usa il mazzo con cui è stata avviata) #VSubmenuGauntletQuick.java -lblQuickGauntletBuilder=Quick Gauntlet Builder +lblQuickGauntletBuilder=Costruttore di Sfide rapide lblDecklistDesc=Fai doppio clic su un mazzo non casuale per la sua lista. lblOptions=OPZIONI -lblMatchesperGauntlet=Partite per guanto +lblMatchesperGauntlet=Incontri per sfida lblAllowedDeckTypes=Tipi di mazzo consentiti -lblAutosaveInf=A new quick gauntlet is auto-saved. They can be loaded in the "Load Gauntlet" screen. +lblAutosaveInf=Una sfida rapida nuova è salvata automaticamente. Possono essere caricate dalla schermata "Carica sfida". #VSubmenuGauntletContests.java -lblGauntletContests=Concorsi di sfida -lblPickaContest=SCEGLI UN CONCORSO -lblGauntletStartedDesc=Un guanto che è stato avviato manterrà lo stesso mazzo fino al termine. +lblGauntletContests=Competizioni delle sfide +lblPickaContest=SCEGLI UNA COMPETIZIONE +lblGauntletStartedDesc=In una sfida avviata verrà mantenuto lo stesso mazzo fino al termine. #VSubmenuGauntletBuild.java -lblGauntletBuilder=Gauntlet Builder -lblGauntletDesc1=Le frecce sinistra / destra aggiungono o rimuovono i deck. -lblGauntletDesc2=Le frecce su / giù cambiano l''ordine dell''avversario. +lblGauntletBuilder=Costruttore di sfide +lblGauntletDesc1=Le frecce sinistra/destra aggiungono o rimuovono i mazzi. +lblGauntletDesc2=Le frecce su/giù cambiano l''ordine degli avversari. lblDecklist=Fai doppio clic su un mazzo non casuale per la sua lista. -btnUp=Sposta questo mazzo in alto nel guanto -btnDown=Sposta questo mazzo in basso nel guanto -btnRight=Aggiungi questo mazzo al guanto -btnLeft=Rimuovi questo mazzo sul guanto -btnSaveGauntlet=Salva questo guanto -btnNewGauntlet=Costruisci un nuovo guanto -btnLoadaGauntlet=Carica un guanto -lblGauntletName=Nome del guanto -lblBuildAGauntlet=Costruisci un guanto +btnUp=Sposta questo mazzo in alto nella sfida +btnDown=Sposta questo mazzo in basso nella sfida +btnRight=Aggiungi questo mazzo alla sfida +btnLeft=Rimuovi questo mazzo dalla sfida +btnSaveGauntlet=Salva questa sfida +btnNewGauntlet=Costruisci un nuova sfida +btnLoadaGauntlet=Carica una sfida +lblGauntletName=Nome della sfida +lblBuildAGauntlet=Costruisci una sfida lblChangesNotSave=Modifiche non ancora salvate. #QuestUtil.java -lblTravelBetweenWorlds=Viaggia tra mondi. +lblTravelBetweenWorlds=Viaggia tra i mondi. lblWhereDoYouWishToTravel=Dove desideri viaggiare? lblUncompleteChallengesWarning=ATTENZIONE: sfide non completate -lblUncompleteChallengesDesc=You have uncompleted challenges in your current world. If you travel now, they will be LOST!\nAre you sure you wish to travel anyway?\n(Click "No" to go back and complete your current challenges first.) -lblDontSummonAPet=Non convocare un animale domestico +lblUncompleteChallengesDesc=Hai delle sfide da completare nel mondo attuale. Se viaggi ora, saranno PERSE!\nSei sicuro di voler viaggiare lo stesso?\n(Clicca "No"per annullare e completare prima le sfide in corso.) +lblDontSummonAPet=Non evocare un animale lblSummon=Evoca %n -lblMatchBestOf1=Abbinamento - Il meglio di 1 -lblMatchBestOf3=Abbinamento - Il meglio di 3 -lblMatchBestOf5=Abbinamento - Il migliore di 5 -lblCredits=Titoli di coda +lblMatchBestOf1=Incontro - Al meglio di 1 +lblMatchBestOf3=Incontro - Al meglio di 3 +lblMatchBestOf5=Incontro - Al meglio di 5 +lblCredits=Monete lblLife=Vita -lblWins=vittorie -lblLosses=Perdite +lblWins=Vittorie +lblLosses=Sconfitte lblWorld=Mondo lblNone=Nessuna -lblnextChallengeInWins0=I tuoi exploit sono stati notati. Un avversario ti ha sfidato. +lblnextChallengeInWins0=Le tue gesta non sono passate inosservate. Un avversario ti ha sfidato. lblnextChallengeInWins1=Una nuova sfida sarà disponibile dopo 1 ulteriore vittoria. lblnextChallengeInWins2=Una nuova sfida sarà disponibile tra %n vittorie. -lblWinStreak=Vinci una serie +lblWinStreak=Serie di vittorie lblBest=Migliore -lblBuildAndSelectaDeck=Build, then select a deck in the "Quest Decks" submenu. +lblBuildAndSelectaDeck=Costruisci, quindi seleziona un mazzo nel sotto-menu "Mazzi Avventura". lblCurrentDeck=Il tuo mazzo attuale è %n -PleaseCreateAQuestBefore=Crea una missione prima di provare a %n. -lblNoQuest=Nessuna ricerca -lblVisitTheSpellShop=Visita il negozio degli incantesimi. +PleaseCreateAQuestBefore=Crea un''Avventura prima di provare a %n. +lblNoQuest=Nessuna Avventura +lblVisitTheSpellShop=Visita il negozio delle magie. lblVisitTheBazaar=Visita il bazar. lblUnlockEditions=Sblocca le edizioni. lblUnlocked=Hai sbloccato con successo %n! titleUnlocked= %n sbloccato! lblStartADuel=Inizia un duello. -lblSelectAQuestDeck=Seleziona un mazzo missioni. +lblSelectAQuestDeck=Seleziona un mazzo Avventura. lblInvalidDeck=Mazzo non valido lblInvalidDeckDesc=Il tuo mazzo %n \nModifica o scegli un altro mazzo. #VSubmenuQuestPrefs.java -lblQuestPreferences=Preferenze missione +lblQuestPreferences=Preferenze Avventura lblRewardsError=Errore premi -lblDifficultyError=Errore di difficoltà -lblBoosterError=Errore di richiamo +lblDifficultyError=Errore difficoltà +lblBoosterError=Errore buste lblShopError=Errore negozio -lblDraftTournamentsError=Draft Tournaments Error -lblRewards=Rewards -lblBoosterPackRatios=Rapporti del pacchetto di potenziamento -lblDifficultyAdjustments=Regolazioni di difficoltà +lblDraftTournamentsError=Errore tornei Draft +lblRewards=Ricompense +lblBoosterPackRatios=Rapporti buste +lblDifficultyAdjustments=Regola la difficoltà lblShopPreferences=Preferenze del negozio -lblDraftTournaments=Progetti di tornei +lblDraftTournaments=Tornei Draft lblBaseWinnings=Vincite di base -lblNoLosses=Nessuna perdita -lblPoisonWin=Poison Win -lblMillingWin=Fresatura -lblMulligan0Win=Mulligan 0 Win -lblAlternativeWin=Win alternativo +lblNoLosses=Nessuna sconfitta +lblPoisonWin=Vittoria via veleno +lblMillingWin=VIttoria via macina +lblMulligan0Win=Vittoria dopo mulligan a 0 +lblAlternativeWin=Vittoria alternativa lblBonusMultiplierperWin=Moltiplicatore bonus per vittoria -ttBonusMultiplierperWin=Ogni vincita precedente aumenta di molto la tua ricompensa dopo aver vinto una partita. -lblMaxWinsforMultiplier=Vittorie massime per moltiplicatore -ttMaxWinsforMultiplier=La ricompensa smette di aumentare dopo aver ottenuto così tante vittorie. -lblWinbyTurn15=Vinci per turno 15 -lblWinbyTurn10=Vinci al turno 10 -lblWinbyTurn5=Vinci al turno 5 -lblFirstTurnWin=Primo turno Vinci -lblMaxLifeDiffBonus=Max Life Diff. indennità -lblExcludePromosFromRewardPool=Exclude Promos -lblEasy=Facile -lblMedium=medio -lblHard=Difficile -lblExpert=Esperto +ttBonusMultiplierperWin=Ogni vittoria precedente aumenta la tua ricompensa di questo valore dopo aver vinto una partita. +lblMaxWinsforMultiplier=Numero massimo di vittorie per moltiplicatore +ttMaxWinsforMultiplier=La ricompensa smette di aumentare dopo aver ottenuto questo numero di vittorie. +lblWinbyTurn15=Vinci entro il turno 15 +lblWinbyTurn10=Vinci entro il turno 10 +lblWinbyTurn5=Vinci entro il turno 5 +lblFirstTurnWin=Vinci al primo turno +lblMaxLifeDiffBonus=Bonus per differenza punti vita +lblExcludePromosFromRewardPool=Escludi carte promo +lblEasy=Novizio +lblMedium=Apprendista +lblHard=Esperto +lblExpert=Maestro lblWinsforBooster=Vittorie per Booster lblWinsforRankIncrease=Vittorie per aumento di rango -lblWinsforMediumAI=Vince per l''IA media -lblWinsforHardAI=Vittorie per l''IA dura -lblWinsforExpertAI=Vittorie per Expert AI -lblStartingCommons=Avvio di Commons -lblStartingUncommons=Avvio di Uncommons -lblStartingRares=Rare iniziali -lblStartingCredits=Crediti iniziali -lblWinsforNewChallenge=Vince per la nuova sfida -lblStartingSnowLands=A partire dalle terre di neve -lblColorBias=Bias colore (1-100 %) -ttColorBias=La percentuale di carte nel tuo pool iniziale che saranno i colori selezionati. -lblPenaltyforLoss=Penalità per perdita -lblMoreDuelChoices=Altre scelte di duello +lblWinsforMediumAI=Vince per l''IA livello apprendista +lblWinsforHardAI=Vittorie per l''IA livello esperto +lblWinsforExpertAI=Vittorie per l''IA livello maestro +lblStartingCommons=Carte comuni iniziali +lblStartingUncommons=Carte non comuni iniziali +lblStartingRares=Carte rare iniziali +lblStartingCredits=Monete iniziali +lblWinsforNewChallenge=Vittorie per nuova sfida +lblStartingSnowLands=Terre innevate iniziali +lblColorBias=Predilezione colore (1-100 %) +ttColorBias=La percentuale di carte nel tuo insieme di partenza che saranno dei colori prescelti. +lblPenaltyforLoss=Penalità per sconfitta +lblMoreDuelChoices=Scelte ulteriori per i duelli lblCommon=Comune -lblUncommon=Raro +lblUncommon=Non comune lblRare=Raro -lblSpecialBoosters=Booster speciali -ttSpecialBoosters=Consente ai booster speciali e specifici per colore di apparire nel negozio e come ricompense delle partite. -lblMaximumPacks=Pacchetti massimi -lblMinimumPacks=Pacchetti minimi -lblStartingPacks=Pacchetti di partenza +lblSpecialBoosters=Buste speciali +ttSpecialBoosters=Consente alle buste speciali e specifiche per colore di comparire nel negozio e come ricompense. +lblMaximumPacks=Numero massimo di pacchetti +lblMinimumPacks=Numero minimo di pacchetti +lblStartingPacks=Numero di pacchetti iniziale lblWinsforPack=Vittorie per pacchetto -lblWinsperSetUnlock=Vittorie per sblocco set +lblWinsperSetUnlock=Vittorie per sbloccare una nuova espansione lblAllowFarUnlocks=Consenti sblocchi lontani -lblUnlockDistanceMultiplier=Sblocca il moltiplicatore di distanza -lblCommonSingles=Singoli comuni -lblUncommonSingles=Singoli non comuni -lblRareSingles=Singoli rari +lblUnlockDistanceMultiplier=Moltiplicatore della distanza per gli sblocchi +lblCommonSingles=Singole comuni +lblUncommonSingles=Singole non comuni +lblRareSingles=Singole rare lblCardSalePercentageBase=Base percentuale vendita carte lblCardSalePercentageCap=Limite percentuale vendita carta -lblCardSalePriceCap=Prezzo di vendita della carta -lblWinstoUncapSalePrice=Vince il prezzo di vendita Uncap -lblPlaysetSize=Dimensione del set di giochi -ttPlaysetSize=Il numero di copie delle carte da conservare prima di vendere extra. -lblPlaysetSizeBasicLand=Dimensione set giochi: terra base -ttPlaysetSizeBasicLand=Il numero di copie delle terre base da conservare prima di vendere extra. -lblPlaysetSizeAnyNumber=Dimensioni del set di giochi: qualsiasi numero -ttPlaysetSizeAnyNumber=Il numero di copie di Relentless Rats o altre carte simili senza limiti da conservare prima di vendere extra. +lblCardSalePriceCap=Tetto massimo del prezzo di vendita di una carta +lblWinstoUncapSalePrice=Vittorie per rimuovere il tetto massimo di vendita +lblPlaysetSize=Dimensione playset +ttPlaysetSize=Il numero di copie di una carta da conservare prima di vendere quelle in eccesso. +lblPlaysetSizeBasicLand=Dimensione playset: terra base +ttPlaysetSizeBasicLand=Il numero di copie di una terra base da conservare prima di vendere quelle in eccesso. +lblPlaysetSizeAnyNumber=Dimensioni playset: qualsiasi numero +ttPlaysetSizeAnyNumber=Il numero di copie di Relentless Rats o altre carte simili (senza limiti al numero di copie nel mazzo) da conservare prima di vendere quelle in eccesso. lblItemLevelRestriction=Limitazione a livello di oggetto -lblFoilfilterAlwaysOn=Filtro a foglio Sempre attivo +lblFoilfilterAlwaysOn=Effetto foil sempre attivo lblRatingsfilterAlwaysOn=Filtro di valutazione Sempre attivo -lblSimulateAIvsAIResults=Simula risultati AI vs. AI -ttSimulateAIvsAIResults=Se impostato su 1, le partite AI vs. AI nei tornei a tiraggio non verranno giocate e il loro risultato verrà invece deciso casualmente. -lblWinsforNewDraft=Vittorie per il nuovo draft -lblWinsperDraftRotation=Vittorie per Draft Rotation -ttWinsperDraftRotation=Se una Draft non viene giocata per questo numero di vittorie, verrà rimossa o sostituita. +lblSimulateAIvsAIResults=Simula risultati IA vs. IA +ttSimulateAIvsAIResults=Se impostato su 1, le partite IA vs. IA nei tornei Draft non verranno giocate e il loro risultato verrà invece deciso casualmente. +lblWinsforNewDraft=Vittorie per un nuovo Draft +lblWinsperDraftRotation=Vittorie per rotazione Draft +ttWinsperDraftRotation=Se un Draft non viene giocato per questo numero di vittorie, verrà rimosso o sostituito. lblRotationType=Tipo di rotazione -ttRotationType=Se impostato su 0, le vecchie bozze scompaiono, se impostate su 1, vengono sostituite con un''altra utilizzando set diversi. -lblWildOpponentNumber=Number of Wild Opponents -lblWildOpponentMultiplier=Wild Multiplier +ttRotationType=Se impostato su 0, i vecchi Draft scompaiono, se impostato su 1, vengono sostituiti con un''altro utilizzando espansioni diverse. +lblWildOpponentNumber=Numero di avversari a sorpresa +lblWildOpponentMultiplier=Moltiplicatore ricompense per avversari a sorpresa #StatTypeFilter.java -lblclicktotoogle=fai clic per attivare o disattivare il filtro, fai clic con il pulsante destro del mouse per mostrare solo +lblclicktotoogle=Fai clic per attivare o disattivare il filtro,clic destro per mostrare solo questo filtro #SItemManagerUtil.java lblWhitecards=Carte bianche lblBluecards=Carte blu lblBlackcards=Carte nere -lblRedcards=Cartellini rossi +lblRedcards=Carte rosse lblGreencards=Carte verdi -lblColorlesscards=Carte incolori -lblMulticolorcards=Carte multicolor -lblPackordeck=Pacchetti di carte e mazzi prefabbricati -lblLands=terre -lblArtifacts=artefatti -lblCreatures=creature +lblColorlesscards=Carte incolore +lblMulticolorcards=Carte multicolore +lblPackordeck=Pacchetti di carte e mazzi precostruiti +lblLands=Terre +lblArtifacts=Artefatti +lblCreatures=Creature lblEnchantments=Incantesimi -lblPlaneswalkers=planeswalker -lblInstants=Instants -lblSorceries=stregonerie -lblCCMC0=Schede con CMC 0 -lblCCMC1=Schede con CMC 1 -lblCCMC2=Schede con CMC 2 -lblCCMC3=Schede con CMC 3 -lblCCMC4=Schede con CMC 4 -lblCCMC5=Schede con CMC 5 -lblCCMC6orMore=Schede con CMC 6+ +lblPlaneswalkers=Planeswalker +lblInstants=Istantanei +lblSorceries=Stregonerie +lblCCMC0=Carte con CMC 0 +lblCCMC1=Carte con CMC 1 +lblCCMC2=Carte con CMC 2 +lblCCMC3=Carte con CMC 3 +lblCCMC4=Carte con CMC 4 +lblCCMC5=Carte con CMC 5 +lblCCMC6orMore=Carte con CMC 6+ lblWhitedecks=Mazzi bianchi -lblBluedecks=Ponti blu +lblBluedecks=Mazzi blu lblBlackdecks=Mazzi neri -lblReddecks=Ponti rossi +lblReddecks=Mazzi rossi lblGreendecks=Mazzi verdi -lblColorlessdecks=Mazzi incolori -lblMulticolordecks=Mazzi multicolor +lblColorlessdecks=Mazzi incolore +lblMulticolordecks=Mazzi multicolore lblOldstyleFoilcards=Carte foil vecchio stile -lblNewstyleFoilcards=Nuove carte foil in stile -lblNon-Foilcards=Carte non stagnola +lblNewstyleFoilcards=Carte foil nuovo stile +lblNon-Foilcards=Carte non-foil lblUnratedcards=Carte senza punteggio -lbl1starcards=1 stella -lbl2starcards=2 stelle +lbl1starcards=Carte a 1 stella +lbl2starcards=Carte a 2 stelle lbl3starcards=Carte a 3 stelle lbl4starcards=Carte a 4 stelle lbl5starcards=Carte a 5 stelle lblXcopiesof=X copie di lblcopiesof=copie di #ItemListView.java -lblUniqueCardsOnly=Solo carte uniche -ttUniqueCardsOnly=Seleziona se mostrare solo carte uniche -lblListView=List View +lblUniqueCardsOnly=Versione unica +ttUniqueCardsOnly=Seleziona per mostrare una singola versione per carta +lblListView=Visualizzazione elenco #ACEditorBase.java lblAddcard=Aggiungi carta ttAddcard=Aggiungi la carta selezionata al mazzo corrente (o fai doppio clic sulla riga o premi la barra spaziatrice) -lblAdd4ofcard=Aggiungi 4 di carte -ttAdd4ofcard=Aggiungi fino a 4 carte selezionate al mazzo corrente +lblAdd4ofcard=Aggiungi 4 copie +ttAdd4ofcard=Aggiungi fino a 4 copie della carta selezionata al mazzo corrente lblRemovecard=Rimuovi la carta ttRemovecard=Rimuovi la carta selezionata dal mazzo corrente (o fai doppio clic sulla riga o premi la barra spaziatrice) -lblRemove4ofcard=Rimuovere 4 di carta -ttRemove4ofcard=Rimuovi fino a 4 della carta selezionata nel mazzo corrente -lblAddBasicLands=Aggiungi terre di base +lblRemove4ofcard=Rimuovere 4 copie +ttRemove4ofcard=Rimuovi fino a 4 copie della carta selezionata nel mazzo corrente +lblAddBasicLands=Aggiungi terre base ttAddBasicLands=Aggiungi terre base al mazzo lblCardCatalog=Catalogo delle carte lblJumptoprevioustable=Vai alla tabella precedente -lblJumptopnexttable=Vai al prossimo tavolo +lblJumptopnexttable=Vai alla prossima tabella lblJumptotextfilter=Vai al filtro di testo lblChooseavalueforX=Scegli un valore per X #VCurrentDeck.java lblVCurrentDeck=Mazzo corrente ttbtnSave=Salva mazzo (Ctrl + S) ttbtnSaveAs=Salva mazzo come (Ctrl + E) -ttbtnLoadDeck=Open Deck (Ctrl + O) +ttbtnLoadDeck=Apri mazzo (Ctrl + O) ttbtnNewDeck=Nuovo mazzo (Ctrl + N) ttbtnPrintProxies=Stampa su file HTML (Ctrl + P) -lblImport=Importare +lblImport=Importa ttImportDeck=Tentativo di importare un mazzo da un formato non Forge (Ctrl + I) lblTitle=Titolo #ImageView.java lblExpandallgroups=Espandi tutti i gruppi lblCollapseallgroups=Comprimi tutti i gruppi -lblGroupby=raggruppare per -lblPileby=ammucchiare -lblColumns=colonne -lblPiles=Piles: -lblGroups=Groups: -lblImageView=Image View +lblGroupby=Raggruppa per +lblPileby=Impila per +lblColumns=Colonne +lblPiles=Pile: +lblGroups=Gruppi: +lblImageView=Visualizzazione immagini #CEditorVariant.java, CEditorConstructed.java -lblCatalog=Catalogare -lblAdd=Inserisci -lbltodeck=al ponte +lblCatalog=Catalogo +lblAdd=Aggiungi +lbltodeck=al mazzo lblfromdeck=dal mazzo -lbltosideboard=alla credenza -lblfromsideboard=dalla credenza -lblascommander=come comandante -lblasoathbreaker=come rompiscatole -lblassignaturespell=come incantesimo firma +lbltosideboard=al sideboard +lblfromsideboard=dal sideboard +lblascommander=come generale +lblasoathbreaker=come oathbreaker +lblassignaturespell=come magia distintiva lblasavatar=come avatar -lblfromschemedeck=dal mazzo di schemi +lblfromschemedeck=dal mazzo intrighi lblfromplanardeck=dal mazzo planare -lblfromconspiracydeck=dal mazzo della cospirazione -lbltoschemedeck=per pianificare il mazzo +lblfromconspiracydeck=dal mazzo conspiracy +lbltoschemedeck=al mazzo intrighi lbltoplanardeck=al mazzo planare -lbltoconspiracydeck=al mazzo della cospirazione -lblMove=Mossa +lbltoconspiracydeck=al mazzo conspiracy +lblMove=Sposta #VDock.java -lblDock=bacino -lblViewDeckList=Visualizza l''elenco dei deck +lblDock=Comandi +lblViewDeckList=Visualizza la lista del mazzo lblRevertLayout=Ripristina layout lblOpenLayout=Apri layout lblSaveLayout=Salva layout #GroupDef.java lblColor=Colore -lblColorIdentity=Identità del colore -lblSet=Impostato -lblSet2=Impostato +lblColorIdentity=Identità di colore +lblSet=Espansione #Set word has different meanings in other languages lblDefault=Predefinito -lblType=genere -lblPlaneswalkerDeckSort=Ordinamento del mazzo Planeswalker +lblType=Tipo +lblPlaneswalkerDeckSort=Ordinamento mazzi Planeswalker lblRarity=Rarità -lblConvertToFoil=Foglio +lblConvertToFoil=Foil lblMulticolor=Multicolore #DeckFileMenu.java lblNewDeck=Nuovo mazzo -lblOpenDeck=Open Deck +lblOpenDeck=Apri mazzo lblImportDeck=Importa mazzo lblSaveDeck=Salva mazzo lblSaveDeckAs=Salva mazzo come @@ -890,354 +902,354 @@ lblPrinttoHTMLfile=Stampa su file HTML lblCard=Carta #CardManager.java lblFormat=Formato -lblFormats=formati -lblQuestWorld=Quest World -lblSets=Imposta -lblTypes=tipi +lblFormats=Formati +lblQuestWorld=Mondo dell''Avventura +lblSets=Espansioni +lblTypes=Tipi lblConvertedManaCosts=Mana convertito -lblCMCRange=Gamma CMC -lblPowerRange=Scala di potenza -lblToughnessRange=Gamma di resistenza -lblFoil=Foglio +lblCMCRange=Intorno CMC +lblPowerRange=Intorno Forza +lblToughnessRange=Intorno Costituzione +lblFoil=Foil lblPersonalRating=Valutazione personale lblAdvanced=Avanzate #VDeckgen.java lblDeckGeneration=Generazione del mazzo -btnRandCardpool=Cardpool casuale -ttbtnRandCardpool=Genera cardpool costruito casualmente nell''area del mazzo corrente +btnRandCardpool=Carte casuali +ttbtnRandCardpool=Genera un gruppo di carte casuale nell''area del mazzo in uso btnRandDeck2=Costruito (2 colori) -ttbtnRandDeck2=Genera 2 mazzi costruiti a colori nell''area del mazzo corrente +ttbtnRandDeck2=Genera un mazzo a 2 colori nell''area del mazzo in uso btnRandDeck3=Costruito (3 colori) -ttbtnRandDeck3=Genera un mazzo costruito in 3 colori nell''area del mazzo corrente +ttbtnRandDeck3=Genera un mazzo a 3 colori nell''area del mazzo in uso btnRandDeck5=Costruito (5 colori) -ttbtnRandDeck5=Genera un mazzo costruito a 5 colori nell''area del mazzo corrente +ttbtnRandDeck5=Genera un mazzo a 5 colori nell''area del mazzo in uso #DeckCotroller.java -lblCurrentDeck2=Mazzo corrente +lblCurrentDeck2=Mazzo in uso lblUntitled=Senza titolo #VPrompt.java -lblPrompt=Richiesta +lblPrompt=Messaggi lblGameSetup=Configurazione del gioco #ColumnDef.java -lblAIStatus=Stato AI +lblAIStatus=Stato IA lblCMC=CMC ttCMC=CMC -lblCN=CN -ttCN=Ordine numero collezionisti +lblCN=NC +ttCN=Ordina secondo il Numero di Collezione ttColor=Colore lblCost=Costo ttCost=Costo -lblDecks=Decks +lblDecks=Mazzi lblDeleteEdit=Cancella / Modifica -lblSetEdition=Colonna misteriosa. Non sappiamo cosa fa o se è quello che dovrebbe fare. +lblSetEdition=Espansione ttFavorite=Preferito lblFolder=Cartella -ttFormats=Il mazzo dei formati è legale +ttFormats=Formati in cui il mazzo è legale lblMain=Principale -ttMain=Ponte principale +ttMain=Mazzo principale lblQty=Quantità lblQuantity=Quantità -lblSide=Lato -lblSideboard=Credenza +lblSide=Sideboard +lblSideboard=Sideboard lblNew=Nuovo -lblOwned=Di proprietà -lblPower=Energia -ttPower=Energia -lblPrice=Prezzo -ttPrice=Prezzo -lblRanking=classifica -lblDraftRanking=Classifica bozza -lblToughness=durezza -ttToughness=durezza -ttType=genere +lblOwned=Posseduto +lblPower=Forza +ttPower=Forza +lblPrice=Costo +ttPrice=Costo +lblRanking=Valore +lblDraftRanking=Valore in Draft +lblToughness=Costituzione +ttToughness=Costituzione +ttType=Tipo #HomeScreen.java -lblNewGame=Nuovo gioco -lblLoadGame=Carica gioco -lblPlayOnline=Giocare online +lblNewGame=Nuova partita +lblLoadGame=Carica partita +lblPlayOnline=Gioca online lblSettings=impostazioni #SettingsPage.java -lblAutomaticBugReports=Segnalazioni di bug automatiche -lblBattlefieldTextureFiltering=Filtraggio delle trame del campo di battaglia -lblCompactListItems=Elementi dell''elenco compatto +lblAutomaticBugReports=Segnalazioni automatiche di bug +lblBattlefieldTextureFiltering=Filtro delle texture sul campo di battaglia +lblCompactListItems=Elementi compatti in elenco lblCompactTabs=Schede compatte -lblCardOverlays=Sovrapposizioni di carte -lblCJKFont=CJK Font -lblDisableCardEffect=Disable Card ''Effect'' Images -lblDynamicBackgroundPlanechase=Planechase di sfondo dinamico +lblCardOverlays=Sovraimpressionii delle carte +lblCJKFont=Font CJK +lblDisableCardEffect=Disabilita le immagini degli "effetti" delle carte +lblDynamicBackgroundPlanechase=Sfondo dinamico in Planechase lblGameplayOptions=Opzioni di gioco -lblGeneralSettings=impostazioni generali +lblGeneralSettings=Impostazioni generali lblHotSeatMode=Modalità Hot Seat -lblLandscapeMode=Modalità panoramica +lblLandscapeMode=Modalità panorama lblLater=Dopo lblMinimizeScreenLock=Riduci a icona su Blocco schermo -lblOrderGraveyard=Order Graveyard +lblOrderGraveyard=Ordine cimitero lblRestartForge=Riavvia Forge lblRestartForgeDescription=È necessario riavviare Forge per rendere effettiva questa modifica. -lblRotateZoomPlanesPhenomena=Ruota Zoom Immagine di piani / fenomeni -lblRotateZoomSplit=Ruota Zoom Immagine di Split Cards +lblRotateZoomPlanesPhenomena=Ruota piani/ fenomeni +lblRotateZoomSplit=Ruota carte Split lblShowAbilityIconsOverlays=Mostra icone abilità -lblShowCardIDOverlays=Mostra overlay ID carta -lblShowCardManaCostOverlays=Mostra sovrapposizioni di costi Mana delle carte -lblShowCardNameOverlays=Mostra sovrapposizioni nome carta -lblShowCardOverlays=Mostra sovrapposizioni di carte -lblShowCardPTOverlays=Mostra sovrapposizioni scheda P / T -lblShowMatchBackground=Mostra sfondo partita +lblShowCardIDOverlays=Mostra sovraimpressione con l''ID della carta +lblShowCardManaCostOverlays=Mostra sovraimpressione con il costo di mana +lblShowCardNameOverlays=Mostra sovraimpressione con il nome della carta +lblShowCardOverlays=Mostra sovraimpressioni sulle carte +lblShowCardPTOverlays=Mostra sovraimpressione con valori F/C +lblShowMatchBackground=Mostra lo sfondo dell''incontro lblVibrateAfterLongPress=Vibrazione dopo una pressione prolungata -lblVibrateWhenLosingLife=Vibrazione quando si perde la vita +lblVibrateWhenLosingLife=Vibrazione quando si perde vita lblVibrationOptions=Opzioni di vibrazione nlAutomaticBugReports=Invia automaticamente segnalazioni di bug agli sviluppatori, senza chiedere conferma. nlBattlefieldTextureFiltering=Filtra la grafica delle carte sul campo di battaglia per renderla meno pixelata su schermi di grandi dimensioni (è necessario riavviare, potrebbe ridurre le prestazioni). -nlCJKFont=Set the font for CJK glyphs. Will override skin font (restart required). -nlCompactListItems=Mostra solo una singola riga di testo per carte e mazzi su tutte le visualizzazioni elenco per impostazione predefinita. -nlCompactTabs=Mostra schede più piccole nella parte superiore delle schermate della scheda (come questa schermata). -nlDisableCardEffect=Disable the zoomed image for the ''Effect'' cards. -nlDynamicBackgroundPlanechase=Usa le immagini del piano corrente come sfondo (le immagini della Planes Card devono trovarsi nella cartella cache / pics / planechase). -nlHotSeatMode=Quando inizi una partita con 2 giocatori umani, usa un singolo prompt per controllare entrambi i giocatori. +nlCJKFont=Imposta il font per i glifi Cinesi-Giapponesi-Coreani. Ignora il font del tema (richiede riavvio). +nlCompactListItems=Mostra solo una singola riga di testo per carte e mazzi in tutte le visualizzazioni elenco. +nlCompactTabs=Mostra schede più piccole nella parte superiore delle schermate con schede (come questa). +nlDisableCardEffect=Disabilita l''immagine ingrandita per gli "effetti" delle carte +nlDynamicBackgroundPlanechase=Usa le immagini del piano in vigore come sfondo (le immagini delle carte Piano devono essere salvate nella cartella cache/pics/ planechase). +nlHotSeatMode=Quando inizi una partita con 2 giocatori umani, usa un singolo riquadro messaggi per controllare entrambi i giocatori. nlLandscapeMode=Usa l''orientamento orizzontale (orizzontale) per l''app anziché verticale (verticale). -nlMinimizeScreenLock=Riduci a icona Forgia quando lo schermo è bloccato (abilita se riscontri problemi grafici dopo aver bloccato lo schermo). -nlOrderGraveyard=Determina quando autorizzare l''ordine delle carte che vanno al cimitero (mai / sempre / solo con carte pertinenti). +nlMinimizeScreenLock=Riduci a icona Forge quando lo schermo è bloccato (abilita se riscontri problemi grafici dopo aver bloccato lo schermo). +nlOrderGraveyard=Determina quando indicare l''ordine delle carte che vanno al cimitero (mai / sempre / solo con carte pertinenti). nlRotateZoomPlanesPhenomena=Ruota l''immagine ingrandita delle carte Piano o Fenomeno. -nlRotateZoomSplit=Ruota l''immagine ingrandita delle carte divise. -nlShowAbilityIconsOverlays=Mostra le icone delle abilità per le carte, altrimenti sono nascoste. -nlShowCardIDOverlays=Mostra gli overlay ID per le carte, altrimenti sono nascosti. -nlShowCardManaCostOverlays=Mostra le sovrapposizioni di costo di mana per le carte, altrimenti sono nascoste. -nlShowCardNameOverlays=Mostra sovrapposizioni di nomi per le carte, altrimenti sono nascoste. -nlShowCardOverlays=Mostra sovrapposizioni di nome, costo di mana, p / te id id per le carte, altrimenti sono nascoste. -nlShowCardPTOverlays=Mostra sovrapposizioni di potenza / costituzione / lealtà per le carte, altrimenti sono nascoste. -nlShowMatchBackground=Mostra l''immagine di sfondo della partita sul campo di battaglia, altrimenti verrà mostrata la trama di sfondo. -nlTheme=Imposta il tema che determina la modalità di skin dei componenti di visualizzazione. -nlVibrateAfterLongPress=Abilitare la vibrazione rapida per indicare una pressione prolungata, ad esempio per lo zoom della scheda. +nlRotateZoomSplit=Ruota l''immagine ingrandita delle carte Split. +nlShowAbilityIconsOverlays=Mostra le icone delle abilità delle carte, altrimenti sono nascoste. +nlShowCardIDOverlays=Mostra una sovraimpressione con l''ID della carta, altrimenti è nascosto. +nlShowCardManaCostOverlays=Mostra una sovraimpressione con il costo di mana della carta, altrimenti è nascosto. +nlShowCardNameOverlays=Mostra una sovraimpressione con il nome della carta, altrimenti è nascosto. +nlShowCardOverlays=Mostra le sovraimpressioni di nome, costo di mana, ID e F/C delle carte, altrimenti sono nascoste. +nlShowCardPTOverlays=Mostra una sovraimpressione con i valori di Forza/Costituzione/Lealtà della carta, altrimenti sono nascosti. +nlShowMatchBackground=Mostra l''immagine di sfondo dell''incontro sul campo di battaglia, altrimenti verrà mostrata la trama di sfondo. +nlTheme=Imposta il tema che determina l''aspetto visivo dei vari componenti dell''interfaccia. +nlVibrateAfterLongPress=Abilitare una rapida vibrazione per indicare una pressione prolungata, ad esempio quando si ingrandisce una carta. nlVibrateWhenLosingLife=Attiva le vibrazioni quando il giocatore perde punti vita o subisce danni durante una partita. -lblBorderMaskOption=Border Mask Option -nlBorderMaskOption=Applies the selected border option for card images (If unsure, choose Crop). -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 (Utilizzo elevato della RAM). -lblEnableMatchScrollIndicator=Match Scroll Indicator -nlEnableMatchScrollIndicator=When enabled, show the scroll indicator on the match screen. -lblShowFPSDisplay=Mostra display FPS -nlShowFPSDisplay=Se abilitato, mostra il display FPS (sperimentale). -lblEnableUnknownCards=Enable Unknown Cards -nlEnableUnknownCards=Enable Unknown Cards to be loaded to Unknown Set. (Requires restart) -lblEnableNonLegalCards=Enable Non-Legal Cards -nlEnableNonLegalCards=Enable Non-Legal Cards like Un-sets and PlayTest Cards. (Requires restart) -lblDisableCardImages=Disable Card Images -nlDisableCardImages=When enabled, Forge will not display card images. -lblExperimentalNetworkCompatibility=Experimental Network Compatibility -nlExperimentalNetworkCompatibility=Forge switches to compatible network stream. (If unsure, turn OFF this option) -lblDisposeTextures=Dispose Textures -nlDisposeTextures=When enabled, disposes the card art caches. (If unsure, turn OFF this option) -lblAutoCacheSize=Enable Auto Cache Size -nlAutoCacheSize=When enabled, Cache size are automatically determined on startup. (If unsure, turn OFF this option) +lblBorderMaskOption=Opzioni della maschera dei bordi +nlBorderMaskOption=Applica l''opzione selezionata ai bordi delle carte (Nel dubbio, scegli Ritaglia). +lblEnableRoundBorder=Abilita maschera bordi arrotondati +nlEnableRoundBorder=Se abilitato, gli angoli delle carte sono arrotondati (preferibilmente con carte con bordi interi). +lblPreloadExtendedArtCards=Precarica arte estesa delle carte +nlPreloadExtendedArtCards=Se abilitato, precarica l''arte estesa delle carte nella cache all''avvio (Utilizzo elevato di RAM). +lblMatchScrollIndicator=Indicatore di scorrimento negli incontri +nlMatchScrollIndicator=Se abilitato, mostra l''indicatore di scorrimento nella schermata degli incontri +lblShowFPSDisplay=Mostra indicatore FPS +nlShowFPSDisplay=Se abilitato, mostra i Frame Per Secondo (sperimentale). +lblEnableUnknownCards=Abilita carte sconosciute +nlEnableUnknownCards=Abilita il caricamento di carte sconosciute in espansioni sconosciute. (richiede riavvio) +lblEnableNonLegalCards=Abilita carte non legali +nlEnableNonLegalCards=Abilita carte non legali come le espansioni ''Un-'' e le carte di Playtest. (richiede riavvio) +lblDisableCardImages=Disabilita le immagini delle carte +nlDisableCardImages=Se abilitato, Forge non mostrerà alcuna immagine per le carte. +lblExperimentalNetworkCompatibility=Compatibilità di rete sperimentale +nlExperimentalNetworkCompatibility=Forge passa a un flusso di rete compatibile. (Nel dubbio, DISABILITARE questa opzione) +lblDisposeTextures=Rimuovi Texture +nlDisposeTextures=Quando abilitato, rimuove la cache delle immagini delle carte. (Nel dubbio, DISABILITARE questa opzione) +lblAutoCacheSize=Abilita dimensione automatica della cache +nlAutoCacheSize=Se abilitato, la dimensione della cache è stabilita automaticamente all''avvio. (Nel dubbio, DISABILITARE questa opzione) #MatchScreen.java lblPlayers=Giocatori -lblLog=Login -lblDev=Dev -lblCombatTab=Combat +lblLog=Registro +lblDev=Sviluppo +lblCombatTab=Combattimento lblStack=Pila lblMustWaitPriority=Devi aspettare la priorità ... #FDeckEditor.java lblImportFromClipboard=Importa dagli Appunti lblSaveAs=Salva come... -lblNameNewCopyDeck=Inserisci il nome per la nuova copia del mazzo -lblRenameDeck=Rinomina deck +lblNameNewCopyDeck=Inserisci un nome per la nuova copia del mazzo +lblRenameDeck=Rinomina il mazzo lblNewNameDeck=Inserisci un nuovo nome per il mazzo -lblDeleteDeck=Elimina mazzo +lblDeleteDeck=Elimina il mazzo lblDelete=Elimina -lblConfirmDelete=Sei sicuro di voler eliminare -lblNameNewDeck=Inserisci il nome per il nuovo mazzo +lblConfirmDelete=Confermi l''eliminazione? +lblNameNewDeck=Inserisci un nome per il nuovo mazzo lblSaveChangesCurrentDeck=Salvare le modifiche al mazzo corrente? lblAddFavorites=Aggiungi ai preferiti lblRemoveFavorites=Rimuovi dai preferiti -lblChangePreferredArt=Modifica arte preferita +lblChangePreferredArt=Modifica l''arte preferita lblSelectPreferredArt=Seleziona l''arte preferita per lblTo=per lblAvatar=Avatar lblCards=Carte -lblPlanes=Aerei -lblSchemes=schemi -lblToMainDeck=al ponte principale -lblHowMany=quanti? +lblPlanes=Piani +lblSchemes=Intrighi +lblToMainDeck=al mazzo +lblHowMany=quante? lblInventory=Inventario lblCollection=Collezione -lblCommanders=comandanti +lblCommanders=Commanders lblOathbreakers=Oathbreakers -lblSave=Save -lblDontSave=Don''t Save -lblPackN=Pack {0} +lblSave=Salva +lblDontSave=Non salvare +lblPackN=Confeziona {0} #Forge.java -lblLoadingFonts=Caricamento caratteri in corso ... -lblLoadingCardTranslations=Caricamento traduzioni carte ... -lblFinishingStartup=Avvio finitura ... +lblLoadingFonts=Caricamento dei caratteri ... +lblLoadingCardTranslations=Caricamento delle traduzioni delle carte ... +lblFinishingStartup=Ultimando il caricamento ... lblPreloadExtendedArt=Precarica arte estesa ... #LobbyScreen.java lblMore=Di Più... -lblLoadingNewGame=Caricamento nuovo gioco in corso ... +lblLoadingNewGame=Caricamento nuovo partita in corso ... lblSelectVariants=Seleziona le varianti -msgSelectAdeckBeforeReadying=Seleziona un mazzo prima di prepararti! +msgSelectAdeckBeforeReadying=Seleziona un mazzo prima di renderti pronto! #PlayerPanel.java -lblLoadingDeck=Caricamento deck ... -lblSchemeDeckRandomGenerated=Schema Deck: mazzo generato casualmente -lblCommanderDeckRandomGenerated=Ponte del comandante: mazzo generato casualmente -lblOathbreakerDeckRandomGenerated=Deck Oathbreaker: mazzo generato casualmente -lblTinyLeadersDeckRandomGenerated=Tiny Leaders Deck: mazzo generato casualmente -lblBrawlDeckRandomGenerated=Brawl Deck: mazzo generato casualmente +lblLoadingDeck=Caricamento mazzo... +lblSchemeDeckRandomGenerated=Mazzo intrighi: mazzo generato casualmente +lblCommanderDeckRandomGenerated=Mazzo Commander: mazzo generato casualmente +lblOathbreakerDeckRandomGenerated=Mazzo Oathbreaker: mazzo generato casualmente +lblTinyLeadersDeckRandomGenerated=Mazzo Tiny Leaders: mazzo generato casualmente +lblBrawlDeckRandomGenerated=Mazzo Brawl: mazzo generato casualmente lblPlanarDeckRandomGenerated=Mazzo planare: mazzo generato casualmente lblVanguardAvatarRandom=Avatar Vanguard: Casuale lblNotReady=Non pronto lblNormal=Normale -lblDevMode=Modalità Dev -lblOathbreakerDeck=Deck Oathbreaker -lblTinyLeadersDeck=Mazzo di piccoli leader -lblBrawlDeck=Brawl Deck -lblSelectDeckFor=Seleziona il deck per %s -lblSelectCommanderDeckFor=Seleziona Commander Deck per %s +lblDevMode=Modalità Sviluppatore +lblOathbreakerDeck=Mazzo Oathbreaker +lblTinyLeadersDeck=Mazzo Tiny Leaders +lblBrawlDeck=Mazzo Brawl +lblSelectDeckFor=Seleziona il mazzo per %s +lblSelectCommanderDeckFor=Seleziona il mazzo Commander per %s lblSelectOathbreakerDeckFor=Seleziona il mazzo Oathbreaker per %s -lblSelectTinyLeadersDeckFor=Seleziona Tiny Leaders Deck per %s -lblSelectBrawlDeckFor=Seleziona Brawl Deck per %s -lblSelectSchemeDeckFor=Seleziona Schema Deck per %s -lblSelectPlanarDeckFor=Seleziona Mazzo planare per %s +lblSelectTinyLeadersDeckFor=Seleziona il mazzo Tiny Leaders per %s +lblSelectBrawlDeckFor=Seleziona il mazzo Brawl per %s +lblSelectSchemeDeckFor=Seleziona il mazzo intrighi per %s +lblSelectPlanarDeckFor=Seleziona il mazzo planare per %s lblSelectVanguardFor=Seleziona Vanguard per %s lblMale=Maschio lblFemale=Femmina lblAny=Qualunque -lblFantasy=Fantasia +lblFantasy=Fantasy lblGeneric=Generico #MatchController.java -lblChooseAbilityToPlay=Scegli la capacità di giocare +lblChooseAbilityToPlay=Scegli l''abilità da giocare lblSelected=Selezionato #ItemManager.java lblAdvancedSearch=Ricerca Avanzata -lblSort=Ordinare +lblSort=Ordina lblResetFilters=Ripristina filtri -lblSelectCard=select card -lblClickToconfigureFilters=Click to configure filters -lblShownOfTotalCards=Number of cards shown / Total available cards -lblToggleShowOrHideOptionsForCurrentView=Toggle to show/hide options for current view -lblFilterMenu=FilterMenu -lblShowFilters=Show Filters -lblAddOrEditFilter=Add/Edit Filter -lblCurrentTextSearch=Current text search -lblHideFilters=Hide Filters +lblSelectCard=Seleziona la carta +lblClickToconfigureFilters=Clicca per configurare i filitri +lblShownOfTotalCards=Numbero di carte mostrate / Numero totale di carte disponibili +lblToggleShowOrHideOptionsForCurrentView=Clicca per mostrare o nascondere le opzioni per il tipo di visualizzazione corrente +lblFilterMenu=Menu dei filtri +lblShowFilters=Mostra filtri +lblAddOrEditFilter=Aggiungi/Modifica filtro +lblCurrentTextSearch=Ricerca testuale corrente +lblHideFilters=Nascondi filtro #AdvancedSearchFilter.java lblEditExpression=Modifica espressione lblRemoveFilter=Rimuovi filtro -lblClearFilter=Clear Filter +lblClearFilter=Pulisci filtro #CardZoom.java -lblSwipeUpTo=Scorri fino a %s -lblSwipeDownDetailView=Scorri verso il basso per passare alla visualizzazione dettagli -lblSwipeDownPictureView=Scorri verso il basso per passare alla visualizzazione delle immagini +lblSwipeUpTo=Striscia verso l''alto per %s +lblSwipeDownDetailView=Striscia verso il basso per passare alla visualizzazione dettagliata +lblSwipeDownPictureView=Striscia verso il basso per passare alla visualizzazione per immagini #VGameMenu.java -lblShowWinLoseOverlay=Show WinLose Overlay -lblNoPlayerPriorityNoDeckListViewed=Nessun giocatore ha la priorità al momento, quindi l''elenco dei mazzi non può essere visualizzato. +lblShowWinLoseOverlay=Mostra la sovraimpressione Vittoria/Sconfitta +lblNoPlayerPriorityNoDeckListViewed=Nessun giocatore ha la priorità al momento, quindi la lista del mazzo non può essere visualizzata. #FilesPage.java lblFiles=File -lblStorageLocations=Posizioni di archiviazione -lblCardPicsLocation=Posizione delle foto delle carte -lblDecksLocation=Posizione dei mazzi -lblDataLocation=Posizione dei dati (ad es. Impostazioni e richieste) -lblImageCacheLocation=Posizione della cache dell''immagine +lblStorageLocations=Percorso di archiviazione +lblCardPicsLocation=Percorso delle immagini delle carte +lblDecksLocation=Percorso dei mazzi +lblDataLocation=Percorso dei dati (ad es. Impostazioni e Avventure) +lblImageCacheLocation=Percorso della cache delle immagini lblRestartForgeMoveFilesNewLocation=È necessario riavviare Forge per rendere effettive le modifiche. Assicurati di spostare tutti i file necessari nella nuova posizione prima di farlo. lblRestartRequired=Riavvio richiesto lblSelect=Seleziona %s #AddBasicLandsDialog.java -lblLandSet=Set di terra -lblAddBasicLandsAutoSuggest=Aggiungi terre di base a %s \n (tocca due volte le statistiche per suggerire automaticamente) -lblDeckStatisticsAutoSuggest=Deck statistics. Double click to auto-suggest basic lands. +lblLandSet=Terre dall''espansione +lblAddBasicLandsAutoSuggest=Aggiungi terre base a %s \n (tocca due volte le statistiche per ottenere un suggerimento automatico) +lblDeckStatisticsAutoSuggest=Statistiche del mazzo. Doppio clic per il suggerimento delle terre base. lblAssortedArt=Arte Assortita -lblCardArtN=Card Art {0} +lblCardArtN=Arte della carta {0} lblNonLandCount= %d non terre lblOldLandCount= %d terre lblNewLandCount= %d terre aggiunte lblNewTotalCount= %d carte #FDeckImportDialog.java lblImportLatestVersionCard=Importa l''ultima versione della carta -lblUseOnlySetsReleasedBefore=Utilizzare solo set rilasciati prima: -lblUseOnlyCoreAndExpansionSets=Utilizzare solo set di core e di espansione -lblFollowingCardsCannotBeImported=Le seguenti carte non possono essere importate a causa di errori di ortografia, impostare restrizioni o non essere ancora in Forge: +lblUseOnlySetsReleasedBefore=Utilizzare solo espansioni rilasciate prima di: +lblUseOnlyCoreAndExpansionSets=Utilizzare solo set base e di espansione +lblFollowingCardsCannotBeImported=Le seguenti carte non possono essere importate a causa di errori di ortografia, restrizioni delle espansioni o per non essere ancora in Forge: lblImportRemainingCards=Importa le carte rimanenti? -lblNoKnownCardsOnClipboard=Nessuna carta nota trovata negli appunti. \n \nCopia la lista dei mazzi negli appunti, quindi riapri questa finestra di dialogo. +lblNoKnownCardsOnClipboard=Nessuna carta nota trovata negli appunti. \n \nCopia la lista dei mazzi negli appunti, quindi riapri questa finestra. #FDeckViewer.java -lblChangeSection=Change Section -lblDeckListCopiedClipboard=Elenco dei deck per '' {0}'' copiato negli appunti. +lblChangeSection=Cambia sezione +lblDeckListCopiedClipboard=Lista del mazzo per '' {0}'' copiato negli appunti. #FSideboardDialog.java -lblUpdateMainFromSideboard=Aggiorna il deck principale dalla sideboard %s +lblUpdateMainFromSideboard=Aggiorna il mazzo dalla sideboard %s #FVanguardChooser.java -lblRandomVanguard=Avanguardia casuale +lblRandomVanguard=Vanguard casuale #FOptionPane.java -lblYes=sì +lblYes=Sì lblNo=No #FSpinner.java lblSelectANumber=Seleziona un numero #FTextField.java -lblCut=Tagliare -lblCopy=copia +lblCut=Taglia +lblCopy=Copia lblPaste=Incolla #ListChooser.java lblSearch=Ricerca #InputBase.java lblPriority=Priorità -lblTurn=girare +lblTurn=Turno lblPhase=Fase lblEmpty=Vuoto -lbltoResolve=risolvere. -lblStormCount=Conteggio della tempesta +lbltoResolve=che si risolva. +lblStormCount=Storm Count #InputAttack.java -lblCallBack=Call Back -lblDisabled=Disabled -lblSelectAttackCreatures=Select creatures to attack -lblSelectAttackTarget= or select player/planeswalker you wish to attack. -lblSelectBandingTarget= To attack as a band, select an attacking creature to activate its ''band'' then select another to join it. +lblCallBack=Ritira +lblDisabled=Disabilitato +lblSelectAttackCreatures=Seleziona le creature con cui attaccare +lblSelectAttackTarget= o seleziona il giocatore/planeswalker che intendi attaccare.. +lblSelectBandingTarget=Per attaccare come branco, seleziona una creatura attaccante per attivare la sua abilità "branco", quindi selezionane un''altra che si unirà ad essa. #InputBlock.java -lblSelectBlockTarget=Select another attacker to declare blockers for. -lblSelectBlocker=Select creatures to block -lblOrSelectBlockTarget= or select another attacker to declare blockers for. -lblMorph=Morph +lblSelectBlockTarget=Seleziona un altro attaccante di cui dichiarare i difensori. +lblSelectBlocker=Seleziona le creature da bloccare +lblOrSelectBlockTarget=o seleziona un altro attaccante di cui dichiarare i difensori. +lblMorph=Metamorfosi #PlayerControllerHuman.java lblYouHaveWonTheCoinToss= %s, hai vinto il lancio della moneta. lblYouLostTheLastGame= %s, hai perso l''ultima partita. -lblWouldYouLiketoPlayorDraw=Ti piacerebbe giocare o disegnare? -lblWhoWouldYouLiketoStartthisGame=Chi ti piacerebbe iniziare questo gioco? (Clicca sul ritratto.) -lblPlay=Giocare -lblDraw=Disegnare -lblTooFewCardsMainDeck=Troppe carte nel tuo mazzo principale (minimo %s), per favore apporta nuovamente modifiche al tuo mazzo. -lblTooManyCardsSideboard=Troppe carte nel tuo sideboard (massimo %s), modifica nuovamente il tuo mazzo. -lblAssignCombatDamageWerentBlocked=Vuoi assegnare il suo danno da combattimento come se non fosse bloccato? -lblAssignCombatDamageAsChoose=Vuoi suddividere come preferisci il danno da combattimento dell''{0}? +lblWouldYouLiketoPlayorDraw=Preferisci iniziare o pescare? +lblWhoWouldYouLiketoStartthisGame=Chi vuoi che inizi la partita? (Clicca sul ritratto) +lblPlay=Inizia +lblDraw=Pesca +lblTooFewCardsMainDeck=Troppe poche carte nel tuo mazzo (minimo %s), per favore modifica il tuo mazzo. +lblTooManyCardsSideboard=Troppe carte nella sideboard (massimo %s), per favore modifica il tuo mazzo. +lblAssignCombatDamageWerentBlocked=Vuoi assegnare il suo danno da combattimento come se non fosse stato bloccato? +lblAssignCombatDamageAsChoose=Vuoi suddividere a tua scelta il danno da combattimento di {0}? lblChosenCards=Carte scelte -lblAttacker=aggressore +lblAttacker=Attaccante lblTriggeredby=Innescato da lblChooseWhichCardstoReveal=Scegli quali carte rivelare -lblChooseCardsActivateOpeningHandandOrder=Scegli le carte da attivare dalla mano iniziale e dal loro ordine +lblChooseCardsActivateOpeningHandandOrder=Scegli le carte da attivare dalla mano iniziale e il loro ordine lblActivateFirst=Attiva prima lblChooseOptionalCosts=Scegli Costi opzionali lblOptionalCosts=Costi opzionali -lblDoYouWanttoScry=Vuoi scry? -lblChooseCardstoSpliceonto=Scegli le carte su cui giuntare +lblDoYouWanttoScry=Vuoi profetizzare? +lblChooseCardstoSpliceonto=Scegli le carte da Unire lblDoNextActioninSequence=Esegui l''azione successiva in sequenza lblPleaseDefineanActionSequenceFirst=Definire prima una sequenza di azioni. lblRememberActionSequence=Ricorda la sequenza di azioni lblYouMustHavePrioritytoUseThisFeature=Devi avere la priorità per usare questa funzione. -lblNameTheCard=Dai un nome alla carta +lblNameTheCard=Nomina la carta lblWhichPlayerShouldRoll=Quale giocatore dovrebbe tirare? lblChooseResult=Scegli il risultato -lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=La carta scelta non è permanente o non può esistere indipendentemente sul campo di battaglia. \nSe desideri lanciare una magia non permanente o se desideri lanciare una magia permanente e metterla in pila, usa il pulsante Cast Spell / Play Land. +lblChosenCardNotPermanentorCantExistIndependentlyontheBattleground=La carta scelta non è un permanente o non può esistere da sola sul campo di battaglia. \nSe desideri lanciare una magia non permanente o se desideri lanciare una magia permanente e metterla in pila, usa il pulsante Lancia Magia/Gioca Terra. lblError=Errore lblWinGame=Vinci il gioco -lblSetLifetoWhat=Dai vita a cosa? -lblSetLifeforWhichPlayer=Dai vita a quale giocatore -lblChoosePermanentstoTap=Scegli permanenti da toccare +lblSetLifetoWhat=Imposta i punti vita a: +lblSetLifeforWhichPlayer=Imposta i punti vita per quale giocatore +lblChoosePermanentstoTap=Scegli permanenti da tappare lblChoosePermanentstoUntap=Scegli permanenti da stappare -lblWhichTypeofCounter=Quale tipo di contatore? -lblHowManyCounters=Quanti contatori? +lblWhichTypeofCounter=Quale tipo di segnalino? +lblHowManyCounters=Quanti segnalini? lblRemoveCountersFromWhichCard=Rimuovere i segnalini da quale carta? lblAddCountersToWhichCard=Aggiungi segnalini a quale carta? lblChooseaCard=Scegli una carta -lblNoPlayerPriorityDeckCantBeTutoredFrom=Nessun giocatore ha la priorità in questo momento, quindi il suo mazzo non può essere tutorato da. +lblNoPlayerPriorityDeckCantBeTutoredFrom=Nessun giocatore ha la priorità in questo momento, quindi non si può tutorare da alcun mazzo. lblNoPlayerPriorityGameStateCannotBeSetup=Nessun giocatore ha la priorità al momento, quindi lo stato del gioco non può essere impostato. -lblErrorLoadingBattleSetupFile=Errore durante il caricamento del file di installazione della battaglia! +lblErrorLoadingBattleSetupFile=Errore durante il caricamento del file con le impostazioni della battaglia! lblSelectCardstoAddtoYourDeck=Seleziona le carte da aggiungere al tuo mazzo -lblAddTheseToMyDeck=Aggiungi questi al mio mazzo +lblAddTheseToMyDeck=Aggiungi queste al mio mazzo lblChooseaPile=Scegli una pila lblSelectOrderForSimultaneousAbilities=Seleziona l''ordine per le abilità simultanee lblReorderSimultaneousAbilities=Riordina abilità simultanee @@ -1245,98 +1257,98 @@ lblResolveFirst=Risolvi prima lblMoveCardstoToporBbottomofLibrary=Sposta le carte in cima o in fondo al grimorio lblSelectCardsToBeOutOnTheBottomOfYourLibrary=Seleziona le carte da mettere in fondo al tuo grimorio lblCardsToPutOnTheBottom=Carte da mettere sul fondo -lblArrangeCardsToBePutOnTopOfYourLibrary=Organizza le carte da mettere in cima al tuo grimorio -lblTopOfLibrary=Top of Library +lblArrangeCardsToBePutOnTopOfYourLibrary=Ordina le carte da mettere in cima al tuo grimorio +lblTopOfLibrary=Cima del grimorio lblSelectCardsToBePutIntoTheGraveyard=Seleziona le carte da mettere nel cimitero lblCardsToPutInTheGraveyard=Carte da mettere nel cimitero -lblDiscardUpToNCards=Scarta fino a %d card (s) -lblDiscardNCards=Elimina %d carte -lblSelectNCardsToDiscardUnlessDiscarduType=Seleziona %d carte da scartare, a meno che tu non scarti una %s. -lblCleanupPhase=Fase di pulizia +lblDiscardUpToNCards=Scarta fino a %d carta/e +lblDiscardNCards=Scarta %d carta/e +lblSelectNCardsToDiscardUnlessDiscarduType=Seleziona %d carta/e da scartare, a meno che tu non scarti una %s. +lblCleanupPhase=Sottofase di cancellazione lblSelectCardsToDiscardHandDownMaximum=Seleziona %d carte da scartare per portare la tua mano al massimo di %max carte. lblChooseMinCardToDiscard=Scegli %d carte da scartare -lblDiscarded=Discarded -lblChooseDamageOrderFor=Scegli Ordine danni per %s -lblDamagedFirst=Danneggiato per primo -lblChooseBlockerAfterWhichToPlaceAttackert=Scegli il blocco dopo il quale posizionare %s in ordine di danno; annulla per posizionarlo per primo -lblPutCardOnTopOrBottomLibrary=Metti %s nella parte superiore o inferiore della tua libreria? +lblDiscarded=Scartate +lblChooseDamageOrderFor=Scegli l''ordine dei danni per %s +lblDamagedFirst=Riceve danno per primo +lblChooseBlockerAfterWhichToPlaceAttackert=Scegli il difensore dopo il quale posizionare %s nell''ordine del danno; annulla per posizionarlo per primo +lblPutCardOnTopOrBottomLibrary=Metti %s in cima o in fondo del tuo grimorio? lblChooseOrderCardsPutIntoLibrary=Scegli l''ordine delle carte da mettere nel grimorio -lblClosestToTop=Più vicino all''inizio +lblClosestToTop=Più vicino alla cima lblChooseOrderCardsPutOntoBattlefield=Scegli l''ordine delle carte da mettere sul campo di battaglia -lblChooseOrderCardsPutIntoExile=Choose order of cards to put into the exile zone +lblChooseOrderCardsPutIntoExile=Scegli l''ordine delle carte da mettere in esilio lblPutFirst=Metti per primo lblChooseOrderCardsPutIntoGraveyard=Scegli l''ordine delle carte da mettere nel cimitero lblClosestToBottom=Più vicino al fondo lblChooseOrderCardsPutIntoPlanarDeck=Scegli l''ordine delle carte da mettere nel mazzo planare -lblChooseOrderCardsPutIntoSchemeDeck=Scegli l''ordine delle carte da mettere nel mazzo schema -lblChooseOrderCopiesCast=Scegli l''ordine delle copie da trasmettere -lblDelveHowManyCards=Delve quante carte? +lblChooseOrderCardsPutIntoSchemeDeck=Scegli l''ordine delle carte da mettere nel mazzo intrighi +lblChooseOrderCopiesCast=Scegli l''ordine delle copie da lanciare +lblDelveHowManyCards=Esuma quante carte? lblExileWhichCard=Esilia quale carta({0}/{1})? -lblDestroy=destroy -lblSelectUpToNumTargetToAction=Select up to %d {0}(s) to {1}. -lblSelectNumTargetToAction=Select %d {0}(s) to {1}. -lblHighestBidder=Highest Bidder -lblUseTriggeredAbilityOf=Use triggered ability of -lblExertAttackersConfirm=Exert Attackers? -lblThereNoCardInPlayerZone=There are no cards in {0} {1} -lblPutCardsOnTheTopLibraryOrGraveyard=Put {0} on the top of library or graveyard? -lblLibrary=Library -lblGraveyard=Graveyard -lblTop=Top -lblBottom=Bottom -lblNColorManaFromCard={0} {1} mana from {2} -lblPayManaFromManaPool=Pay Mana from Mana Pool -lblChooseATargetType=Choose a {0} type -lblUntap=Untap -lblOdds=Odds -lblEvens=Evens -lblLeaveTapped=Leave tapped -lblUntapAndSkipThisTurn=Untap (and skip this turn) -lblLeft=Left -lblRight=Right -lblAddCounter=Add Counter -lblRemoveCounter=Remove Counter -lblWinTheFlip=win the flip -lblLoseTheFlip=lose the flip -lblChooseAResult=Choose a result -lblSelectPreventionShieldToUse=select which prevention shield to use -lblPlayerActivatedCardChooseMode={0} activated {1} - Choose a mode -lblNoPlayerHasPriorityCannotAddedManaToPool=No player has priority at the moment, so mana cannot be added to their pool. -lblOverwriteExistFileConfirm=Overwrite existing file? -lblFileExists=File exists! -lblSelectGameStateFile=Select Game State File -lblFileNotFound=File not found -lblPutCardInWhichPlayerZone=Put card in {0} for which player? -lblPutCardInWhichPlayerBattlefield=Put card on the battlefield for which player? -lblPutCardInWhichPlayerPlayOrStack=Put card on the stack / in play for which player? -lblCardShouldBeSummoningSicknessConfirm=Should {0} be affected with Summoning Sickness? -lblCardShouldBeAddedToLibraryTopOrBottom=Should {0} be added to the top or to the bottom of the library? -lblExileCardsFromPlayerHandConfirm=Exile card(s) from which player''s hand? -lblChooseCardsExile=Choose cards to exile -lblExileCardsFromPlayerBattlefieldConfirm=Exile card(s) from which player''s battlefield? -lblRemoveCardBelongingWitchPlayer=Remove card(s) belonging to which player? -lblRemoveCardFromWhichZone=Remove card(s) from which zone? -lblChooseCardsRemoveFromGame=Choose cards to remove from game -lblRemoved=Removed -lblEnterASequence=Enter a sequence (card IDs and/or "opponent"/"me"). (e.g. 7, opponent, 18) -lblActionSequenceCleared=Action sequence cleared. -lblRestartingActionSequence=Restarting action sequence. -lblErrorPleaseCheckID=Error: Check IDs and ensure they''re separated by spaces and/or commas. -lblErrorEntityWithId=Error: Entity with ID -lblNotFound=not found -lblChooseAnnounceForCard=Choose {0} for {1} -lblSacrifice=Sacrifice -lblLookCardInPlayerZone=Looking at cards in {0} {1} -lblPlayerZone={0} {1} -lblActionFromPlayerDeck={0} from {1} Deck +lblDestroy=Distruggi +lblSelectUpToNumTargetToAction=Seleziona fino a %d {0}/1 per {1}. +lblSelectNumTargetToAction=Seleziona %d {0}/i per {1}. +lblHighestBidder=Maggior offerente +lblUseTriggeredAbilityOf=Usa l''abilità innescata di +lblExertAttackersConfirm=Vuoi stremare gli attaccanti? +lblThereNoCardInPlayerZone=Non ci sono carte in {0} {1} +lblPutCardsOnTheTopLibraryOrGraveyard=Metti {0} in cima al grimorio o nel cimitero? +lblLibrary=Grimorio +lblGraveyard=Cimitero +lblTop=Cima +lblBottom=Fondo +lblNColorManaFromCard={0} {1} mana da {2} +lblPayManaFromManaPool=Paga il mana dalla riserva di mana +lblChooseATargetType=Scegli un tipo di {0} +lblUntap=Stappa +lblOdds=Dispari +lblEvens=Pari +lblLeaveTapped=Lascia tappato +lblUntapAndSkipThisTurn=Stappa (e salta questo turno) +lblLeft=Sinistra +lblRight=Destra +lblAddCounter=Aggiungi un segnalino +lblRemoveCounter=Rimuovi un segnalino +lblWinTheFlip=Vinci il lancio di moneta +lblLoseTheFlip=Perdi il lancio di moneta +lblChooseAResult=Scegli un risultato +lblSelectPreventionShieldToUse=Scegli quale protezione utilizzare +lblPlayerActivatedCardChooseMode={0} ha attivato {1} - Scegli una modalità +lblNoPlayerHasPriorityCannotAddedManaToPool=Nessun giocatore ha la priorità al momento, quindi non è possibile aggiungere mana alla riserva. +lblOverwriteExistFileConfirm=Vuoi sovrascrivere il file esistente? +lblFileExists=File già esistente! +lblSelectGameStateFile=Scegli il file dello stato di gioco +lblFileNotFound=File non trovato +lblPutCardInWhichPlayerZone=Per quale giocatore vuoi mettere la carta {0}? +lblPutCardInWhichPlayerBattlefield=Per quale giocatore vuoi mettere la carta nel campo di battaglia? +lblPutCardInWhichPlayerPlayOrStack=Per quale giocatore vuoi mettere la carta in pila / in gioco? +lblCardShouldBeSummoningSicknessConfirm={0} deve essere affetto da debolezza da evocazione? +lblCardShouldBeAddedToLibraryTopOrBottom={0} deve essere aggiunto alla cima o al fondo del grimorio? +lblExileCardsFromPlayerHandConfirm=Dalla mano di quale giocatore vuoi esiliare la/le carta/e? +lblChooseCardsExile=Seleziona le carte da esiliare +lblExileCardsFromPlayerBattlefieldConfirm=Dal campo di battaglia di quale giocatore vuoi esiliare la/le carta/e? +lblRemoveCardBelongingWitchPlayer=A quale giocatore appartiene la carta o le carte che vuoi esiliare? +lblRemoveCardFromWhichZone=Da quale zona vuoi rimuovere la/le carta/e? +lblChooseCardsRemoveFromGame=Seleziona le carte da rimuovere dal gioco +lblRemoved=Rimossa +lblEnterASequence=Digita una sequenza (ID delle carte e/o "opponent"/"me"). (es. 7, opponent, 18) +lblActionSequenceCleared=Sequenza di azioni ripulita. +lblRestartingActionSequence=Riavvio sequenza di azioni. +lblErrorPleaseCheckID=Errore: Controlla gli ID e assicurati che siano separati da spazi e/o virgole.. +lblErrorEntityWithId=Errore: Entità con ID +lblNotFound=non trovato +lblChooseAnnounceForCard=Scegli{0} per {1} +lblSacrifice=Sacrifica +lblLookCardInPlayerZone=Stai guardando le carte in {1} di {0} +lblPlayerZone={1} di {0} +lblActionFromPlayerDeck={0} dal mazzo di {1} #AbstractGuiGame.java -lblConcedeCurrentGame=Questo concederà il gioco attuale e perderai. \n \nConcedi comunque? -lblConcedeTitle=Concedere il gioco? -lblConcede=Concedere -lblCloseGameSpectator=Questo chiuderà questo gioco e non potrai riprendere a guardarlo. \n \nChiudi comunque? -lblCloseGame=Gioco chiuso? +lblConcedeCurrentGame=Questo concederà la partita in corso e perderai. \n \nConcedi comunque? +lblConcedeTitle=Concedere la partita? +lblConcede=Concedi +lblCloseGameSpectator=Questo chiuderà questa partita e non potrai riprendere a guardarla. \n \nChiudi comunque? +lblCloseGame=Chiudi la partita? lblWaitingForOpponent=Aspettando l''avversario ... -lblYieldingUntilEndOfTurn=Cedere fino alla fine del turno. \nPuoi annullare questa resa per agire. +lblYieldingUntilEndOfTurn=Passa automaticamente fino alla fine del turno. \nPuoi annullare questa azione per agire. lblStopWatching=Smetti di guardare lblEnterNumberBetweenMinAndMax=Inserisci un numero compreso tra {0} e {1}: lblEnterNumberGreaterThanOrEqualsToMin=Inserisci un numero maggiore o uguale a {0}: @@ -1345,814 +1357,814 @@ lblEnterNumberLessThanOrEqualsToMax=Inserisci un numero inferiore o uguale a {1} lblWonBecauseAllOpponentsHaveLost=ha vinto perché tutti gli avversari hanno perso lblWonDueToEffectOf=ha vinto a causa dell''effetto di '' %s'' lblConceded=ha concesso -lblLostTryingToDrawCardsFromEmptyLibrary=ha perso il tentativo di pescare carte dal grimorio vuoto -lblLostBecauseLifeTotalReachedZero=ha perso perché il totale della vita ha raggiunto 0 -lblLostBecauseOfObtainingTenPoisonCounters=ha perso a causa dell''ottenimento di 10 segnalini veleno -lblLostBecauseAnOpponentHasWonBySpell=ha perso perché un avversario ha vinto per incantesimo '' %s'' -lblLostDueToEffectOfSpell=ha perso a causa dell''effetto dell''incantesimo '' %s'' -lblLostDueToAccumulationOf21DamageFromGenerals=ha perso a causa dell''accumulo di 21 danni dai generali +lblLostTryingToDrawCardsFromEmptyLibrary=ha perso per il tentativo di pescare carte dal grimorio vuoto +lblLostBecauseLifeTotalReachedZero=ha perso perché i punti vita sono 0 +lblLostBecauseOfObtainingTenPoisonCounters=ha perso per avere 10 segnalini veleno +lblLostBecauseAnOpponentHasWonBySpell=ha perso perché un avversario ha vintocon la magia '' %s'' +lblLostDueToEffectOfSpell=ha perso a causa dell''effetto della magia '' %s'' +lblLostDueToAccumulationOf21DamageFromGenerals=ha perso per aver ricevuto 21 danni dai generali lblAcceptedThatTheGameIsADraw=ha accettato che il gioco sia un pareggio lblLostForUnknownReasonBug=ha perso per motivi sconosciuti (questo è un bug) #ViewWinLose.java btnNextGame=Prossima partita -btnStartNewMatch=Inizia una nuova partita -btnQuitMatch=Abbandona partita +btnStartNewMatch=Inizia un nuovo incontro +btnQuitMatch=Abbandona incontro lblItsADraw=È un pareggio! lblTeamWon=La squadra %s ha vinto! -lblWinnerWon= %s vinto! +lblWinnerWon= %s ha vinto! lblGameLog=Registro di gioco #NewDraftScreen.java -lblLoadingNewDraft=Caricamento nuova bozza ... +lblLoadingNewDraft=Caricamento nuovo Draft... #LoadDraftScreen.java -lblDoubleTapToEditDeck=Tocca due volte per modificare il deck (premi a lungo per visualizzare) +lblDoubleTapToEditDeck=Tocca due volte per modificare il mazzo (premi a lungo per visualizzare) lblMode=Modalità: -lblYouMustSelectExistingDeck=Devi selezionare un mazzo esistente o costruire un mazzo da un nuovo gioco booster. +lblYouMustSelectExistingDeck=Devi selezionare un mazzo esistente o costruire un mazzo da una nuova partita Draft. lblWhichOpponentWouldYouLikeToFace=Quale avversario vorresti affrontare? lblSingleMatch=Partita singola #NewGauntletScreen.java -lblGauntletText1=Nella modalità Gauntlet, selezioni un mazzo e giochi contro più avversari. +lblGauntletText1=Nella modalità Sfida, selezioni un mazzo e giochi contro più avversari. lblGauntletText2=Configura quanti avversari vuoi affrontare e quali mazzi o tipi di mazzi giocheranno. -lblGauntletText3=Quindi, prova a battere tutti gli avversari di AI senza perdere una partita. -lblSelectGauntletType=Seleziona un tipo di guanto -lblCustomGauntlet=Guanto personalizzato -lblGauntletContest=Concorso di sfida +lblGauntletText3=Quindi, prova a battere tutti gli avversari IA senza perdere una partita. +lblSelectGauntletType=Seleziona un tipo di sfida +lblCustomGauntlet=Sfida personalizzata +lblGauntletContest=Competizione delle sfide lblSelectYourDeck=Seleziona il tuo mazzo lblSelectDeckForOpponent=Seleziona il mazzo per l''avversario -lblSelectGauntletContest=Seleziona Contest sfida +lblSelectGauntletContest=Seleziona la competizione delle sfide #PuzzleScreen.java -lblPuzzleText1=La modalità Puzzle si carica in un puzzle che devi vincere in un tempo / modo predeterminato. +lblPuzzleText1=La modalità Puzzle consiste in un puzzle che devi vincere in un tempo / modo predeterminato. lblPuzzleText2=Per iniziare, premi il pulsante Start in basso, quindi seleziona un puzzle da un elenco. -lblPuzzleText3=Il tuo obiettivo verrà visualizzato in una finestra pop-up all''avvio del puzzle e anche specificato su una carta effetto speciale che verrà posizionata nella tua zona di comando. +lblPuzzleText3=Il tuo obiettivo verrà visualizzato in una finestra pop-up all''avvio del puzzle e anche specificato su una speciale carta effetto che verrà posizionata nella tua zona di comando. lblChooseAPuzzle=Scegli un puzzle lblLoadingThePuzzle=Caricamento del puzzle ... #InputPassPriority.java -lblCastSpell=lanciare un incantesimo -lblPlayLand=giocare a terra -lblActivateAbility=attivare l''abilità -lblYouHaveManaFloatingInYourManaPoolCouldBeLostIfPassPriority=Hai mana fluttuante nella tua riserva di mana che potrebbe andare perso se passi priorità adesso. -lblYouWillTakeManaBurnDamageEqualAmountFloatingManaLostThisWay=Subirai danni da bruciatura di mana pari alla quantità di mana fluttuante persa in questo modo. -lblManaFloating=Mana Floating +lblCastSpell=lancia una magia +lblPlayLand=gioca una terra +lblActivateAbility=attiva l''abilità +lblYouHaveManaFloatingInYourManaPoolCouldBeLostIfPassPriority=Hai del mana fluttuante nella tua riservache potrebbe andare perso se passi la priorità. +lblYouWillTakeManaBurnDamageEqualAmountFloatingManaLostThisWay=Subirai danni da mana burn pari alla quantità di mana fluttuante persa in questo modo. +lblManaFloating=Mana fluttuante #InputPayManaOfCostPayment.java lblPayManaCost=Paga il costo in mana: -lblLifePaidForPhyrexianMana=( %d punti vita pagati per mana phyrexiano) -lblClickOnYourLifeTotalToPayLifeForPhyrexianMana=Fai clic sul totale della tua vita per pagare la vita per il mana phyrexiano. -lblClickOnYourLifeTotalToPayLifeForBlackMana=Fai clic sul totale della tua vita per pagare la vita per il mana nero. -lblClickOnYourLifeTotalToPayLifeForPhyrexianOrBlackMana=Fai clic sul totale della tua vita per pagare la vita per mana phyrexiano o mana nero. +lblLifePaidForPhyrexianMana=(hai pagato %d punti vita per il mana phyrexiano) +lblClickOnYourLifeTotalToPayLifeForPhyrexianMana=Fai clic sul totale dei tuoi punti vita per pagare punti vita per il mana phyrexiano. +lblClickOnYourLifeTotalToPayLifeForBlackMana=Fai clic sul totale dei tuoi punti vita per pagare punti vita per il mana nero. +lblClickOnYourLifeTotalToPayLifeForPhyrexianOrBlackMana=Fai clic sul totale dei tuoi punti vita per pagare punti vita per il mana phyrexiano o mana nero. #GameLogFormatter.java -lblLogScryTopBottomLibrary=%s scried %top card(s) to the top of the library and %bottom card(s) to the bottom of the library -lblLogScryTopLibrary=%s scried %top card(s) to the top of the library -lblLogScryBottomLibrary=%s scried %bottom card(s) to the bottom of the library -lblLogSurveiledToLibraryGraveyard={0} surveiled {1} card(s) to the top of the library and {2} card(s) to the graveyard -lblLogSurveiledToLibrary={0} surveiled {1} card(s) to the top of the library -lblLogSurveiledToGraveyard={0} surveiled {1} card(s) to the graveyard -lblLogCardAbilityFizzles={0} ability fizzles. -lblCast=cast -lblTriggered=triggered -lblActivated=activated -lblLogPlayerActionObjectWitchTarget={0} {1} {2} targeting {3} +lblLogScryTopBottomLibrary=%s ha profetizzato %top carta/e in cima al grimorio e %bottom carta/e in fondo al grimorio +lblLogScryTopLibrary=%s ha profetizzato %top carta/e in cima al grimorio +lblLogScryBottomLibrary=%s ha profetizzato %bottom carta/e in fondo al grimorio +lblLogSurveiledToLibraryGraveyard={0} ha sorvegliato {1} carta/e in cima al grimorio e {2} carta/e al cimitero +lblLogSurveiledToLibrary={0} ha sorvegliato {1} carta/e in cima al grimorio +lblLogSurveiledToGraveyard={0} ha sorvegliato {1} carta/e al cimitero +lblLogCardAbilityFizzles=l''abilità {0} è neutralizzata dalle regole del gioco. +lblCast=ha lanciato +lblTriggered=ha innescato +lblActivated=ha attivato +lblLogPlayerActionObjectWitchTarget={0} {1} {2} con bersaglio {3} lblLogPlayerActionObject={0} {1} {2} -lblLogPlayerChosenModeForCard={0} has chosen {1} for {2}. -lblLogPlayerHasRestoredControlThemself={0} has restored control over themself -lblLogPlayerControlledTargetPlayer={0} is controlled by {1} -lblDeathtouch=Deathtouch -lblAsM1M1Counters=As -1/-1 Counters -lblRemovingNLoyaltyCounter=Removing {0} loyalty counter -lblSourceDealsNDamageToDest={0} deals {1} damage ({2}) to {3}. -lblLogPlayerPlayedLand={0} played {1} -lblLogTurnNOwnerByPlayer=Turn {0} ({1}) -lblLogAsPoisonCounters=(as poison counters) -lblCombat=combat -lblNonCombat=non-combat -lblLogSourceDealsNDamageOfTypeToDest={0} deals {1} {2} damage to {3}{4}. -lblLogPlayerReceivesNPosionCounterFrom={0} receives {1} posion counter from {2} -lblLogPlayerAssignedAttackerToAttackTarget={0} assigned {1} to attack {2}. -lblLogPlayerDidntBlockAttacker={0} didn''t block {1}. -lblLogPlayerAssignedBlockerToBlockAttacker={0} assigned {1} to block {2}. -lblPlayerHasMulliganedDownToNCards=%s has mulliganed down to %d cards. -lblPlayerDidntAttackThisTurn=%s didn''t attack this turn. +lblLogPlayerChosenModeForCard={0} ha scelto {1} per {2}. +lblLogPlayerHasRestoredControlThemself={0} ha ripreso il controllo di sé stesso +lblLogPlayerControlledTargetPlayer={0} è controllato da {1} +lblDeathtouch=Tocco letale +lblAsM1M1Counters=Come segnalini -1/-1 +lblRemovingNLoyaltyCounter=Rimuovendo {0} segnalini fedeltà +lblSourceDealsNDamageToDest={0} infligge {1} danno/i ({2}) a {3}. +lblLogPlayerPlayedLand={0} ha giocato {1} +lblLogTurnNOwnerByPlayer=Turno {0} ({1}) +lblLogAsPoisonCounters=(come segnalini veleno) +lblCombat=da combattimento +lblNonCombat=non da combattimento +lblLogSourceDealsNDamageOfTypeToDest={0} infligge {1} {2} danno/i a {3}{4}. +lblLogPlayerReceivesNPosionCounterFrom={0} riceve {1} segnalino/i veleno da {2} +lblLogPlayerAssignedAttackerToAttackTarget={0} ha dichiarato di attaccare {2} con {1}. +lblLogPlayerDidntBlockAttacker={0} non blocca {1}. +lblLogPlayerAssignedBlockerToBlockAttacker={0} ha dichiarato di bloccare {2} con {1}. +lblPlayerHasMulliganedDownToNCards=%s ha preso mulligan fino a %d carte. +lblPlayerDidntAttackThisTurn=%s non ha attaccato questo turno. #FormatFilter.java -lblAllSetsFormats=All Sets/Formats -lblOtherFormats=Other Formats... -lblChooseSets=Choose Sets... +lblAllSetsFormats=Tutti i set/formati +lblOtherFormats=Altri formati +lblChooseSets=Scegli le espansioni #HistoricFormatSelect.java -lblChooseFormat=Choose Format +lblChooseFormat=Scegli il formato #Card.java -lblAdventure=Adventure +lblAdventure=Avventura #TriggerAdapt.java -lblAdapt=Adapt +lblAdapt=Adattamento #TriggerAttached.java -lblAttachee=Attachee +lblAttachee=Assegnata #TriggerAttackerBlocked.java -lblNumberBlockers=Number Blockers -lblBlocker=Blocker +lblNumberBlockers=Numero di bloccanti +lblBlocker=Creatura bloccante #TriggerAttackersDeclared.java -lblNumberAttackers=Number Attackers +lblNumberAttackers=Numero di attaccanti #TriggerAttackerUnblockedOnce.java -lblAttackingPlayer=AttackingPlayer -lblDefenders=Defenders +lblAttackingPlayer=Giocatore attaccante +lblDefenders=Difensori #TriggerBecomeMonarch.java -lblPlayer=Player +lblPlayer=Giocatore #TriggerBecomeMonstrous.java -lblMonstrous=Monstrous +lblMonstrous=Mostruoso #TriggerBecomeRenowned.java -lblRenowned=Renowned +lblRenowned=Rinomato #TriggerBecomesTarget.java -lblSource=Source -lblTarget=Target +lblSource=Fonte +lblTarget=Bersaglio #TriggerBecomesTargetOnce.java -lblTargets=Targets +lblTargets=Bersagli #TriggerBlockersDeclared.java -lblBlockers=Blockers +lblBlockers=Bloccanti #TriggerChampioned.java -lblChampioned=Championed +lblChampioned=Battuta con #TriggerChangesController.java -lblChangedController=Changed Controller +lblChangedController=Ha cambiato controllore #TriggerChangesZone.java -lblZoneChanger=Zone Changer +lblZoneChanger=Cambio di zona #TriggerChangesZoneAll.java -lblAmount=Amount +lblAmount=Quantità #TriggerCounterAdded.java -lblAddedOnce=Added once +lblAddedOnce=Aggiunto una volta #TriggerCountered.java -lblCountered=Countered -lblCause=Cause +lblCountered=Neutralizzato +lblCause=Causa #TriggerCounteredRemoved.java -lblRemovedFrom=Removed from +lblRemovedFrom=Rimosso da #TriggerCrewed.java -lblVehicle=Vehicle -lblCrew=Crew +lblVehicle=Veicolo +lblCrew=Manovrare #TriggerCycled.java -lblCycled=Cycled +lblCycled=Ciclato #TriggerDamageDealtOnce.java -lblDamageSource=Damage Source -lblDamaged=Damaged +lblDamageSource=Fonte del danno +lblDamaged=Danneggiato #TriggerDamagePrevented.java -lblDamageTarget=Damage Target +lblDamageTarget=Bersaglio del danno #TriggerDestroyed.java -lblDestroyed=Destroyed -lblDestroyer=Destroyer +lblDestroyed=Distrutto +lblDestroyer=Distruggente #TriggerDevoured.java -lblDevoured=Devoured +lblDevoured=Divorato #TriggerDiscarded.java -lblDiscarded=Discarded +lblDiscarded=Scartate #TriggerEvolved.java -lblEvolved=Evolved +lblEvolved=Evoluto #TriggerExerted.java -lblExerted=Exerted +lblExerted=Stremato #TriggerExiled.java -lblExiled=Exiled +lblExiled=Esiliato #TriggerExploited.java -lblExploited=Exploited -lblExploiter=Exploiter +lblExploited=Sfruttato +lblExploiter=Sfruttante #TriggerExplores.java -lblExplorer=Explorer +lblExplorer=Esplorante #TriggerFight.java -lblFighter=Fighter +lblFighter=Che lotta #TriggerLandPlayed.java -lblLandPlayed=Land played +lblLandPlayed=Giocata terra #TriggerLifeGained.java -lblGainedAmount=Gained Amount +lblGainedAmount=Guadagno di punti vita #TriggerLifeLost.java -lblLostAmount=Lost Amount +lblLostAmount=Perdita di punti vita #TriggerPayCumulativeUpkeep.java lblMana=Mana #TriggerPayLife.java -lblPaidAmount=Paid Amount +lblPaidAmount=Pagato punti vita #TriggerPhaseIn.java -lblPhasedIn=Phased In +lblPhasedIn=Apparso #TriggerPhaseOut.java -lblPhasedOut=Phased Out +lblPhasedOut=Scomparso #TriggerRoller.java -lblRoller=Roller +lblRoller=Che tira il dado #TriggerPlaneswalkedFrom.java -lblPlaneswalkedFrom=Planeswalked From +lblPlaneswalkedFrom=Piano da cui il giocatore proviene #TriggerPlaneswalkedTo.java -lblPlaneswalkedTo=Planeswalked To +lblPlaneswalkedTo=Piano verso cui il giocatore ha viaggiato #TriggerRegenerated.java -lblRegenerated=Regenerated +lblRegenerated=Rigenerato #TriggerRevealed.java -lblRevealed=Revealed +lblRevealed=Rivelato #TriggerSacrificed.java -lblSacrificed=Sacrificed +lblSacrificed=Sacrificato #TriggerScry.java -lblScryer=Scryer +lblScryer=Giocatore che profetizza #TriggerSearchLibrary.java -lblSearcher=Searcher +lblSearcher=Giocatore che passa in rassegna il grimorio #TriggerShuffled.java -lblShuffler=Shuffler +lblShuffler=Giocatore che mescola #TriggerSpellAbilityCast.java -lblActivator=Activator +lblActivator=Attivatore #TriggerSpellAbilityCast.java -lblSpellAbility=SpellAbility +lblSpellAbility=Abilità o magia #TriggerTaps.java -lblTapped=Tapped +lblTapped=Tappato #TriggerTapsForMana.java -lblTappedForMana=Tapped for Mana -lblProduced=Produced +lblTappedForMana=Tappato per produrre mana +lblProduced=Prodotto #TriggerTransformed.java -lblTransformed=Transformed +lblTransformed=Trasformato #TriggerTurnFaceUp.java -lblTurnFaceUp=Turn Face up +lblTurnFaceUp=Girata a faccia in su #TriggerUnattach.java -lblObject=Object -lblAttachment=Attachment +lblObject=Oggetto +lblAttachment=Assegnazione #TriggerUntaps.java -lblUntapped=Untapped +lblUntapped=Stappato #TriggerVote.java -lblVoters=Voters +lblVoters=Votanti #PermanentCreatureEffect.java -lblCreature=Creature +lblCreature=Creatura #LimitedWinLoseController.java -btnRestartRound=Restart Round -btnTournamentInfo=Tournament Info -btnNextRound=Next Round -btnWonRound=YOU HAVE WON ROUND -btnWonTournament=***CONGRATULATIONS! YOU HAVE WON THE TOURNAMENT!*** -btnLoseRound=YOU HAVE LOST ON ROUND -btnQuit=Quit -btnContinue=Continue -btnRestart=Restart +btnRestartRound=Ricomincia il round +btnTournamentInfo=Informazioni sul torneo +btnNextRound=Prossimo round +btnWonRound=HAI VINTO IL ROUND +btnWonTournament=***CONGRATULAZIONI! HAI VINTO IL TORNEO!*** +btnLoseRound=HAI PERSO AL ROUND +btnQuit=Esci +btnContinue=Continua +btnRestart=Ricomincia #TournamentWinLoseController.java -btnSaveQuit=Save and Quit -lblCongratulations=CONGRATULATIONS! -lblThroughTournament=You made it through the tournament! -lblDefeated=DEFEATED! -lblFailedTournament=You have failed to pass the tournament. +btnSaveQuit=Salva ed esci +lblCongratulations=CONGRATULAZIONI! +lblThroughTournament=Hai completato il torneo! +lblDefeated=SCONFITTA! +lblFailedTournament=Non sei riuscito a completare il torneo. #GauntletWinLoseController.java -lblGauntletTournament=You made it through the gauntlet! -lblFailedGauntlet=You have failed to pass the gauntlet. +lblGauntletTournament=Hai completato la sfida! +lblFailedGauntlet=Non sei riuscito a completare la sfida. #QuestTournamentController.java -lblLeaveTournamentDraftWarning1=If you leave now, this tournament will be forever gone.\nYou will keep the cards you drafted, but will receive no other prizes.\n\nWould you still like to quit the tournament? -lblLeaveTournamentDraftWarning2=You have matches left to play!\nLeaving the tournament early will forfeit your potential future winnings.\nYou will still receive winnings as if you conceded your next match and you will keep the cards you drafted.\n\nWould you still like to quit the tournament? -lblReallyQuit=Really Quit? -lblForPlacing=For placing -lblHaveBeAward=, you have been awarded -lblTournamentReward=Tournament Reward -lblParticipateingTournamentReward=For participating in the tournament, you have been awarded the following promotional card: -lblCreditsAwarded=Credits Awarded +lblLeaveTournamentDraftWarning1=Se esci ora, il torneo non sarà più disponibile.\nPotrai tenere le carte ottenute dal draft, ma non potrai ricevere altri premi.\n\nVuoi davvero abbandonare il torneo? +lblLeaveTournamentDraftWarning2=Hai ancora degli incontri da giocare!\nL''uscita anticipata dal torneo preclude l''accesso ad ulteriori premi\nOtterrai un premio come se avessi concesso l''incontro successivo, e terrai le carte ottenute dal draft.\n\nVuoi davvero abbandonare il torneo? +lblReallyQuit=Vuoi veramente uscire? +lblForPlacing=Per esserti piazzato +lblHaveBeAward=, hai ottenuto +lblTournamentReward=Premio del torneo +lblParticipateingTournamentReward=Per la partecipazione al torneo, hai ottenuto questa carta promozionale: +lblCreditsAwarded=Monete ricevute lblBoosterPack=Booster Pack -lblAwarded=Awarded -lblFoundCards=You have found the following cards inside -lblRareAwarded=Rare Awarded -lblSelectRareAwarded=, you may select a rare or mythic rare card from the drafted block. -lblSelectACard=Select a Card -lblSelectKeepCard=Select a card to keep: -lblAddToCollection=has been added to your collection! -lblCardAdded=Card Added -lblBonusToken=Bonus Token -lblHaveBeAwardToken=, you have been awarded a token!\nUse tokens to create new drafts to play. -lblWouldLikeSaveDraft=Would you like to save this draft to the regular draft mode? -lblSaveDraft=Save Draft -lblNoAvailableDraftsMessage=You do not have any draft-able sets unlocked!\nCome back later when you''ve unlocked more sets. -lblNoAvailableDrafts=No Available Drafts -lblEntryFeeOfDraftTournament=The entry fee for this booster draft tournament is -lblWouldLikeCreateTournament= credits.\nWould you like to spend a token and create this tournament? -lblCreatingDraftTournament=Creating a Booster Draft Tournament -lblUnexpectedCreatingDraftTournament=Unexpected error when creating a draft tournament -lblPleaseReportBug=. Please report this as a bug. -lbl1stPlace=1st Place: -lbl2ndPlace=2nd Place: -lbl3rdPlace=3rd Place: -lbl4thPlace=4th Place: -lblTime= time -lblCollectPrizes=Collect Prizes -lblCurrentlyInDraft=You are currently in a draft.\nYou should leave or finish that draft before starting another. -lblYouNeed=You need -lblMoreCredits=more credits to enter this tournament. -lblNotEnoughCredits=Not Enough Credits -lblTournamentCosts=This tournament costs -lblSureEnterTournament= credits to enter.\nAre you sure you wish to enter? -lblEnterDraftTournament=Enter Draft Tournament? -lblLeaveDraftConfirm=This will end the current draft and you will not be able to join this tournament again.\nYour credits will be refunded and the draft will be removed.\n\nLeave anyway? -lblLeave=Leave -lblDeckInvalid=Deck Invalid -lblAlreadyMatchPleaseWait=There is already a match in progress.\nPlease wait for the current round to end before attempting to continue. +lblAwarded=In premio +lblFoundCards=Hai trovato le seguenti carte nella busta +lblRareAwarded=Carta rara in premio +lblSelectRareAwarded=, puoi scegliere una carta rara o mitica dal blocco del draft. +lblSelectACard=Scegli una carta +lblSelectKeepCard=Scegli una carta da tenere: +lblAddToCollection=è stata aggiunta alla tua collezione! +lblCardAdded=Carta aggiunta +lblBonusToken=Token bonus +lblHaveBeAwardToken=, hai ottenuto un Token in premio!\nUsa i token per creare nuovi draft da giocare. +lblWouldLikeSaveDraft=Vuoi salvare questo draft così da renderlo disponibile nella modalità draft ordinaria? +lblSaveDraft=Salva draft +lblNoAvailableDraftsMessage=Non hai espansioni disponibili per il draft!\nRiprova quando avrai sbloccato più espansioni. +lblNoAvailableDrafts=Nessun draft disponibile +lblEntryFeeOfDraftTournament=La quota di ingresso per questo torneo booster draft è di +lblWouldLikeCreateTournament= monete.\nDesideri usare un token e creare questo torneo? +lblCreatingDraftTournament=Creazione del torneo Booster Draft +lblUnexpectedCreatingDraftTournament=Errore inaspettato durante la creazione del torneo +lblPleaseReportBug=. Per favore segnala il bug. +lbl1stPlace=Primo posto: +lbl2ndPlace=Secondo posto: +lbl3rdPlace=Terzo posto: +lbl4thPlace=Quarto posto: +lblTime= tempo +lblCollectPrizes=Ricevi i premi +lblCurrentlyInDraft=Stai partecipando a un draft.\nDevi terminare o abbandonare quel draft prima di iniziarne un altro. +lblYouNeed=Ti servono altre +lblMoreCredits=monete per partecipare al torneo.. +lblNotEnoughCredits=Monete insufficienti +lblTournamentCosts=La quota d''ingresso a questo torneo costa +lblSureEnterTournament= monete.\nSei sicuro di voler partecipare? +lblEnterDraftTournament=Vuoi partecipare al torneot? +lblLeaveDraftConfirm=Questa azione terminerà il draft in corso e non potrai partecipare di nuovo a questo torneo.\nTi verranno rimborsate le monete spese e il draft sarà rannullato.\n\nVuoi davvero abbandonare? +lblLeave=Abbandona +lblDeckInvalid=Mazzo non valido +lblAlreadyMatchPleaseWait=C''è già un incontro in corso.\nAttendi la fine del round prima di continuare. #DraftingProcessScreen.java -lblSaveDraftAs=Save this draft as -lblAlreadyDeckName=There is already a deck named '' -lblOverwriteConfirm=''. Overwrite? -lblOverwriteDeck=Overwrite Deck? -lblEndDraftConfirm=This will end the current draft and you will not be able to resume.\n\nLeave anyway? +lblSaveDraftAs=Salva questo draft con il nome +lblAlreadyDeckName=Esiste già un mazzo con il nome '' +lblOverwriteConfirm=''. Vuoi sovrascrivere? +lblOverwriteDeck=Vuoi sovrascrivere il mazzo? +lblEndDraftConfirm=Questa azione terminerà il draft in corso e non potrai ripernderlo successivamente.\n\nVuoi davvero abbandonare? lblLeaveDraft=Lascia Draft #Match.java -lblAICantPlayCards=AI can''t play these cards well -lblAnteCardsRemoved=These ante cards were removed +lblAICantPlayCards=L''intelligenza artificiale non è in grado di giocare bene queste carte +lblAnteCardsRemoved=La carte nella zona della posta sono state rimosse #CEditorDraftingProcess.java -lblQuitWithoutSaving=Quit without saving -lblQuitDraft=Quit Draft -lblDraftPicks=Draft Picks -lblPackNCards=Pack {0} - Cards +lblQuitWithoutSaving=Esci senza salvare +lblQuitDraft=Esci dal draft +lblDraftPicks=Scelta +lblPackNCards=Pacchetto {0} - Carte #LoadQuestScreen.java -lblLoadingExistingQuests=Loading Existing Quests... -lblNewQuest=New -lblRename=Rename -lblEnterNewQuestName=Enter new name for quest: -lblRenameQuest=Rename Quest -lblDeleteQuest=Delete Quest +lblLoadingExistingQuests=Caricamento delle Avventure esistenti... +lblNewQuest=Nuova Avventura +lblRename=Rinomina +lblEnterNewQuestName=Inserisci un nuovo nome per l''Avventura: +lblRenameQuest=Rinomina Avventura +lblDeleteQuest=Elimina Avventura #NewQuestScreen.java -lblDifficulty=Difficulty -lblStartingPoolColors=Starting pool colors -lblStartingPoolOptions=Starting pool options -lblAllowDuplicatesStartingPool=Allow duplicates in starting pool -lblIncludeArtifactsStartingPool=Include artifacts in starting pool -lblDefinedFormat=Defined format -lblOnlyInStartingPoolAvailable=Only sets found in starting pool will be available. -lblCustomFormatWithoutRestrictionGame=You have defined a custom format that doesn''t contain any sets.\nThis will start a game without restriction.\n\nContinue? -lblCustomFormatWithoutRestrictionPrized=You have defined custom format as containing no sets.\nThis will choose all editions without restriction as prized.\n\nContinue? -lblCreatingNewQuest=Creating new quest... +lblDifficulty=Difficoltà +lblStartingPoolColors=Colori del gruppo di carte iniziale +lblStartingPoolOptions=Opzioni del gruppo di carte iniziale +lblAllowDuplicatesStartingPool=Ammetti duplicati nel gruppo di carte iniziale +lblIncludeArtifactsStartingPool=Includi artefatti nel gruppo di carte iniziale +lblDefinedFormat=Formato definito +lblOnlyInStartingPoolAvailable=Saranno disponibili solo le espansioni incluse nel gruppo di carte iniziale. +lblCustomFormatWithoutRestrictionGame=Hai indicato un formato personalizzato che non contiene alcuna espansioni.\nIn questo modo inizierai una partita senza restrizioni.\n\nVuoi continuare? +lblCustomFormatWithoutRestrictionPrized=Hai indicato un formato personalizzato che non contiene alcuna espansione.\nIn questo modo tutte le edizioni saranno disponibili come premi, senza restrizioni.\n\nVuoi continuare? +lblCreatingNewQuest=Creazione nuova Avventura... #QuestBazaarScreen.java -lblMerchantDoesHaveCommodity=The merchant does not have anything useful for sale. -lblBuy=Buy +lblMerchantDoesHaveCommodity=Il mercante non ha niente di utile in vendita. +lblBuy=Compra #QuestMenu.java -lblStatistics=Statistics -lblLoadingCurrentQuest=Loading current quest... +lblStatistics=Statistiche +lblLoadingCurrentQuest=Caricamento Avventura in corso... #QuestPrefsScreen.java -lblSellingPercentageBase=Selling Percentage Base -lblSellingPercentageMax=Selling Percentage Max -lblSellingPriceMax=Selling Price Max -lblDifficultyAdjustmentsAll=Difficulty Adjustments (All) -lblDifficultyAdjustmentsEasy=Difficulty Adjustments (Easy) -lblDifficultyAdjustmentsMedium=Difficulty Adjustments (Medium) -lblDifficultyAdjustmentsHard=Difficulty Adjustments (Hard) -lblDifficultyAdjustmentsExpert=Difficulty Adjustments (Expert) -lblWinsForBooster=Wins For Booster -lblWinsForRankIncrease=Wins For Rank Increase -lblWinsForMediumAI=Wins For Medium AI -lblWinsForHardAI=Wins For Hard AI -lblWinsForExpertAI=Wins For Expert AI -lblSaveFailed=Save Failed - +lblSellingPercentageBase=Parcentuale di vendita - valore di base +lblSellingPercentageMax=Parcentuale di vendita - valore massimo +lblSellingPriceMax=Prezzo massimo di vendita +lblDifficultyAdjustmentsAll=Regolazioni difficoltà (Tutti) +lblDifficultyAdjustmentsEasy=Regolazioni difficoltà (Novizio) +lblDifficultyAdjustmentsMedium=Regolazioni difficoltà (Apprendista) +lblDifficultyAdjustmentsHard=Regolazioni difficoltà (Esperto) +lblDifficultyAdjustmentsExpert=Regolazioni difficoltà (Maestro) +lblWinsForBooster=Vittorie per Booster +lblWinsForRankIncrease=Vittorie per aumento di rango +lblWinsForMediumAI=Numero di vittorie per IA livello Apprendista +lblWinsForHardAI=Numero di vittorie per IA livello Esperto +lblWinsForExpertAI=Numero di vittorie per IA livello Maestro +lblSaveFailed=Salvataggio fallito - #QuestSpellShopScreen.java -lblMaximumSellingCredits=Maximum selling price is %d credits. -lblSellCardsAt=Selling cards at -lblTheirValue=% of their value.\n -lblSell=Sell -lblItem=item -lblCardsForSale=Cards for Sale -lblSellAllExtras=Sell all extras -lblSelectAllCards=Select All -lblYourCards=Your Cards +lblMaximumSellingCredits=Il prezzo massimo di vendita è di %d monete. +lblSellCardsAt=Carte in vendita al +lblTheirValue=% del loro valore.\n +lblSell=Vendi +lblItem=oggetto +lblCardsForSale=Carte in vendita +lblSellAllExtras=Vendi tutte le carte in esubero +lblSelectAllCards=Seleziona tutto +lblYourCards=Le tue carte #QuestStatsScreen.java -lblTournamentResults=Tournament Results -lblQuestStatistics=Quest Statistics +lblTournamentResults=Risultati del torneo +lblQuestStatistics=Statistche dell''Avventura #QuestTournamentsScreen.java -lblWinner=Winner -lblQuarterfinals=QUARTERFINALS -lblSemifinals=SEMIFINALS -lblFinalMatch=FINAL MATCH +lblWinner=Vincitore +lblQuarterfinals=QUARTI DI FINALE +lblSemifinals=SEMIFINALI +lblFinalMatch=FINALE #DualListBox.java -lblSelectOrder=Select Order +lblSelectOrder=Seleziona l''ordine #HumanPlay.java -lblIfYouDo=if you do -lblOr=or -lblDoYouWantPay=Do you want to pay -lblDoYouWantPayNLife=Do you want to pay {0} life? -lblDoyouWantTo=Do you want to -lblDoYouWantMillNCardsOrDoAction=Do you want to mill {0} card(s)? {1} -lblDoYouWantFlipNCoinAction=Do you want to flip {0} coin(s)? -lblDoYouWantRemoveNTargetTypeCounterFromCard=Do you want to remove {0} {1} counter from {2}? -lblDoYouWantRemoveCountersFromCard=Do you want to remove counters from {0}? -lblDoYouWantExileNCardsFromYourLibrary=Do you want to exile {0} card(s) from your library? -lblDoYouWantExileAllCardYouGraveyard=Do you want to exile all cards in your graveyard? -lblDoYouWantDiscardYourHand=Do you want to discard your hand? -lblDoYouWantSpendNTargetTypeCounter=Do you want to spend {0} {1} counter? -lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Do you want to let that player draw {0} card(s)?{1} -lblDoYouWantDrawNCardOrDoAction=Do you want to draw {0} card(s)?{1} -lblSelectRemoveCounterCard=Select a card to remove a counter -lblSelectRemoveCounterType=Select type counters to remove -lblExileFromZone=Exile from {0} -lblPutCardFromWhoseZone=Put cards from whose {0}? -lblPutCardToLibrary=Put cards to Library -lblPutIntoLibrary=put into library. -lblGainControl=gain control. -lblReturnToHand=return to hand. -lbldiscard=discard. -lblReveal=reveal -lblTap=tap -lblCurrentCard=Current Card -lblSelectNSpecifyTypeCardsToAction=Select %d {0} card(s) to {1} +lblIfYouDo=se fai +lblOr=o +lblDoYouWantPay=Vuoi pagare +lblDoYouWantPayNLife=Vuoi pagare {0} punti vita? +lblDoyouWantTo=Vuoi +lblDoYouWantMillNCardsOrDoAction=Vuoi macinare {0} carta/e? {1} +lblDoYouWantFlipNCoinAction=Vuoi lanciare {0} moneta/e? +lblDoYouWantRemoveNTargetTypeCounterFromCard=Vuoi rimuovere {0} segnalino {1} da {2}? +lblDoYouWantRemoveCountersFromCard=Vuoi rimuovere i segnalini da {0}? +lblDoYouWantExileNCardsFromYourLibrary=Vuoi esiliare {0} carta/e dal tuo grimorio? +lblDoYouWantExileAllCardYouGraveyard=Vuoi esiliare tutte le carte nel tuo cimitero? +lblDoYouWantDiscardYourHand=Vuoi scartare la tua mano? +lblDoYouWantSpendNTargetTypeCounter=Vuoi spendere {0} segnalino {1}? +lblDoYouWantLetThatPlayerDrawNCardOrDoAction=Vuoi lasciare che il giocatore peschi {0} carta/e?{1} +lblDoYouWantDrawNCardOrDoAction=Vuoi pescare {0} carta/e?{1} +lblSelectRemoveCounterCard=Seleziona una carta da cui rimuovere un segnalino +lblSelectRemoveCounterType=Seleziona il tipo di segnalini da rimuovere +lblExileFromZone=Esilia da {0} +lblPutCardFromWhoseZone=Metti le carte da quale {0}? +lblPutCardToLibrary=Metti le carte nel grimorio +lblPutIntoLibrary=metti nel grimorio. +lblGainControl=ottieni controllo. +lblReturnToHand=ritorna in mano. +lbldiscard=scarta. +lblReveal=rivela +lblTap=tappa +lblCurrentCard=Carta attualmente selezionata +lblSelectNSpecifyTypeCardsToAction=Seleziona %d {0} carta/e da {1} #AbandonEffect.java -lblWouldYouLikeAbandonSource=Would you like to abandon the scheme {0}? +lblWouldYouLikeAbandonSource=Vuoi abbandonare l'' intrigo {0}? #ActivateAbilityEffect.java -lblChooseManaAbility=Choose a mana ability: +lblChooseManaAbility=Scegli una abilità di mana: #AddTurnEffect.java -lblPlayerTakesExtraTurn={0} takes an extra turn. +lblPlayerTakesExtraTurn={0} prende un turno extra. #AmassEffect.java. -lblChooseAnArmy=Choose an army to put counters on +lblChooseAnArmy=Scegli un Esercito su cui mettere i segnalini #AssignGroupEffect.java -lblChooseAbilityForObject=Choose ability for {0} +lblChooseAbilityForObject=Scegli l''abilità per {0} #AttachEffect.java -lblDoYouWantAttachSourceToTarget=Do you want to attach {0} to {1}? -lblSelectAPlayerAttachSourceTo={0} - Select a player to attach to. -lblSelectACardAttachSourceTo={0} - Select a card to attach to. +lblDoYouWantAttachSourceToTarget=Vuoi assegnare {0} a {1}? +lblSelectAPlayerAttachSourceTo=Scegli un giocatore a cui assegnare {0}. +lblSelectACardAttachSourceTo=Scegli una carta a cui assegnare {0}. #BidLifeEffect.java -lblBidLife=Choose a higher bid -lblChooseStartingBid=Choose a starting bid +lblBidLife=Scegli un''offerta più alta +lblChooseStartingBid=Scegli un''offerta di partenza lblDoYouWantTopBid=Do you want to top bid? Current Bid \= -lblTopBidWithValueLife=topped bid with {0} life +lblTopBidWithValueLife=ha superato l''offerta con {0} punti vita #BondEffect.java -lblSelectACardPair=Select a card to pair with +lblSelectACardPair=Seleziona una carta con cui abbinarsi #CamouflageEffect.java -lblChooseBlockerForAttacker=Choose a creature to block {0} -lblChooseBlockersForPile=Choose creatures to put in pile {0} (can be empty) +lblChooseBlockerForAttacker=Scegli una creatura per bloccare {0} +lblChooseBlockersForPile=Scegli le creature da mettere nella pila {0} (può essere vuota) #ChangeCombatantsEffect.java -lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} +lblChooseDefenderToAttackWithCard=Scegli quale bloccante attaccare con {0} #ChangeTargetsEffect.java -lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? +lblDoYouWantChangeAbilityTargets=Vuoi cambiare i bersagli di {0}? #ChangeTextEffect.java -lblChooseColorReplace=Choose a color word to replace -lblChooseNewColor=Choose a new color word +lblChooseColorReplace=Scegli una parola che indica un singolo colore da sostituire +lblChooseNewColor=Scegli un nuovo colore #ChangeZoneEffect.java -lblDoYouWantMoveTargetFromOriToDest=Do you want to move {0} from {1} to {2}? -lblPutThatCardFromPlayerOriginToDestination=Put that card from {0} {1} to {2}? -lblSearchPlayerZoneConfirm=Search {0} {1}? -lblCardMatchSearchingTypeInAlternateZones=cards match your searching type in Alternate Zones. -lblLookingCardIn=Looking at cards in -lblDoYouWantPlayCard=Do you want to play {0}? -lblSelectCardFromPlayerZone=Select a card from {0} {1} -lblSelectUpToNumCardFromPlayerZone=Select up to {0} cards from {1} {2} -lblSelectCardsFromPlayerZone=Select cards from {0} {1} -lblCancelSearchUpToSelectNumCards=Cancel Search? Up to {0} more card(s) can be selected. +lblDoYouWantMoveTargetFromOriToDest=Vuoi spostare {0} da {1} a {2}? +lblPutThatCardFromPlayerOriginToDestination=Metti la carta da {1} di {0} a {2} +lblSearchPlayerZoneConfirm=Cerchi {1} di {0}? +lblCardMatchSearchingTypeInAlternateZones=carte corrispondono alla tua ricerca in zone diverse.. +lblLookingCardIn=Stai guardando le carte in +lblDoYouWantPlayCard=Vuoi giocare {0}? +lblSelectCardFromPlayerZone=Scegl;i una carta da {1} di {0} +lblSelectUpToNumCardFromPlayerZone=Scegli fino a {0} carte da {2} di {1} +lblSelectCardsFromPlayerZone=Scegli carte a {1} di {0} +lblCancelSearchUpToSelectNumCards=Vuoi annullare la ricerca? Puoi selezionare fino a {0} carta/e in più. #ChangeZoneAllEffect.java -lblMoveTargetFromOriginToDestination=Move {0} from {1} to {2}? +lblMoveTargetFromOriginToDestination=Sposti {0} da {1} a {2}? #CharmEffect.java -lblWouldYouLikeCharm=Do you want to choose modes? +lblWouldYouLikeCharm=Vuoi scegliere i modi? #ChooseCardEffect.java -lblChoose=Choose -lblSelectCreatureWithTotalPowerLessOrEqualTo=Select creature(s) with total power less than or equal to {0} -lblTotalPowerNum=Total Power: {0} -lblCancelChooseConfirm=Cancel Choose? +lblChoose=Scegli +lblSelectCreatureWithTotalPowerLessOrEqualTo=Seleziona creature con forza complessiva minore o uguale a {0} +lblTotalPowerNum=Forza totale: {0} +lblCancelChooseConfirm=Annulli la scelta? #ChooseCardNameEffect.java -lblChooseACardName=Choose a card name -lblChooseASpecificCard=Choose a {0} card name. -lblPlayerPickedChosen={0} picked {1} +lblChooseACardName=Scegli il nome di una carta +lblChooseASpecificCard=Scegli il nome di una carta {0}. +lblPlayerPickedChosen={0} ha scelto {1} #ChooseColorEffect.java -lblChooseAColor=Choose a color -lblChooseNColors=Choose {0} color -lblAtLastChooseNumColors=Choose {0} or more color -lblChooseSpecifiedRangeColors=Choose {0} to {1} color +lblChooseAColor=Scegli un colore +lblChooseNColors=Scegli {0} colori +lblAtLastChooseNumColors=Scegli {0} o più colori +lblChooseSpecifiedRangeColors=Scegli da {0} a {1} colori #ChooseDirectionEffect.java -lblLeftClockwise=Left (clockwise) -lblRightAntiClockwise=Right (anticlockwise) -lblChooseDirection=Choose a direction +lblLeftClockwise=Sinistra (senso orario) +lblRightAntiClockwise=Destra (senso antiorario) +lblChooseDirection=Scegli una direzione #ChooseGenericEffect.java -lblChooseOne=Choose one +lblChooseOne=Scegli uno #ChooseNumberEffect.java -lblChooseNumber=Choose a number -lblPlayerChoseNum={0} chose {1} +lblChooseNumber=Scegli un numero +lblPlayerChoseNum={0} ha scelto {1} #ChoosePlayerEffect.java -lblChoosePlayer=Choose a player +lblChoosePlayer=Scegli un giocatore #ChooseSourceEffect.java -lblChooseSource=Choose a source +lblChooseSource=Scegli una fonte #ClashEffect.java -lblChooseOpponent=Choose a opponent -lblReveals=reveals -lblWinsClash=wins clash -lblLosesClash=loses clash +lblChooseOpponent=Scegli un avversario +lblReveals=rivela +lblWinsClash=vince lo scontro +lblLosesClash=perde lo scontro #CloneEffect.java -lblDoYouWantCopy=Do you want to copy {0}? +lblDoYouWantCopy=Vuoi copiare {0}? #ControlExchangeEffect.java -lblExchangeControl=Do you want to exchange control of {0} and {1}? +lblExchangeControl=Vuoi scambiare il controllo di {0} e {1}? #ControlExchangeVariantEffect.java -lblChooseCards=Choose cards +lblChooseCards=Scegli le carte #CopyPermanentEffect.java -lblCopyPermanentConfirm=Copy this permanent? -lblDefender=defender +lblCopyPermanentConfirm=Copia questo permanente? +lblDefender=difensore #CopySpellAbilityEffect.java -lblDoyouWantCopyTheSpell=Do you want to copy the spell {0}? -lblSelectMultiSpellCopyToStack=Select {0} spell to copy to stack -lblSelectASpellCopy=Select a spell to copy +lblDoyouWantCopyTheSpell=Vuoi copiare la magia {0}? +lblSelectMultiSpellCopyToStack=Seleziona {0} magie da copiare in pila +lblSelectASpellCopy=Seleziona una magia da copiare #CounterEffect.java -lblRemoveDestination=a destination to remove +lblRemoveDestination=una destinazione da cui rimuovere #CountersMoveEffect.java -lblChooseTakeCountersCard=Choose card to take {0} counters from -lblTakeHowManyTargetCounterFromCard=Take how many {0} counters from {1}? -lblChooseCardToGetCountersFrom=Choose cards to get {0} counters from {1}. -lblPutHowManyTargetCounterOnCard=Put how many {0} counters on {1}? -lblTakeHowManyTargetCounters=Take how many {0} counters? +lblChooseTakeCountersCard=Scegli una carta da cui prendere {0} segnalini +lblTakeHowManyTargetCounterFromCard=Quanti segnalini {0} vuoi prendere da {1}? +lblChooseCardToGetCountersFrom=Scegli una carta da {1} da cui prendere {0} segnalini. +lblPutHowManyTargetCounterOnCard=Quanti segnalini {0} aggiungi su {1}? +lblTakeHowManyTargetCounters=Quanti segnalini {0} prendi? #CountersProliferateEffect.java -lblChooseProliferateTarget=Choose any number of permanents and/or players for proliferate +lblChooseProliferateTarget=Scegli un numero qualsiasi di permanenti e/o giocatori per l''abilità prolifera #CountersPutEffect.java -lblDoYouWantPutCounter=Do you want to put the counter? -lblChooseACreatureWithLeastToughness=Choose a creature with the least toughness -lblSelectCounterTypeAddTo=Select counter type to add to -lblHowManyCountersThis=Quanti contatori? {0} -lblChooseAnOpponent=Choose an opponent -lblDoYouWantPutTargetP1P1CountersOnCard=Do you want to put {0} +1/+1 counters on {1}? +lblDoYouWantPutCounter=Vuoi aggiungere il segnalino? +lblChooseACreatureWithLeastToughness=Scegli una creatura con la minor costituzione +lblSelectCounterTypeAddTo=Scegli il tipo di segnalino da aggiungere +lblHowManyCountersThis=Quanti segnalini vuoi aggiungere a {0}? +lblChooseAnOpponent=Scegli un avversario +lblDoYouWantPutTargetP1P1CountersOnCard=Vuoi aggiungere {0} segnalino/i +1/+1 a {1}? #CountersPutOrRemoveEffect.java -lblSelectCounterTypeToAddOrRemove=Select type of counters to add or remove -lblWhatToDoWithTargetCounter=What to do with that ''{0}'' counter +lblSelectCounterTypeToAddOrRemove=Scegli il tipo di segnalini da aggiungere o rimuovere +lblWhatToDoWithTargetCounter=Cosa fare con quel segnalino ''{0}'' #CountersRemoveEffect.java -lblAllCounters=all counters -lblACounters=a counter -lblCounters=counters -lblChooseCardsToTakeTargetCounters=Choose cards to take {0} counters from -lblSelectRemoveCountersNumberOfTarget=Select the number of {0} counters to remove -lblSelectCountersTypeToRemove=Select type of counters to remove +lblAllCounters=tutti i segnalini +lblACounters=un segnalino +lblCounters=segnalini +lblChooseCardsToTakeTargetCounters=Scegli le carte da cui prendere i segnalini {0} +lblSelectRemoveCountersNumberOfTarget=Scegli il numero di segnalini {0} da rimuovere +lblSelectCountersTypeToRemove=Scegli il tipo di segnalini da rimuovere #DamageDealEffect.java -lblDoyouWantDealTargetDamageToTarget=Do you want to deal {0} damage to {1}? +lblDoyouWantDealTargetDamageToTarget=Vuoi infliggere {0} danno/i a {1}? #DigEffect.java -lblChooser=Chooser -lblWouldYouLikeProceedWithOptionalAbility=Would you like to proceed with the optional ability for -lblChooseACardToLeaveTargetLibraryTop=Choose a card to leave on top of {0} library -lblChooseACardLeaveTarget=Choose a card to leave in {0} {1} -lblChooseCardsPutIntoZone=Choose card(s) to put into {0} -lblChooseCardPutOnTargetLibraryBottom=Choose card(s) to put on the bottom of {0} library -lblChooseCardPutOnTargetLibraryTop=Choose card(s) to put on top of {0} library -lblPlayerPickedCardFrom={0} picked card(s) from -lblNoValidCards=No valid cards +lblChooser=Fai la tua scelta +lblWouldYouLikeProceedWithOptionalAbility=Vuoi procedere con l''abilità facoltativa per +lblChooseACardToLeaveTargetLibraryTop=Scegli una carta da lasciare in cima al grimorio di {0} +lblChooseACardLeaveTarget=Scegli una carta da lasciare in {1} di {0} +lblChooseCardsPutIntoZone=Scegli la carta o le carte da mettere in {0} +lblChooseCardPutOnTargetLibraryBottom=Scegli la carta o le carte da mettere in fondo al grimorio di {0} +lblChooseCardPutOnTargetLibraryTop=Scegli le carte da mettere in cima al grimorio di {0} +lblPlayerPickedCardFrom={0} ha scelto delle carte da +lblNoValidCards=Nessuna carta valida #DigUntilEffect.java -lblDoYouWantDigYourLibrary=Do you want to dig your library? -lblDoYouWantPutCardToZone=Do you want to put that card to {0}? +lblDoYouWantDigYourLibrary=Vuoi passare in rassegna il tuo grimorio? +lblDoYouWantPutCardToZone=Vuoi mettere la carta in {0}? #DiscardEffect.java -lblWouldYouLikeRandomDiscardTargetCard=Would you like to discard {0} random card(s)? -lblPlayerHasChosenCardsFrom={0} has chosen card(s) from +lblWouldYouLikeRandomDiscardTargetCard=Vuoi scartare {0} carta/e a caso? +lblPlayerHasChosenCardsFrom={0}ha scelto delle carte da #DrawEffect.java -lblDoYouWantDrawCards=Do you want to draw {0}? -lblHowManyCardDoYouWantDraw=How may cards do you want to draw? +lblDoYouWantDrawCards=Vuoi pescare {0}? +lblHowManyCardDoYouWantDraw=Quante carte vuoi pescare? #EncodeEffect.java -lblDoYouWantExileCardAndEncodeOntoYouCreature=Do you want to exile {0} and encode it onto a creature you control? -lblChooseACreatureYouControlToEncode=Choose a creature you control to encode +lblDoYouWantExileCardAndEncodeOntoYouCreature=Vuoi esiliare {0} e codificarla sotto a una creatura che controlli? +lblChooseACreatureYouControlToEncode=Scegli una creatura che controlli per codificare #EndTurnEffect.java -lblDoYouWantEndTurn=Do you want to end the turn? +lblDoYouWantEndTurn=Vuoi concludere il turno? #ExploreEffect.java -lblRevealedForExplore=Revealed for Explore -lblPutThisCardToYourGraveyard=Put this card in your graveyard? +lblRevealedForExplore=Rivelata dall''abilità Esplora +lblPutThisCardToYourGraveyard=Metti la carta nel cimitero? #FightEffect.java -lblWouldYouLikeFight=Do you want {0} to fight {1}? +lblWouldYouLikeFight=Vuoi che {0} lotti con {1}? #FlipCoinEffect.java -lblHeads=heads -lblTails=tails -lblCallCoinFlip=Call coin flip -lblWin=win -lblLose=lose +lblHeads=testa +lblTails=croce +lblCallCoinFlip=Scegli testa o croce +lblWin=hai vinto +lblLose=hai perso #LifeSetEffect.java -lblLifeTotal=Life Total +lblLifeTotal=Punti Vita #ManaEffect.java -lblDoYouWantAddMana=Do you want to add mana? -lblSelectManaProduce=Select Mana to Produce -lblChooseSingleColorFromTarget=Choose a single color from {0} +lblDoYouWantAddMana=Vuoi aggiungere mana? +lblSelectManaProduce=Scegli il mana da produrre +lblChooseSingleColorFromTarget=Scegli un singolo colore da {0} #ManifestEffect.java -lblChooseCardToManifest=Choose cards to manifest +lblChooseCardToManifest=Scegli le carte da manifestare #MeldEffect.java -lblChooseCardToMeld=Choose card to meld with +lblChooseCardToMeld=Scegli le carte da combinare #MillEffect.java -lblDoYouWantPutLibraryCardsTo=Do you want to put card(s) from library to {0}? +lblDoYouWantPutLibraryCardsTo=Vuoi mettere la carta o le carte dal grimorio a {0}? #MultiplePilesEffect.java -lblChooseCardsInTargetPile=Choose cards in Pile {0}? +lblChooseCardsInTargetPile=Scegli le carte nella Pila {0}? #MutateEffect.java -lblChooseCreatureToBeTop=Choose which creature to be the top +lblChooseCreatureToBeTop=Scegli quale creatura mettere sopra #PeekAndRevealEffect.java -lblRevealingCardFrom=Revealing cards from -lblRevealCardToOtherPlayers=Reveal cards to other players? +lblRevealingCardFrom=Sto mostrando le carte da +lblRevealCardToOtherPlayers=Rivela carte agli altri giocatori? #PlayEffect.java -lblChooseUpTo=Choose up to -lblSelectCardToPlay=Select a card to play +lblChooseUpTo=Scegli fino a +lblSelectCardToPlay=Seleziona una carta da giocare #ProtectAllEffect.java -lblChooseAProtection=Choose a protection +lblChooseAProtection=Scegli una protezione #PumpEffect.java -lblApplyPumpToTarget=Apply pump to {0}? +lblApplyPumpToTarget=Applica il potenziamento a {0}? #RearrangeTopOfLibraryEffect.java -lblDoyouWantShuffleTheLibrary=Do you want to shuffle the library? +lblDoyouWantShuffleTheLibrary=Vuoi mescolare il grimorio? #RepeatEffect.java -lblDoYouWantRepeatProcessAgain=Do you want to repeat this process again? +lblDoYouWantRepeatProcessAgain=Vuoi ripetere nuovamente questo procedimento? #RevealHandEffect.java -lblDoYouWantRevealYourHand=Do you want to reveal your hand? +lblDoYouWantRevealYourHand=Vuoi rivelare la tua mano? #RollPlanarDiceEffect.java -lblPlayerRolledResult={0} rolled {1} +lblPlayerRolledResult={0} ha ottenuto {1} col dado #SacrificeEffect.java -lblDoYouWantPayEcho=Do you want to pay Echo -lblPayEcho=Pay Echo -lblDoYouWantSacrifice=Do you want to sacrifice? +lblDoYouWantPayEcho=Vuoi pagare Eco +lblPayEcho=Paga Eco +lblDoYouWantSacrifice=Vuoi sacrificare? #SetStateEffect.java -lblFaceDownCardCantTurnFaceUp=Face-down card can''t turn face up +lblFaceDownCardCantTurnFaceUp=La carta a faccia in giù non può essere girata a faccia in su #ShuffleEffect.java -lblHaveTargetShuffle=Have {0} shuffle? +lblHaveTargetShuffle=Fai mescolare {0}? #SubgameEffect.java -lblSubgameStart=Subgame started by {0}''s effect. -lblSubgameEnd=Subgame ended. {0} wins. {1} loses. -lblSubgameEndDraw=Subgame ended in a draw. +lblSubgameStart=Sottopartita iniziata per effetto di {0}. +lblSubgameEnd=Sottopartita conclusa. {0} ha vinto. {1} ha perso. +lblSubgameEndDraw=La Sottopartita è terminata in un pareggio. #SurveilEffect.java -lblDoYouWantSurveil=Do you want to surveil? +lblDoYouWantSurveil=Vuoi Sorvegliare? #TapOrUntapAllEffect.java -lblPermanents=Permanents -lblTapOrUntapTarget=Tap or Untap {0}? +lblPermanents=Permanenti +lblTapOrUntapTarget=Tappa o Stappa {0}? #TwoPilesEffect.java -lblSelectCardForFaceDownPile=Select cards for a face down pile -lblDivideCardIntoTwoPiles=Divide cards into two piles -lblSelectCardForLeftPile=Select cards for the left pile -lblLeftPile=Left pile -lblRightPile=Right pile -lblChoosesPile=chooses Pile -lblEmptyPile=Empty pile +lblSelectCardForFaceDownPile=Seleziona le carte per una pila a faccia in giù +lblDivideCardIntoTwoPiles=Dividi le carte in due pile +lblSelectCardForLeftPile=Scegli le carte per la pila di sinistra +lblLeftPile=Pila di sinistra +lblRightPile=Pila di destra +lblChoosesPile=sceglie la Pila +lblEmptyPile=Pila vuota #UntapEffect.java -lblSelectCardToUntap=Select cards to untap +lblSelectCardToUntap=Scegli le carte da Stappare #VoteEffect.java -lblVote=Vote -lblCurrentVote=Current Votes -lblHowManyAdditionalVotesDoYouWant=How many additional votes do you want? +lblVote=Voto +lblCurrentVote=Voti attuali +lblHowManyAdditionalVotesDoYouWant=Quanti voti aggiuntivi vuoi? #InputPayMana.java -lblChooseManaAbility=Choose mana ability +lblChooseManaAbility=Scegli una abilità di mana: #VDevMenu.java -lblUnlimitedLands=Play Unlimited Lands -lblGenerateMana=Generate Mana -lblViewAll=View All Cards -lblSetupGame=Setup Game State -lblDumpGame=Dump Game State -lblTutor=Tutor for Card -lblRollbackPhase=Rollback Phase -lblAddCounterPermanent=Add Counters to Card -lblSubCounterPermanent=Sub Counters from Card -lblTapPermanent=Tap Permanents -lblUntapPermanent=Untap Permanents -lblSetLife=Set Player Life -lblCardToBattlefield=Add Card to Battlefield -lblExileFromPlay=Exile Card from Play -lblCardToHand=Add Card to Hand -lblExileFromHand=Exile Card from Hand -lblCardToLibrary=Add Card to Library -lblCardToGraveyard=Add Card to Graveyard -lblCardToExile=Add Card to Exile -lblCastSpellOrPlayLand=Cast Spell/Play Land -lblRepeatAddCard=Repeat Last Add Card -lblRemoveFromGame=Remove Card from Game -lblRiggedRoll=Rigged Planar Roll -lblWalkTo=Planeswalk to +lblUnlimitedLands=Gioca terre senza limite +lblGenerateMana=Genera mana +lblViewAll=Vedi tutte le carte +lblSetupGame=Setup Stato di Gioco +lblDumpGame=Salva Stato di Gioco +lblTutor=Ottieni una carta +lblRollbackPhase=Fase di ripristino +lblAddCounterPermanent=Aggiungi segnalini a una carta +lblSubCounterPermanent=Rimuovi segnalini a una carta +lblTapPermanent=Tappa permanenti +lblUntapPermanent=Stappa permanenti +lblSetLife=Imposta Punti Vita di un giocatore +lblCardToBattlefield=Aggiungi una carta al campo di battaglia +lblExileFromPlay=Esilia una carta dal gioco +lblCardToHand=Aggiungi una carta alla mano +lblExileFromHand=Esilia una carta dalla mano +lblCardToLibrary=Aggiungi una carta al grimorio +lblCardToGraveyard=Aggiungi una carta al cimitero +lblCardToExile=Aggiungi una carta all''esilio +lblCastSpellOrPlayLand=Lancia magia/gioca terra +lblRepeatAddCard=Ripeti l''ultima azione aggiungi carta +lblRemoveFromGame=Rimuovi una carta dal gioco +lblRiggedRoll=Lancio di dado planare truccato +lblWalkTo=Viaggia tra i piani (scegli il piano) #PhaseType.java -lblUntapStep=Untap step -lblUpkeepStep=Upkeep step -lblDrawStep=Draw step -lblMainPhase1=Main phase, precombat -lblCombatBeginStep=Beginning of Combat Step -lblCombatDeclareAttackersStep=Declare Attackers Step -lblCombatDeclareBlockersStep=Declare Blockers Step -lblCombatFirstStrikeDamageStep=First Strike Damage Step -lblCombatDamageStep=Combat Damage Step -lblCombatEndStep=End of Combat Step -lblMainPhase2=Main phase, postcombat -lblEndStep=End step -lblCleanupStep=Cleanup step +lblUntapStep=Sottofase di Stap +lblUpkeepStep=Sottofase di Mantenimento +lblDrawStep=Sottofase di Acquisizione +lblMainPhase1=Fase Principale pre-combattimento +lblCombatBeginStep=Sottofase di Inizio Combattimento +lblCombatDeclareAttackersStep=Sottofase di Dichiarazione delle Creature Attaccanti +lblCombatDeclareBlockersStep=Sottofase di Dichiarazione delle Creature Bloccanti +lblCombatFirstStrikeDamageStep=Sottofase di Danno da Combattimento - Attacco improvviso +lblCombatDamageStep=Sottofase di Danno da Combattimento +lblCombatEndStep=Sottofase di Fine Combattimento +lblMainPhase2=Fase principale post-combattimento +lblEndStep=Sottofase Finale +lblCleanupStep=Sottofase di Cancellazione #ZoneType.java -lblHandZone=hand -lblLibraryZone=library -lblGraveyardZone=graveyard -lblBattlefieldZone=battlefield -lblExileZone=exile +lblHandZone=mano +lblLibraryZone=grimorio +lblGraveyardZone=cimitero +lblBattlefieldZone=campo di battaglia +lblExileZone=esilio lblFlashbackZone=flashback -lblCommandZone=command -lblStackZone=stack +lblCommandZone=comando +lblStackZone=pila lblSideboardZone=sideboard -lblAnteZone=ante -lblSchemeDeckZone=schemedeck -lblPlanarDeckZone=planardeck -lblSubgameZone=subgame -lblNoneZone=none +lblAnteZone=posta +lblSchemeDeckZone=mazzo Intrighi +lblPlanarDeckZone=mazzo planare +lblSubgameZone=sottopartita +lblNoneZone=nessuno #BoosterDraft.java -lblChooseBlock=Choose Block -lblChooseChaosTheme=Choose Chaos Draft Theme -lblBlockNotContainSetCombinations={0} does not contain any set combinations. -lblChooseSetCombination=Choose Set Combination -lblNotFoundCustomDraftFiles=No custom draft files found. -lblChooseCustomDraft=Choose Custom Draft -lblChooseSetForNPack=Choose set for Pack {0} of {1} +lblChooseBlock=Scegli il Blocco +lblChooseChaosTheme=Scegli il tema del Chaos Draft +lblBlockNotContainSetCombinations={0} non contiene alcuna combinazione di espansioni. +lblChooseSetCombination=Scegli la combinazione di espansioni +lblNotFoundCustomDraftFiles=Nessun file di draft personalizzato trovato. +lblChooseCustomDraft=Scegli draft personalizzato +lblChooseSetForNPack=Scegli l''espansione per il pacchetto {0} di {1} #SealedCardPoolGenerator.java -lblChooseSealedDeckFormat=Choose Sealed Deck Format -lblSaveCardPoolAs=Save this card pool as -lblSaveCardPool=Save Card Pool -lblDeckExistsReplaceConfirm=''{0}'' already exists. Do you want to replace it? -lblSealedDeckGameExists=Sealed Deck Game Exists -lblChooseAnEdition=Choose an edition -lblChoosePackNumberToPlay=Choose packs to play with -lblNotFoundCustomSealedFiles=No custom sealed files found. -lblChooseCustomSealedPool=Choose Custom Sealed Pool -lblHowManyBoosterPacks=How many booster packs? +lblChooseSealedDeckFormat=Scegli il formato del Sealed Deck +lblSaveCardPoolAs=Salva questo gruppo di carte come +lblSaveCardPool=Salva gruppo di carte +lblDeckExistsReplaceConfirm=''{0}'' è già esistente. Vuoi sovrascrivere? +lblSealedDeckGameExists=La partita Sealed Deck esiste già +lblChooseAnEdition=Scegli un''edizione +lblChoosePackNumberToPlay=Scegli i pacchetti con cui giocare +lblNotFoundCustomSealedFiles=Nessun file di gioco sealed trovato. +lblChooseCustomSealedPool=Scegli gruppo di carte Sealed +lblHowManyBoosterPacks=Quanti pacchetti? #DialogChooseSets.java -lblDisplayRecentSetRepints=Display compatible reprints from more recent sets -lblSelectRandomSets=Select Random Sets -lblSelectNumber=Number to Select -lblCore=Core -lblExpansion=Expansion -lblFormatRestrictions=Format Restrictions +lblDisplayRecentSetReprints=Mostra ristampe compatibili dalle espansioni più recenti +lblSelectRandomSets=Scegli espansioni casuali +lblSelectNumber=Numero +lblCore=Set base +lblExpansion=Espansione +lblFormatRestrictions=Restrizioni del formato lblLegacyOrVintage=Legacy/Vintage -lblModernCardFrame=Modern Card Frame -lblNoFormatRestriction=No Format Restriction -lblRandomizeSets=Randomize Sets -lblClearSelection=Clear Selection -lblShowOptions=Show Options -lblHideOptions=Hide Options -lblCoreSets=Core sets -lblExpansions=Expansions -lblOtherSets=Other sets +lblModernCardFrame=Frame delle carte Modern +lblNoFormatRestriction=Nessuna restrizione di formato +lblRandomizeSets=Espansioni casuali +lblClearSelection=Cancella selezione +lblShowOptions=Mostra opzioni +lblHideOptions=Nascondi opzioni +lblCoreSets=Set base +lblExpansions=Espansioni +lblOtherSets=Promo, Online, e Altre Espansioni +lblCustomSets=Espansioni Personalizzate #CMatchUI.java -lblAbilities=Abilities +lblAbilities=Abilità #VAutoYields.java -lblDisableAllAutoYields=Disable All Auto Yields -lblRemoveYield=Remove Yield -lblNoActiveAutoYield=There are no active auto-yields. -lblNoAutoYield=No Auto-Yields +lblDisableAllAutoYields=Disabilita tutti i consensi automatici +lblRemoveYield=Rimuovi consenso +lblNoActiveAutoYield=Non ci sono consensi automatici attivi. +lblNoAutoYield=Nessun consenso automatico #GameEntityPicker.java -lblChoices=Choices +lblChoices=Scelte #ConquestRewardDialog.java -lblSkip=Skip +lblSkip=Passa #ConquestChaosBattle.java -lblGreat=Great +lblGreat=Ottimo! #ConquestData.java -lblExileCard=Exile Card -lblExileNCard=Exile {0} Cards -lblExileFollowCardsToReceiveNAE=Exile the following {0} to receive {1} {2}?\n -lblCurrentPlaneswalkerCannotBeExiled=Current planeswalker cannot be exiled. -lblCannotCommanderWithDefinedDeck=Cannot exile a commander with a defined deck. -lblCardCannotBeExiledCommandersCard={0} is in use by the following commanders and cannot be exiled:\n{1} -lblRetrieveCard=Retrieve Card -lblRetrieveNCard=Retrieve {0} Cards -lblNotEnoughShardsToRetrieveCards=Not enough shards to retrieve {0}. -lblSpendAECostToRetrieveCardsFromExile=Spend {0} {1} to retrieve the following {2} from exile?\n -lblAetherShards=Aether Shards -lblPlaneswalkEmblems=Planeswalk Emblems -lblTotalWins=Total Wins -lblTotalLosses=Total Losses -lblConqueredEvents=Conquered Events -lblUnlockedCards=Unlocked Cards +lblExileCard=Esilia carta +lblExileNCard=Esilia {0} carte +lblExileFollowCardsToReceiveNAE=Vuoi esiliare {0} per ricevere {1} {2}?\n +lblCurrentPlaneswalkerCannotBeExiled=Il planeswalker selezionato non può essere esiliato +lblCannotCommanderWithDefinedDeck=Non è possibile esiliare un generale con un mazzo associato. +lblCardCannotBeExiledCommandersCard={0} è in uso dai seguenti generali e non può essere esiliato:\n{1} +lblRetrieveCard=Recupera carta +lblRetrieveNCard=Recupera {0} carte +lblNotEnoughShardsToRetrieveCards=Non hai abbastanza frammenti per recuperare {0}. +lblSpendAECostToRetrieveCardsFromExile=Spendi {0} {1} per recuperare {2} dall''esilio?\n +lblAetherShards=Frammenti d''Etere +lblPlaneswalkEmblems=Emblemi dei Planeswalker +lblTotalWins=Vittorie complessive +lblTotalLosses=Sconfitte complessive +lblConqueredEvents=Eventi superati +lblUnlockedCards=Carte sbloccate #QuestWinLoseController.java -lblQuitByPayCredits=Quit (-15 Credits) -lblSpoilsWonAnteCard=Spoils! Cards won from ante -lblLootedLostAnteCard=Looted! Cards lost to ante -lblAchieving25WinStreakAwarded =For achieving a 25 win streak, you have been awarded a draft token!\nUse these tokens to generate new tournaments. -lblBonusDraftTokenReward=Bonus Draft Token Reward -lblAchievedNWinStreakWinMTypeCards=You have achieved a {0} win streak and won {1} {2} card(s)! -lblJustWonTenRandomRares=You just won 10 random rares! -lblChooseBonusBoosterFormat=Choose bonus booster format -lblBonusFormatBoosterPack=Bonus booster pack from the "{0}" format! -lblChooseBonusBoosterSet=Choose bonus booster set -lblBonusSetBoosterPack=Bonus {0} Booster Pack! -lblChallengeCompletedBountyIS=Challenge completed.\n\nChallenge bounty: {0} credits. -lblChallengeRewardsForEvent=Challenge Rewards for "{0}" -lblYouHaveLostNCredits=You lose! You have lost {0} credits. -lblGameplayResults=Gameplay Results +lblQuitByPayCredits=Abbandona (-15 monete) +lblSpoilsWonAnteCard=Bottino! Carte vinte come posta +lblLootedLostAnteCard=Saccheggiato! Carte perse come posta +lblAchieving25WinStreakAwarded=Per aver ottenuto una serie di 25 vittorie, sei stato premiato con un gettone draft!\nUna questi gettoni per generare nuovi tornei. +lblBonusDraftTokenReward=Gettone premio Draft +lblAchievedNWinStreakWinMTypeCards=Hai ottenuto una serie di {0} vittorie e hai guadagnato {1} {2} carta/e! +lblJustWonTenRandomRares=Hai vinto 10 carte rare a caso! +lblChooseBonusBoosterFormat=Scegli il formato della busta premio +lblBonusFormatBoosterPack=Busta premio dal formato "{0}"! +lblChooseBonusBoosterSet=Scegli l''espansione della busta premio +lblBonusSetBoosterPack=Busta premio {0}! +lblChallengeCompletedBountyIS=Sfida completata.\n\nRicompensa: {0} monete. +lblChallengeRewardsForEvent=Ricompensa per la sfida "{0}" +lblYouHaveLostNCredits=Sconfitta! Hai perso {0} monete. +lblGameplayResults=Risultati #MessageUtil.java -lblResultIs=Result: {0} -lblPlayerRandomChosenNumberIs=Randomly chosen number for {0} is {1} -lblPlayerChoosesNumberIs={0} chooses number: {1} -lblPlayerChooseValueOfEffectOfCard={0} choose {1} for effect of {2} -lblPlayerFlipComesUpValue={0} flip comes up {1} -lblPlayerActionFlip={0} {1} the flip -lblPlayerChooseValue={0} choose {1} -lblPlayerVoteValue={0} vote {1} -lblCardEffectValueIs={0} effect''s value is {1} -lblCardEffectToTargetValueIs={0} effect''s value for {1} is {2} -# TODO: If below is changed, also need to modify LangItalian.getPossesive() function -lblYou=you +lblResultIs=Risultato: {0} +lblPlayerRandomChosenNumberIs=Il numero scelto a caso per {0} è {1} +lblPlayerChoosesNumberIs={0} sceglie il numero: {1} +lblPlayerChooseValueOfEffectOfCard={0} ha scelto{1} per effetto di {2} +lblPlayerFlipComesUpValue=Al lancio di {0} è uscita {1} +lblPlayerActionFlip={0} {1} il lancio +lblPlayerChooseValue={0} sceglie {1} +lblPlayerVoteValue={0} vota {1} +lblCardEffectValueIs=Il valore dell''effetto di {0} è {1} +lblCardEffectToTargetValueIs=Il valore dell''effetto di {0} per {1} è {2} +lblYou=tu #CardListChooser.java -lblAreYouSureWantPickCard=Are you sure you want to pick ''{0}'' ? -lblSelectThisCardConfirm=Select this card? +lblAreYouSureWantPickCard=Sei sicuro di voler scegliere ''{0}'' ? +lblSelectThisCardConfirm=Vuoi scegliere questa carta? #CardView.java -lblMainGame=Main game -lblSubgame=Subgame ({0} parent) +lblMainGame=Gioco principale +lblSubgame=Sottopartita (da {0}) #PlayerView.java -lblCommanderCastCard=Cast from command zone {0} times -lblCommanderCastPlayer={0} cast from command zone {1} times -lblCommanderDealNDamageToPlayer=Commander damage to {0} from {1}: {2}\r\n -lblNCommanderDamageFromOwnCommander=Commander damage from own commander {0}: {1}\r\n -lblNCommanderDamageFromPlayerCommander=Commander damage from {0} {1}: {2}\r\n -lblUnlimited=unlimited -lblLifeHas=Life: {0} -lblTypeCounterHas={0} counters: {1} -lblCardInHandHas=Cards in hand: {0}/{1} -lblLandsPlayed=Lands played: {0}/{1} -lblCardDrawnThisTurnHas=Cards drawn this turn: {0} -lblDamagepreventionHas=Damage prevention: {0} -lblIsExtraTurn=Extra Turn: Yes -lblExtraTurnCountHas=Extra Turn Count: {0} -lblAntedHas=Ante''d: {0} -lblAdditionalVotes=You get {0} additional votes. -lblOptionalAdditionalVotes=You may vote {0} additional times. -lblControlsVote=You choose how each player votes. +lblCommanderCastCard=Lanciato dalla zona di comando {0} volte +lblCommanderCastPlayer={0} è stato lanciato dalla zona di comando {1} volte +lblCommanderDealNDamageToPlayer=Danno del Generale {1} a {0}: {2}\r\n +lblNCommanderDamageFromOwnCommander=Danno dal proprio Generale {0}: {1}\r\n +lblNCommanderDamageFromPlayerCommander=Danno dal Generale {1} di {1}: {2}\r\n +lblUnlimited=senza limiti +lblLifeHas=Punti vita: {0} +lblTypeCounterHas=Segnalini {0}: {1} +lblCardInHandHas=Carte in mano: {0}/{1} +lblLandsPlayed=Terre giocate: {0}/{1} +lblCardDrawnThisTurnHas=Carte pescate in questo turno: {0} +lblDamagepreventionHas=Prevenzione danni: {0} +lblIsExtraTurn=Turno extra: Sì +lblExtraTurnCountHas=Numero turni extra: {0} +lblAntedHas=Posta: {0} +lblAdditionalVotes=Ottieni {0} voti aggiuntivi. +lblOptionalAdditionalVotes=Puoi votare {0} volte in più. +lblControlsVote=Puoi scegliere come vota ciascun giocatore. #VStack.java -lblAlwaysYes=Always Yes -lblAlwaysNo=Always No -lblZoomOrDetails=Zoom/Details +lblAlwaysYes=Sempre sì +lblAlwaysNo=Sempre no +lblZoomOrDetails=Zoom/Dettagli #AdvancedSearch.java -lblRulesText=Rules Text -lblKeywords=Keywords -lblPlane=Plane -lblRegion=Region -lblColorCount=Color Count -lblSubtype=Subtype -lblGenericCost=Generic Cost -lblManaCost=Mana Cost -lblFirstPrinting=First Printing -lblAverageCMC=Average CMC -lblMainDeck=Main Deck -lblMainDeckSize=Main Deck Size -lblSideboardSize=Sideboard Size -lblOrigin=Origin -lblDeckAverageCMC=Deck Average CMC -lblDeckContents=Deck Contents -lblDeckSize=Deck Size -lblBuyPrice=Buy Price -lblSellPrice=Sell Price -lblUsedInQuestDecks=Used in # Quest Decks -lblIsTrue=is true -lblIsFalse=is false +lblRulesText=Testo delle regole +lblKeywords=Keyword +lblPlane=Piano +lblRegion=Regione +lblColorCount=Computo dei colori +lblSubtype=Sottotipo +lblGenericCost=Costo generico +lblManaCost=Costo di mana +lblFirstPrinting=Prima stampa +lblAverageCMC=CMC medio +lblMainDeck=Mazzo +lblMainDeckSize=Dimensione del mazzo +lblSideboardSize=Dimensione sideboard +lblOrigin=Origine +lblDeckAverageCMC=CMC medio del mazzo +lblDeckContents=Contenuti del mazzo +lblDeckSize=Dimensione del mazzo +lblBuyPrice=Prezzo d''acquisto +lblSellPrice=Prezzo di vendita +lblUsedInQuestDecks=Usato in # Mazzi Avventura +lblIsTrue=è vero +lblIsFalse=è falso lblEqual=\= lblNotEqual=<> lblGreaterThan=> @@ -2161,518 +2173,518 @@ lblGreaterThanOrEqual=>\= lblLessThanOrEqual=<\= lblBetweenInclusive=<\=|<\= lblBetweenExclusive=<|< -lblContains=contains -lblStartsWith=starts with -lblEndsWith=ends with -lblIsExactly=is exactly -lblIsAnyOf=is any of -lblContainsAnyOf=contains any of -lblContainsAllOf=contains all of -lblContainAnyOf=contain any of -lblContainAllOf=contain all of -lblContainsCard=contains card -lblContainsXCopiesCard=contains X copies of card -lblHowManyCopiesOfN=How many copies of {0}? -lblSelectAFilterType=Select a filter type -lblSelectOperatorFor=Select an operator for {0} -lblSelectingFilter=Select Filter... -lblLoadingKeywords=Loading keywords... +lblContains=contiene +lblStartsWith=inizia con +lblEndsWith=finisce con +lblIsExactly=è esattamente +lblIsAnyOf=è qualsiasi tra +lblContainsAnyOf=contiene qualsiasi tra +lblContainsAllOf=contiene tutto tra +lblContainAnyOf=contengono qualsiasi tra +lblContainAllOf=contengono tutto tra +lblContainsCard=contiene la carta +lblContainsXCopiesCard=contiene X copie della carta +lblHowManyCopiesOfN=Quante copie di {0}? +lblSelectAFilterType=Seleziona un tipo di filtro +lblSelectOperatorFor=Seleziona un operatore per {0} +lblSelectingFilter=Seleziona il filtro... +lblLoadingKeywords=Sto caricando le parole chiave... #LoadSealedScreen.java -lblYouMustSelectExistingSealedPool=You must select an existing deck or build a deck from a new sealed pool. +lblYouMustSelectExistingSealedPool=Devi selezionare un mazzo esistente o crearne uno nuovo in Sealed. #LoadGauntletScreen.java -lblYouMustCreateAndSelectGauntlet=You must create and select a gauntlet. -lblSelectGauntletDeck=Select Deck for Gauntlet -lblEnterNewGauntletGameName=Enter new name for gauntlet: -lblRenameGauntlet=Rename Gauntlet -lblPleaseSpecifyGauntletName=Please specify a gauntlet name. -lblGauntletNameExistsPleasePickAnotherName=A gauntlet already exists with that name. Please pick another gauntlet name. -lblAreYouSuerDeleteGauntlet=Are you sure you want to delete {0}? -lblDeleteGauntlet=Delete Gauntlet +lblYouMustCreateAndSelectGauntlet=Devi creare e selezionare una sfida. +lblSelectGauntletDeck=Scegli il mazzo per la Sfida +lblEnterNewGauntletGameName=Inserisci un nome per la sfida: +lblRenameGauntlet=Rinomina Sfida +lblPleaseSpecifyGauntletName=Indica il nome della sfida. +lblGauntletNameExistsPleasePickAnotherName=Esiste già una sfida con tale nome. Scegline un altro per favore. +lblAreYouSuerDeleteGauntlet=Sei sicuro di voler cancellare {0}? +lblDeleteGauntlet=Elimina sfida #LoadConquestScreen.java -lblLoadingExistingConquests=Loading Existing Conquests... -lblOldConquestDataPutIntoDirAndRestartForge=Old conquest data? Put into {0} and restart Forge. -lblEnterNewConquestName=Enter new name for conquest: -lblRenameConquest=Rename Conquest -lblPleaseSpecifyConquestName=Please specify a conquest name. -lblConquestNameExistsPleasePickAnotherName=A conquest already exists with that name. Please pick another conquest name. -lblAreYouSuerDeleteConquest=Are you sure you want to delete {0}? -lblDeleteConquest=Delete Conquest +lblLoadingExistingConquests=Caricamento Conquiste... +lblOldConquestDataPutIntoDirAndRestartForge=Vecchi dati Conquista? Inseriscili in {0} e riavvia Forge. +lblEnterNewConquestName=Inserisci un nome per la Conquista: +lblRenameConquest=Rinomina Conquista +lblPleaseSpecifyConquestName=Indica il nome della conquista. +lblConquestNameExistsPleasePickAnotherName=Esiste già una conquista con tale nome. Scegline un altro per favore. +lblAreYouSuerDeleteConquest=Sei sicuro di voler cancellare {0}? +lblDeleteConquest=Elimina conquista #NewConquestScreen.java -lblStartingNewConquest=Starting new conquest... -lblSelectStartingPlane=Select Starting Plane\n(Tap art for more info) -lblSelectStartingCommander=Select Starting Commander -lblSelectStartingPlaneswalker=Select Starting Planeswalker +lblStartingNewConquest=La Conquista ha inizio... +lblSelectStartingPlane=Scegli il Piano di partenza\n(Tap art for more info) +lblSelectStartingCommander=Scegli il generale di partenza +lblSelectStartingPlaneswalker=Scegli il planeswalker di partenza #ConquestStatsScreen.java -lblAllPlanes=All Planes +lblAllPlanes=Tutti i piani #MultiStepWizardScreen.java -lblBack=Back -lblNext=Next -lblFinish=Finish +lblBack=Indietro +lblNext=Avanti +lblFinish=Fine #ConquestPrefsScreen.java -lblConquestPreference=Conquest Preferences -lblBaseDuplicateValue=Base Duplicate Value -lblBaseExileValue=Base Exile Value -lblBaseRetrieveCost=Base Retrieve Cost -lblBasePullCost=Base Pull Cost -lblUncommonMultiplier=Uncommon Multiplier -lblRareMultiplier=Rare Multiplier -lblMythicMultiplier=Mythic Multiplier -lblStartingShards=Starting Shards -lblChaosWheelShardValue=Chaos Wheel Shard Value -lblBoosterPacks=Booster Packs -lblCommons=Commons -lblUncommons=Uncommons -lblRares=Rares -lblBoostersPerMythic=Boosters per Mythic -lblBaseConquerReward=Base Conquer Reward -lblChaosWheelBonus=Chaos Wheel Bonus -lblFirstPlaneUnlockCost=First Plane Unlock Cost -lblCostIncreasePerUnlock=Cost Increase Per Unlock -lblChaosBattles=Chaos Battles +lblConquestPreference=Preferenze della Conquista +lblBaseDuplicateValue=Valore di base per i doppioni +lblBaseExileValue=Valore di base per l''esilio +lblBaseRetrieveCost=Costo di base per il recupero +lblBasePullCost=Costo di base per +lblUncommonMultiplier=Moltiplicatore carte non comuni +lblRareMultiplier=Moltiplicatore carte rare +lblMythicMultiplier=Moltiplicatore carte mitiche +lblStartingShards=Frammenti di partenza +lblChaosWheelShardValue=Valore frammenti Ruota del Caos +lblBoosterPacks=Booster Pack +lblCommons=Comuni +lblUncommons=Non comuni +lblRares=Rare +lblBoostersPerMythic=Pacchetti per Mitiche +lblBaseConquerReward=Ricompensa di base per la Conquista +lblChaosWheelBonus=Bonus Ruota del Caos +lblFirstPlaneUnlockCost=Costo dello sblocco del primo piano +lblCostIncreasePerUnlock=Aumento del costo per sblocco +lblChaosBattles=Battaglie del Caos #ConquestMenu.java -lblTheMultiverse=The Multiverse -lblTheAether=The Aether -lblPlaneswalk=Planeswalk -lblLoadingCurrentConquest=Loading current conquest... +lblTheMultiverse=Multiverso +lblTheAether=Etere +lblPlaneswalk=Viaggio tra i piani +lblLoadingCurrentConquest=Caricamento Conquista in corso... #ConquestCommandersScreen.java -lblSelectCommander=Select Commander -lblCantSelectDeckBecause=Can''t select {0} \nDeck {1} +lblSelectCommander=Seleziona Generale +lblCantSelectDeckBecause=Non puoi selezionare {0} \nMazzo {1} #ConquestAEtherScreen.java -lblShardsAE=Shards: {0} -lblHaveNAEShards=Shards: {0} {1} -lblTapToPullFromAE=Tap to pull from the Aether\n{0} -lblSelectCaptionFilter=Select {0} Filter +lblShardsAE=Frammenti: {0} +lblHaveNAEShards=Frammenti: {0} {1} +lblTapToPullFromAE=Tocca per attingere dall''etere\n{0} +lblSelectCaptionFilter=Seleziona il filtro {0} #ConquestCollectionScreen.java -lblExile=Exile -lblRetrieve=Retrieve -lblExileRetrieveProportion=Exile unneeded cards at {0}% value.\nRetrieve exiled cards for {1}% value. -lblRetrieveForNAE=Retrieve for {0} {1} -lblExileForNAE=Exile for {0} {1} +lblExile=Esilia +lblRetrieve=Recupera +lblExileRetrieveProportion=Esilia le carte che non ti servono al {0}% del loro valore.\nRecupera le carte esiliate al {1}% del loro valore. +lblRetrieveForNAE=Recupera per {0} {1} +lblExileForNAE=Esilia per {0} {1} #ConquestBattle.java -lblRetry=Retry -lblQuit=Quit +lblRetry=Riprova +lblQuit=Esci #ConquestMultiverseScreen.java -lblAllPlanesUnlockedNotify=With a feeling that you don''t need more planeswalker emblems, you attempt to tap the Aether for another reward, causing a chaotic disturbance. An unknown entity is summoned from the Aether. It approaches you and a chaos battle ensues... -lblAllPlanesUnlocked=All Planes Unlocked -lblReceivedBoosterPack=Received Booster Pack -lblReceivedBoosterPackNOfTotal=Received Booster Pack\n({0} of {1}) -lblReceivedAetherShards=Received Aether Shards -lblReceivedAetherShardsForDuplicateCards=Received Aether Shards for Duplicate Cards -lblReceivedBonusPlaneswalkEmblems=Received Bonus Planeswalk Emblems -lblStartingBattle=Starting battle... -lblChaosApproaching=Chaos approaching... -lblBattle=Battle +lblAllPlanesUnlockedNotify=Con la sensazione di non aver bisogno di altri emblemi di planeswalker, provi a incanalare l''etere per ottenere una nuova ricompensa, scatenando una anomalia caotica. Un''entità sconosciuta è evocata dall''etere. Si avvicina e ne deriva una battaglia del caos... +lblAllPlanesUnlocked=Tutti i piani sbloccati +lblReceivedBoosterPack=Hai ricevuto un Booster Pack +lblReceivedBoosterPackNOfTotal=Hai ricevuto dei Booster Pack\n({0} of {1}) +lblReceivedAetherShards=Hai ricevuto dei frammenti d''etere +lblReceivedAetherShardsForDuplicateCards=Hai ricevuto dei frammenti d''etere per i doppioni delle carte +lblReceivedBonusPlaneswalkEmblems=Hai ricevuto un emblema di planeswalker bonus +lblStartingBattle=Comincia la battaglia... +lblChaosApproaching=Il Caos si avvicina... +lblBattle=Battaglia #ConquestDeckEditor.java -lblConquestCommander=Conquest Commander +lblConquestCommander=Generale della Conquista #ConquestPlaneSelector.java -lblThisPlaneHasNoDesc=This plane has no description. +lblThisPlaneHasNoDesc=Questo piano non ha descrizione. #ConquestUtil.java -lblHistoriiansWillRecallYourConquestAs=Historians will recall your conquest as: -lblConquestName=Conquest Name +lblHistoriiansWillRecallYourConquestAs=Gli storici ricorderanno la tua Conquista come: +lblConquestName=Nome della Conquista #HumanCostDecision.java -lblChooseXValueForCard={0} - Choose a Value for X -lblSelectOneSameNameCardToDiscardAlreadyChosen=Select one of the cards with the same name to discard. Already chosen: -lblSelectOneDifferentNameCardToDiscardAlreadyChosen=Select one of the cards with a different name to discard. Already chosen: -lblSelectNMoreTargetTypeCardToDiscard=Select {0} more {1} to discard. -lblDoYouWantCardDealNDamageToYou=Do you want {0} to deal {1} damage to you? -lblDrawNCardsConfirm=Draw {0} Card(s)? -lblExileConfirm=Exile {0}? -lblExileNCardsFromYourZone=Exile {0} card(s) from your {1} -lblExileFromWhoseZone=Exile from whose {0} -lblExileProgressFromZone=Exile {0}/{1} from {2} -lblToBeExiled=To be exiled -lblExileFromStack=Exile from Stack -lblExileNCardFromYourTopLibraryConfirm=Exile {0} card from the top of your library? -lblChooseAnExiledCardPutIntoGraveyard=Choose an exiled card to put into graveyard -lblToGraveyard=To graveyard -lblExertCardConfirm=Exert {0}? -lblSelectACostToExert=Select a {0} to exert ({1} left) -lblGainNTargetControl=Gain control of {0} {1} -lblCardChooseAnOpponentToGainNLife={0} - Choose an opponent to gain {1} life -lblMillNCardsFromYourLibraryConfirm=Mill {0} card(s) from your library? -lblPayNLifeConfirm=Pay {0} life? -lblPayEnergyConfirm={0}?\n(You have {1} {2}) -lblPutCardToLibraryConfirm=Put {0} to library? -lblPutNCardsFromYourZone=Put {0} card(s) from your {1} -lblFromZonePutToLibrary=Put from {0} to library -lblPutCardsFromWhoseZone=Put cards from whose {0}? -lblPutZoneCardsToLibrary=Put cards from {0} to Library -lblPutNTypeCounterOnTarget=Put {0} {1} counter on {2} -lblReturnCardToHandConfirm=Return {0} to hand? -lblNTypeCardsToHand=Return {0} {1} card(s) to Hand -lblSelectNCardOfSameColorToReveal=Select {0} Card of same color to reveal. -lblSelectNMoreTypeCardsTpReveal=Select {0} more {1} card(s) to reveal. -lblSelectTargetCounter=Select {0} to remove a counter -lblRemoveCounterFromCard=remove counter from card -lblRemoveAllCountersConfirm=Remove all counters? -lblRemoveNTargetCounterFromCardPayCostConfirm=Pay Cost: Remove {0} {1} counter from {2}? -lblRemoveCountersFromAInZoneCard=Remove counter(s) from a card in {0} -lblSacrificeCardConfirm=Sacrifice {0}? -lblSelectATargetToSacrifice=Select a {0} to sacrifice ({1} left) -lblSelectOneOfCardsToTapAlreadyChosen=Select one of the cards to tap. Already chosen: -lblSelectACreatureToTap=Select a creature to tap. -lblEnoughValidCardNotToPayTheCost=Not enough valid cards left to tap to pay the cost. -lblCostPaymentInvalid=Cost payment invalid -lblSelectATargetToTap=Select a {0} to tap ({1} left) -lblSelectATargetToUntap=Select a {0} to untap ({1} left) -lblUnattachCardConfirm=Unattach {0}? +lblChooseXValueForCard={0} - Scegli un valore per X +lblSelectOneSameNameCardToDiscardAlreadyChosen=Seleziona una delle carte con lo stesso nome da scartare. Già scelto: +lblSelectOneDifferentNameCardToDiscardAlreadyChosen=Seleziona una delle carte con un nome diverso da scartare. Già scelto: +lblSelectNMoreTargetTypeCardToDiscard=Seleziona altre{0} {1} da scartare. +lblDoYouWantCardDealNDamageToYou=Vuoi che {0} ti infligga {1} danno/i? +lblDrawNCardsConfirm=Vuoi pescare {0} carta/e? +lblExileConfirm=Vuoi esiliare {0}? +lblExileNCardsFromYourZone=Esilia {0} carta/e dal tuo {1} +lblExileFromWhoseZone=Esilia da quale {0} +lblExileProgressFromZone=Esilia {0}/{1} da {2} +lblToBeExiled=Saranno esiliati +lblExileFromStack=Esilia dalla Pila +lblExileNCardFromYourTopLibraryConfirm=Vuoi esiliare {0} carta/e dalla cima del tuo grimorio? +lblChooseAnExiledCardPutIntoGraveyard=Scegli una carta esiliata da mettere nel tuo cimitero +lblToGraveyard=Al cimitero +lblExertCardConfirm=Vuoi stremare {0}? +lblSelectACostToExert=Seleziona una carta {0} per stremare ({1} rimasta/e) +lblGainNTargetControl=Ottieni il controllo di {0} {1} +lblCardChooseAnOpponentToGainNLife={0} - Scegli un avversario per fargli guadagnare {1} punti vita +lblMillNCardsFromYourLibraryConfirm=Vuoi macinare {0} carta/e dal tuo grimorio? +lblPayNLifeConfirm=Vuoi pagare {0} punti vita? +lblPayEnergyConfirm={0}?\n(Hai {1} {2}) +lblPutCardToLibraryConfirm=Vuoi mettere {0} nel grimorio? +lblPutNCardsFromYourZone=Vuoi mettere {0} carta/e dal tuo {1} +lblFromZonePutToLibrary=Metti da {0} al cimitero +lblPutCardsFromWhoseZone=Metti le carte da quale {0}? +lblPutZoneCardsToLibrary=Metti le carte da {0} nel grimorio +lblPutNTypeCounterOnTarget=Metti {0} segnalini {1} su {2} +lblReturnCardToHandConfirm=Vuoi far ritornare {0} in mano? +lblNTypeCardsToHand=Fai ritornare {0} carta/e {1} in mano +lblSelectNCardOfSameColorToReveal=Seleziona {0} carta dello stesso colore da rivelare. +lblSelectNMoreTypeCardsTpReveal=Seleziona ancora {0} carta/e {1} da rivelare. +lblSelectTargetCounter=Seleziona una carta {0} da cui rimuovere un segnalino +lblRemoveCounterFromCard=rimuovi un segnalino dalla carta +lblRemoveAllCountersConfirm=Vuoi rimuovere tutti i segnalini? +lblRemoveNTargetCounterFromCardPayCostConfirm=Paga il costot: Vuoi rimuovere {0} segnalini {1} da {2}? +lblRemoveCountersFromAInZoneCard=Rimuovi segnalini da una carta in {0} +lblSacrificeCardConfirm=Vuoi sacrificare {0}? +lblSelectATargetToSacrifice=Seleziona una carta {0} da scarificare ({1} rimasta/e) +lblSelectOneOfCardsToTapAlreadyChosen=Seleziona una delle carta da tappare. Già scelto: +lblSelectACreatureToTap=Seleziona una creatura da tappare. +lblEnoughValidCardNotToPayTheCost=Non sono rimaste abbastanza carte valide da tappare per pagare il costo +lblCostPaymentInvalid=Pagamento del costo non valido +lblSelectATargetToTap=Seleziona una carta {0} da tapapre ({1} rimasta/e) +lblSelectATargetToUntap=Seleziona una carta {0} da stappare ({1} rimasta/e) +lblUnattachCardConfirm=Vuoi rimuovere l''assegnazione di {0}? #ReplacementHandler.java -lblChooseFirstApplyReplacementEffect=Choose a replacement effect to apply first. -lblApplyCardReplacementEffectToCardConfirm=Apply replacement effect of {0} to {1}?\r\n{2} -lblApplyReplacementEffectOfCardConfirm=Apply replacement effect of {0}?\r\n{1} +lblChooseFirstApplyReplacementEffect=Scegli un effetto di sostituzione da applicare per primo. +lblApplyCardReplacementEffectToCardConfirm=Vuoi applicare l''effetto di sostituzione di {0} a {1}?\r\n{2} +lblApplyReplacementEffectOfCardConfirm=Vuoi applicare l''effetto di sostituzione di {0}?\r\n{1} #SleeveSelector.java -lblSelectSleevesFroPlayer=Select Sleeves for {0} +lblSelectSleevesFroPlayer=Seleziona le buste per {0} #SEditorIO.java -lblPleaseTitleBoxNameYourDeck=Please name your deck using the ''Title'' box. -lblSaveErrorWarning=Save Error! -lblThisWillCreateNewDeckNameIs=This will create a new deck named {0}. Continue? -lblCreateDeckConfirm=Create Deck? -lblSaveChangesConfirm=Save Changes? +lblPleaseTitleBoxNameYourDeck=Dai un nome al tuo mazzo utilizzando la casella ''Titolo''. +lblSaveErrorWarning=Errore di salvataggio +lblThisWillCreateNewDeckNameIs=Stai per creare un nuovo mazzo chiamato {0}. Confermi? +lblCreateDeckConfirm=Vuoi creare il mazzo? +lblSaveChangesConfirm=Vuoi salvare le modifiche? #CCardScript.java -lblSaveChangesToDestConfirm=Save Changes to {0}? +lblSaveChangesToDestConfirm=Vuoi salvare le modifiche a {0}? #BugReporter.java -lblReport=Report -lblDiscardError=Discard -lblAutoSubmitBugReports=Submit bug reports automatically -lblReportCrash=Report a crash -lblThereErrorWasDuringSaving=There was an error during saving. Sorry!\n{0} -lblErrorSavingFile=Error saving file +lblReport=Invia +lblDiscardError=Ignora +lblAutoSubmitBugReports=Invia automaticamente le segnalazioni di errore +lblReportCrash=Invia la segnalazione di un blocco del programma +lblThereErrorWasDuringSaving=C''è stato un errore durante il salvataggio. Ci dispiace!\n{0} +lblErrorSavingFile=Errore durante il salvataggio del file #CardDetailPanel.java -lblCardNameAndCost=Card Name and Cost -lblCardType=Card Type -lblCardID=Card ID -lblCardPTOrLoyalty=Card P/T or Loyalty +lblCardNameAndCost=Nome della carta e costo +lblCardType=Tipo di carta +lblCardID=ID della carta +lblCardPTOrLoyalty=Forza/Costituzione della carta o fedeltà #ArcaneMaster.java -lblArcaneMaster=Arcane Master -lblWinGameWithOutCasting=Win a game without casting -lblMore3Spells=more than 3 spells -lblMore2Spells=more than 2 spells -lblMore1Spell=more than 1 spell -lblAnySpells=any spells -lblSpell=Spell +lblArcaneMaster=Maestro dell''Arcano +lblWinGameWithOutCasting=Vinci una partita senza lanciare +lblMore3Spells=più di 3 magie +lblMore2Spells=più di 2 magie +lblMore1Spell=più di 1 magia +lblAnySpells=alcuna magia +lblSpell=Magia #Blackjack.java -lblBlackjack=Blackjack -lblWinGameFromYourCommanderDealing=Win a game from your commander dealing -lblNCombatDamage={0} combat damage -lblDamage=Damage +lblBlackjack=Mano pesante +lblWinGameFromYourCommanderDealing=Vinci una partita grazie al tuo Generale che ha inflitto +lblNCombatDamage={0} danni da combattimento +lblDamage=Danno #ChallengeAchievements.java -lblChromatic=Chromatic -lblWinGameAfterCasting5CSpell=Win a game after casting a 5 color spell -lblGreatColorComesPower=With great color requirements comes great power. -lblEpic=Epic -lblWinGameAfterResolvingWithEpicSpell=Win a game after resolving a spell with the Epic keyword -lblWhenItsYouLastSpellBetterMakeCount=When it''s the last spell you ever cast, you better make it count! -lblWinGameUsingTargetDeck=Win a game using a deck {0} +lblChromatic=Cromatico +lblWinGameAfterCasting5CSpell=Vinci una partita dopo aver lanciato una magia penta-colore +lblGreatColorComesPower=La forza dei colori. +lblEpic=Epic Win +lblWinGameAfterResolvingWithEpicSpell=Vinci una partita dopo aver risolto una magia Epica +lblWhenItsYouLastSpellBetterMakeCount=Quando lanci la tua ultima magia, meglio faccia qualcosa! +lblWinGameUsingTargetDeck=Vinci una partita usando un mazzo {0} #DeckedOut.java -lblDeckedOut=Decked Out -lblWinGameFromOpponent=Win a game from opponent -lblDrawingEmptyLibrary=drawing into an empty library -lblDrawingEmptyLibraryByNTurn=drawing into an empty library by turn {0} +lblDeckedOut=Smazzato +lblWinGameFromOpponent=Vinci una partita perché un avversario +lblDrawingEmptyLibrary=ha pescato da un grimorio vuoto +lblDrawingEmptyLibraryByNTurn=ha pescato da un grimorio vuoto entro il turno {0} #Domain.java -lblDomain=Domain -lblWinGameWithOneOfEachBasicLandOnTheBattlefield=Win a game with one of each basic land on the battlefield -lblAbleToCastAnytingNiceBeing=It''s nice being able to cast anything you want +lblDomain=Dominio +lblWinGameWithOneOfEachBasicLandOnTheBattlefield=Vinci una partita con una terra base per tipo nel campo di battaglia +lblAbleToCastAnytingNiceBeing=È piacevole poter lanciare tutto ciò che vuoi #GameWinStreak.java -lblGameWinStreak=Game Win Streak -lblWinNGamesInARow=Win {0} games in a row +lblGameWinStreak=Serie di vittorie +lblWinNGamesInARow=Vinci {0} partite di fila #Hellbent.java -lblHellbent=Hellbent -lblWinGameWithNoCardsInYour=Win a game with no cards in your -lblhandOrlibrary=hand or library -lblHandOrLibraryOrGraveyard=hand, library, or graveyard -lblHandOrLibraryOrGraveyardOrBattlefield=hand, library, graveyard, or battlefield +lblHellbent=Determinazione +lblWinGameWithNoCardsInYour=Vinci una partita senza carte in +lblhandOrlibrary=mano e grimorio +lblHandOrLibraryOrGraveyard=mano, grimorio e cimitero +lblHandOrLibraryOrGraveyardOrBattlefield=mano, grimorio, cimitero e campo di battaglia #LifeToSpare.java -lblLifeToSpare=Life to Spare -lblWinGameWith=Win a game with -lblMoreThanStartedLifeN={0} life more than you started with +lblLifeToSpare=Vita da vendere +lblWinGameWith=Vinci una partita con +lblMoreThanStartedLifeN={0} punti vita in più di quelli con cui hai iniziato #ManaFlooded.java -lblManaFlooded=Mana Flooded -lblWinGameWithLeast=Win a game with at Least -lblNLandOnTheBattlefield={0} lands on the battlefield -lblLand=Land +lblManaFlooded=Inondazione di mana +lblWinGameWithLeast=Vinci una partita con almeno +lblNLandOnTheBattlefield={0} terre nel campo di battaglia +lblLand=Terra #ManaScrewed.java -lblManaScrewed=Mana Screwed -lblWinGameOnlyPlaing=Win a game despite playing only -lblNLands={0} land(s) +lblManaScrewed=Fregato dal mana +lblWinGameOnlyPlaing=Vinci una partita pur avendo giocato solo +lblNLands={0} terra/e #MatchWinStreak.java -lblMatchWinStreak=Match Win Streak -lblWinNMatchesInARow=Win {0} matches in a row +lblMatchWinStreak=Serie di vittorie (Incontri) +lblWinNMatchesInARow=Vinci {0} incontri di fila #NeedForSpeed.java -lblNeedForSpeed=Need for Speed -lblWinGameByNTurn=Win a game by turn {0} +lblNeedForSpeed=Achille piè veloce +lblWinGameByNTurn=Vinci una partita entro il turno {0} #NoCreatures.java -lblNoCreatures=No Creatures -lblWithNoCreatures=with no creatures -lblIMNotReallyAnimalPerson=I''m not really an animal person. +lblNoCreatures=Niente Creature +lblWithNoCreatures=senza creature +lblIMNotReallyAnimalPerson=Non son tanto amante degli animali. #NoLands.java -lblNoLands=No Lands -lblWithNoLands=with no lands -lblIMorePreferManaFromArtificial=I prefer mana from more artificial sources. +lblNoLands=Niente terre +lblWithNoLands=senza terre +lblIMorePreferManaFromArtificial=Preferisco il mana che proviene da fonti più artificiali. #NoSpells.java -lblNoSpells=No Spells -lblWithOnlyCreaturesAndLands=with only creatures and lands -lblILetMyArmyTalking=I let my army do the talking. +lblNoSpells=Niente magie +lblWithOnlyCreaturesAndLands=solo con terre e creature +lblILetMyArmyTalking=Faccio parlare il mio esercito. #Overkill.java -lblOverkill=Overkill -lblWinGameWithOppentAt=Win a game with opponent at -lblNLife={0} life +lblOverkill=Esagerato +lblWinGameWithOppentAt=Vinci una partita portando un avversario a +lblNLife={0} punti vita #PlaneswalkerAchievements.java -lblPlaneswalkerUltimates=Planeswalker Ultimates -lblWinGameAfterActivatingCardUltimate=Win a game after activating {0} ultimate +lblPlaneswalkerUltimates=Planeswalker Ultimate +lblWinGameAfterActivatingCardUltimate=Vinci una partita attivando la ''ultimate'' di {0} #Poisoned.java -lblPoisoned=Poisoned -lblWinGameByGivingOppoent=Win a game by giving opponent -lblNPoisonCounters={0} poison counters -lblCounter=Counter +lblPoisoned=Avvelenato +lblWinGameByGivingOppoent=Vinci una partita per aver dato a un avversario +lblNPoisonCounters={0} segnalini veleno +lblCounter=Segnalino #RagsToRiches.java -lblRagsToRiches=Rags to Riches -lblWinGameAfterMulliganingTo=Win a game after mulliganing to -lblNCards={0} card(s) +lblRagsToRiches=Per aspera ad astra +lblWinGameAfterMulliganingTo=Vinci una partita dopo aver mulligato a +lblNCards={0} carta/e #StormChaser.java -lblStormChaser=Storm Chaser -lblWinGameAfterCasting=Win a game after casting -lblNSpellInSingleTurn={0} spells in a single turn +lblStormChaser=La tempesta perfetta +lblWinGameAfterCasting=Vinci una partita dopo aver giocato +lblNSpellInSingleTurn={0} magie in un sol turno #TotalGameWins.java -lblTotalGameWins=Total Game Wins -lblWinNGames=Win {0} games +lblTotalGameWins=Vittorie complessive +lblWinNGames=Vinci {0} partite #TotalMatchWins.java -lblTotalMatchWins=Total Match Wins -lblWinNMatches=Win {0} Matches -lblMatch=Match +lblTotalMatchWins=Vittorie complessive - incontri +lblWinNMatches=Vinci {0} incontri +lblMatch=Incontro #TotalPuzzlesSolved.java -lblTotalPuzzlesSolved=Total Puzzles Solved -lblSolveNPuzzles=Solve {0} puzzles +lblTotalPuzzlesSolved=Puzzle risolti +lblSolveNPuzzles=Risolvi {0} puzzle #VariantWins.java -lblWinNVariantGame=Win {0} {1} game +lblWinNVariantGame=Vinci {0} partite {1} #AbstractMulligan.java -lblPlayerKeepNCardsHand={0} has kept a hand of {1} cards +lblPlayerKeepNCardsHand={0} ha tenuto una mano di {1} carte #VSubmenuAvatars.java -lblAvatars=Avatars +lblAvatars=Avatar #AltWinAchievements.java -lblAlternateWinConditions=Alternate Win Conditions -lblWinGameWithCard=Win a game with {0} +lblAlternateWinConditions=Vittorie alternative +lblWinGameWithCard=Vinci una partita con {0} #VSubmenuOnlineLobby.java -lblLobby=Lobby -lblConnectToServer=Connect to Server -lblOnlineLobbyTitle=Online Multiplayer: Lobby -lblLeaveLobbyConfirm=Leave lobby? -lblLeaveLobbyDescription=Leave lobby? Doing so will shut down all connections and stop hosting. +lblLobby=Locanda +lblConnectToServer=Connettiti a un server +lblOnlineLobbyTitle=Partita multi-giocatore online: Locanda +lblLeaveLobbyConfirm=Vuoi lasciare la Locanda? +lblLeaveLobbyDescription=Vuoi lasciare la Locanda? Così facendo terminerai tutte le connessioni e concluderai l''hosting. #VDetail.java -lblCardDetail=Card Detail +lblCardDetail=Dettagli della carta #VCardDesigner.java -lblCardDesigner=Card Designer -lblSaveAndApplyCardChanges=Save and Apply Card Changes +lblCardDesigner=Designer della carta +lblSaveAndApplyCardChanges=Salva e applica le modifiche alla carta #VCardScript.java -lblCardScript=Card Script +lblCardScript=Script della carta #VPicture.java -lblCardPicture=Card Picture +lblCardPicture=Immagine della carta #VProbabilities.java -lblDrawOrder=Draw Order -lblClickHereToReshuffle=CLICK HERE TO RE-SHUFFLE -lblSeeANewSampleShuffle=See a new sample shuffle -lblSampleHand=SAMPLE HAND -lblRemainingDraws=REMAINING DRAWS +lblDrawOrder=Ordine di pescata +lblClickHereToReshuffle=CLICCA QUI PER RIMESCOLARE +lblSeeANewSampleShuffle=Vedi un nuovo esempio +lblSampleHand=MANO DI ESEMPIO +lblRemainingDraws=PESCATE RIMANENTI #VStatistics.java -lblTotalCards=Total cards -lblTotalManaCost=Total mana cost -lblAverageManaCost=Average mana cost -lblCardByColorTypeCMC=CARDS BY COLOR, TYPE AND CMC: -lblBreakdownOfColorTypeCMC=Breakdown of cards by color, type and CMC -lblColoredManaSymbolsINManaCost=COLORED MANA SYMBOLS IN MANA COST: -lblAmountOfManaSymbolsInManaCostOfCards=Amount of mana symbols in mana cost of cards -lblMulticolorCardCount=Multicolor Card Count -lblBlackCardCount=Black Card Count -lblBlueCardCount=Blue Card Count -lblGreenCardCount=Green Card Count -lblRedCardCount=Red Card Count -lblWhiteCardCount=White Card Count -lblColorlessCardCount=Colorless Card Count -lblBlackManaSymbolCount=Black Mana Symbol Count -lblBlueManaSymbolCount=Blue Mana Symbol Count -lblGreenManaSymbolCount=Green Mana Symbol Count -lblRedManaSymbolCount=Red Mana Symbol Count -lblWhiteManaSymbolCount=White Mana Symbol Count -lblArtifactCardCount=Artifact Card Count -lblCreatureCardCount=Creature Card Count -lblEnchantmentCardCount=Enchantment Card Count -lblInstantCardCount=Instant Card Count -lblLandCardCount=Land Card Count -lblPlaneswalkerCardCount=Planeswalker Card Count -lblSorceryCardCount=Sorcery Card Count -lblCMCNCardCount=CMC {0} Card Count +lblTotalCards=Carte totali +lblTotalManaCost=Costo di mana complessivo +lblAverageManaCost=Costo di mana medio +lblCardByColorTypeCMC=CARTE SUDDIVISE PER COLORE, TIPO E CMC +lblBreakdownOfColorTypeCMC=Suddivisione delle carte per colore, tipo e CMC +lblColoredManaSymbolsINManaCost=SIMBOLI DI MANA COLORATO NEL COSTO: +lblAmountOfManaSymbolsInManaCostOfCards=Numero di simboli di mana nel costo della carta +lblMulticolorCardCount=Numero di carte multicolore +lblBlackCardCount=Numero di carte nere +lblBlueCardCount=Numero di carte blu +lblGreenCardCount=Numero di carte verdi +lblRedCardCount=Numero di carte rosse +lblWhiteCardCount=Numero di carte bianche +lblColorlessCardCount=Numero di carte incolore +lblBlackManaSymbolCount=Numero di simboli di mana nero +lblBlueManaSymbolCount=Numero di simboli di mana blu +lblGreenManaSymbolCount=Numero di simboli di mana verde +lblRedManaSymbolCount=Numero di simboli di mana rosso +lblWhiteManaSymbolCount=Numero di simboli di mana bianco +lblArtifactCardCount=Numero di carte artefatto +lblCreatureCardCount=Numero di carte creatura +lblEnchantmentCardCount=Numero di carte incantesimo +lblInstantCardCount=Numero di carte istantaneo +lblLandCardCount=Numero di carte terra +lblPlaneswalkerCardCount=Numero di carte planeswalker +lblSorceryCardCount=Numero di carte stregoneria +lblCMCNCardCount=Numero di carte con CMC {0} #FFileChooser.java -lblNewFolder=New Folder -lblInvalidFolder=Invalid Folder -lblInvalidName=Invalid Name -lblInvalidFile=Invalid File -lblCannotAddNewFolderToInvaildFolder=Cannot add new folder to invalid folder. -lblEnterNewFolderName=Enter name for new folder -lblEnterFolderNameNotValid="{0}" is not a valid folder name. -lblNoFolderExistsWithSelectPath=No folder exists with the selected path. -lblNoFileExistsWithSelectPath=No file exists with the selected path. -lblCannotRenameFileInInvalidFolder=Cannot rename file in invalid folder. -lblEnterNewNameForFolder=Enter new name for folder -lblEnterNewNameForFile=Enter new name for file -lblEnterNameNotValid="{0}" is not a valid name. -lblAreYouSureProceedDelete=Are you sure you wish to proceed with delete? This action cannot be undone. -lblDeleteFolder=Delete Folder -lblDeleteFile=Delete File -lblRenameFolder=Rename Folder -lblRenameFile=Rename File -lblCouldBotDeleteFile=Could not delete file. +lblNewFolder=Nuova cartella +lblInvalidFolder=Cartella non valida +lblInvalidName=Nome non valido +lblInvalidFile=File non valido +lblCannotAddNewFolderToInvaildFolder=Non è possibile aggiungere una nuova cartella a una cartella non valida +lblEnterNewFolderName=Inserisci il nome per la nuova cartella +lblEnterFolderNameNotValid="{0}" non è un nome valido per la cartella. +lblNoFolderExistsWithSelectPath=Non ci sono cartelle nel percorso indicato. +lblNoFileExistsWithSelectPath=Non ci sono file nel percorso indicato. +lblCannotRenameFileInInvalidFolder=Non è possibile rinominare il file in una cartella non valida. +lblEnterNewNameForFolder=Inserisci un nuovo nome per la cartella +lblEnterNewNameForFile=Inserisci un nuovo nome per il file +lblEnterNameNotValid="{0}" non è un nome valido. +lblAreYouSureProceedDelete=Vuoi procedere con l''eliminazione? Questa operazione è irreversibile. +lblDeleteFolder=Elimina cartella +lblDeleteFile=Elimina file +lblRenameFolder=Rinomina cartella +lblRenameFile=Rinomina file +lblCouldBotDeleteFile=Non è possibile eliminare il file. #FloatingZone.java -lblRightClickToUnSort=- sorted by name (right click in title to not sort) -lblRightClickToSort=(right click in title to sort) +lblRightClickToUnSort=- ordinamento per nome (clic destro sul titolo per non ordinare) +lblRightClickToSort=(clic destro sul titolo per ordinare) lblPlayerZoneNCardSortStatus={0} {1} ({2}) {3} #OnlineMenu.java lblOnline=Online -lblShowChatPanel=Show Chat Panel -lblDisconnect=Disconnect +lblShowChatPanel=Mostra pannello della chat +lblDisconnect=Sconnettiti #CardOverlaysMenu.java -lblCardName=Card Name -lblPowerOrToughness=Power/Toughness -lblAbilityIcon=Ability Icon -lblShow=Show +lblCardName=Nome della carta +lblPowerOrToughness=Forza/Costituzione +lblAbilityIcon=Icona dell''abilità +lblShow=Mostra #VField.java -lblField=Field -lblPlayField={0} Field -lblNoPlayerForEDocID=NO PLAYER FOR {0} +lblField=Campo +lblPlayField={0} Campo +lblNoPlayerForEDocID=NESSUN GIOCATORE PER {0} #VHand.java -lblYourHand=Your Hand -lblPlayerHand={0} Hand -lblNoPlayerHand=NO PLAYER Hand +lblYourHand=La tua mano +lblPlayerHand=Mano di {0} +lblNoPlayerHand=Mano di NESSUN GIOCATORE #PlayerDetailsPanel.java -lblHandNOfMax=Hand ({0}/{1}) -lblGraveyardNCardsNTypes=Graveyard ({0}) Types[{1}] -lblLibraryNCards=Library ({0}) -lblExileNCards=Exile ({0}) -lblFlashbackNCards=Flashback cards ({0}) -lblCommandZoneNCards=Command zone ({0}) -lblWhiteManaOfN=White mana ({0}) -lblBlueManaOfN=Blue mana ({0}) -lblBlackManaOfN=Black mana ({0}) -lblRedManaOfN=Red mana ({0}) -lblGreenManaOfN=Green mana ({0}) -lblColorlessManaOfN=Colorless mana ({0}) +lblHandNOfMax=Mano ({0}/{1}) +lblGraveyardNCardsNTypes=Cimitero ({0}) Tipi [{1}] +lblLibraryNCards=Grimorio ({0}) +lblExileNCards=Esilio ({0}) +lblFlashbackNCards=Carte Flashback ({0}) +lblCommandZoneNCards=Zona di Comando ({0}) +lblWhiteManaOfN=Mana Bianco ({0}) +lblBlueManaOfN=Mana Blu ({0}) +lblBlackManaOfN=Mana Nero ({0}) +lblRedManaOfN=Mana Rosso ({0}) +lblGreenManaOfN=Mana Verde ({0}) +lblColorlessManaOfN=Mana Incolore ({0}) #FTitleBarBase.java -lblLockTitleBar=lock Title Bar -lblUnlockTitleBar=Unlock Title Bar -lblRestoreDown=Restore Down -lblMaximize=Maximize -lblMinimize=Minimize +lblLockTitleBar=Blocca barra del titolo +lblUnlockTitleBar=Sblocca barra del titolo +lblRestoreDown=Ripristina +lblMaximize=Massimizza +lblMinimize=Minimizza #QuestFileLister.java -lblNameAndRank=Name | Rank -lblModeAndDifficulty=Mode | Difficulty -lblRecordAndAssets=Record | Assets -lblXWinOfYLost={0} W/{1} L -lblDeleteThisQuest=Delete this quest -lblRenameThisQuest=Rename this quest -lblRenameQuestTo=Rename quest to -lblQuestRename=Quest Rename +lblNameAndRank=Nome | Rango +lblModeAndDifficulty=Modo | Difficoltà +lblRecordAndAssets=Record | Risorse +lblXWinOfYLost={0} V/{1} S +lblDeleteThisQuest=Elimina questa Avventura +lblRenameThisQuest=Rinomina questa Avventura +lblRenameQuestTo=Rinomina l''Avventura: +lblQuestRename=Rinomina Avventura #StartingPoolType.java -lblUnrestricted=Unrestricted -lblCasualOrHistoricFormat=Casual/Historic format -lblCustomFormat=Custom format -lblEventOrStartDeck=Event or starter deck -lblMySealedDeck=My sealed deck -lblMyDraftDeck=My draft deck -lblPredefinedCube=Predefined cube +lblUnrestricted=Senza restrizioni +lblCasualOrHistoricFormat=A caso/Historic formato +lblCustomFormat=Formato personalizzato +lblEventOrStartDeck=Mazzo evento o principiante +lblMySealedDeck=Il mio mazzo Sealed +lblMyDraftDeck=Il mio mazzo Draft +lblPredefinedCube=Cubo personalizzato #DevModeMenu.java -lblDeveloperCorner=Developer''s Corner +lblDeveloperCorner=Angolo sviluppatori #CSubmenuPuzzleSolve.java -lblPleaseFirstSelectAPuzzleFromList=Please select a puzzle from the list first! -lblNoSelectedPuzzle=No puzzle selected +lblPleaseFirstSelectAPuzzleFromList=Prima seleziona un puzzle dalla lista! +lblNoSelectedPuzzle=Nessun puzzle selezionato #CSubmenuPuzzleCreate.java -lblWhoShouldBeFirstTakeTurn=Who should be the first to take a turn? -lblWelcomePuzzleModeMessage=Welcome to the Create a Puzzle mode.\n\nPlease make sure that Developer Mode is enabled in Forge preferences.\nRemember that rule enforcement is active, so players will lose the game\nfor drawing from empty library! +lblWhoShouldBeFirstTakeTurn=Chi deve iniziare il turno per primo? +lblWelcomePuzzleModeMessage=Modalità Crea un puzzle.\n\nAssicurati che la modalità sviluppatore sia attivata nelle preferenze di Forge.\nRicorda che l''applicazione delle regole è sempre in vigore, per cui i giocatore perdono\nse pescano da un grimorio vuoto! #CDock.java -lblTargetingArcsOff=Targeting arcs: Off -lblTargetingArcsCardMouseover=Targeting arcs: Card mouseover -lblTargetingArcsAlwaysOn=Targeting arcs: Always on +lblTargetingArcsOff=Indicatori dei bersagli: Spenti +lblTargetingArcsCardMouseover=Indicatori dei bersagli: Mouse sopra alla carta +lblTargetingArcsAlwaysOn=Indicatori dei bersagli: Sempre attivi #ListCardArea.java -lblDone=Done +lblDone=Fatto #DeckImport.java -lblSideboardSummayLine=Line for sideboard summary -lblImportedDeckSummay=Imported deck summary will appear here -lblDeckImporter=Deck Importer -lblPasteTypeDecklist=Paste or type a decklist -lblExpectRecognizedLines=Expect the recognized lines to appear -lblDeckImporterSummaryOfMain=Main: {0} cards recognized, {1} unknown cards -lblDeckImporterSummaryOfSideboard=Sideboard: {0} cards recognized, {1} unknown cards +lblSideboardSummayLine=Riga per la lista del sideboard +lblImportedDeckSummay=La lista del mazzo importato comparirà qui +lblDeckImporter=Importa mazzi +lblPasteTypeDecklist=Incolla o inserisci una lista +lblExpectRecognizedLines=Aspettati che le righe riconosciute appariranno nel mazzo +lblDeckImporterSummaryOfMain=Main: {0} carte riconosciute, {1} carte sconosciute +lblDeckImporterSummaryOfSideboard=Sideboard: {0} carte riconosciute, {1} carte sconosciute #CEditorTokenViewer.java -lblAllTokens=All Tokens +lblAllTokens=Tutti i segnalini #StartRenderer.java -lblClickToAddTargetToFavorites=Click to add {0} to your favorites -lblClickToRemoveTargetToFavorites=Click to remove {0} to your favorites +lblClickToAddTargetToFavorites=Clicca per aggiungere {0} ai preferiti +lblClickToRemoveTargetToFavorites=Clicca per rimuovere {0} ai preferiti #PhaseIndicator.java #translate html*** please keep HTML Tags -htmlPhaseUpkeepTooltip=Phase: Upkeep
Click to toggle. -htmlPhaseDrawTooltip=Phase: Draw
Click to toggle. -htmlPhaseMain1Tooltip=Phase: Main 1
Click to toggle. -htmlPhaseBeginCombatTooltip=Phase: Begin Combat
Click to toggle. -htmlPhaseDeclareAttackersTooltip=Phase: Declare Attackers
Click to toggle. -htmlPhaseDeclareBlockersTooltip=Phase: Declare Blockers
Click to toggle. -htmlPhaseFirstStrikeDamageTooltip=Phase: First Strike Damage
Click to toggle. -htmlPhaseCombatDamageTooltip=Phase: Combat Damage
Click to toggle. -htmlPhaseEndCombatTooltip=Phase: End Combat
Click to toggle. -htmlPhaseMain2Tooltip=Phase: Main 2
Click to toggle. -htmlPhaseEndTurnTooltip=Phase: End Turn
Click to toggle. -htmlPhaseCleanupTooltip=Phase: Cleanup
Click to toggle. +htmlPhaseUpkeepTooltip=Fase: Mantenimento
Clic per (dis)attivare. +htmlPhaseDrawTooltip=Fase: Acquisizione
Clic per (dis)attivare. +htmlPhaseMain1Tooltip=Fase: Principale 1
Clic per (dis)attivare. +htmlPhaseBeginCombatTooltip=Fase: Inizio combattimento
Clic per (dis)attivare. +htmlPhaseDeclareAttackersTooltip=Fase: Dichiara attaccanti
Clic per (dis)attivare. +htmlPhaseDeclareBlockersTooltip=Fase: Dichiara bloccanti
Clic per (dis)attivare. +htmlPhaseFirstStrikeDamageTooltip=Fase: Danno attacco improvviso
Clic per (dis)attivare. +htmlPhaseCombatDamageTooltip=Fase: Danno da combattimento
Clic per (dis)attivare. +htmlPhaseEndCombatTooltip=Fase: Fine combattimento
Clic per (dis)attivare. +htmlPhaseMain2Tooltip=Fase: Principale 2
Clic per (dis)attivare. +htmlPhaseEndTurnTooltip=Fase: Finale
Clic per (dis)attivare. +htmlPhaseCleanupTooltip=Fase: Cancellazione
Clic per (dis)attivare. #GuiChoose.java -lblSideboardForPlayer=Sideboard for {0} -lblOtherInteger=Other... +lblSideboardForPlayer=Sideboard per {0} +lblOtherInteger=Altro... #DeckImportController.java -lblReplaceCurrentDeckConfirm=This will replace the contents of your current deck with these cards.\n\nProceed? -lblReplaceCurrentDeck=Replace Current Deck -lblReplace=Replace +lblReplaceCurrentDeckConfirm=Stai per sostituire il contenuto del tuo mazzo con queste carte.\n\nVuoi proseguire? +lblReplaceCurrentDeck=Rimpiazza mazzo corrente +lblReplace=Rimpiazza #FNetOverlay.java lblChat=Chat -lblSend=Send +lblSend=Invia #CSubmenuOnlineLobby.java -lblUnableStartServerPortAlreadyUse=Unable to start server, port already in use! -lblStartingServer=Starting server... -lblConnectingToServer=Connecting to server... +lblUnableStartServerPortAlreadyUse=Impossibile avviare il server, porta già in uso! +lblStartingServer=Avvio server... +lblConnectingToServer=Connessione al server... #NetConnectUtil.java -lblOnlineMultiplayerDest=This feature is under active development.\nYou are likely to find bugs.\n\n - = * H E R E B E E L D R A Z I * = -\n\nEnter the URL of the server to join.\nLeave blank to host your own server. -lblHostingPortOnN=Hosting on port {0}. -lblShareURLToMakePlayerJoinServer=Share the following URL with anyone who wishes to join your server. It has been copied to your clipboard for convenience.\n\n{0}\n\nFor internal games, use the following URL: {1} -lblForgeUnableDetermineYourExternalIP=Forge was unable to determine your external IP!\n\n{0} -lblServerURL=Server URL -lblYourConnectionToHostWasInterrupted=Your connection to the host ({0}) was interrupted. -lblConnectedIPPort=Connected to {0}:{1} +lblOnlineMultiplayerDest=Questa funzione è attualmente in sviluppo.\nPotrai trovare facilmente dei bug.\n\n - = * H I C S U N T E L D R A Z I * = -\n\nInserisci l''indirizzo URL del server a cui collegarti.\nLascia vuoto per creare il tuo server personale. +lblHostingPortOnN=Ospitando sulla porta {0}. +lblShareURLToMakePlayerJoinServer=Condividi il seguente URL con chi vuole unirsi al tuo server. L''indirizzo è stato copiato negli appunti per praticità.\n\n{0}\n\nPer partite interne, usa questo URL: {1} +lblForgeUnableDetermineYourExternalIP=Forge non è riuscito a determinare il tuo indirizzo IP esterno!\n\n{0} +lblServerURL=URL del server +lblYourConnectionToHostWasInterrupted=La tua connessione all''host ({0}) si è interrotta. +lblConnectedIPPort=Connesso a {0}:{1} #GameLobby.java -lblRequiredLeastTwoPlayerStartGame=At least two players are required to start a game. -lblNotEnoughTeams=There are not enough teams! Please adjust team allocations. -lblPlayerIsNotReady=Player {0} is not ready -lblPleaseSpecifyPlayerDeck=Please specify a deck for {0} -lblPlayerDoesntHaveCommander={0} doesn''t have a commander -lblPlayerDeckError={0} deck {1} -lblInvalidCommanderGameTypeDeck=Invalid {0} Deck -lblInvalidSchemeDeck=Invalid Scheme Deck -lblInvalidPlanarDeck=Invalid Planar Deck -lblNoSelectedVanguardAvatarForPlayer=No Vanguard avatar selected for {0}. Please choose one or disable the Vanguard variant +lblRequiredLeastTwoPlayerStartGame=Sono richiesti almeno due giocatori per iniziare una partita. +lblNotEnoughTeams=Non ci sono abbastanza squadre! Correggi la ripartizione delle squadre. +lblPlayerIsNotReady=Il giocatore {0} non è pronto/a +lblPleaseSpecifyPlayerDeck=Specifica un mazzo per {0} +lblPlayerDoesntHaveCommander={0} non ha un Generale +lblPlayerDeckError=Il mazzo di {0} {1} +lblInvalidCommanderGameTypeDeck=Mazzo {0} non valido +lblInvalidSchemeDeck=Mazzo Intrighi non valido +lblInvalidPlanarDeck=Mazzo planare non valido +lblNoSelectedVanguardAvatarForPlayer=Nessun avatar Vanguard selezionato per {0}. Selezionane uno o disabilita la variante Vanguard #AutoUpdater.java -lblYouHaventSetUpdateChannel=You haven''t set an update channel. Do you want to check a channel now? -lblManualCheck=Manual Check -lblNewVersionForgeAvailableUpdateConfirm=A new version of Forge is available ({0}).\nYou are currently on version ({1})\n\nWould you like to update to the new version now? -lblUpdateNow=Update Now -lblUpdateLater=Update Later -lblNewVersionAvailable=New Version Available -lblNewVersionDownloading=Download the new version.. -lblForgeHasBeenUpdateRestartForgeToUseNewVersion=Forge has been downloaded. You should extract the package and restart Forge for the new version. -lblExitNowConfirm=Exit now? +lblYouHaventSetUpdateChannel=Non hai impostato un canale di aggiornamento. Vuoi controllarne uno ora? +lblManualCheck=Controllo manuale +lblNewVersionForgeAvailableUpdateConfirm=È disponibile una nuova versione di Forge ({0}).\nStai usando la versione ({1})\n\nVuoi aggiornare alla nuova versione ora? +lblUpdateNow=Aggiorna ora +lblUpdateLater=Aggiorna più tardi +lblNewVersionAvailable=Nuova versione disponibile +lblNewVersionDownloading=Scaricamento nuova versione... +lblForgeHasBeenUpdateRestartForgeToUseNewVersion=Forge è stato scaricato. Devi estrarre i dati dal file compresso e riavviare Forge. +lblExitNowConfirm=Vuoi uscire ora? #OnlineChatScreen.java -lblEnterMessageToSend=Enter message to send +lblEnterMessageToSend=Inserisci il messaggio da inviare #OnlineLobbyScreen.java -lblDetectedInvalidHostAddress=Invalid host address ({0}) was detected. +lblDetectedInvalidHostAddress=È stato individuato un indirizzo host non valido ({0}). #Player.java -lblChooseACompanion=Choose a companion -lblChooseAColorFor=Choose a color for {0} -lblRevealFaceDownCards=Revealing face-down cards from -lblLearnALesson=Learn a Lesson +lblChooseACompanion=Scegli un Compagno +lblChooseAColorFor=Scegli un colore per {0} +lblRevealFaceDownCards=Rivela carte a faccia in giù da +lblLearnALesson=Apprendi una Lezione #QuestPreferences.java -lblWildOpponentNumberError=Wild Opponents can only be 0 to 3 +lblWildOpponentNumberError=Gli avversari a sorpresa possono essere da 0 a 3 #GauntletWinLose.java -lblGauntletProgress=Gauntlet Progress +lblGauntletProgress=Avanzamento della Sfida #SpellAbility.java -lblInvalidTargetSpecification=Not all target requirements are met. +lblInvalidTargetSpecification=Bersagli non validi. diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index c7103db035c..b8e8e09a5ae 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -115,8 +115,10 @@ cbpAutoYieldMode=優先権の自動放棄 cbpCounterDisplayType=カウンター表示タイプ cbpCounterDisplayLocation=カウンター表示場所 cbpGraveyardOrdering=墓地に置かれるカードの順番指定を許可する -lblAltLifeDisplay=代替のプレイヤーレイアウト(ランドスケープモード時) +lblAltLifeDisplay=代替のプレイヤーライフレイアウト(ランドスケープモード時) nlAltLifeDisplay=代替のレイアウトでプレイヤーライフ、毒、エネルギーと経験カウンターを表示する +lblAltZoneTabs=代替のプレイヤーゾーンレイアウト(ランドスケープモード時) +nlAltZoneTabs=代替のレイアウトで手札、墓地、ライブラリーと除外領域を表示する lblPreferredArt=好むのアート nlPreferredArt=カードの好むのアートを設定します。 Troubleshooting=トラブルシューティング @@ -193,6 +195,8 @@ nlSrOptimize=Forge とスクリーンリーダーを上手く連動できるよ KeyboardShortcuts=キーボードショートカット cbpLandPlayed=土地が戦場に出るときの通知 nlpLandPlayed=土地が戦場に出た時いつに通知を受けたい:Never[しない]、Always[常時]、またはAIプレイヤーの行動によるの時だけ。 +cbpSwitchStates=カードの交代表示 +nlSwitchStates=デッキリスト中の両面カードや反転カードなど二つの面を交代で表示します。 #VSubmenuAchievements.java lblAchievements=実績 #VSubmenuDownloaders.java @@ -351,12 +355,21 @@ lblReset=リセット lblAuto=自動 #VAssignDamage.java lbLAssignDamageDealtBy=%sによって与えられるダメージを割り当てます -lblLClickDamageMessage=左クリック:1ダメージを割り当てます。 (Ctrl + 左クリック):残りのダメージを致死まで割り当てる -lblRClickDamageMessage=右クリック:1ダメージの割り当てを解除します。 (Ctrl + 右クリック):すべての損傷の割り当てを解除します。 +lblLClickDamageMessage=左クリック:1点ダメージを割り当てます。 (Ctrl + 左クリック):残りのダメージを致死まで割り当てます。 +lblRClickDamageMessage=右クリック:1点ダメージの割り当てを解除します。 (Ctrl + 右クリック):すべてのダメージの割り当てを解除します。 lblTotalDamageText=利用可能なダメージポイント:不明 -lblAssignRemainingText=致命傷を負ったエンティティに残りのダメージポイントを分配する +lblAssignRemainingText=致死ダメージを負ったオブジェクトに残りのダメージを割り当てます。 lblLethal=リーサル lblAvailableDamagePoints=利用可能なダメージポイント +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect={1}によって効果の{0}を割り当てます +lblLClickAmountMessage=左クリック: 1点{0}を割り当てます。 (Ctrl + 左クリック):{0}を最大まで割り当てます。 +lblRClickAmountMessage=右クリック:1点{0}の割り当てを解除します。 (Ctrl + 右クリック):すべての{0}の割り当てを解除します。 +lblTotalAmountText=残りの{0}のポイント:不明 +lblAvailableAmount=残りの{0}のポイント +lblMax=最大 +lblShield=盾 #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=スタックパネルを表示 lblSHORTCUT_SHOWCOMBAT=戦闘パネルを表示 @@ -580,7 +593,7 @@ lblQuestOpponentDecks=クエスト対戦相手のデッキ lblRandomColorDecks=ランダムカラーデッキ lblRandomStandardArchetypeDecks=ランダムアーキタイプデッキ スタンダード lblRandomPioneerArchetypeDecks=ランダムアーキタイプデッキ パイオニア -lblRandomHistoricArchetypeDecks=Random Historic Archetype Decks +lblRandomHistoricArchetypeDecks=ランダムアーキタイプデッキ ヒストリック lblRandomModernArchetypeDecks=ランダムアーキタイプデッキ モダン lblRandomLegacyArchetypeDecks=ランダムアーキタイプデッキ レガシー lblRandomVintageArchetypeDecks=ランダムアーキタイプデッキ ビンテージ @@ -1523,7 +1536,7 @@ lblPhasedIn=フェイズ・インした #TriggerPhaseOut.java lblPhasedOut=フェイズ・アウトした #TriggerRoller.java -lblRoller=Roller +lblRoller=ダイスロールした #TriggerPlaneswalkedFrom.java lblPlaneswalkedFrom=次元渡った元 #TriggerPlaneswalkedTo.java @@ -2026,7 +2039,7 @@ lblNotFoundCustomSealedFiles=カスタムシールファイルが見つかりま lblChooseCustomSealedPool=カスタムシールプールを選択 lblHowManyBoosterPacks=ブースターパックはいくつですか? #DialogChooseSets.java -lblDisplayRecentSetRepints=新しいセットからの同名の再録を表示する +lblDisplayRecentSetReprints=新しいセットからの同名の再録を表示する lblSelectRandomSets=ランダムセットを選択 lblSelectNumber=数を設定する lblCore=基本セット @@ -2042,6 +2055,7 @@ lblHideOptions=オプションを非表示 lblCoreSets=基本セット lblExpansions=エキスパンション lblOtherSets=その他のセット +lblCustomSets=カスタムエディション #CMatchUI.java lblAbilities=能力 #VAutoYields.java diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index ac77731a3f3..c18b670eaa8 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -117,6 +117,8 @@ cbpCounterDisplayLocation=计数器显示区域 cbpGraveyardOrdering=允许指衍生物进入墓地 lblAltLifeDisplay=备用牌手布局(横向模式) nlAltLifeDisplay=启用备用牌手布局以显示玩家的生命以及中毒,能量和经验指示物。 +lblAltZoneTabs=备用牌手区域布局(用于横向模式) +nlAltZoneTabs=启用用于显示牌手手牌、坟场、牌库、放逐区的备用布局。 lblPreferredArt=首选卡图 nlPreferredArt=设置牌张的首选卡图。 Troubleshooting=故障排除 @@ -193,6 +195,8 @@ nlSrOptimize=使屏幕阅读器能更好的在forge上使用 KeyboardShortcuts=键盘快捷键 cbpLandPlayed=当地牌进入战场发出通知 nlpLandPlayed=选择你是否想收到地牌进入战场的视觉通知:从不(Never),总是(always), 或者只有当地牌是因AI玩家的动作而进入战场 +cbpSwitchStates=切换卡牌状态 +nlSwitchStates=在套牌视图中显示为每个拥有异画的卡牌显示指定的异画。 #VSubmenuAchievements.java lblAchievements=成就 #VSubmenuDownloaders.java @@ -357,6 +361,15 @@ lblTotalDamageText=可用的伤害值:未知 lblAssignRemainingText=对受到致命伤害的对象分配过量的伤害 lblLethal=致死 lblAvailableDamagePoints=可用的伤害值 +#VAssignGenericAmount.java +# The {0} below should be amount label (like "shield" or "damage"), and {1} will be the name of the effect source +lbLAssignAmountForEffect=Assign {0} by {1} +lblLClickAmountMessage=Left click: Assign 1 {0}. (Left Click + Control): Assign maximum {0} points +lblRClickAmountMessage=Right click: Unassign 1 {0}. (Right Click + Control): Unassign all {0} points. +lblTotalAmountText=Available {0} points: Unknown +lblAvailableAmount=Available {0} points +lblMax=Max +lblShield=shield #KeyboardShortcuts.java lblSHORTCUT_SHOWSTACK=匹配:显示堆叠面板 lblSHORTCUT_SHOWCOMBAT=匹配:显示战斗面板 @@ -2026,7 +2039,7 @@ lblNotFoundCustomSealedFiles=找不到自定义现开文件。 lblChooseCustomSealedPool=选择自定义现开池 lblHowManyBoosterPacks=多少个补充包? #DialogChooseSets.java -lblDisplayRecentSetRepints=显示来自最新系列的重印版本 +lblDisplayRecentSetReprints=显示来自最新系列的重印版本 lblSelectRandomSets=选择随机系列 lblSelectNumber=选择数量 lblCore=核心 @@ -2041,7 +2054,8 @@ lblShowOptions=显示选项 lblHideOptions=隐藏选项 lblCoreSets=核心系列 lblExpansions=扩充 -lblOtherSets=其他系列 +lblOtherSets=闪卡系列、MO特有系列以及其他系列 +lblCustomSets=自定义系列 #CMatchUI.java lblAbilities=异能 #VAutoYields.java @@ -2251,7 +2265,7 @@ lblExileForNAE=出售获得{0}个{1} lblRetry=重试 lblQuit=退出 #ConquestMultiverseScreen.java -lblAllPlanesUnlockedNotify=你似乎不需要更多的鹏洛克徽记,你尝试轻按乙太以获得其他奖励,由于混沌的干扰。一个未知的实体被乙太召唤。它正在接近你,随之而来的是一场混沌战斗。 +lblAllPlanesUnlockedNotify=你似乎不需要更多的鹏洛克徽记,你尝试轻按乙太以获得其他奖励。由于混沌的干扰,一个未知的实体被乙太召唤。它正在接近你,随之而来的是一场混沌战斗。 lblAllPlanesUnlocked=所有时空已解锁 lblReceivedBoosterPack=获得补充包 lblReceivedBoosterPackNOfTotal=获得补充包\n({0}/{1}) diff --git a/forge-gui/res/lists/TypeLists.txt b/forge-gui/res/lists/TypeLists.txt index 367e45a1743..4956e4953e5 100644 --- a/forge-gui/res/lists/TypeLists.txt +++ b/forge-gui/res/lists/TypeLists.txt @@ -111,6 +111,7 @@ Graveborn:Graveborn Gremlin:Gremlins Griffin:Griffins Hag:Hags +Halfling:Halflings Harpy:Harpies Hellion:Hellions Hippo:Hippos @@ -201,6 +202,7 @@ Praetor:Praetors Prism:Prisms Processor:Processors Rabbit:Rabbits +Ranger:Rangers Rat:Rats Rebel:Rebels Reflection:Reflections @@ -315,8 +317,10 @@ Bolas Calix Chandra Dack +Dakkon Daretti Davriel +Dihada Domri Dovin Duck @@ -326,6 +330,7 @@ Estrid Freyalise Garruk Gideon +Grist Huatli Inzerva Jace @@ -337,6 +342,7 @@ Kaya Kiora Koth Liliana +Lolth Lukka Nahiri Narset diff --git a/forge-gui/res/lists/altwin-achievements.txt b/forge-gui/res/lists/altwin-achievements.txt index b22a52d7d6a..adccfc06d80 100644 --- a/forge-gui/res/lists/altwin-achievements.txt +++ b/forge-gui/res/lists/altwin-achievements.txt @@ -33,4 +33,5 @@ Test of Endurance|The Test|So... did I pass? Thassa's Oracle|The Prophecy of Victory|I see... nothing. We must've won. The Cheese Stands Alone|The Cheese|It's cheesy, but hey, it works! Triskaidekaphobia|The Fear of 13|It's just a silly ancient superstition... right? +Vorpal Blade|Snicker-Snack!|"And hast thou slain the Jabberwock? Come to my arms, my beamish boy!" Emblem - Vraska, Golgari Queen|The Flurry of Assassins|How good is your dodging? diff --git a/forge-gui/res/lists/net-decks-archive-block.txt b/forge-gui/res/lists/net-decks-archive-block.txt index 53a0f400e23..29fd266735d 100644 --- a/forge-gui/res/lists/net-decks-archive-block.txt +++ b/forge-gui/res/lists/net-decks-archive-block.txt @@ -964,3 +964,10 @@ 2021-02-22 Sealed Khm Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-02-22-sealed-khm-block-champ-qual.zip 2021-03-01 Sealed Khm Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-03-01-sealed-khm-block-champ-qual.zip 2021-03-28 Sealed Khm Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-03-28-sealed-khm-block-champ-qual.zip +2021-04-25 Sealed Stx Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-04-25-sealed-stx-block-champ-qual.zip +2021-04-26 Sealed Tsr Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-04-26-sealed-tsr-block-champ-qual.zip +2021-05-02 Sealed Stx Block Champ Qual (7 decks) | https://downloads.cardforge.org/decks/archive/block/2021-05-02-sealed-stx-block-champ-qual.zip +2021-05-09 Sealed Stx Block Mocs (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-05-09-sealed-stx-block-mocs.zip +2021-05-10 Sealed Stx Block Mocs (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-05-10-sealed-stx-block-mocs.zip +2021-05-16 Sealed Stx Block Champ Qual (8 decks) | https://downloads.cardforge.org/decks/archive/block/2021-05-16-sealed-stx-block-champ-qual.zip +2021-05-17 Sealed Stx Block Champ Qual (7 decks) | https://downloads.cardforge.org/decks/archive/block/2021-05-17-sealed-stx-block-champ-qual.zip diff --git a/forge-gui/res/lists/net-decks-archive-legacy.txt b/forge-gui/res/lists/net-decks-archive-legacy.txt index 44c4a41d7fd..0261f5abd77 100644 --- a/forge-gui/res/lists/net-decks-archive-legacy.txt +++ b/forge-gui/res/lists/net-decks-archive-legacy.txt @@ -1967,3 +1967,49 @@ 2021-04-06 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-06-legacy-preliminary.zip 2021-04-07 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-07-legacy-preliminary.zip 2021-04-08 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-08-legacy-preliminary.zip +2021-04-09 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-09-legacy-preliminary.zip +2021-04-09 Legacy Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-09-legacy-super-qualifier.zip +2021-04-10 Legacy League (65 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-10-legacy-league.zip +2021-04-10 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-10-legacy-preliminary.zip +2021-04-11 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-11-legacy-challenge.zip +2021-04-12 Legacy Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-12-legacy-showcase-challenge.zip +2021-04-13 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-13-legacy-preliminary.zip +2021-04-14 Legacy Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-14-legacy-preliminary.zip +2021-04-15 Legacy Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-15-legacy-preliminary.zip +2021-04-16 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-16-legacy-preliminary.zip +2021-04-17 Legacy League (22 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-17-legacy-league.zip +2021-04-17 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-17-legacy-preliminary.zip +2021-04-18 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-18-legacy-challenge.zip +2021-04-19 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-19-legacy-challenge.zip +2021-04-20 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-20-legacy-preliminary.zip +2021-04-21 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-21-legacy-preliminary.zip +2021-04-22 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-22-legacy-preliminary.zip +2021-04-23 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-23-legacy-preliminary.zip +2021-04-24 Legacy League (59 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-24-legacy-league.zip +2021-04-24 Legacy Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-24-legacy-preliminary.zip +2021-04-25 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-25-legacy-challenge.zip +2021-04-26 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-26-legacy-challenge.zip +2021-04-27 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-27-legacy-preliminary.zip +2021-04-28 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-28-legacy-preliminary.zip +2021-04-29 Legacy Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-29-legacy-preliminary.zip +2021-04-30 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-04-30-legacy-preliminary.zip +2021-05-01 Legacy League (46 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-01-legacy-league.zip +2021-05-01 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-01-legacy-preliminary.zip +2021-05-02 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-02-legacy-challenge.zip +2021-05-03 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-03-legacy-challenge.zip +2021-05-04 Legacy Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-04-legacy-preliminary.zip +2021-05-05 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-05-legacy-preliminary.zip +2021-05-06 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-06-legacy-preliminary.zip +2021-05-07 Legacy Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-07-legacy-preliminary.zip +2021-05-08 Legacy League (48 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-08-legacy-league.zip +2021-05-08 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-08-legacy-preliminary.zip +2021-05-09 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-09-legacy-challenge.zip +2021-05-10 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-10-legacy-challenge.zip +2021-05-11 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-11-legacy-preliminary.zip +2021-05-12 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-12-legacy-preliminary.zip +2021-05-15 Legacy League (48 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-15-legacy-league.zip +2021-05-15 Legacy Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-15-legacy-preliminary.zip +2021-05-16 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-16-legacy-challenge.zip +2021-05-17 Legacy Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-17-legacy-challenge.zip +2021-05-18 Legacy Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-18-legacy-preliminary.zip +2021-05-19 Legacy Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/legacy/2021-05-19-legacy-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-modern.txt b/forge-gui/res/lists/net-decks-archive-modern.txt index e806156588c..b7ef4bb6af3 100644 --- a/forge-gui/res/lists/net-decks-archive-modern.txt +++ b/forge-gui/res/lists/net-decks-archive-modern.txt @@ -2550,3 +2550,41 @@ 2021-04-06 Modern Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-06-modern-super-qualifier.zip 2021-04-07 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-07-modern-preliminary.zip 2021-04-08 Modern Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-08-modern-preliminary.zip +2021-04-09 Modern League (58 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-09-modern-league.zip +2021-04-09 Modern Preliminary (19 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-09-modern-preliminary.zip +2021-04-10 Modern Preliminary (10 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-10-modern-preliminary.zip +2021-04-10 Modern Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-10-modern-super-qualifier.zip +2021-04-11 Modern Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-11-modern-showcase-challenge.zip +2021-04-12 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-12-modern-challenge.zip +2021-04-13 Modern League (67 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-13-modern-league.zip +2021-04-13 Modern Preliminary (13 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-13-modern-preliminary.zip +2021-04-14 Modern Preliminary (10 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-14-modern-preliminary.zip +2021-04-15 Modern Preliminary (12 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-15-modern-preliminary.zip +2021-04-16 Modern League (20 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-16-modern-league.zip +2021-04-16 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-16-modern-preliminary.zip +2021-04-17 Modern Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-17-modern-preliminary.zip +2021-04-18 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-18-modern-challenge.zip +2021-04-19 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-19-modern-challenge.zip +2021-04-20 Modern League (55 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-20-modern-league.zip +2021-04-20 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-20-modern-preliminary.zip +2021-04-21 Modern Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-21-modern-preliminary.zip +2021-04-22 Modern Preliminary (12 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-22-modern-preliminary.zip +2021-04-23 Modern League (55 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-23-modern-league.zip +2021-04-23 Modern Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-23-modern-preliminary.zip +2021-04-24 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-24-modern-preliminary.zip +2021-04-29 Modern Preliminary (10 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-29-modern-preliminary.zip +2021-04-30 Modern League (56 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-30-modern-league.zip +2021-04-30 Modern Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-04-30-modern-preliminary.zip +2021-05-01 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-01-modern-preliminary.zip +2021-05-02 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-02-modern-challenge.zip +2021-05-03 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-03-modern-challenge.zip +2021-05-04 Modern Champ Qual (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-04-modern-champ-qual.zip +2021-05-04 Modern League (49 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-04-modern-league.zip +2021-05-04 Modern Preliminary (10 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-04-modern-preliminary.zip +2021-05-05 Modern Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-05-modern-preliminary.zip +2021-05-06 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-06-modern-preliminary.zip +2021-05-07 Modern League (48 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-07-modern-league.zip +2021-05-07 Modern Preliminary (11 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-07-modern-preliminary.zip +2021-05-08 Modern Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-08-modern-preliminary.zip +2021-05-09 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-09-modern-challenge.zip +2021-05-10 Modern Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/modern/2021-05-10-modern-challenge.zip diff --git a/forge-gui/res/lists/net-decks-archive-pioneer.txt b/forge-gui/res/lists/net-decks-archive-pioneer.txt index 91eb676fbee..582f3e7288d 100644 --- a/forge-gui/res/lists/net-decks-archive-pioneer.txt +++ b/forge-gui/res/lists/net-decks-archive-pioneer.txt @@ -578,3 +578,49 @@ 2021-04-07 Pioneer Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-07-pioneer-preliminary.zip 2021-04-08 Pioneer League (20 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-08-pioneer-league.zip 2021-04-08 Pioneer Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-08-pioneer-super-qualifier.zip +2021-04-09 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-09-pioneer-preliminary.zip +2021-04-10 Pioneer Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-10-pioneer-preliminary.zip +2021-04-11 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-11-pioneer-challenge.zip +2021-04-11 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-11-pioneer-preliminary.zip +2021-04-12 Pioneer League (19 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-12-pioneer-league.zip +2021-04-12 Pioneer Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-12-pioneer-showcase-challenge.zip +2021-04-13 Pioneer Preliminary (7 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-13-pioneer-preliminary.zip +2021-04-14 Pioneer Preliminary (11 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-14-pioneer-preliminary.zip +2021-04-15 Pioneer League (18 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-15-pioneer-league.zip +2021-04-17 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-17-pioneer-preliminary.zip +2021-04-18 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-18-pioneer-challenge.zip +2021-04-19 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-19-pioneer-challenge.zip +2021-04-19 Pioneer League (23 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-19-pioneer-league.zip +2021-04-20 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-20-pioneer-preliminary.zip +2021-04-21 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-21-pioneer-preliminary.zip +2021-04-22 Pioneer League (16 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-22-pioneer-league.zip +2021-04-22 Pioneer Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-22-pioneer-preliminary.zip +2021-04-23 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-23-pioneer-preliminary.zip +2021-04-24 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-24-pioneer-preliminary.zip +2021-04-26 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-26-pioneer-challenge.zip +2021-04-26 Pioneer League (16 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-26-pioneer-league.zip +2021-04-27 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-27-pioneer-preliminary.zip +2021-04-28 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-28-pioneer-preliminary.zip +2021-04-29 Pioneer League (21 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-29-pioneer-league.zip +2021-04-29 Pioneer Preliminary (9 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-29-pioneer-preliminary.zip +2021-04-30 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-04-30-pioneer-preliminary.zip +2021-05-01 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-01-pioneer-preliminary.zip +2021-05-02 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-02-pioneer-challenge.zip +2021-05-02 Pioneer Champ Qual (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-02-pioneer-champ-qual.zip +2021-05-03 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-03-pioneer-challenge.zip +2021-05-03 Pioneer League (27 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-03-pioneer-league.zip +2021-05-05 Pioneer Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-05-pioneer-preliminary.zip +2021-05-06 Pioneer League (20 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-06-pioneer-league.zip +2021-05-06 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-06-pioneer-preliminary.zip +2021-05-07 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-07-pioneer-preliminary.zip +2021-05-08 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-08-pioneer-preliminary.zip +2021-05-09 Pioneer Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-09-pioneer-challenge.zip +2021-05-10 Pioneer League (24 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-10-pioneer-league.zip +2021-05-11 Pioneer Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-11-pioneer-preliminary.zip +2021-05-12 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-12-pioneer-preliminary.zip +2021-05-13 Pioneer League (19 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-13-pioneer-league.zip +2021-05-14 Pioneer Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-14-pioneer-preliminary.zip +2021-05-15 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-15-pioneer-preliminary.zip +2021-05-17 Pioneer League (18 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-17-pioneer-league.zip +2021-05-18 Pioneer Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-18-pioneer-preliminary.zip +2021-05-19 Pioneer Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/pioneer/2021-05-19-pioneer-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-standard.txt b/forge-gui/res/lists/net-decks-archive-standard.txt index 3fb06f099ae..a1a4b8265e4 100644 --- a/forge-gui/res/lists/net-decks-archive-standard.txt +++ b/forge-gui/res/lists/net-decks-archive-standard.txt @@ -2395,3 +2395,31 @@ 2021-04-08 Standard League (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-08-standard-league.zip 2021-04-08 Standard Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-08-standard-preliminary.zip 2021-04-08 Standard Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-08-standard-super-qualifier.zip +2021-04-11 Standard Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-11-standard-showcase-challenge.zip +2021-04-12 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-12-standard-challenge.zip +2021-04-12 Standard League (6 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-12-standard-league.zip +2021-04-15 Standard League (7 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-15-standard-league.zip +2021-04-18 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-18-standard-challenge.zip +2021-04-19 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-19-standard-challenge.zip +2021-04-19 Standard League (6 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-19-standard-league.zip +2021-04-22 Standard League (6 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-22-standard-league.zip +2021-04-26 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-26-standard-challenge.zip +2021-04-26 Standard League (6 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-26-standard-league.zip +2021-04-29 Standard League (4 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-04-29-standard-league.zip +2021-05-02 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-02-standard-challenge.zip +2021-05-03 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-03-standard-challenge.zip +2021-05-03 Standard League (10 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-03-standard-league.zip +2021-05-05 Standard Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-05-standard-preliminary.zip +2021-05-06 Standard League (12 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-06-standard-league.zip +2021-05-06 Standard Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-06-standard-preliminary.zip +2021-05-07 Standard Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-07-standard-preliminary.zip +2021-05-09 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-09-standard-challenge.zip +2021-05-10 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-10-standard-challenge.zip +2021-05-10 Standard League (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-10-standard-league.zip +2021-05-12 Standard Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-12-standard-preliminary.zip +2021-05-13 Standard League (10 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-13-standard-league.zip +2021-05-13 Standard Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-13-standard-preliminary.zip +2021-05-16 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-16-standard-challenge.zip +2021-05-17 Standard Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-17-standard-challenge.zip +2021-05-17 Standard League (13 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-17-standard-league.zip +2021-05-19 Standard Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/standard/2021-05-19-standard-preliminary.zip diff --git a/forge-gui/res/lists/net-decks-archive-vintage.txt b/forge-gui/res/lists/net-decks-archive-vintage.txt index 7ca23681972..c36d75c66af 100644 --- a/forge-gui/res/lists/net-decks-archive-vintage.txt +++ b/forge-gui/res/lists/net-decks-archive-vintage.txt @@ -263,8 +263,6 @@ 2015-10-05 Vintage Daily (1 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-05-vintage-daily.zip 2015-10-14 0 Vintage Daily (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-14-0-vintage-daily.zip 2015-10-14 1 Vintage Daily (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-14-1-vintage-daily.zip -2015-10-14 2 Vintage Daily (0 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-14-2-vintage-daily.zip -2015-10-14 Vintage Daily (0 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-14-vintage-daily.zip 2015-10-19 0 Vintage Daily (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-19-0-vintage-daily.zip 2015-10-19 1 Vintage Daily (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-19-1-vintage-daily.zip 2015-10-19 Vintage Daily (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2015-10-19-vintage-daily.zip @@ -1404,3 +1402,33 @@ 2021-04-05 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-05-vintage-challenge.zip 2021-04-05 Vintage Super Qualifier (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-05-vintage-super-qualifier.zip 2021-04-08 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-08-vintage-preliminary.zip +2021-04-10 Vintage Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-10-vintage-preliminary.zip +2021-04-11 Vintage League (16 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-11-vintage-league.zip +2021-04-11 Vintage Showcase Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-11-vintage-showcase-challenge.zip +2021-04-12 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-12-vintage-challenge.zip +2021-04-12 Vintage Preliminary (8 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-12-vintage-preliminary.zip +2021-04-15 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-15-vintage-preliminary.zip +2021-04-17 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-17-vintage-preliminary.zip +2021-04-18 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-18-vintage-challenge.zip +2021-04-18 Vintage League (7 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-18-vintage-league.zip +2021-04-19 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-19-vintage-challenge.zip +2021-04-22 Vintage Preliminary (3 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-22-vintage-preliminary.zip +2021-04-24 Vintage Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-24-vintage-preliminary.zip +2021-04-25 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-25-vintage-challenge.zip +2021-04-25 Vintage League (17 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-25-vintage-league.zip +2021-04-26 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-26-vintage-challenge.zip +2021-04-29 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-04-29-vintage-preliminary.zip +2021-05-01 Vintage Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-01-vintage-preliminary.zip +2021-05-02 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-02-vintage-challenge.zip +2021-05-02 Vintage League (17 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-02-vintage-league.zip +2021-05-03 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-03-vintage-challenge.zip +2021-05-03 Vintage Preliminary (5 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-03-vintage-preliminary.zip +2021-05-06 Vintage Preliminary (6 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-06-vintage-preliminary.zip +2021-05-08 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-08-vintage-preliminary.zip +2021-05-09 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-09-vintage-challenge.zip +2021-05-09 Vintage League (14 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-09-vintage-league.zip +2021-05-10 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-10-vintage-challenge.zip +2021-05-15 Vintage Preliminary (4 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-15-vintage-preliminary.zip +2021-05-16 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-16-vintage-challenge.zip +2021-05-16 Vintage League (14 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-16-vintage-league.zip +2021-05-17 Vintage Challenge (32 decks) | https://downloads.cardforge.org/decks/archive/vintage/2021-05-17-vintage-challenge.zip diff --git a/forge-gui/res/quest/duels/King_Goldemar_2.dck b/forge-gui/res/quest/duels/King_Goldemar_2.dck new file mode 100644 index 00000000000..474e3f3723d --- /dev/null +++ b/forge-gui/res/quest/duels/King_Goldemar_2.dck @@ -0,0 +1,26 @@ +[duel] +[metadata] +Name=King Goldemar 2 +Title=King Goldemar +Difficulty=medium +Description= R/B Kobold deck with teeth deck +Icon=King Goldemar.jpg +Deck Type=constructed +[main] +4 Crimson Kobolds +4 Crookshank Kobolds +4 Kobolds of Kher Keep +4 Kobold Drill Sergeant +4 Kobold Overlord +4 Kobold Taskmaster +4 Rohgahh of Kher Keep +4 Lightning Bolt +4 Kher Keep +4 Fiery Emancipation +10 Mountain +2 Swamp +4 Blood Crypt +4 Blackcleave Cliffs +4 Door of Destinies +4 Dark Ritual +[sideboard] diff --git a/forge-gui/res/tokenscripts/b_2_1_spider_menace_reach.txt b/forge-gui/res/tokenscripts/b_2_1_spider_menace_reach.txt new file mode 100644 index 00000000000..9caa942339d --- /dev/null +++ b/forge-gui/res/tokenscripts/b_2_1_spider_menace_reach.txt @@ -0,0 +1,7 @@ +Name:Spider +ManaCost:no cost +Colors:black +PT:2/1 +K:Menace +K:Reach +Oracle:Menace, reach diff --git a/forge-gui/res/tokenscripts/cloud_sprite.txt b/forge-gui/res/tokenscripts/cloud_sprite.txt index e53f71d94cb..306a85f1c90 100644 --- a/forge-gui/res/tokenscripts/cloud_sprite.txt +++ b/forge-gui/res/tokenscripts/cloud_sprite.txt @@ -4,5 +4,5 @@ ManaCost:no cost PT:1/1 Types:Creature Faerie K:Flying -K:CARDNAME can block only creatures with flying. -Oracle:Flying\nCloud Sprite can block only creatures with flying. +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ CARDNAME can block only creatures with flying. +Oracle:Flying\nCloud Sprite can block only creatures with flying. \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/guenhwyvar.txt b/forge-gui/res/tokenscripts/guenhwyvar.txt new file mode 100644 index 00000000000..17a5e05d91b --- /dev/null +++ b/forge-gui/res/tokenscripts/guenhwyvar.txt @@ -0,0 +1,7 @@ +Name:Guenhwyvar +ManaCost:no cost +Colors:green +Types:Legendary Creature Cat +PT:4/1 +K:Trample +Oracle:Trample diff --git a/forge-gui/res/tokenscripts/rw_4_4_a_golem.txt b/forge-gui/res/tokenscripts/rw_4_4_a_golem.txt new file mode 100644 index 00000000000..94ff4dc94cc --- /dev/null +++ b/forge-gui/res/tokenscripts/rw_4_4_a_golem.txt @@ -0,0 +1,6 @@ +Name:Golem +Types:Artifact Creature Golem +Colors:red,white +ManaCost:no cost +PT:4/4 +Oracle: diff --git a/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt b/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt index 7a146c397df..1f1d57e0e2f 100644 --- a/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt +++ b/forge-gui/res/tokenscripts/u_0_2_illusion_mesmerize.txt @@ -4,6 +4,6 @@ ManaCost:no cost Colors:blue PT:0/2 T:Mode$ AttackerBlocked | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step. -SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +SVar:TrigPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent SVar:HasBlockEffect:TRUE Oracle:Whenever this creature blocks a creature, that creature doesn't untap during its controller's next untap step. \ No newline at end of file diff --git a/forge-gui/res/tokenscripts/u_0_3_crab.txt b/forge-gui/res/tokenscripts/u_0_3_crab.txt new file mode 100644 index 00000000000..6cb0962b9c8 --- /dev/null +++ b/forge-gui/res/tokenscripts/u_0_3_crab.txt @@ -0,0 +1,6 @@ +Name:Crab +ManaCost:no cost +Types:Creature Crab +Colors:blue +PT:0/1 +Oracle: diff --git a/forge-gui/src/main/java/forge/download/AutoUpdater.java b/forge-gui/src/main/java/forge/download/AutoUpdater.java index 9741d081690..f39547d1bce 100644 --- a/forge-gui/src/main/java/forge/download/AutoUpdater.java +++ b/forge-gui/src/main/java/forge/download/AutoUpdater.java @@ -30,12 +30,13 @@ import forge.util.Localizer; import forge.util.WaitCallback; public class AutoUpdater { - private final String SNAPSHOT_VERSION_INDEX = "https://snapshots.cardforge.org/"; - private final String SNAPSHOT_VERSION_URL = "https://snapshots.cardforge.org/version.txt"; - private final String SNAPSHOT_PACKAGE = "https://snapshots.cardforge.org/latest/"; - private final String RELEASE_VERSION_URL = "https://releases.cardforge.org/forge/forge-gui-desktop/version.txt"; - private final String RELEASE_PACKAGE = "https://releases.cardforge.org/latest/"; - private final String RELEASE_MAVEN_METADATA = "https://releases.cardforge.org/forge/forge-gui-desktop/maven-metadata.xml"; + private final String SNAPSHOT_VERSION_INDEX = "https://downloads.cardforge.org/dailysnapshots/"; + private final String SNAPSHOT_VERSION_URL = SNAPSHOT_VERSION_INDEX + "version.txt"; + private final String SNAPSHOT_PACKAGE = SNAPSHOT_VERSION_INDEX + "latest/"; + private final String RELEASE_VERSION_INDEX = "https://releases.cardforge.org/"; + private final String RELEASE_VERSION_URL = RELEASE_VERSION_INDEX + "forge/forge-gui-desktop/version.txt"; + private final String RELEASE_PACKAGE = RELEASE_VERSION_INDEX + "latest/"; + private final String RELEASE_MAVEN_METADATA = RELEASE_VERSION_INDEX + "forge/forge-gui-desktop/maven-metadata.xml"; private static final boolean VERSION_FROM_METADATA = true; private static final String TMP_DIR = "tmp/"; private static final Localizer localizer = Localizer.getInstance(); diff --git a/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java b/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java index f33d2ae4ded..e7e3ef6ec51 100644 --- a/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java +++ b/forge-gui/src/main/java/forge/gamemodes/limited/SealedDeckBuilder.java @@ -40,7 +40,6 @@ public class SealedDeckBuilder extends LimitedDeckBuilder { for (int i = 0; i < limit; i++) { PaperCard cp = initialRanked.get(i); colorChooserList.add(cp); - //System.out.println(cp.getName() + " " + cp.getRules().getManaCost().toString()); } Iterable rules = Iterables.transform(colorChooserList, PaperCard.FN_GET_RULES); diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java index 0fe7d9b1fd0..a913181585c 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputPayMana.java @@ -66,12 +66,14 @@ public abstract class InputPayMana extends InputSyncronizedBase { @Override protected void onStop() { - // Clear current Mana cost being paid for SA - saPaidFor.setManaCostBeingPaid(null); - player.popPaidForSA(); + if (!isFinished()) { + // Clear current Mana cost being paid for SA + saPaidFor.setManaCostBeingPaid(null); + player.popPaidForSA(); - if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana - getController().getGui().hideManaPool(PlayerView.get(player)); + if (wasFloatingMana) { //hide mana pool if it was shown due to floating mana + getController().getGui().hideManaPool(PlayerView.get(player)); + } } } diff --git a/forge-gui/src/main/java/forge/gamemodes/match/input/InputSyncronizedBase.java b/forge-gui/src/main/java/forge/gamemodes/match/input/InputSyncronizedBase.java index df10c4fc797..54fe6a737a7 100644 --- a/forge-gui/src/main/java/forge/gamemodes/match/input/InputSyncronizedBase.java +++ b/forge-gui/src/main/java/forge/gamemodes/match/input/InputSyncronizedBase.java @@ -36,8 +36,6 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } protected final void stop() { - onStop(); - // ensure input won't accept any user actions. FThreads.invokeInEdtNowOrLater(new Runnable() { @Override @@ -46,6 +44,8 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } }); + onStop(); + // thread irrelevant if (getController().getInputQueue().getInput() != null) { getController().getInputQueue().removeInput(InputSyncronizedBase.this); diff --git a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java index 2e9a3c98bae..68736d498c8 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/ProtocolMethod.java @@ -56,6 +56,7 @@ public enum ProtocolMethod { setPanelSelection (Mode.SERVER, Void.TYPE, CardView.class), getAbilityToPlay (Mode.SERVER, SpellAbilityView.class, CardView.class, List/*SpellAbilityView*/.class, ITriggerEvent.class), assignCombatDamage (Mode.SERVER, Map.class, CardView.class, List/*CardView*/.class, Integer.TYPE, GameEntityView.class, Boolean.TYPE), + divideShield (Mode.SERVER, Map.class, CardView.class, Map.class, Integer.TYPE, Boolean.TYPE, String.class), message (Mode.SERVER, Void.TYPE, String.class, String.class), showErrorDialog (Mode.SERVER, Void.TYPE, String.class, String.class), showConfirmDialog (Mode.SERVER, Boolean.TYPE, String.class, String.class, String.class, String.class, Boolean.TYPE), diff --git a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java index 0bd8208d47b..8fcd1ec696f 100644 --- a/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java +++ b/forge-gui/src/main/java/forge/gamemodes/net/server/NetGuiGame.java @@ -74,7 +74,7 @@ public class NetGuiGame extends AbstractGuiGame { updateGameView(); send(ProtocolMethod.showPromptMessage, playerView, message); } - + @Override public void showPromptMessage(final PlayerView playerView, final String message, final CardView card) { updateGameView(); @@ -206,6 +206,11 @@ public class NetGuiGame extends AbstractGuiGame { return sendAndWait(ProtocolMethod.assignCombatDamage, attacker, blockers, damage, defender, overrideOrder); } + @Override + public Map assignGenericAmount(final CardView effectSource, final Map targets, final int amount, final boolean atLeastOne, final String amountLabel) { + return sendAndWait(ProtocolMethod.divideShield, effectSource, targets, amount, atLeastOne, amountLabel); + } + @Override public void message(final String message, final String title) { send(ProtocolMethod.message, message, title); diff --git a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java index 033633c39a2..52ccd8ae4de 100644 --- a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java +++ b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestPlane.java @@ -194,7 +194,7 @@ public class ConquestPlane { for (String setCode : setCodes) { CardEdition edition = FModel.getMagicDb().getEditions().get(setCode); if (edition != null) { - for (CardInSet card : edition.getCards()) { + for (CardInSet card : edition.getAllCardsInSet()) { if (bannedCardSet == null || !bannedCardSet.contains(card.name)) { addCard(commonCards.getCard(card.name, setCode)); } diff --git a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java index b3f7cb03778..1dd15bb9c25 100644 --- a/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java +++ b/forge-gui/src/main/java/forge/gamemodes/planarconquest/ConquestUtil.java @@ -12,7 +12,6 @@ import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Sets; -import forge.card.CardEdition; import forge.card.CardRarity; import forge.card.CardRules; import forge.card.CardType; @@ -187,13 +186,9 @@ public class ConquestUtil { public static Iterable getStartingPlaneswalkerOptions(final PaperCard startingCommander) { final byte colorIdentity = startingCommander.getRules().getColorIdentity().getColor(); final List selected = Lists.newArrayList(); - return Iterables.filter(FModel.getMagicDb().getCommonCards().getUniqueCards(), new Predicate() { + return Iterables.filter(FModel.getMagicDb().getCommonCards().getAllNonPromosNonReprintsNoAlt(), new Predicate() { @Override public boolean apply(PaperCard card) { - if (FModel.getMagicDb().getEditions().get(card.getEdition()).getType() == CardEdition.Type.PROMOS - || FModel.getMagicDb().getEditions().get(card.getEdition()).getType() == CardEdition.Type.REPRINT) { - return false; // exclude promos from the starting planeswalker set - } if (selected.contains(card.getName())) { return false; } diff --git a/forge-gui/src/main/java/forge/gamemodes/quest/bazaar/QuestBazaarManager.java b/forge-gui/src/main/java/forge/gamemodes/quest/bazaar/QuestBazaarManager.java index e2b367f3d18..f3ef9cf50f9 100644 --- a/forge-gui/src/main/java/forge/gamemodes/quest/bazaar/QuestBazaarManager.java +++ b/forge-gui/src/main/java/forge/gamemodes/quest/bazaar/QuestBazaarManager.java @@ -154,7 +154,6 @@ public class QuestBazaarManager { for (int iSlot = 0; iSlot < QuestController.MAX_PET_SLOTS; iSlot++) { for (final QuestPetController pet : qCtrl.getPetsStorage().getAllPets(iSlot)) { - //System.out.println("Pet: " + pet.getName()); itemSet.put(pet.getName(), pet); } } @@ -168,7 +167,6 @@ public class QuestBazaarManager { for (final String itemName : thisStall.getItems()) { final IQuestBazaarItem item = itemSet.get(itemName); - //System.out.println(itemName); set.add(item); } itemsOnStalls.put(thisStall.getName(), set); diff --git a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java index 2e81bd8720e..1d3df5bad43 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java +++ b/forge-gui/src/main/java/forge/gui/card/CardDetailUtil.java @@ -280,6 +280,8 @@ public class CardDetailUtil { area.append("Emblem"); else area.append("Token"); + } else if (card.isTokenCard()) { + area.append("Token card"); } // card text diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index d65aadfce23..d02b173a8ce 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -412,8 +412,7 @@ public final class CardScriptParser { "notTributed", "madness", "Paired", "NotPaired", "PairedWith", "Above", "DirectlyAbove", "TopGraveyardCreature", "BottomGraveyard", "TopLibrary", "Cloned", "DamagedBy", "Damaged", - "IsTargetingSource", "sharesPermanentTypeWith", - "canProduceSameManaTypeWith", "SecondSpellCastThisTurn", + "sharesPermanentTypeWith", "canProduceSameManaTypeWith", "SecondSpellCastThisTurn", "ThisTurnCast", "withFlashback", "tapped", "untapped", "faceDown", "faceUp", "hasLevelUp", "DrawnThisTurn", "notDrawnThisTurn", "firstTurnControlled", "notFirstTurnControlled", diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java index 809cacd39e0..62a1db1c6b1 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadService.java @@ -413,7 +413,6 @@ public abstract class GuiDownloadService implements Runnable { protected static void addMissingItems(Map list, String nameUrlFile, String dir, boolean includeParent) { for (Pair nameUrlPair : FileUtil.readNameUrlFile(nameUrlFile)) { File f = new File(includeParent? dir+FileUtil.getParent(nameUrlPair.getRight()) : dir , decodeURL(nameUrlPair.getLeft())); - //System.out.println(f.getAbsolutePath()); if (!f.exists()) { list.put(f.getAbsolutePath(), nameUrlPair.getRight()); } diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java index c3e28d3c325..cb1ea0fba3d 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadSetPicturesLQ.java @@ -95,7 +95,6 @@ public class GuiDownloadSetPicturesLQ extends GuiDownloadService { if (fullborder.exists()) return; //don't add on download if you have an existing fullborder image in this set... - // System.out.println(filename); if (!destFile.exists()) { downloads.put(destFile.getAbsolutePath(), ForgeConstants.URL_PIC_DOWNLOAD + urlPath); } diff --git a/forge-gui/src/main/java/forge/gui/download/GuiDownloadZipService.java b/forge-gui/src/main/java/forge/gui/download/GuiDownloadZipService.java index 2f94c8966ee..576ca23345c 100644 --- a/forge-gui/src/main/java/forge/gui/download/GuiDownloadZipService.java +++ b/forge-gui/src/main/java/forge/gui/download/GuiDownloadZipService.java @@ -172,7 +172,13 @@ public class GuiDownloadZipService extends GuiDownloadService { } } - final ZipFile zipFile = new ZipFile(zipFilename, Charset.forName("IBM437")); + final Charset charset = Charset.forName("IBM437"); + ZipFile zipFile; + try { + zipFile = new ZipFile(zipFilename, charset); + } catch (Throwable e) { //some older Android versions need the old method + zipFile = new ZipFile(zipFilename); + } final Enumeration entries = zipFile.entries(); progressBar.reset(); diff --git a/forge-gui/src/main/java/forge/gui/error/BugReporter.java b/forge-gui/src/main/java/forge/gui/error/BugReporter.java index 6a1e0e1d929..b3965239ad9 100644 --- a/forge-gui/src/main/java/forge/gui/error/BugReporter.java +++ b/forge-gui/src/main/java/forge/gui/error/BugReporter.java @@ -98,7 +98,7 @@ public class BugReporter { } } - private static boolean isSentryEnabled() { + public static boolean isSentryEnabled() { return FModel.getPreferences().getPrefBoolean(ForgePreferences.FPref.USE_SENTRY); } /** diff --git a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java index 08bd147ac30..18fdf3d07ac 100644 --- a/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java +++ b/forge-gui/src/main/java/forge/gui/interfaces/IGuiGame.java @@ -69,6 +69,7 @@ public interface IGuiGame { void setPanelSelection(CardView hostCard); SpellAbilityView getAbilityToPlay(CardView hostCard, List abilities, ITriggerEvent triggerEvent); Map assignCombatDamage(CardView attacker, List blockers, int damage, GameEntityView defender, boolean overrideOrder); + Map assignGenericAmount(CardView effectSource, Map target, int amount, final boolean atLeastOne, final String amountLabel); void message(String message); void message(String message, String title); diff --git a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java index 805970bca18..5c5525e20bd 100644 --- a/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java +++ b/forge-gui/src/main/java/forge/itemmanager/AdvancedSearch.java @@ -116,7 +116,7 @@ public class AdvancedSearch { CARD_SET("lblSet", PaperCard.class, FilterOperator.SINGLE_LIST_OPS, new CustomListEvaluator(FModel.getMagicDb().getSortedEditions(), CardEdition.FN_GET_CODE) { @Override protected CardEdition getItemValue(PaperCard input) { - return FModel.getMagicDb().getEditions().get(input.getEdition()); + return FModel.getMagicDb().getCardEdition(input.getEdition()); } }), CARD_FORMAT("lblFormat", PaperCard.class, FilterOperator.MULTI_LIST_OPS, new CustomListEvaluator((List)FModel.getFormats().getFilterList()) { @@ -330,7 +330,10 @@ public class AdvancedSearch { @Override protected CardEdition getItemValue(InventoryItem input) { if (input instanceof PaperCard) { - return FModel.getMagicDb().getEditions().get(((PaperCard)input).getEdition()); + CardEdition set = FModel.getMagicDb().getEditions().get(((PaperCard)input).getEdition()); + if (set == null) // try custom set + set = FModel.getMagicDb().getCustomEditions().get(((PaperCard)input).getEdition()); + return set; } else if (input instanceof SealedProduct) { return FModel.getMagicDb().getEditions().get(((SealedProduct)input).getEdition()); } else { diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index e85501e9430..54721468484 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -50,12 +50,14 @@ import forge.util.CardTranslation; import forge.util.Localizer; public enum ColumnDef { - /**The column containing the inventory item name.*/ + /** + * The column containing the inventory item name. + */ STRING("", "", 0, false, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return from.getKey() instanceof Comparable ? (Comparable)from.getKey() : from.getKey().getName(); + return from.getKey() instanceof Comparable ? (Comparable) from.getKey() : from.getKey().getName(); } }, new Function, Object>() { @@ -64,7 +66,9 @@ public enum ColumnDef { return from.getKey().toString(); } }), - /**The name column.*/ + /** + * The name column. + */ NAME("lblName", "lblName", 180, false, SortState.ASC, new Function, Comparable>() { @Override @@ -82,8 +86,10 @@ public enum ColumnDef { return from.getKey().getName(); } }), - - /**The column for sorting cards in collector order.*/ + + /** + * The column for sorting cards in collector order. + */ COLLECTOR_ORDER("lblCN", "ttCN", 20, false, SortState.ASC, new Function, Comparable>() { @Override @@ -94,24 +100,30 @@ public enum ColumnDef { new Function, Object>() { @Override public Object apply(final Entry from) { - return ""; + InventoryItem item = from.getKey(); + return item instanceof PaperCard ? + ((PaperCard) item).getCollectorNumber() : IPaperCard.NO_COLLECTOR_NUMBER; } }), - /**The type column.*/ + /** + * The type column. + */ TYPE("lblType", "ttType", 100, false, SortState.ASC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { - return CardTranslation.getTranslatedType(from.getKey().getName(),toType(from.getKey())); + return CardTranslation.getTranslatedType(from.getKey().getName(), toType(from.getKey())); } }, new Function, Object>() { @Override public Object apply(final Entry from) { - return CardTranslation.getTranslatedType(from.getKey().getName(),toType(from.getKey())); + return CardTranslation.getTranslatedType(from.getKey().getName(), toType(from.getKey())); } }), - /**The mana cost column.*/ + /** + * The mana cost column. + */ COST("lblCost", "ttCost", 70, true, SortState.ASC, new Function, Comparable>() { @Override @@ -125,7 +137,9 @@ public enum ColumnDef { return toCardRules(from.getKey()); } }), - /**The color column.*/ + /** + * The color column. + */ COLOR("lblColor", "ttColor", 46, true, SortState.ASC, new Function, Comparable>() { @Override @@ -139,7 +153,9 @@ public enum ColumnDef { return toColor(from.getKey()); } }), - /**The power column.*/ + /** + * The power column. + */ POWER("lblPower", "ttPower", 20, true, SortState.DESC, new Function, Comparable>() { @Override @@ -153,7 +169,9 @@ public enum ColumnDef { return toPower(from.getKey()); } }), - /**The toughness column.*/ + /** + * The toughness column. + */ TOUGHNESS("lblToughness", "ttToughness", 20, true, SortState.DESC, new Function, Comparable>() { @Override @@ -167,7 +185,9 @@ public enum ColumnDef { return toToughness(from.getKey()); } }), - /**The converted mana cost column.*/ + /** + * The converted mana cost column. + */ CMC("lblCMC", "ttCMC", 20, true, SortState.ASC, new Function, Comparable>() { @Override @@ -181,7 +201,9 @@ public enum ColumnDef { return toCMC(from.getKey()); } }), - /**The rarity column.*/ + /** + * The rarity column. + */ RARITY("lblRarity", "lblRarity", 20, true, SortState.DESC, new Function, Comparable>() { @Override @@ -195,14 +217,18 @@ public enum ColumnDef { return toRarity(from.getKey()); } }), - /**The set code column.*/ + /** + * The set code column. + */ SET("lblSet", "lblSet", 38, true, SortState.DESC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { InventoryItem i = from.getKey(); - return i instanceof InventoryItemFromSet ? FModel.getMagicDb().getEditions() - .get(((InventoryItemFromSet) i).getEdition()) : CardEdition.UNKNOWN; + if (!(i instanceof InventoryItemFromSet)) + return CardEdition.UNKNOWN; + String editionCode = ((InventoryItemFromSet) i).getEdition(); + return FModel.getMagicDb().getCardEdition(editionCode); } }, new Function, Object>() { @@ -212,7 +238,9 @@ public enum ColumnDef { return i instanceof InventoryItemFromSet ? ((InventoryItemFromSet) i).getEdition() : "n/a"; } }), - /**The AI compatibility flag column*/ + /** + * The AI compatibility flag column + */ AI("lblAI", "lblAIStatus", 30, true, SortState.ASC, new Function, Comparable>() { @Override @@ -235,7 +263,9 @@ public enum ColumnDef { : (ai.getRemRandomDecks() ? "?" : ""); } }), - /**The Draft ranking column.*/ + /** + * The Draft ranking column. + */ RANKING("lblRanking", "lblDraftRanking", 50, true, SortState.ASC, new Function, Comparable>() { @Override @@ -249,7 +279,9 @@ public enum ColumnDef { return toRanking(from.getKey(), true); } }), - /**The quantity column.*/ + /** + * The quantity column. + */ QUANTITY("lblQty", "lblQuantity", 25, true, SortState.ASC, new Function, Comparable>() { @Override @@ -263,7 +295,9 @@ public enum ColumnDef { return from.getValue(); } }), - /**The quantity in deck column.*/ + /** + * The quantity in deck column. + */ DECK_QUANTITY("lblQuantity", "lblQuantity", 50, true, SortState.ASC, new Function, Comparable>() { @Override @@ -277,19 +311,29 @@ public enum ColumnDef { return from.getValue(); } }), - /**The new inventory flag column.*/ + /** + * The new inventory flag column. + */ NEW("lblNew", "lblNew", 30, true, SortState.DESC, null, null), //functions will be set later - /**The price column.*/ + /** + * The price column. + */ PRICE("lblPrice", "ttPrice", 35, true, SortState.DESC, null, null), - /**The quantity owned column.*/ + /** + * The quantity owned column. + */ OWNED("lblOwned", "lblOwned", 20, true, SortState.ASC, null, null), - /**The deck name column.*/ + /** + * The deck name column. + */ DECKS("lblDecks", "lblDecks", 20, true, SortState.ASC, null, null), - /**The favorite flag column.*/ + /** + * The favorite flag column. + */ FAVORITE("", "ttFavorite", 18, true, SortState.DESC, new Function, Comparable>() { @Override @@ -307,7 +351,9 @@ public enum ColumnDef { return toCard(from.getKey()); } }), - /**The favorite deck flag column.*/ + /** + * The favorite deck flag column. + */ DECK_FAVORITE("", "ttFavorite", 18, true, SortState.DESC, new Function, Comparable>() { @Override @@ -325,7 +371,9 @@ public enum ColumnDef { return toDeck(from.getKey()); } }), - /**The edit/delete deck column.*/ + /** + * The edit/delete deck column. + */ DECK_ACTIONS("", "lblDeleteEdit", 40, true, SortState.DESC, new Function, Comparable>() { @Override @@ -339,7 +387,9 @@ public enum ColumnDef { return toDeck(from.getKey()); } }), - /**The deck folder column.*/ + /** + * The deck folder column. + */ DECK_FOLDER("lblFolder", "lblFolder", 80, false, SortState.ASC, new Function, Comparable>() { @Override @@ -353,7 +403,9 @@ public enum ColumnDef { return toDeckFolder(from.getKey()); } }), - /**The deck color column.*/ + /** + * The deck color column. + */ DECK_COLOR("lblColor", "ttColor", 70, true, SortState.ASC, new Function, Comparable>() { @Override @@ -367,7 +419,9 @@ public enum ColumnDef { return toDeckColor(from.getKey()); } }), - /**The deck format column.*/ + /** + * The deck format column. + */ DECK_FORMAT("lblFormat", "ttFormats", 60, false, SortState.DESC, new Function, Comparable>() { @Override @@ -378,9 +432,9 @@ public enum ColumnDef { } Iterable all = deck.getExhaustiveFormats(); int acc = 0; - for(GameFormat gf : all) { + for (GameFormat gf : all) { int ix = gf.getIndex(); - if( ix < 30 && ix > 0) + if (ix < 30 && ix > 0) acc |= 0x40000000 >> (ix - 1); } return acc; @@ -396,8 +450,10 @@ public enum ColumnDef { return deck.getFormatsString(); } }), - /**The deck edition column, a mystery to us all.*/ - DECK_EDITION("lblSet", "lblSetEdition", 38, true, SortState.DESC, + /** + * The deck edition column, a mystery to us all. + */ + DECK_EDITION("lblSet", "lblSet", 38, true, SortState.DESC, new Function, Comparable>() { @Override public Comparable apply(final Entry from) { @@ -410,7 +466,9 @@ public enum ColumnDef { return toDeck(from.getKey()).getEdition().getCode(); } }), - /**The main library size column.*/ + /** + * The main library size column. + */ DECK_MAIN("lblMain", "ttMain", 30, true, SortState.ASC, new Function, Comparable>() { @Override @@ -424,7 +482,9 @@ public enum ColumnDef { return toDeck(from.getKey()).getMainSize(); } }), - /**The sideboard size column.*/ + /** + * The sideboard size column. + */ DECK_SIDE("lblSide", "lblSideboard", 30, true, SortState.ASC, new Function, Comparable>() { @Override @@ -440,12 +500,20 @@ public enum ColumnDef { }); ColumnDef(String shortName0, String longName0, int preferredWidth0, boolean isWidthFixed0, SortState sortState0, - Function, Comparable> fnSort0, - Function, Object> fnDisplay0) { + Function, Comparable> fnSort0, + Function, Object> fnDisplay0) { final Localizer localizer = Localizer.getInstance(); - if (shortName0 != null && !shortName0.isEmpty()) { this.shortName = localizer.getMessage(shortName0);} else {this.shortName = shortName0;} - if (longName0 != null && !longName0.isEmpty()) { this.longName = localizer.getMessage(longName0);} else {this.longName = longName0;} + if (shortName0 != null && !shortName0.isEmpty()) { + this.shortName = localizer.getMessage(shortName0); + } else { + this.shortName = shortName0; + } + if (longName0 != null && !longName0.isEmpty()) { + this.longName = localizer.getMessage(longName0); + } else { + this.longName = longName0; + } this.preferredWidth = preferredWidth0; this.isWidthFixed = isWidthFixed0; @@ -465,57 +533,66 @@ public enum ColumnDef { public String toString() { return this.longName; } -/** - *Converts a card name to a sortable name. - * Trim leading quotes, then move article last, then replace characters. - * Because An-Havva Constable. - * Capitals and lowercase sorted as one: "my deck" before "Myr Retribution" - * Apostrophes matter, though: "D'Avenant" before "Danitha" - * TO DO: Commas before apostrophes: "Rakdos, Lord of Riots" before "Rakdos's Return" - * @param printedName The name of the card. - * @return A sortable name. - */ + + /** + * Converts a card name to a sortable name. + * Trim leading quotes, then move article last, then replace characters. + * Because An-Havva Constable. + * Capitals and lowercase sorted as one: "my deck" before "Myr Retribution" + * Apostrophes matter, though: "D'Avenant" before "Danitha" + * TO DO: Commas before apostrophes: "Rakdos, Lord of Riots" before "Rakdos's Return" + * + * @param printedName The name of the card. + * @return A sortable name. + */ private static String toSortableName(String printedName) { - if (printedName.startsWith("\"")) printedName = printedName.substring(1); - return moveArticleToEnd(printedName).toLowerCase().replaceAll("[^\\s'0-9a-z]",""); + if (printedName.startsWith("\"")) printedName = printedName.substring(1); + return moveArticleToEnd(printedName).toLowerCase().replaceAll("[^\\s'0-9a-z]", ""); } - - /**Article words. These words get kicked to the end of a sortable name. - For localization, simply overwrite this array with appropriate words. - Words in this list are used by the method String moveArticleToEnd(String), useful - for alphabetizing phrases, in particular card or other inventory object names.*/ + + /** + * Article words. These words get kicked to the end of a sortable name. + * For localization, simply overwrite this array with appropriate words. + * Words in this list are used by the method String moveArticleToEnd(String), useful + * for alphabetizing phrases, in particular card or other inventory object names. + */ private static final String[] ARTICLE_WORDS = { - "A", - "An", - "The" + "A", + "An", + "The" }; - - /**Detects whether a string begins with an article word - @param str The name of the card. - @return The sort-friendly name of the card. Example: "The Hive" becomes "Hive The".*/ - private static String moveArticleToEnd(String str){ - String articleWord; - for (int i = 0; i < ARTICLE_WORDS.length; i++){ - articleWord = ARTICLE_WORDS[i]; - if (str.startsWith(articleWord + " ")){ - str = str.substring(articleWord.length()+1) + " " + articleWord; - return str; - } - } - return str; + + /** + * Detects whether a string begins with an article word + * + * @param str The name of the card. + * @return The sort-friendly name of the card. Example: "The Hive" becomes "Hive The". + */ + private static String moveArticleToEnd(String str) { + String articleWord; + for (int i = 0; i < ARTICLE_WORDS.length; i++) { + articleWord = ARTICLE_WORDS[i]; + if (str.startsWith(articleWord + " ")) { + str = str.substring(articleWord.length() + 1) + " " + articleWord; + return str; + } + } + return str; } - + private static String toType(final InventoryItem i) { - return i instanceof IPaperCard ? ((IPaperCard)i).getRules().getType().toString() : i.getItemType(); + return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getType().toString() : i.getItemType(); } private static IPaperCard toCard(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i) : null; } + private static ManaCost toManaCost(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i).getRules().getManaCost() : ManaCost.NO_COST; } + private static CardRules toCardRules(final InventoryItem i) { return i instanceof IPaperCard ? ((IPaperCard) i).getRules() : null; } @@ -529,7 +606,7 @@ public enum ColumnDef { if (i instanceof PaperCard) { result = ((IPaperCard) i).getRules().getIntPower(); if (result == Integer.MAX_VALUE) { - if (((IPaperCard)i).getRules().getType().isPlaneswalker()) { + if (((IPaperCard) i).getRules().getType().isPlaneswalker()) { String loy = ((IPaperCard) i).getRules().getInitialLoyalty(); result = StringUtils.isNumeric(loy) ? Integer.valueOf(loy) : 0; } @@ -545,13 +622,13 @@ public enum ColumnDef { private static Integer toCMC(final InventoryItem i) { return i instanceof PaperCard ? ((IPaperCard) i).getRules().getManaCost().getCMC() : -1; } - - private static CardRarity toRarity(final InventoryItem i) { + + private static CardRarity toRarity(final InventoryItem i) { return i instanceof PaperCard ? ((IPaperCard) i).getRarity() : CardRarity.Unknown; } private static Double toRanking(final InventoryItem i, boolean truncate) { - if (i instanceof PaperCard){ + if (i instanceof PaperCard) { PaperCard cp = (PaperCard) i; double ranking = CardRanker.getRawScore(cp); if (truncate) { @@ -565,222 +642,275 @@ public enum ColumnDef { private static DeckProxy toDeck(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i) : null; } + private static ColorSet toDeckColor(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i).getColor() : null; } + private static String toDeckFolder(final InventoryItem i) { return i instanceof DeckProxy ? ((DeckProxy) i).getPath() + "/" : null; } - - /**Generates a sortable numeric string based on a card's attributes. - This is a multi-layer sort. It is coded in layers to make it easier to manipulate. - This method can be fed any inventory item, but is only useful for paper cards. - @param i An inventory item. - @return A sortable numeric string based on the item's attributes.*/ + + /** + * Generates a sortable numeric string based on a card's attributes. + * This is a multi-layer sort. It is coded in layers to make it easier to manipulate. + * This method can be fed any inventory item, but is only useful for paper cards. + * + * @param i An inventory item. + * @return A sortable numeric string based on the item's attributes. + */ private static String toCollectorPrefix(final InventoryItem i) { - //make sure it's a card. if not, pointless to proceed. - return (i instanceof PaperCard ? toBasicLandsLast(i) + " " : "") + toSortableName(i.getName()); + //make sure it's a card. if not, pointless to proceed. + String collectorNumber; + if (i instanceof PaperCard) { + collectorNumber = ((PaperCard) i).getCollectorNumberSortingKey(); + } else { + collectorNumber = IPaperCard.NO_COLLECTOR_NUMBER; + } + return collectorNumber; } - - /**Returns 1 for land, otherwise 0 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 1 for land, otherwise 0 and continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toLandsLast(final InventoryItem i) { - //nonland? - return !(((IPaperCard) i).getRules().getType().isLand()) ? - "0" + toArtifactsWithColorlessCostsLast(i) - //land - : "1"; + //nonland? + return !(((IPaperCard) i).getRules().getType().isLand()) ? + "0" + toArtifactsWithColorlessCostsLast(i) + //land + : "1"; } - - /**Returns 1 for artifacts without color shards in their mana cost, otherwise 0 and continues sorting. - As of 2019, colored artifacts appear here if there are no colored shards in their casting cost. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 1 for artifacts without color shards in their mana cost, otherwise 0 and continues sorting. + * As of 2019, colored artifacts appear here if there are no colored shards in their casting cost. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toArtifactsWithColorlessCostsLast(final InventoryItem i) { - forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); - - return !(((IPaperCard) i).getRules().getType().isArtifact() && (toColor(i).isColorless() || - //If it isn't colorless, see if it can be paid with only white, only blue, only black. - //No need to check others since three-color hybrid shards don't exist. - manaCost.canBePaidWithAvaliable(MagicColor.WHITE) && - manaCost.canBePaidWithAvaliable(MagicColor.BLUE) && - manaCost.canBePaidWithAvaliable(MagicColor.BLACK))) - ? "0" + toSplitLast(i): "1"; + forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); + + return !(((IPaperCard) i).getRules().getType().isArtifact() && (toColor(i).isColorless() || + //If it isn't colorless, see if it can be paid with only white, only blue, only black. + //No need to check others since three-color hybrid shards don't exist. + manaCost.canBePaidWithAvaliable(MagicColor.WHITE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLUE) && + manaCost.canBePaidWithAvaliable(MagicColor.BLACK))) + ? "0" + toSplitLast(i) : "1"; } - - /**Returns 1 for split cards or 0 for other cards; continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 1 for split cards or 0 for other cards; continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toSplitLast(final InventoryItem i) { - return ((IPaperCard) i).getRules().getSplitType() != CardSplitType.Split ? - "0" + toConspiracyFirst(i) : "1" + toSplitCardSort(i); + return ((IPaperCard) i).getRules().getSplitType() != CardSplitType.Split ? + "0" + toConspiracyFirst(i) : "1" + toSplitCardSort(i); } - - /**Returns 0 for Conspiracy cards, otherwise 1 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for Conspiracy cards, otherwise 1 and continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toConspiracyFirst(final InventoryItem i) { return ((IPaperCard) i).getRules().getType().isConspiracy() ? "0" //is a Conspiracy : "1" + toColorlessFirst(i); //isn't a Conspiracy } - - /**Returns 0 for colorless cards, otherwise 1 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for colorless cards, otherwise 1 and continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toColorlessFirst(final InventoryItem i) { - return toColor(i).isColorless() ? - "0" : "1" + toMonocolorFirst(i); + return toColor(i).isColorless() ? + "0" : "1" + toMonocolorFirst(i); } - - /**Returns 0 for monocolor cards, 1 for multicolor cards; continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for monocolor cards, 1 for multicolor cards; continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toMonocolorFirst(final InventoryItem i) { - return toColor(i).isMonoColor() ? - "0" + toWubrgOrder(i): "1" + toGoldFirst(i); + return toColor(i).isMonoColor() ? + "0" + toWubrgOrder(i) : "1" + toGoldFirst(i); } - - /**Returns 0 for gold cards and continues sorting, 1 otherwise. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for gold cards and continues sorting, 1 otherwise. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toGoldFirst(final InventoryItem i) { - forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); - - return !(manaCost.canBePaidWithAvaliable(MagicColor.WHITE) | manaCost.canBePaidWithAvaliable(MagicColor.BLUE) | - manaCost.canBePaidWithAvaliable(MagicColor.BLACK) | manaCost.canBePaidWithAvaliable(MagicColor.RED) | - manaCost.canBePaidWithAvaliable(MagicColor.GREEN)) ? "0" : "1"; + forge.card.mana.ManaCost manaCost = ((IPaperCard) i).getRules().getManaCost(); + + return !(manaCost.canBePaidWithAvaliable(MagicColor.WHITE) | manaCost.canBePaidWithAvaliable(MagicColor.BLUE) | + manaCost.canBePaidWithAvaliable(MagicColor.BLACK) | manaCost.canBePaidWithAvaliable(MagicColor.RED) | + manaCost.canBePaidWithAvaliable(MagicColor.GREEN)) ? "0" : "1"; } - - /**Entry point for generating split card sortable strings. - Splits the card into two card faces, then sends it to the next - sorting method. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Entry point for generating split card sortable strings. + * Splits the card into two card faces, then sends it to the next + * sorting method. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ //Split card sorting is probably as complex as sorting gets. //This method serves as an entry point only, separating the two card parts for convenience. private static String toSplitCardSort(final InventoryItem i) { - CardRules rules = ((IPaperCard) i).getRules(); - forge.card.ICardFace mainPart = rules.getMainPart(); - forge.card.ICardFace otherPart = rules.getOtherPart(); - return toSplitSort(mainPart, otherPart); + CardRules rules = ((IPaperCard) i).getRules(); + forge.card.ICardFace mainPart = rules.getMainPart(); + forge.card.ICardFace otherPart = rules.getOtherPart(); + return toSplitSort(mainPart, otherPart); } - - /**Generates a sortable numeric string for split cards. - Split cards are sorted by color on both halves. - Sort order is C//C, W//W, U//U, B//B, R//R, G//G, - Gold/Gold, - W//U, U//B, B//R, R//G, G//W, - W//B, U//R, B//G, R//W, G//U, - W//R, U//G, B//W, R//U, G//B, - W//G, U//W, B//U, R//B, G//R. - Any that do not conform will sort at the end. - @param mainPart The first half of the card. - @param otherPart The other half of the card. - @return Part of a sortable numeric string.*/ - private static String toSplitSort(final ICardFace mainPart, final ICardFace otherPart) { - ColorSet mainPartColor = mainPart.getColor(); - ColorSet otherPartColor = otherPart.getColor(); - - return mainPartColor.isEqual(otherPartColor.getColor()) - - ? //both halves match - - (mainPartColor.isEqual(MagicColor.WHITE) ? "01" : - mainPartColor.isEqual(MagicColor.BLUE) ? "02" : - mainPartColor.isEqual(MagicColor.BLACK) ? "03" : - mainPartColor.isEqual(MagicColor.RED) ? "04" : - mainPartColor.isEqual(MagicColor.GREEN) ? "05" : "00") - - : //halves don't match - - //both halves gold - mainPartColor.isMulticolor() && otherPartColor.isMulticolor() ? "06" : - - //second color is << 1 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLUE) ? "11" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.BLACK) ? "12" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.RED) ? "13" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.GREEN) ? "14" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.WHITE) ? "15" : - - //second color is << 2 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLACK) ? "21" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.RED) ? "22" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.GREEN) ? "23" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.WHITE) ? "24" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLUE) ? "25" : - - //second color is << 3 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.RED) ? "31" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.GREEN) ? "32" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.WHITE) ? "33" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLUE) ? "34" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLACK) ? "35" : - - //second color is << 4 - mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.GREEN) ? "41" : - mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.WHITE) ? "42" : - mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.BLUE) ? "43" : - mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLACK) ? "44" : - mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.RED) ? "45" - - ://No split cards have been printed that don't fall into one of these groups. - - "99"; + + /** + * Generates a sortable numeric string for split cards. + * Split cards are sorted by color on both halves. + * Sort order is C//C, W//W, U//U, B//B, R//R, G//G, + * Gold/Gold, + * W//U, U//B, B//R, R//G, G//W, + * W//B, U//R, B//G, R//W, G//U, + * W//R, U//G, B//W, R//U, G//B, + * W//G, U//W, B//U, R//B, G//R. + * Any that do not conform will sort at the end. + * + * @param mainPart The first half of the card. + * @param otherPart The other half of the card. + * @return Part of a sortable numeric string. + */ + private static String toSplitSort(final ICardFace mainPart, final ICardFace otherPart) { + ColorSet mainPartColor = mainPart.getColor(); + ColorSet otherPartColor = otherPart.getColor(); + + return mainPartColor.isEqual(otherPartColor.getColor()) + + ? //both halves match + + (mainPartColor.isEqual(MagicColor.WHITE) ? "01" : + mainPartColor.isEqual(MagicColor.BLUE) ? "02" : + mainPartColor.isEqual(MagicColor.BLACK) ? "03" : + mainPartColor.isEqual(MagicColor.RED) ? "04" : + mainPartColor.isEqual(MagicColor.GREEN) ? "05" : "00") + + : //halves don't match + + //both halves gold + mainPartColor.isMulticolor() && otherPartColor.isMulticolor() ? "06" : + + //second color is << 1 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLUE) ? "11" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.BLACK) ? "12" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.RED) ? "13" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.GREEN) ? "14" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.WHITE) ? "15" : + + //second color is << 2 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.BLACK) ? "21" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.RED) ? "22" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.GREEN) ? "23" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.WHITE) ? "24" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLUE) ? "25" : + + //second color is << 3 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.RED) ? "31" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.GREEN) ? "32" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.WHITE) ? "33" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLUE) ? "34" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.BLACK) ? "35" : + + //second color is << 4 + mainPartColor.isEqual(MagicColor.WHITE) && otherPartColor.isEqual(MagicColor.GREEN) ? "41" : + mainPartColor.isEqual(MagicColor.BLUE) && otherPartColor.isEqual(MagicColor.WHITE) ? "42" : + mainPartColor.isEqual(MagicColor.BLACK) && otherPartColor.isEqual(MagicColor.BLUE) ? "43" : + mainPartColor.isEqual(MagicColor.RED) && otherPartColor.isEqual(MagicColor.BLACK) ? "44" : + mainPartColor.isEqual(MagicColor.GREEN) && otherPartColor.isEqual(MagicColor.RED) ? "45" + + ://No split cards have been printed that don't fall into one of these groups. + + "99"; } - - /**Returns 0 for white, 1 for blue, 2 for black, 3 for red, or 4 for green. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for white, 1 for blue, 2 for black, 3 for red, or 4 for green. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toWubrgOrder(final InventoryItem i) { - ColorSet color = toColor(i); - return color.hasWhite() ? "0" : color.hasBlue() ? "1" : color.hasBlack() ? "2" : - color.hasRed() ? "3" : "4"; + ColorSet color = toColor(i); + return color.hasWhite() ? "0" : color.hasBlue() ? "1" : color.hasBlack() ? "2" : + color.hasRed() ? "3" : "4"; } - - /**Returns 1 for Contraptions, otherwise 0 and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 1 for Contraptions, otherwise 0 and continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toContraptionsLast(final InventoryItem i) { - return !(((IPaperCard) i).getRules().getType().hasSubtype("Contraption")) ? - "0" + toLandsLast(i) : "1"; + return !(((IPaperCard) i).getRules().getType().hasSubtype("Contraption")) ? + "0" + toLandsLast(i) : "1"; } - - /**Returns 1 for basic lands, 0 otherwise, and continues sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 1 for basic lands, 0 otherwise, and continues sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toBasicLandsLast(final InventoryItem i) { - return !(((IPaperCard) i).getRules().getType().isBasicLand()) - ? "0" + toContraptionsLast(i) - : "1" + toFullArtFirst(i); + return !(((IPaperCard) i).getRules().getType().isBasicLand()) + ? "0" + toContraptionsLast(i) + : "1" + toFullArtFirst(i); } - - /**Currently only continues sorting. If Forge is updated to - use a flag for full-art lands, this method should be updated - to assign those 0 and regular lands 1, then continue sorting. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Currently only continues sorting. If Forge is updated to + * use a flag for full-art lands, this method should be updated + * to assign those 0 and regular lands 1, then continue sorting. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toFullArtFirst(final InventoryItem i) { - return toBasicLandSort(i); + return toBasicLandSort(i); } - - /**Returns 0 for wastes, 1 for plains, 2 for island, - 3 for swamp, 4 for mountain, 5 for forest. Snow - lands are treated like nonsnow. - @param i A paper card. - @return Part of a sortable numeric string.*/ + + /** + * Returns 0 for wastes, 1 for plains, 2 for island, + * 3 for swamp, 4 for mountain, 5 for forest. Snow + * lands are treated like nonsnow. + * + * @param i A paper card. + * @return Part of a sortable numeric string. + */ private static String toBasicLandSort(final InventoryItem i) { - CardType basicLandType = ((IPaperCard) i).getRules().getType(); - return basicLandType.hasStringType("Plains") ? "1" : ( - basicLandType.hasStringType("Island") ? "2" : ( - basicLandType.hasStringType("Swamp") ? "3" : ( - basicLandType.hasStringType("Mountain") ? "4" : ( - basicLandType.hasStringType("Forest") ? "5" : "0" - ) - ) - ) - ); + CardType basicLandType = ((IPaperCard) i).getRules().getType(); + return basicLandType.hasStringType("Plains") ? "1" : ( + basicLandType.hasStringType("Island") ? "2" : ( + basicLandType.hasStringType("Swamp") ? "3" : ( + basicLandType.hasStringType("Mountain") ? "4" : ( + basicLandType.hasStringType("Forest") ? "5" : "0" + ) + ) + ) + ); } } diff --git a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java index 9e0808c2f45..d79ee03430b 100644 --- a/forge-gui/src/main/java/forge/itemmanager/GroupDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/GroupDef.java @@ -287,6 +287,7 @@ public enum GroupDef { //build sorted list of sets List sortedSets = Lists.newArrayList(FModel.getMagicDb().getEditions()); + sortedSets.addAll(Lists.newArrayList(FModel.getMagicDb().getCustomEditions())); Collections.sort(sortedSets); Collections.reverse(sortedSets); diff --git a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java index 5e4ca8993df..a94c0abb15e 100644 --- a/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java +++ b/forge-gui/src/main/java/forge/itemmanager/SItemManagerUtil.java @@ -164,10 +164,16 @@ public final class SItemManagerUtil { return builder.toString(); } - private static final GroupDef[] CARD_GROUPBY_OPTIONS = { GroupDef.DEFAULT, GroupDef.CARD_TYPE, GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET, GroupDef.CARD_RARITY, GroupDef.PW_DECK_SORT }; - private static final GroupDef[] DECK_GROUPBY_OPTIONS = { GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET }; - private static final ColumnDef[] CARD_PILEBY_OPTIONS = { ColumnDef.CMC, ColumnDef.COLOR, ColumnDef.NAME, ColumnDef.COST, ColumnDef.TYPE, ColumnDef.RARITY, ColumnDef.SET }; - private static final ColumnDef[] DECK_PILEBY_OPTIONS = { ColumnDef.DECK_COLOR, ColumnDef.DECK_FOLDER, ColumnDef.NAME, ColumnDef.DECK_FORMAT, ColumnDef.DECK_EDITION }; + private static final GroupDef[] CARD_GROUPBY_OPTIONS = {GroupDef.DEFAULT, GroupDef.CARD_TYPE, GroupDef.COLOR, + GroupDef.COLOR_IDENTITY, GroupDef.SET, GroupDef.CARD_RARITY, + GroupDef.PW_DECK_SORT}; + private static final GroupDef[] DECK_GROUPBY_OPTIONS = {GroupDef.COLOR, GroupDef.COLOR_IDENTITY, GroupDef.SET}; + private static final ColumnDef[] CARD_PILEBY_OPTIONS = {ColumnDef.CMC, ColumnDef.COLOR, ColumnDef.NAME, + ColumnDef.COST, ColumnDef.TYPE, ColumnDef.RARITY, + ColumnDef.SET, ColumnDef.COLLECTOR_ORDER}; + private static final ColumnDef[] DECK_PILEBY_OPTIONS = {ColumnDef.DECK_COLOR, ColumnDef.DECK_FOLDER, + ColumnDef.NAME, ColumnDef.DECK_FORMAT, + ColumnDef.DECK_EDITION}; public static void populateImageViewOptions(final IItemManager itemManager, final IComboBox cbGroupByOptions, final IComboBox cbPileByOptions) { final boolean isDeckManager = itemManager.getGenericType().equals(DeckProxy.class); diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java index 3d771509799..d58d06a3090 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -212,7 +212,7 @@ public final class ForgeConstants { public static final String DECK_BASE_DIR; public static final String DECK_CONSTRUCTED_DIR; static { - ForgeProfileProperties.load(); + ForgeProfileProperties.load(GuiBase.isUsingAppDirectory()); USER_DIR = ForgeProfileProperties.getUserDir(); CACHE_DIR = ForgeProfileProperties.getCacheDir(); CACHE_CARD_PICS_DIR = ForgeProfileProperties.getCardPicsDir(); @@ -338,13 +338,18 @@ public final class ForgeConstants { public static final String STACK_EFFECT_NOTIFICATION_ALWAYS = "Always"; public static final String STACK_EFFECT_NOTIFICATION_AI_AND_TRIGGERED = "AI cast/activated, or triggered by any player"; - // Constants for LAnd played notification policy + // Constants for Land played notification policy public static final String LAND_PLAYED_NOTIFICATION_NEVER = "Never"; public static final String LAND_PLAYED_NOTIFICATION_ALWAYS = "Always"; public static final String LAND_PLAYED_NOTIFICATION_ALWAYS_FOR_NONBASIC_LANDS = "Always, but only for nonbasic lands"; public static final String LAND_PLAYED_NOTIFICATION_AI = "Lands entering a battlefield because of an action of a AI player"; public static final String LAND_PLAYED_NOTIFICATION_AI_FOR_NONBASIC_LANDS = "Nonbasic lands entering a battlefield because of an action of a AI player"; - + + // Constants for Land played notification policy + public static final String SWITCH_CARDSTATES_DECK_NEVER = "Never"; + public static final String SWITCH_CARDSTATES_DECK_ALWAYS = "Always"; + public static final String SWITCH_CARDSTATES_DECK_HOVER = "Switch back on hover"; + // Set boolean constant for landscape mode for gdx port public static final boolean isGdxPortLandscape = FileUtil.doesFileExist(ASSETS_DIR + "switch_orientation.ini"); diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java index 033357e4d60..f8680cf9810 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgePreferences.java @@ -133,6 +133,7 @@ public class ForgePreferences extends PreferencesStore { UI_FILTER_LANDS_BY_COLOR_IDENTITY("true"), UI_ALLOW_ESC_TO_END_TURN ("false"), UI_ALT_PLAYERINFOLAYOUT ("false"), + UI_ALT_PLAYERZONETABS ("false"), UI_PRESELECT_PREVIOUS_ABILITY_ORDER ("false"), UI_AUTO_YIELD_MODE (ForgeConstants.AUTO_YIELD_PER_ABILITY), UI_SHOW_STORM_COUNT_IN_PROMPT ("false"), @@ -157,6 +158,7 @@ public class ForgePreferences extends PreferencesStore { UI_DEFAULT_FONT_SIZE("12"), UI_SELECT_FROM_CARD_DISPLAYS("true"), UI_FOR_TOUCHSCREN("false"), + UI_SWITCH_STATES_DECKVIEW("Always"), UI_VIBRATE_ON_LIFE_LOSS("true"), UI_VIBRATE_ON_LONG_PRESS("true"), diff --git a/forge-gui/src/main/java/forge/localinstance/properties/ForgeProfileProperties.java b/forge-gui/src/main/java/forge/localinstance/properties/ForgeProfileProperties.java index 7eccef3d8f6..c2f281ba90d 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeProfileProperties.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeProfileProperties.java @@ -57,11 +57,11 @@ public class ForgeProfileProperties { //prevent initializing static class } - public static void load() { + public static void load(boolean isUsingAppDirectory) { final Properties props = new Properties(); final File propFile = new File(ForgeConstants.PROFILE_FILE); try { - if (propFile.canRead()) { + if (propFile.canRead() && !isUsingAppDirectory) { props.load(new FileInputStream(propFile)); } } catch (final IOException e) { diff --git a/forge-gui/src/main/java/forge/model/FModel.java b/forge-gui/src/main/java/forge/model/FModel.java index de663df36eb..e75d11df015 100644 --- a/forge-gui/src/main/java/forge/model/FModel.java +++ b/forge-gui/src/main/java/forge/model/FModel.java @@ -277,28 +277,23 @@ public final class FModel { } } - allCardsNoAlt = ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getAllCardsNoAlt(), getMagicDb().getCustomCards().getAllCardsNoAlt()), PaperCard.class); - archenemyCards = ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard.FN_GET_RULES)), PaperCard.class); - planechaseCards = ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class); + if (GuiBase.getInterface().isLibgdxPort() && GuiBase.getDeviceRAM() < 5000) + return; // don't preload ItemPool on mobile port with less than 5GB RAM + + //common ItemPool to preload + allCardsNoAlt = getAllCardsNoAlt(); + archenemyCards = getArchenemyCards(); + planechaseCards = getPlanechaseCards(); if (GuiBase.getInterface().isLibgdxPort()) { //preload mobile Itempool - uniqueCardsNoAlt = ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getUniqueCardsNoAlt(), getMagicDb().getCustomCards().getUniqueCardsNoAlt()), PaperCard.class); + uniqueCardsNoAlt = getUniqueCardsNoAlt(); } else { //preload Desktop Itempool - commanderPool = ItemPool.createFrom(Iterables.concat( - getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES)), - getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES))), PaperCard.class); - brawlCommander = ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.and( - FModel.getFormats().get("Brawl").getFilterPrinted(), Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, PaperCard.FN_GET_RULES))), getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.and( - FModel.getFormats().get("Brawl").getFilterPrinted(), Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, PaperCard.FN_GET_RULES)))), PaperCard.class); - oathbreakerCommander = ItemPool.createFrom(Iterables.concat( - getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.CAN_BE_OATHBREAKER, CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL), PaperCard.FN_GET_RULES)), - getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.CAN_BE_OATHBREAKER, CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL), PaperCard.FN_GET_RULES))), PaperCard.class); - tinyLeadersCommander = ItemPool.createFrom(Iterables.concat( - getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard.FN_GET_RULES)), - getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard.FN_GET_RULES))), PaperCard.class); - avatarPool = ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard.FN_GET_RULES)), PaperCard.class); - conspiracyPool = ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_CONSPIRACY, PaperCard.FN_GET_RULES)), PaperCard.class); + commanderPool = getCommanderPool(); + brawlCommander = getBrawlCommander(); + tinyLeadersCommander = getTinyLeadersCommander(); + avatarPool = getAvatarPool(); + conspiracyPool = getConspiracyPool(); } } @@ -317,42 +312,70 @@ public final class FModel { } public static ItemPool getUniqueCardsNoAlt() { + if (uniqueCardsNoAlt == null) + return ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getUniqueCardsNoAlt(), getMagicDb().getCustomCards().getUniqueCardsNoAlt()), PaperCard.class); return uniqueCardsNoAlt; } public static ItemPool getAllCardsNoAlt() { + if (allCardsNoAlt == null) + return ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getAllCardsNoAlt(), getMagicDb().getCustomCards().getAllCardsNoAlt()), PaperCard.class); return allCardsNoAlt; } public static ItemPool getArchenemyCards() { + if (archenemyCards == null) + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_SCHEME, PaperCard.FN_GET_RULES)), PaperCard.class); return archenemyCards; } public static ItemPool getPlanechaseCards() { + if (planechaseCards == null) + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_PLANE_OR_PHENOMENON, PaperCard.FN_GET_RULES)), PaperCard.class); return planechaseCards; } public static ItemPool getBrawlCommander() { + if (brawlCommander == null) + return ItemPool.createFrom(Iterables.concat(getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.and( + FModel.getFormats().get("Brawl").getFilterPrinted(), Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, PaperCard.FN_GET_RULES))), getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.and( + FModel.getFormats().get("Brawl").getFilterPrinted(), Predicates.compose(CardRulesPredicates.Presets.CAN_BE_BRAWL_COMMANDER, PaperCard.FN_GET_RULES)))), PaperCard.class); return brawlCommander; } public static ItemPool getOathbreakerCommander() { + if (oathbreakerCommander == null) + return ItemPool.createFrom(Iterables.concat( + getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.CAN_BE_OATHBREAKER, CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL), PaperCard.FN_GET_RULES)), + getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(Predicates.or(CardRulesPredicates.Presets.CAN_BE_OATHBREAKER, CardRulesPredicates.Presets.CAN_BE_SIGNATURE_SPELL), PaperCard.FN_GET_RULES))), PaperCard.class); return oathbreakerCommander; } public static ItemPool getTinyLeadersCommander() { + if (tinyLeadersCommander == null) + return ItemPool.createFrom(Iterables.concat( + getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard.FN_GET_RULES)), + getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_TINY_LEADERS_COMMANDER, PaperCard.FN_GET_RULES))), PaperCard.class); return tinyLeadersCommander; } public static ItemPool getCommanderPool() { + if (commanderPool == null) + return ItemPool.createFrom(Iterables.concat( + getMagicDb().getCommonCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES)), + getMagicDb().getCustomCards().getAllCardsNoAlt(Predicates.compose(CardRulesPredicates.Presets.CAN_BE_COMMANDER, PaperCard.FN_GET_RULES))), PaperCard.class); return commanderPool; } public static ItemPool getAvatarPool() { + if (avatarPool == null) + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_VANGUARD, PaperCard.FN_GET_RULES)), PaperCard.class); return avatarPool; } public static ItemPool getConspiracyPool() { + if (conspiracyPool == null) + return ItemPool.createFrom(getMagicDb().getVariantCards().getAllCards(Predicates.compose(CardRulesPredicates.Presets.IS_CONSPIRACY, PaperCard.FN_GET_RULES)), PaperCard.class); return conspiracyPool; } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 8a76b21a2f3..ba58489a1cf 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -198,8 +198,6 @@ public class HumanPlay { req.playAbility(!useOldTargets, false, true); } - // ------------------------------------------------------------------------ - private static int getAmountFromPart(CostPart part, Card source, SpellAbility sourceAbility) { String amountString = part.getAmount(); return StringUtils.isNumeric(amountString) ? Integer.parseInt(amountString) : AbilityUtils.calculateAmount(source, amountString, sourceAbility); diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index 4bcbdcbf4ab..56f0b326e18 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -143,8 +143,9 @@ public class HumanPlaySpellAbility { // This line makes use of short-circuit evaluation of boolean values, that is each subsequent argument // is only executed or evaluated if the first argument does not suffice to determine the value of the expression - final boolean prerequisitesMet = announceValuesLikeX() - && announceType() + // because of Selective Snare do announceType first + final boolean prerequisitesMet = announceType() + && announceValuesLikeX() && (!mayChooseTargets || ability.setupTargets()) // if you can choose targets, then do choose them. && ability.canCastTiming(human) && ability.checkRestrictions(human) diff --git a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java index d8913de1254..e0f5d2ee606 100644 --- a/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java +++ b/forge-gui/src/main/java/forge/player/PlayerControllerHuman.java @@ -11,6 +11,7 @@ import java.util.Arrays; import java.util.Collection; import java.util.Collections; import java.util.Comparator; +import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.Map.Entry; @@ -62,6 +63,7 @@ import forge.game.card.CardCollection; import forge.game.card.CardCollectionView; import forge.game.card.CardFaceView; import forge.game.card.CardLists; +import forge.game.card.CardPlayOption; import forge.game.card.CardPredicates; import forge.game.card.CardUtil; import forge.game.card.CardView; @@ -266,10 +268,19 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final ITriggerEvent triggerEvent) { // make sure another human player can't choose opponents cards just because he might see them if (triggerEvent != null && !hostCard.isInZone(ZoneType.Battlefield) && !hostCard.getOwner().equals(player) && - !hostCard.getController().equals(player) && hostCard.mayPlay(player).size() == 0 && + !hostCard.getController().equals(player) && // If player cast Shaman's Trance, they can play spells from any Graveyard (if other effects allow it to be cast) (!player.hasKeyword("Shaman's Trance") || !hostCard.isInZone(ZoneType.Graveyard))) { - return null; + boolean noPermission = true; + for (CardPlayOption o : hostCard.mayPlay(player)) { + if (o.grantsZonePermissions()) { + noPermission = false; + break; + } + } + if (noPermission) { + return null; + } } spellViewCache = SpellAbilityView.getMap(abilities); final SpellAbilityView resultView = getGui().getAbilityToPlay(CardView.get(hostCard), @@ -303,8 +314,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final int deckMinSize = Math.min(mainSize, gameType.getDeckFormat().getMainRange().getMinimum()); final Range sbRange = gameType.getDeckFormat().getSideRange(); - // Limited doesn't have a sideboard max, so let the Main min take care - // of things. + // Limited doesn't have a sideboard max, so let the Main min take care of things. final int sbMax = sbRange == null ? combinedDeckSize : sbRange.getMaximum(); List newMain = null; @@ -347,8 +357,9 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont map.put(null, damageDealt); } else { if ((attacker.hasKeyword(Keyword.TRAMPLE) && defender != null) || (blockers.size() > 1) - || (attacker.hasKeyword("You may assign CARDNAME's combat damage divided as you choose among defending" + - " player and/or any number of creatures they control.")) && overrideOrder && blockers.size() >0) { + || ((attacker.hasKeyword("You may assign CARDNAME's combat damage divided as you choose among " + + "defending player and/or any number of creatures they control.")) && overrideOrder && + blockers.size() >0) || (attacker.hasKeyword("Trample over planeswalkers") && defender instanceof Card)) { GameEntityViewMap gameCacheBlockers = GameEntityView.getMap(blockers); final CardView vAttacker = CardView.get(attacker); final GameEntityView vDefender = GameEntityView.get(defender); @@ -379,6 +390,24 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } + @Override + public Map divideShield(Card effectSource, Map affected, int shieldAmount) { + final CardView vSource = CardView.get(effectSource); + final Map vAffected = new HashMap<>(affected.size()); + for (Map.Entry e : affected.entrySet()) { + vAffected.put(GameEntityView.get(e.getKey()), e.getValue()); + } + final Map vResult = getGui().assignGenericAmount(vSource, vAffected, shieldAmount, false, + localizer.getMessage("lblShield")); + Map result = new HashMap<>(vResult.size()); + for (Map.Entry e : affected.entrySet()) { + if (vResult.containsKey(GameEntityView.get(e.getKey()))) { + result.put(e.getKey(), vResult.get(GameEntityView.get(e.getKey()))); + } + } + return result; + } + @Override public Integer announceRequirements(final SpellAbility ability, final String announce) { int max = Integer.MAX_VALUE; @@ -493,8 +522,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public CardCollectionView chooseCardsForEffect(final CardCollectionView sourceList, final SpellAbility sa, final String title, final int min, final int max, final boolean isOptional, Map params) { // If only one card to choose, use a dialog box. - // Otherwise, use the order dialog to be able to grab multiple cards in - // one shot + // Otherwise, use the order dialog to be able to grab multiple cards in one shot if (min == 1 && max == 1) { final Card singleChosen = chooseSingleEntityForEffect(sourceList, sa, title, isOptional, params); @@ -527,8 +555,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public T chooseSingleEntityForEffect(final FCollectionView optionList, final DelayedReveal delayedReveal, final SpellAbility sa, final String title, final boolean isOptional, final Player targetedPlayer, Map params) { - // Human is supposed to read the message and understand from it what to - // choose + // Human is supposed to read the message and understand from it what to choose if (optionList.isEmpty()) { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), @@ -580,8 +607,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont Sentry.getContext().addExtra("Card", sa.getCardView().toString()); Sentry.getContext().addExtra("SpellAbility", sa.toString()); - // Human is supposed to read the message and understand from it what to // - // choose + // Human is supposed to read the message and understand from it what to choose if (optionList.isEmpty()) { if (delayedReveal != null) { reveal(delayedReveal.getCards(), delayedReveal.getZone(), delayedReveal.getOwner(), @@ -997,6 +1023,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public CardCollectionView orderMoveToZoneList(final CardCollectionView cards, final ZoneType destinationZone, final SpellAbility source) { + boolean bottomOfLibrary = false; if (source == null || source.getApi() != ApiType.ReorderZone) { if (destinationZone == ZoneType.Graveyard) { switch (FModel.getPreferences().getPref(FPref.UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED)) { @@ -1019,13 +1046,18 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } + if (source != null) { + if (source.hasParam("LibraryPosition")) { + bottomOfLibrary = Integer.parseInt(source.getParam("LibraryPosition")) < 0; + } + } tempShowCards(cards); GameEntityViewMap gameCacheMove = GameEntityView.getMap(cards); List choices = gameCacheMove.getTrackableKeys(); switch (destinationZone) { case Library: - choices = getGui().order(localizer.getMessage("lblChooseOrderCardsPutIntoLibrary"), localizer.getMessage("lblClosestToTop"), choices, null); + choices = getGui().order(localizer.getMessage("lblChooseOrderCardsPutIntoLibrary"), localizer.getMessage(bottomOfLibrary ? "lblClosestToBottom" : "lblClosestToTop"), choices, null); break; case Battlefield: choices = getGui().order(localizer.getMessage("lblChooseOrderCardsPutOntoBattlefield"), localizer.getMessage("lblPutFirst"), choices, null); @@ -1269,6 +1301,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont continue; } if (sa.hasParam("TokenScript")) { + sa.setActivatingPlayer(player); Card protoType = TokenInfo.getProtoType(sa.getParam("TokenScript"), sa); for (String type : protoType.getType().getCreatureTypes()) { Integer count = typesInDeck.get(type); @@ -1284,6 +1317,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont SpellAbility sa = t.ensureAbility(); if (sa != null) { if (sa.hasParam("TokenScript")) { + sa.setActivatingPlayer(player); Card protoType = TokenInfo.getProtoType(sa.getParam("TokenScript"), sa); for (String type : protoType.getType().getCreatureTypes()) { Integer count = typesInDeck.get(type); @@ -1339,7 +1373,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont */ @Override public boolean confirmReplacementEffect(final ReplacementEffect replacementEffect, final SpellAbility effectSA, - final String question) { + GameEntity affected, final String question) { final InputConfirm inp = new InputConfirm(this, question, effectSA); inp.showAndWait(); return inp.getResult(); @@ -1362,8 +1396,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont @Override public CardCollectionView getCardsToMulligan(final Player firstPlayer) { - // Partial Paris is gone, so it being commander doesn't really matter - // anymore... + // Partial Paris is gone, so it being commander doesn't really matter anymore... final InputConfirmMulligan inp = new InputConfirmMulligan(this, player, firstPlayer); inp.showAndWait(); return inp.isKeepHand() ? null : player.getCardsIn(ZoneType.Hand); @@ -1402,20 +1435,17 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont if (mayAutoPass()) { // avoid prompting for input if current phase is set to be - // auto-passed - // instead posing a short delay if needed to prevent the game - // jumping ahead too quick + // auto-passed instead posing a short delay if needed to + // prevent the game jumping ahead too quick int delay = 0; if (stack.isEmpty()) { - // make sure to briefly pause at phases you're not set up to - // skip + // make sure to briefly pause at phases you're not set up to skip if (!getGui().isUiSetToSkipPhase(getGame().getPhaseHandler().getPlayerTurn().getView(), getGame().getPhaseHandler().getPhase())) { delay = FControlGamePlayback.phasesDelay; } } else { - // pause slightly longer for spells and abilities on the stack - // resolving + // pause slightly longer for spells and abilities on the stack resolving delay = FControlGamePlayback.resolveDelay; } if (delay > 0) { @@ -1437,8 +1467,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } else { final SpellAbility ability = stack.peekAbility(); if (ability != null && ability.isAbility() && getGui().shouldAutoYield(ability.yieldKey())) { - // avoid prompt for input if top ability of stack is set to - // auto-yield + // avoid prompt for input if top ability of stack is set to auto-yield try { Thread.sleep(FControlGamePlayback.resolveDelay); } catch (final InterruptedException e) { @@ -2161,8 +2190,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont public IDevModeCheats cheat() { if (cheats == null) { cheats = new DevModeCheats(); - // TODO: In Network game, inform other players that this player is - // cheating + // TODO: In Network game, inform other players that this player is cheating } return cheats; } @@ -2933,8 +2961,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // Position in the macro "sequence". private int sequenceIndex = 0; // "Actions" are stored as a pair of the "action" recipient (the entity - // to "click") and a boolean representing whether the entity is a - // player. + // to "click") and a boolean representing whether the entity is a player. private final List> rememberedActions = Lists.newArrayList(); private String rememberedSequenceText = ""; @@ -2955,10 +2982,8 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont final List> entityInfo = Lists.newArrayList(); final int playerID = getPlayer().getId(); // Only support 1 opponent for now. There are some ideas about - // supporting - // multiplayer games in the future, but for now it would complicate - // the parsing - // process, and this implementation is still a "proof of concept". + // supporting multiplayer games in the future, but for now it would complicate + // the parsing process, and this implementation is still a "proof of concept". int opponentID = 0; for (final Player player : getGame().getPlayers()) { if (player.getId() != playerID) { @@ -2968,8 +2993,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } // A more informative prompt would be useful, but the dialog seems - // to - // like to clip text in long messages... + // to like to clip text in long messages... final String prompt = localizer.getMessage("lblEnterASequence"); String textSequence = getGui().showInputDialog(prompt, dialogTitle, FSkinProp.ICO_QUEST_NOTES, rememberedSequenceText); @@ -2982,8 +3006,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont return; } // If they haven't changed the sequence, inform them the index is - // reset - // but don't change rememberedActions. + // reset but don't change rememberedActions. if (textSequence.equals(rememberedSequenceText)) { if (currentIndex > 0 && currentIndex < rememberedActions.size()) { getGui().message(localizer.getMessage("lblRestartingActionSequence"), dialogTitle); @@ -2995,8 +3018,7 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont // Clean up input textSequence = textSequence.trim().toLowerCase().replaceAll("[@%]", ""); - // Replace "opponent" and "me" with symbols to ease following - // replacements + // Replace "opponent" and "me" with symbols to ease following replacements textSequence = textSequence.replaceAll("\\bopponent\\b", "%").replaceAll("\\bme\\b", "@"); // Strip user input of anything that's not a // digit/comma/whitespace/special symbol @@ -3220,4 +3242,3 @@ public class PlayerControllerHuman extends PlayerController implements IGameCont } } - diff --git a/forge-gui/src/main/java/forge/util/ImageFetcher.java b/forge-gui/src/main/java/forge/util/ImageFetcher.java index 88734866769..750c37b2ff3 100644 --- a/forge-gui/src/main/java/forge/util/ImageFetcher.java +++ b/forge-gui/src/main/java/forge/util/ImageFetcher.java @@ -1,14 +1,15 @@ package forge.util; import java.io.File; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.HashSet; +import java.io.IOException; +import java.net.HttpURLConnection; +import java.net.URL; +import java.util.*; import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; -import java.util.regex.Matcher; -import java.util.regex.Pattern; +import forge.card.CardEdition; +import forge.item.IPaperCard; import org.apache.commons.lang3.tuple.Pair; import forge.ImageKeys; @@ -24,6 +25,9 @@ public abstract class ImageFetcher { // see https://scryfall.com/docs/api/languages and // https://en.wikipedia.org/wiki/List_of_ISO_639-1_codes private static final HashMap langCodeMap = new HashMap<>(); + private static final Map scryfallSetCodes = new HashMap<>(); + private static final String INVALID_SCRYFALL_SET_CODE = "NotFound"; + static { langCodeMap.put("en-US", "en"); langCodeMap.put("es-ES", "es"); @@ -40,6 +44,65 @@ public abstract class ImageFetcher { private HashMap> currentFetches = new HashMap<>(); private HashMap tokenImages; + private static boolean isValidScryfallURL(final String urlString){ + try { + URL u = new URL(urlString); + HttpURLConnection huc = (HttpURLConnection) u.openConnection(); + huc.setInstanceFollowRedirects(true); + huc.setRequestProperty("User-Agent", "Mozilla/5.0 (Windows; U; Windows NT 6.0; en-US; rv:1.9.1.2) " + + "Gecko/20090729 Firefox/3.5.2 (.NET CLR 3.5.30729)"); + huc.setRequestMethod("HEAD"); + return (huc.getResponseCode() == HttpURLConnection.HTTP_OK); + } catch (IOException e) { + return false; + } + + } + + private String getScryfallDownloadURL(PaperCard c, boolean backFace, String langCode){ + String setCode = scryfallSetCodes.getOrDefault(c.getEdition(), null); + if ((setCode != null) && (!setCode.equals(INVALID_SCRYFALL_SET_CODE))){ + return ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + + ImageUtil.getScryfallDownloadUrl(c, backFace, setCode, langCode); + } + + // No entry matched yet for edition + StaticData data = StaticData.instance(); + CardEdition edition = data.getEditions().get(c.getEdition()); + if (edition == null) // edition does not exist - some error occurred with card data + return null; + // 1. Try MCI code first, as it original. + String mciCode = edition.getMciCode().toLowerCase(); + String url = ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + + ImageUtil.getScryfallDownloadUrl(c, backFace, mciCode, langCode); + if (isValidScryfallURL(url)) { + scryfallSetCodes.put(c.getEdition(), setCode); + return url; + } + // 2. MCI didn't work, so now try all other codes available in edition, alias included. + // skipping dups with set, and returning as soon as one will work. + Set cardSetCodes = new HashSet<>(); + // all set-codes should be lower case + cardSetCodes.add(mciCode); // add MCI + cardSetCodes.add(edition.getCode().toLowerCase()); + cardSetCodes.add(edition.getCode2().toLowerCase()); + if (edition.getAlias() != null) + cardSetCodes.add(edition.getAlias().toLowerCase()); + for (String code : cardSetCodes) { + if (code.equals(mciCode)) + continue; // Already checked, SKIP + url = ForgeConstants.URL_PIC_SCRYFALL_DOWNLOAD + + ImageUtil.getScryfallDownloadUrl(c, backFace, code, langCode); + if (isValidScryfallURL(url)) { + scryfallSetCodes.put(c.getEdition(), setCode); + return url; + } + } + // If we're here, no valid URL has been found. Record this for the future + scryfallSetCodes.put(c.getEdition(), INVALID_SCRYFALL_SET_CODE); + return null; + } + public void fetchImage(final String imageKey, final Callback callback) { FThreads.assertExecutedByEdt(true); @@ -62,39 +125,24 @@ public abstract class ImageFetcher { System.err.println("Paper card not found for: " + imageKey); return; } - final boolean backFace = imageKey.endsWith(ImageKeys.BACKFACE_POSTFIX); + final boolean backFace = ImageUtil.hasBackFacePicture(paperCard); final String filename = ImageUtil.getImageKey(paperCard, backFace, true); - destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR + "/" + filename + ".jpg"); + destFile = new File(ForgeConstants.CACHE_CARD_PICS_DIR, filename + ".jpg"); //move priority of ftp image here StringBuilder setDownload = new StringBuilder(ForgeConstants.URL_PIC_DOWNLOAD); setDownload.append(ImageUtil.getDownloadUrl(paperCard, backFace)); downloadUrls.add(setDownload.toString()); - - int artIndex = 1; - final Pattern pattern = Pattern.compile("^.:([^|]*\\|){2}(\\d+).*$"); - Matcher matcher = pattern.matcher(imageKey); - if (matcher.matches()) { - artIndex = Integer.parseInt(matcher.group(2)); - } - final StaticData data = StaticData.instance(); - final String cardNum = data.getCommonCards().getCardCollectorNumber(paperCard.getName(), - paperCard.getEdition(), artIndex); - if (cardNum != null) { - String suffix = ""; - if (paperCard.getRules().getOtherPart() != null) { - suffix = (backFace ? "b" : "a"); - } - final String editionMciCode = data.getEditions().getMciCodeByCode(paperCard.getEdition()); + final String cardCollectorNumber = paperCard.getCollectorNumber(); + if (!cardCollectorNumber.equals(IPaperCard.NO_COLLECTOR_NUMBER)){ String langCode = "en"; String UILang = FModel.getPreferences().getPref(ForgePreferences.FPref.UI_LANGUAGE); - if (langCodeMap.containsKey(UILang)) { + if (langCodeMap.containsKey(UILang)) langCode = langCodeMap.get(UILang); - } - // see https://scryfall.com/blog 2020/8/6, and - // https://scryfall.com/docs/api/cards/collector - downloadUrls.add(String.format("https://api.scryfall.com/cards/%s/%s%s/%s?format=image&version=normal", - editionMciCode, cardNum, suffix, langCode)); + final String scryfallURL = this.getScryfallDownloadURL(paperCard, backFace, langCode); + if (scryfallURL == null) + return; // Non existing card, or Card's set not found in Scryfall + downloadUrls.add(scryfallURL); } } else if (prefix.equals(ImageKeys.TOKEN_PREFIX)) { @@ -122,10 +170,11 @@ public abstract class ImageFetcher { } if (destFile.exists()) { - // TODO: Figure out why this codepath gets reached. Ideally, fetchImage() wouldn't - // be called if we already have the image. + // TODO: Figure out why this codepath gets reached. + // Ideally, fetchImage() wouldn't be called if we already have the image. return; } + final String destPath = destFile.getAbsolutePath(); // Note: No synchronization is needed here because this is executed on diff --git a/forge-gui/src/main/java/forge/util/OperatingSystem.java b/forge-gui/src/main/java/forge/util/OperatingSystem.java index 933f2a77886..e3cbb571ba1 100644 --- a/forge-gui/src/main/java/forge/util/OperatingSystem.java +++ b/forge-gui/src/main/java/forge/util/OperatingSystem.java @@ -2,6 +2,8 @@ package forge.util; import forge.gui.FThreads; +import java.awt.event.KeyEvent; + public class OperatingSystem { private static String os = System.getProperty("os.name").toLowerCase(); @@ -47,7 +49,10 @@ public class OperatingSystem { try { //use robot to simulate user action so system standby timer resets java.awt.Robot robot = new java.awt.Robot(); - robot.keyPress(0xF002); //simulate F15 key press since that won't do anything noticable + if (isMac()) + robot.keyPress(KeyEvent.VK_F1); // F15 increases Display Brightness by default. Switch to F1 + else + robot.keyPress(KeyEvent.VK_F15); //simulate F15 key press since that won't do anything noticeable delayedKeepAwakeTask = ThreadUtil.delay(30000, keepSystemAwake); //repeat every 30 seconds until flag cleared }