diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index dc114298e86..2857e710e9c 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -257,7 +257,7 @@ public class AiAttackController { continue; } - if (sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("DefinedPlayers"))) { + if (sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("Defined"))) { List valid = CardLists.getValidCards(c.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), c.getController(), c, sa); // TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine // how much damage is dealt by each of the creatures in the valid list. diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java index 91bf2bb9334..64307ba3754 100644 --- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java +++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java @@ -1074,6 +1074,15 @@ public class ComputerUtil { } } + // cast Backup creatures in main 1 to pump attackers + if (cardState.hasKeyword(Keyword.BACKUP)) { + for (Card potentialAtkr: ai.getCreaturesInPlay()) { + if (ComputerUtilCard.doesCreatureAttackAI(ai, potentialAtkr)) { + return true; + } + } + } + // try not to cast Raid creatures in main 1 if an attack is likely if ("Count$AttackersDeclared".equals(card.getSVar("RaidTest")) && !cardState.hasKeyword(Keyword.HASTE)) { for (Card potentialAtkr: ai.getCreaturesInPlay()) { diff --git a/forge-ai/src/main/java/forge/ai/ability/FightAi.java b/forge-ai/src/main/java/forge/ai/ability/FightAi.java index a1e5b42bff1..4a3765d8111 100644 --- a/forge-ai/src/main/java/forge/ai/ability/FightAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/FightAi.java @@ -24,10 +24,6 @@ import forge.util.MyRandom; public class FightAi extends SpellAbilityAi { @Override protected boolean checkAiLogic(final Player ai, final SpellAbility sa, final String aiLogic) { - if (sa.hasParam("FightWithToughness")) { - // TODO: add ailogic - return false; - } return super.checkAiLogic(ai, sa, aiLogic); } diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java index 761710e9781..38864c7cfa3 100644 --- a/forge-game/src/main/java/forge/game/CardTraitBase.java +++ b/forge-game/src/main/java/forge/game/CardTraitBase.java @@ -144,11 +144,10 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView, public KeywordInterface getKeyword() { return this.keyword; } - public void setKeyword(final KeywordInterface kw) { this.keyword = kw; } - + /** *

* isSecondary. diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java index c80b659dc4f..2ecb44a56e8 100644 --- a/forge-game/src/main/java/forge/game/ForgeScript.java +++ b/forge-game/src/main/java/forge/game/ForgeScript.java @@ -193,6 +193,8 @@ public class ForgeScript { } else if (property.equals("hasTapCost")) { Cost cost = sa.getPayCosts(); return cost != null && cost.hasTapCost(); + } else if (property.equals("Backup")) { + return sa.isBackup(); } else if (property.equals("Blitz")) { return sa.isBlitz(); } else if (property.equals("Buyback")) { diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 88c35aff18d..9afed2cad46 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -478,12 +478,17 @@ public class GameAction { } } - // 400.7a Effects from static abilities that give a permanent spell on the stack an ability - // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. - if (zoneFrom.is(ZoneType.Stack) && toBattlefield && c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) { - KeywordInterface ki = c.getCastSA().getKeyword(); - ki.setHostCard(copied); - copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true); + if (zoneFrom.is(ZoneType.Stack) && toBattlefield) { + // 400.7a Effects from static abilities that give a permanent spell on the stack an ability + // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes. + if (c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) { + KeywordInterface ki = c.getCastSA().getKeyword(); + ki.setHostCard(copied); + copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true); + } + + // 607.2q linked ability can find cards exiled as cost while it was a spell + copied.addExiledCards(c.getExiledCards()); } } @@ -580,12 +585,10 @@ public class GameAction { // 400.7g try adding keyword back into card if it doesn't already have it if (zoneTo.is(ZoneType.Stack) && cause != null && cause.isSpell() && !cause.isIntrinsic() && c.equals(cause.getHostCard())) { - if (cause.getKeyword() != null) { - if (!copied.getKeywords().contains(cause.getKeyword())) { - copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false); - // update Keyword Cache - copied.updateKeywords(); - } + if (cause.getKeyword() != null && !copied.getKeywords().contains(cause.getKeyword())) { + copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false); + // update Keyword Cache + copied.updateKeywords(); } } 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 5fce377cdf4..30047654ae3 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -568,7 +568,9 @@ public class AbilityUtils { val = c == null ? 0 : xCount(c, calcX[1], ability); } else if (calcX[0].startsWith("ExiledWith")) { val = handlePaid(card.getExiledCards(), calcX[1], card, ability); - } + } else if (calcX[0].startsWith("Convoked")) { + val = handlePaid(card.getConvoked(), calcX[1], card, ability); + } else if (calcX[0].startsWith("Remembered")) { // Add whole Remembered list to handlePaid final CardCollection list = new CardCollection(); @@ -1781,6 +1783,11 @@ public class AbilityUtils { return doXMath(Integer.parseInt(kicked ? sq[1] : sq[2]), expr, c, ctb); } + // Count$Madness.. + if (sq[0].startsWith("Madness")) { + return doXMath(calculateAmount(c, sq[sa.isMadness() ? 1 : 2], ctb), expr, c, ctb); + } + //Count$HasNumChosenColors. if (sq[0].contains("HasNumChosenColors")) { int sum = 0; @@ -2004,10 +2011,6 @@ public class AbilityUtils { final boolean isMulti = c.getColor().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")) { 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 354ed3b8835..8380e925ee7 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -1,28 +1,15 @@ package forge.game.ability; -import java.util.Collections; -import java.util.List; -import java.util.Map; -import java.util.Set; -import java.util.StringTokenizer; - -import org.apache.commons.lang3.StringUtils; - import com.google.common.collect.Iterables; import com.google.common.collect.Lists; import com.google.common.collect.Maps; import com.google.common.collect.Table; - import forge.GameCommand; import forge.card.MagicColor; import forge.game.Game; import forge.game.GameEntity; import forge.game.GameObject; -import forge.game.card.Card; -import forge.game.card.CardCollection; -import forge.game.card.CardCollectionView; -import forge.game.card.CardUtil; -import forge.game.card.CardZoneTable; +import forge.game.card.*; import forge.game.combat.Combat; import forge.game.phase.PhaseType; import forge.game.player.Player; @@ -41,6 +28,9 @@ import forge.util.Lang; import forge.util.Localizer; import forge.util.TextUtil; import forge.util.collect.FCollection; +import org.apache.commons.lang3.StringUtils; + +import java.util.*; /** *

@@ -192,7 +182,7 @@ public abstract class SpellAbilityEffect { } else { objs = AbilityUtils.getDefinedObjects(sa.getHostCard(), t, sa); } - sb.append(StringUtils.join(objs, ", ")); + sb.append(Lang.joinHomogenous(objs)); } } else { sb.append(t); @@ -911,8 +901,8 @@ public abstract class SpellAbilityEffect { if (cause.isReplacementAbility() && exilingSource.isLKI()) { exilingSource = exilingSource.getGame().getCardState(exilingSource); } - // only want this on permanents - if (exilingSource.isImmutable() || exilingSource.isInPlay()) { + // avoid storing this on "inactive" cards + if (exilingSource.isImmutable() || exilingSource.isInPlay() || exilingSource.isInZone(ZoneType.Stack)) { // make sure it gets updated exilingSource.removeExiledCard(movedCard); exilingSource.addExiledCard(movedCard); 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 05bdcab6883..c8132d0b254 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 @@ -5,6 +5,7 @@ import forge.game.GameEntity; import forge.game.GameEntityCounterTable; import forge.game.ability.AbilityUtils; import forge.game.card.Card; +import forge.game.card.CardCollection; import forge.game.card.CardDamageMap; import forge.game.card.CardLists; import forge.game.spellability.SpellAbility; @@ -20,10 +21,9 @@ public class DamageEachEffect extends DamageBaseEffect { @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); - final String damage = sa.getParam("NumDmg"); - final int iDmg = AbilityUtils.calculateAmount(sa.getHostCard(), damage, sa); + final int iDmg = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("NumDmg"), sa); - String desc = sa.getParam("ValidCards"); + String desc = sa.getParamOrDefault("ValidCards", ""); if (sa.hasParam("ValidDescription")) { desc = sa.getParam("ValidDescription"); } @@ -35,18 +35,9 @@ public class DamageEachEffect extends DamageBaseEffect { dmg += iDmg + " damage"; } - if (sa.hasParam("StackDescription")) { - sb.append(sa.getParam("StackDescription")); - } else { - sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to "); - Lang.joinHomogenous(getTargetPlayers(sa)); - if (sa.hasParam("DefinedCards")) { - if (sa.getParam("DefinedCards").equals("Self")) { - sb.append(" itself"); - } - } - } - sb.append("."); + sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to "); + sb.append(Lang.joinHomogenous(getTargetEntities(sa))).append("."); + return sb.toString(); } @@ -58,10 +49,16 @@ public class DamageEachEffect extends DamageBaseEffect { public void resolve(SpellAbility sa) { final Card card = sa.getHostCard(); final Game game = card.getGame(); + final String num = sa.getParamOrDefault("NumDmg", "X"); - FCollectionView sources = game.getCardsIn(ZoneType.Battlefield); - if (sa.hasParam("ValidCards")) { - sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), sa.getActivatingPlayer(), card, sa); + FCollectionView sources; + if (sa.hasParam("DefinedDamagers")) { + sources = AbilityUtils.getDefinedCards(card, sa.getParam("DefinedDamagers"), sa); + } else { + sources = game.getCardsIn(ZoneType.Battlefield); + if (sa.hasParam("ValidCards")) { + sources = CardLists.getValidCards(sources, sa.getParam("ValidCards"), sa.getActivatingPlayer(), card, sa); + } } boolean usedDamageMap = true; @@ -77,12 +74,30 @@ public class DamageEachEffect extends DamageBaseEffect { usedDamageMap = false; } - for (final GameEntity ge : getTargetEntities(sa, "DefinedPlayers")) { + if (sa.hasParam("EachToItself")) { for (final Card source : sources) { final Card sourceLKI = game.getChangeZoneLKIInfo(source); - // TODO shouldn't that be using Num or something first? - final int dmg = AbilityUtils.calculateAmount(source, "X", sa); + final int dmg = AbilityUtils.calculateAmount(source, num, sa); + damageMap.put(sourceLKI, source, dmg); + } + } else if (sa.hasParam("ToEachOther")) { + final CardCollection targets = AbilityUtils.getDefinedCards(card, sa.getParam("ToEachOther"), sa); + for (final Card damager : targets) { + for (final Card c : targets) { + if (!c.equals(damager)) { + final Card sourceLKI = game.getChangeZoneLKIInfo(damager); + + final int dmg = AbilityUtils.calculateAmount(damager, num, sa); + damageMap.put(sourceLKI, c, dmg); + } + } + } + } else for (final GameEntity ge : getTargetEntities(sa)) { + for (final Card source : sources) { + final Card sourceLKI = game.getChangeZoneLKIInfo(source); + + final int dmg = AbilityUtils.calculateAmount(source, num, sa); if (ge instanceof Card) { final Card c = (Card) ge; @@ -95,30 +110,6 @@ public class DamageEachEffect extends DamageBaseEffect { } } - if (sa.hasParam("DefinedCards")) { - if (sa.getParam("DefinedCards").equals("Self")) { - for (final Card source : sources) { - final Card sourceLKI = game.getChangeZoneLKIInfo(source); - - 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 = AbilityUtils.calculateAmount(source, "X", sa); - final Card sourceLKI = source.getGame().getChangeZoneLKIInfo(source); - - for (final Object o : card.getRemembered()) { - if (o instanceof Card) { - Card rememberedcard = (Card) o; - damageMap.put(sourceLKI, rememberedcard, dmg); - } - } - } - } - } - if (!usedDamageMap) { game.getAction().dealDamage(false, damageMap, preventMap, counterTable, sa); } 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 eea60ea34ea..b9d7bba8d09 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 @@ -147,7 +147,6 @@ public class FightEffect extends DamageBaseEffect { } private void dealDamage(final SpellAbility sa, Card fighterA, Card fighterB) { - boolean fightToughness = sa.hasParam("FightWithToughness"); boolean usedDamageMap = true; CardDamageMap damageMap = sa.getDamageMap(); @@ -168,11 +167,11 @@ public class FightEffect extends DamageBaseEffect { // 701.12c If a creature fights itself, it deals damage to itself equal to twice its power. - final int dmg1 = fightToughness ? fighterA.getNetToughness() : fighterA.getNetPower(); + final int dmg1 = fighterA.getNetPower(); if (fighterA.equals(fighterB)) { damageMap.put(fighterA, fighterA, dmg1 * 2); } else { - final int dmg2 = fightToughness ? fighterB.getNetToughness() : fighterB.getNetPower(); + final int dmg2 = fighterB.getNetPower(); damageMap.put(fighterA, fighterB, dmg1); damageMap.put(fighterB, fighterA, dmg2); 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 1a56a2150d8..26edbb27b5c 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 @@ -245,7 +245,7 @@ public class ManaEffect extends SpellAbilityEffect { producedMana.append(abMana.produceMana(mana, p, sa)); } - abMana.tapsForMana(sa, producedMana.toString()); + abMana.tapsForMana(sa.getRootAbility(), producedMana.toString()); // Only clear express choice after mana has been produced abMana.clearExpressChoice(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java index 32911571321..349a94a8d7a 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ManaReflectedEffect.java @@ -33,7 +33,7 @@ public class ManaReflectedEffect extends SpellAbilityEffect { producedMana.append(ma.produceMana(generated, player, sa)); } - ma.tapsForMana(sa, producedMana.toString()); + ma.tapsForMana(sa.getRootAbility(), producedMana.toString()); } // *************** Utility Functions ********************** 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 2b6006e10ed..d2b8d03f7a3 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 @@ -314,6 +314,7 @@ public class PlayEffect extends SpellAbilityEffect { // only one mode can be used tgtSA = sa.getActivatingPlayer().getController().getAbilityToPlay(tgtCard, sas); } + // in case player canceled from choice dialog if (tgtSA == null) { if (wasFaceDown) { 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 d31a52ff2f6..8088c700d5b 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2303,10 +2303,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.startsWith("Specialize") || keyword.equals("Ravenous") || keyword.equals("For Mirrodin")) { // keyword parsing takes care of adding a proper description - } else if(keyword.startsWith("Read ahead")) { + } else if (keyword.startsWith("Read ahead")) { sb.append(Localizer.getInstance().getMessage("lblReadAhead")).append(" (").append(Localizer.getInstance().getMessage("lblReadAheadDesc")); sb.append(" ").append(Localizer.getInstance().getMessage("lblSagaFooter")).append(" ").append(TextUtil.toRoman(getFinalChapterNr())).append("."); sb.append(")").append("\r\n\r\n"); + } else if (keyword.startsWith("Backup")) { + final String[] k = keyword.split(":"); + sb.append(k[0]).append(" ").append(k[1]).append(" ("); + String remStr = inst.getReminderText(); + if (k[2].endsWith("s")) { + remStr = remStr.replace("ability", "abilities"); + } + sb.append(remStr).append(")"); } else if (keyword.startsWith("MayEffectFromOpening")) { final String[] k = keyword.split(":"); // need to get SpellDescription from Svar @@ -2325,7 +2333,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbLong.append("\r\n"); } - if (keyword.equals("Flash")) { + if (keyword.equals("Flash") || keyword.startsWith("Backup")) { sb.append("\r\n\r\n"); i = 0; } else { 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 de058f5f264..605577a85ab 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -839,6 +839,31 @@ public class CardFactoryUtil { sa.setBlessing(true); } } + } else if (keyword.startsWith("Backup")) { + final String[] k = keyword.split(":"); + final String magnitude = k[1]; + final String backupVar = card.getSVar(k[2]); + + String descStr = "Backup " + magnitude; + + final String trigStr = "Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | " + + "Secondary$ True | TriggerDescription$ " + descStr; + + final String putCounter = "DB$ PutCounter | ValidTgts$ Creature | CounterNum$ " + magnitude + + " | CounterType$ P1P1 | Backup$ True"; + + final String addAbility = backupVar + " | ConditionDefined$ Targeted | " + + "ConditionPresent$ Card.Other | Defined$ Targeted"; + + SpellAbility sa = AbilityFactory.getAbility(putCounter, card); + AbilitySub backupSub = (AbilitySub) AbilityFactory.getAbility(addAbility, card); + sa.setSubAbility(backupSub); + + final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic); + sa.setIntrinsic(intrinsic); + trigger.setOverridingAbility(sa); + + inst.addTrigger(trigger); } else if (keyword.equals("Battle cry")) { final String trig = "Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Secondary$ True " + " | TriggerDescription$ " + keyword + " (" + inst.getReminderText() + ")"; @@ -1151,7 +1176,7 @@ public class CardFactoryUtil { } else if (keyword.equals("Extort")) { final String extortTrigger = "Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | " + "TriggerZones$ Battlefield | Secondary$ True" - + " | TriggerDescription$ Extort ("+ inst.getReminderText() +")"; + + " | TriggerDescription$ Extort (" + inst.getReminderText() + ")"; final String loseLifeStr = "AB$ LoseLife | Cost$ WB | Defined$ Player.Opponent | LifeAmount$ 1"; final String gainLifeStr = "DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost"; @@ -2687,7 +2712,7 @@ public class CardFactoryUtil { if (keyword.startsWith("Alternative Cost") && !host.isLand()) { final String[] kw = keyword.split(":"); String costStr = kw[1]; - for (SpellAbility sa: host.getBasicSpells()) { + for (SpellAbility sa : host.getBasicSpells()) { if (costStr.equals("ConvertedManaCost")) { costStr = Integer.toString(host.getCMC()); } 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 90073eb56a3..976e6df868b 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -989,6 +989,18 @@ public class CardProperty { if (card.getTurnInZone() <= sourceController.getLastTurnNr()) { return false; } + } else if (property.startsWith("ThisTurnEnteredFrom")) { + final String restrictions = property.split("ThisTurnEnteredFrom_")[1]; + final String[] res = restrictions.split("_"); + final ZoneType origin = ZoneType.smartValueOf(res[0]); + + if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { + return false; + } + + if (!card.getZone().isCardAddedThisTurn(card, origin)) { + return false; + } } else if (property.startsWith("ThisTurnEntered")) { // only check if it entered the Zone this turn if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { @@ -1012,18 +1024,6 @@ public class CardProperty { if (card.getTurnInZone() == game.getPhaseHandler().getTurn()) { return false; } - } else if (property.startsWith("ThisTurnEnteredFrom")) { - final String restrictions = property.split("ThisTurnEnteredFrom_")[1]; - final String[] res = restrictions.split("_"); - final ZoneType origin = ZoneType.smartValueOf(res[0]); - - if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { - return false; - } - - if (!card.getZone().isCardAddedThisTurn(card, origin)) { - return false; - } } else if (property.equals("DiscardedThisTurn")) { if (card.getTurnInZone() != game.getPhaseHandler().getTurn()) { 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 22073210873..ca735fef027 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -28,6 +28,7 @@ public enum Keyword { ASSIST("Assist", SimpleKeyword.class, true, "Another player can pay up to %s of this spell's cost."), AURA_SWAP("Aura swap", KeywordWithCost.class, false, "%s: You may exchange this Aura with an Aura card in your hand."), AWAKEN("Awaken", KeywordWithCostAndAmount.class, false, "If you cast this spell for %s, also put {%d:+1/+1 counter} on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land."), + BACKUP("Backup", KeywordWithAmount.class, false, "When this creature enters the battlefield, put {%1$d:+1/+1 counter} on target creature. If that's another creature, it gains the following ability until end of turn."), BANDING("Banding", SimpleKeyword.class, true, "Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking."), BATTLE_CRY("Battle cry", SimpleKeyword.class, false, "Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn."), BESTOW("Bestow", KeywordWithCost.class, false, "If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature."), diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java index dea434cbd2e..d39f3f93e7f 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java @@ -17,8 +17,8 @@ public class KeywordWithAmount extends KeywordInstance { if (details.contains(":")) { extra = details.split(":")[1]; } - } else { - amount = Integer.parseInt(details); + } else { + amount = details.contains(":") ? Integer.parseInt(details.split(":")[0]) : Integer.parseInt(details); } } 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 1a4563b0a76..34649e4207c 100644 --- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java +++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java @@ -508,6 +508,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit return isAlternativeCost(AlternativeCost.Cycling); } + public boolean isBackup() { + return this.hasParam("Backup"); + } + public boolean isBoast() { return this.hasParam("Boast"); } diff --git a/forge-gui-mobile/src/forge/Forge.java b/forge-gui-mobile/src/forge/Forge.java index 79cda06a27e..4090e7cb3d8 100644 --- a/forge-gui-mobile/src/forge/Forge.java +++ b/forge-gui-mobile/src/forge/Forge.java @@ -164,6 +164,9 @@ public class Forge implements ApplicationListener { frameRate = new FrameRate(); animationBatch = new SpriteBatch(); inputProcessor = new MainInputProcessor(); + //screenWidth and screenHeight should be set initially and only change upon restarting the app + screenWidth = Gdx.app.getGraphics().getWidth(); + screenHeight = Gdx.app.getGraphics().getHeight(); Gdx.input.setInputProcessor(inputProcessor); /* @@ -958,15 +961,15 @@ public class Forge implements ApplicationListener { @Override public void resize(int width, int height) { try { - screenWidth = width; - screenHeight = height; if (currentScreen != null) { currentScreen.setSize(width, height); } else if (splashScreen != null) { splashScreen.setSize(width, height); } + if (currentScene != null) + currentScene.resize(width, height); } catch (Exception ex) { - graphics.end(); + //graphics.end(); //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/adventure/scene/Scene.java b/forge-gui-mobile/src/forge/adventure/scene/Scene.java index 781ddb002ac..2e84eaf364d 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/Scene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/Scene.java @@ -93,6 +93,9 @@ public abstract class Scene implements Disposable { public void updateInput() { } + public void resize(int width, int height) { + + } } diff --git a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java index f353ef13ddf..887f18f9b6f 100644 --- a/forge-gui-mobile/src/forge/adventure/scene/UIScene.java +++ b/forge-gui-mobile/src/forge/adventure/scene/UIScene.java @@ -192,7 +192,6 @@ public class UIScene extends Scene { } public UIScene(String uiFilePath) { - uiFile = uiFilePath; stage = new Stage(new ScalingViewport(Scaling.stretch, getIntendedWidth(), getIntendedHeight())) { @Override @@ -711,4 +710,9 @@ public class UIScene extends Scene { super.updateInput(); Gdx.input.setInputProcessor(stage); } + + @Override + public void resize(int width, int height) { + stage.getViewport().update(width, height, true); + } } diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index f93f3ac049c..b45178647b2 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -285,7 +285,7 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb Sprite item = reward.getItem().sprite(); setItemTooltips(item, backSprite); boolean isQuestItemLoot = RewardScene.Type.Loot.equals(type) && reward.getItem().questItem; - processSprite(backSprite, item, isQuestItemLoot ? Controls.newTextraLabel("[%]" + reward.getItem().name) : null, 0, -10); + processSprite(backSprite, item, isQuestItemLoot ? Controls.newTextraLabel("[%]" + reward.getItem().name) : null, 0, isQuestItemLoot ? -10 : 0); needsToBeDisposed = true; break; } diff --git a/forge-gui-mobile/src/forge/assets/FSkinTexture.java b/forge-gui-mobile/src/forge/assets/FSkinTexture.java index aacdf772f0e..d2555ab31f0 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinTexture.java +++ b/forge-gui-mobile/src/forge/assets/FSkinTexture.java @@ -166,7 +166,33 @@ public enum FSkinTexture implements FImage { Interplanar_Tunnel(ForgeConstants.BG_83, false, true), Morphic_Tide(ForgeConstants.BG_84, false, true), Mutual_Epiphany(ForgeConstants.BG_85, false, true), - Time_Distortion(ForgeConstants.BG_86, false, true); + Time_Distortion(ForgeConstants.BG_86, false, true), + Enigma_Ridges(ForgeConstants.BG_87, false, true), + Esper(ForgeConstants.BG_88, false, true), + Ghirapur(ForgeConstants.BG_89, false, true), + Inys_Haen(ForgeConstants.BG_90, false, true), + Ketria(ForgeConstants.BG_91, false, true), + Littiara(ForgeConstants.BG_92, false, true), + Megaflora_Jungle(ForgeConstants.BG_93, false, true), + Naktamun(ForgeConstants.BG_94, false, true), + New_Argive(ForgeConstants.BG_95, false, true), + Norns_Seedcore(ForgeConstants.BG_96, false, true), + Nyx(ForgeConstants.BG_97, false, true), + Paliano(ForgeConstants.BG_98, false, true), + Riptide_Island(ForgeConstants.BG_99, false, true), + Strixhaven(ForgeConstants.BG_100, false, true), + Ten_Wizards_Mountain(ForgeConstants.BG_101, false, true), + The_Caldaia(ForgeConstants.BG_102, false, true), + The_Fertile_Lands_of_Saulvinia(ForgeConstants.BG_103, false, true), + The_Golden_City_of_Orazca(ForgeConstants.BG_104, false, true), + The_Great_Aerie(ForgeConstants.BG_105, false, true), + The_Pit(ForgeConstants.BG_106, false, true), + The_Western_Cloud(ForgeConstants.BG_107, false, true), + The_Wilds(ForgeConstants.BG_108, false, true), + Towashi(ForgeConstants.BG_109, false, true), + Unyaro(ForgeConstants.BG_110, false, true), + Valors_Reach(ForgeConstants.BG_111, false, true); + private final String filename; private final boolean repeat; diff --git a/forge-gui-mobile/src/forge/screens/match/views/VStack.java b/forge-gui-mobile/src/forge/screens/match/views/VStack.java index f457faa80c4..071489f54f2 100644 --- a/forge-gui-mobile/src/forge/screens/match/views/VStack.java +++ b/forge-gui-mobile/src/forge/screens/match/views/VStack.java @@ -74,10 +74,13 @@ public class VStack extends FDropDown { final Set zones = new HashSet<>(); playersWithValidTargets = new HashMap<>(); - for (final CardView c : activeStackInstance.getTargetCards()) { - if (c.getZone() != null) { - zones.add(c.getZone()); - playersWithValidTargets.put(c.getController(), c); + FCollectionView targetCards = activeStackInstance.getTargetCards(); + if (targetCards != null) { + for (final CardView c : targetCards) { + if (c.getZone() != null) { + zones.add(c.getZone()); + playersWithValidTargets.put(c.getController(), c); + } } } if (zones.isEmpty() || playersWithValidTargets.isEmpty()) { return; } diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt b/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt index 4391be001eb..0122fb7f4e5 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/slobads_iron_boots.txt @@ -1,7 +1,7 @@ Name:Slobad's Iron Boots ManaCost:no cost Types:Artifact -S:Mode$ Continuous | Affected$ Creature.YouCtrl+Artifact | AddToughness$ 1 | EffectZone$ Command | Description$ Artifact Creatures you control get +1/+1 +S:Mode$ Continuous | Affected$ Creature.YouCtrl+Artifact | AddToughness$ 1 | AddPower$ 1 | EffectZone$ Command | Description$ Artifact Creatures you control get +1/+1 T:Mode$ ChangesZone | ValidCard$ Artifact.nonToken+YouCtrl | ActivationLimit$ 1 | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigToken | TriggerZones$ Command | TriggerDescription$ Whenever a nontoken artifact you control is put into a graveyard from the battlefield, create a colorless artifact token named Scrap. This ability triggers only once each turn. SVar:TrigToken:DB$ Token | TokenScript$ scrap A:AB$ Token | Cost$ 4 PayShards<2> Sac<3/Artifact> | ActivationLimit$ 1 | ActivationZone$ Command | TokenScript$ c_0_0_a_construct_total_artifacts | TokenOwner$ You | SubAbility$ DBExileSelf | SpellDescription$ Create a 0/0 colorless Construct artifact creature token with "This creature gets +1/+1 for each artifact you control."Exile Slobad's Iron Boots diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt b/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt index 50a25a59d82..3ed01a22a36 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/xira_boss_effect.txt @@ -2,11 +2,11 @@ Name:Xira's Boss Effect ManaCost:no cost Colors:black,green,red Types:Enchantment -S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken insects you control have +1/+1 and Double Team. +S:Mode$ Continuous | Affected$ Insect.YouCtrl | EffectZone$ Command | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double team | Description$ Nontoken insects you control have +1/+1 and Double Team. T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ PutCounterAll | TriggerDescription$ At the beginning of your upkeep, put an egg counter on each nontoken creature. SVar:PutCounterAll:DB$ PutCounterAll | ValidCards$ Creature.nonToken | CounterType$ EGG | CounterNum$ 1 -T:Mode$ ChangesZone | Origin$ Battlefield | TriggerZones$ Command | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_EGG+OppCtrl | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with an egg counter on it dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. +T:Mode$ ChangesZone | Origin$ Battlefield | TriggerZones$ Command | Destination$ Graveyard | ValidCard$ Creature.counters_GE1_EGG | Execute$ TrigDraw | TriggerDescription$ Whenever a creature with an egg counter on it dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBToken -SVar:DBToken:DB$ Token | TokenScript$ b_1_1_insect_flying | TokenNum$ X +SVar:DBToken:DB$ Token | TokenScript$ b_1_1_insect_flying | TokenAmount$ X SVar:X:TriggeredCard$CardCounters.EGG -Oracle:Nontoken insects you control have +1/+1 and Double Team\nAt the beginning of your upkeep, put an egg counter on each creature.\nWhen a creature with an egg counter dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. +Oracle:Nontoken insects you control have +1/+1 and Double Team\nAt the beginning of your upkeep, put an egg counter on each creature.\nWhen a creature with an egg counter dies, draw a card and create X 1/1 black Insect creature token with flying where X is the amount of Egg counters on that creature. \ No newline at end of file diff --git a/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt b/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt index f8ae5a8b47d..480e468905a 100644 --- a/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt +++ b/forge-gui/res/adventure/Shandalar/custom_cards/xiras_hive.txt @@ -5,7 +5,7 @@ Types:Creature Insect PT:0/2 K:Defender K:Reach -S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double Team | Description$ Nontoken Insects you control have +1/+1 and double team. +S:Mode$ Continuous | Affected$ Insect.YouCtrl+nonToken | EffectZone$ Battlefield | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Double team | Description$ Nontoken Insects you control have +1/+1 and double team. T:Mode$ DamageDone | ActivationLimit$ 1 | ValidSource$ Card.OppCtrl,Emblem.OppCtrl | ValidTarget$ You | TriggerZones$ Battlefield | Execute$ TrigCounter | TriggerDescription$ When a source an opponent controls deals damage to you for the first time each turn, put an egg counter on CARDNAME. SVar:TrigCounter:DB$ PutCounter | CounterType$ EGG | CounterNum$ 1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create X 1/1 black Insect tokens for each egg counter on CARDNAME. diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx index ec32f373d84..9e57d36d521 100644 --- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx +++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx @@ -1514,7 +1514,7 @@ { - "startBattleWithCardInCommandZone": [ "Chandra, Supreme Pyromancer" ] + "startBattleWithCardInCommandZone": [ "Chandra, Bold Pyromancer" ] } diff --git a/forge-gui/res/cardsfolder/a/aerial_guide.txt b/forge-gui/res/cardsfolder/a/aerial_guide.txt index e8cc1996545..411899a8b39 100644 --- a/forge-gui/res/cardsfolder/a/aerial_guide.txt +++ b/forge-gui/res/cardsfolder/a/aerial_guide.txt @@ -3,6 +3,6 @@ ManaCost:2 U Types:Creature Drake PT:2/2 K:Flying -T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature you control gains flying until end of turn. +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target creature gains flying until end of turn. SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+attacking | TgtPrompt$ Select another target attacking creature | KW$ Flying Oracle:Flying\nWhenever Aerial Guide attacks, another target attacking creature gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/a/alpha_brawl.txt b/forge-gui/res/cardsfolder/a/alpha_brawl.txt index 35b7b736ef1..1536ed25a2a 100644 --- a/forge-gui/res/cardsfolder/a/alpha_brawl.txt +++ b/forge-gui/res/cardsfolder/a/alpha_brawl.txt @@ -1,12 +1,9 @@ Name:Alpha Brawl ManaCost:6 R R Types:Sorcery -A:SP$ Pump | Cost$ 6 R R | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | StackDescription$ None | SubAbility$ AlphaAttack | SpellDescription$ Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. -SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | DamageSource$ Targeted | NumDmg$ Y | SubAbility$ SucksToBeAlpha | StackDescription$ Targeted creature deals damage equal to its power to each other creature that player controls, -SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to that creature -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. +A:SP$ Pump | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Select target creature an opponent controls | RememberTargets$ True | SubAbility$ AlphaAttack | StackDescription$ {c:Targeted} | SpellDescription$ Target creature an opponent controls +SVar:AlphaAttack:DB$ DamageAll | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | DamageSource$ Targeted | NumDmg$ Remembered$CardPower | SubAbility$ SucksToBeAlpha | StackDescription$ SpellDescription | SpellDescription$ deals damage equal to its power to each other creature that player controls, +SVar:SucksToBeAlpha:DB$ EachDamage | ValidCards$ Creature.IsNotRemembered+ControlledBy TargetedController | NumDmg$ Count$CardPower | Defined$ Remembered | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ then each of those creatures deals damage equal to its power to that creature. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$CardPower -SVar:Y:Remembered$CardPower AI:RemoveDeck:All Oracle:Target creature an opponent controls deals damage equal to its power to each other creature that player controls, then each of those creatures deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/b/band_together.txt b/forge-gui/res/cardsfolder/b/band_together.txt index bccc9118373..d2aaf8bbe13 100644 --- a/forge-gui/res/cardsfolder/b/band_together.txt +++ b/forge-gui/res/cardsfolder/b/band_together.txt @@ -1,10 +1,6 @@ Name:Band Together ManaCost:2 G Types:Instant -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | ImprintCards$ ThisTargetedCard | AILogic$ PowerDmg | SubAbility$ DBPump | TargetMin$ 0 | TargetMax$ 2 | StackDescription$ SpellDescription | SpellDescription$ Up to two target creatures you control each deal damage equal to their power to another target creature. -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to be dealt damage | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBEachDamage | StackDescription$ None -SVar:DBEachDamage:DB$ EachDamage | ValidCards$ Creature.IsImprinted | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ None -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +A:SP$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | AILogic$ PowerDmg | SubAbility$ DBEachDamage | StackDescription$ {c:ThisTargetedCard} | SpellDescription$ Up to two target creatures you control +SVar:DBEachDamage:DB$ EachDamage | DefinedDamagers$ ParentTarget | ValidTgts$ Creature | TgtPrompt$ Select another target creature | TargetUnique$ True | NumDmg$ Count$CardPower | StackDescription$ REP another target creature_{c:ThisTargetedCard} | SpellDescription$ each deal damage equal to their power to another target creature. Oracle:Up to two target creatures you control each deal damage equal to their power to another target creature. diff --git a/forge-gui/res/cardsfolder/b/bridge_from_below.txt b/forge-gui/res/cardsfolder/b/bridge_from_below.txt index d4a19932634..e93545c1907 100644 --- a/forge-gui/res/cardsfolder/b/bridge_from_below.txt +++ b/forge-gui/res/cardsfolder/b/bridge_from_below.txt @@ -2,9 +2,9 @@ Name:Bridge from Below ManaCost:B B B Types:Enchantment A:SP$ PermanentNoncreature | Cost$ B B B | AILogic$ DontCast -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | TriggerZones$ Graveyard | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, if CARDNAME is in your graveyard, create a 2/2 black Zombie creature token. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.nonToken+YouOwn | Execute$ TrigToken | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | TriggerZones$ Graveyard | TriggerDescription$ Whenever a nontoken creature is put into your graveyard from the battlefield, if CARDNAME is in your graveyard, create a 2/2 black Zombie creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_2_2_zombie | TokenOwner$ You -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | TriggerZones$ Graveyard | ValidCard$ Creature.OppOwn | Execute$ TrigChange | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile CARDNAME. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppOwn | Execute$ TrigChange | IsPresent$ Card.StrictlySelf | PresentZone$ Graveyard | TriggerZones$ Graveyard | TriggerDescription$ When a creature is put into an opponent's graveyard from the battlefield, if CARDNAME is in your graveyard, exile CARDNAME. SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile AI:RemoveDeck:Random SVar:DiscardMe:5 diff --git a/forge-gui/res/cardsfolder/c/combo_attack.txt b/forge-gui/res/cardsfolder/c/combo_attack.txt index 5c93f311137..616cb242fd2 100644 --- a/forge-gui/res/cardsfolder/c/combo_attack.txt +++ b/forge-gui/res/cardsfolder/c/combo_attack.txt @@ -1,10 +1,6 @@ Name:Combo Attack ManaCost:2 G Types:Sorcery -A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YourTeamCtrl | TgtPrompt$ Select two target creatures your team controls | ImprintCards$ ThisTargetedCard | TargetMin$ 2 | TargetMax$ 2 | AILogic$ PowerDmg | SubAbility$ DBPump | StackDescription$ SpellDescription | SpellDescription$ Two target creatures your team controls each deal damage equal to their power to target creature. -SVar:DBPump:DB$ Pump | ValidTgts$ Creature | TgtPrompt$ Select target creature to be dealt damage | RememberObjects$ ThisTargetedCard | IsCurse$ True | SubAbility$ DBEachDamage | StackDescription$ None -SVar:DBEachDamage:DB$ EachDamage | ValidCards$ Creature.IsImprinted | NumDmg$ X | DefinedCards$ Remembered | SubAbility$ DBCleanup | StackDescription$ None -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +A:SP$ Pump | ValidTgts$ Creature.YourTeamCtrl | TgtPrompt$ Select two target creatures your team controls | TargetMin$ 2 | TargetMax$ 2 | SubAbility$ DBEachDamage | StackDescription$ {c:ThisTargetedCard} | SpellDescription$ Two target creatures your team controls +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | StackDescription$ REP target creature_{c:ThisTargetedCard} | SpellDescription$ each deal damage equal to their power to target creature. Oracle:Two target creatures your team controls each deal damage equal to their power to target creature. diff --git a/forge-gui/res/cardsfolder/d/dark_apostle.txt b/forge-gui/res/cardsfolder/d/dark_apostle.txt index 8556399ca79..f5c133c6c1b 100644 --- a/forge-gui/res/cardsfolder/d/dark_apostle.txt +++ b/forge-gui/res/cardsfolder/d/dark_apostle.txt @@ -4,7 +4,7 @@ Types:Creature Astartes Warlock PT:3/3 A:AB$ Effect | PrecostDesc$ Gift of Chaos — | Cost$ 3 T | StaticAbilities$ GrantCascade | Triggers$ ExileEffect | SpellDescription$ The next noncreature spell you cast this turn has cascade. (When you cast that spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) SVar:GrantCascade:Mode$ Continuous | EffectZone$ Command | Affected$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | AddKeyword$ Cascade | Description$ The next noncreature spell you cast this turn has cascade. -SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | Valid$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True +SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | ValidCard$ Card.nonCreature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self DeckHas:Keyword$Cascade Oracle:Gift of Chaos — {3}, {T}: The next noncreature spell you cast this turn has cascade. (When you cast that spell, exile cards from the top of your library until you exile a nonland card that costs less. 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/d/deep_gnome_terramancer.txt b/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt index e013dd8dbd7..9f03d4c538b 100644 --- a/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt +++ b/forge-gui/res/cardsfolder/d/deep_gnome_terramancer.txt @@ -3,7 +3,7 @@ ManaCost:1 W Types:Creature Gnome Wizard PT:2/2 K:Flash -T:Mode$ ChangesZoneAll | ValidCards$ Land.OppCtrl | ValidCause$ !LandAbility | Destination$ Battlefield | TriggerZones$ Battlefield | ActivationLimit$ 1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Mold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. +T:Mode$ ChangesZoneAll | ValidCards$ Land.OppCtrl | ValidCause$ !LandAbility | Destination$ Battlefield | TriggerZones$ Battlefield | ResolvedLimit$ 1 | Execute$ TrigSearch | OptionalDecider$ You | TriggerDescription$ Mold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Card.Plains | ChangeNum$ 1 | ShuffleNonMandatory$ True AI:RemoveDeck:Random Oracle:Flash\nMold Earth — Whenever one or more lands enter the battlefield under an opponent's control without being played, you may search your library for a Plains card, put it onto the battlefield tapped, then shuffle. Do this only once each turn. diff --git a/forge-gui/res/cardsfolder/e/ezuris_predation.txt b/forge-gui/res/cardsfolder/e/ezuris_predation.txt index b367c343962..7565fb1038f 100644 --- a/forge-gui/res/cardsfolder/e/ezuris_predation.txt +++ b/forge-gui/res/cardsfolder/e/ezuris_predation.txt @@ -1,10 +1,9 @@ Name:Ezuri's Predation ManaCost:5 G G G Types:Sorcery -A:SP$ RepeatEach | Cost$ 5 G G G | RepeatCards$ Creature.OppCtrl | UseImprinted$ True | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SubAbility$ DBCleanup2 | SpellDescription$ For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. +A:SP$ RepeatEach | Cost$ 5 G G G | RepeatCards$ Creature.OppCtrl | ChooseOrder$ True | UseImprinted$ True | RepeatSubAbility$ DBToken | ChangeZoneTable$ True | SpellDescription$ For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ g_4_4_phyrexian_beast | TokenOwner$ You | RememberTokens$ True | SubAbility$ DBFight SVar:DBFight:DB$ Fight | Defined$ Imprinted | ExtraDefined$ Remembered | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:DBCleanup2:DB$ Cleanup | ClearImprinted$ True SVar:NeedsToPlay:Creature.OppCtrl+powerLE3 Oracle:For each creature your opponents control, create a 4/4 green Phyrexian Beast creature token. Each of those Beasts fights a different one of those creatures. diff --git a/forge-gui/res/cardsfolder/f/followed_footsteps.txt b/forge-gui/res/cardsfolder/f/followed_footsteps.txt index ce02d3e03a9..fdaea176075 100644 --- a/forge-gui/res/cardsfolder/f/followed_footsteps.txt +++ b/forge-gui/res/cardsfolder/f/followed_footsteps.txt @@ -4,5 +4,5 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | ValidTgts$ Creature | AILogic$ HighestEvaluation T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | SpellDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature. +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted Oracle:Enchant creature\nAt the beginning of your upkeep, create a token that's a copy of enchanted creature. diff --git a/forge-gui/res/cardsfolder/g/genesis.txt b/forge-gui/res/cardsfolder/g/genesis.txt index 39de00dce06..4c014a75e4f 100644 --- a/forge-gui/res/cardsfolder/g/genesis.txt +++ b/forge-gui/res/cardsfolder/g/genesis.txt @@ -2,7 +2,7 @@ Name:Genesis ManaCost:4 G Types:Creature Incarnation PT:4/4 -T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Graveyard | PresentZone$ Graveyard | IsPresent$ Card.StrictlySelf | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, if CARDNAME is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. SVar:TrigChange:AB$ ChangeZone | Cost$ 2 G | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Creature.YouCtrl SVar:DiscardMe:2 Oracle:At the beginning of your upkeep, if Genesis is in your graveyard, you may pay {2}{G}. If you do, return target creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt b/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt index 96a92193828..d527a6a965a 100644 --- a/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt +++ b/forge-gui/res/cardsfolder/g/glissa_sunslayer.txt @@ -9,5 +9,5 @@ SVar:TrigCharm:DB$ Charm | Choices$ DBDraw,DBDestroy,DBRemove SVar:DBDraw:DB$ Draw | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life. SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1 SVar:DBDestroy:DB$ Destroy | ValidTgts$ Enchantment | SpellDescription$ Destroy target enchantment. -SVar:DBRemove:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 3 | SpellDescription$ Remove up to three counters from target permanent. -Oracle:First strike, deathtouch\nWhenever Glissa Sunslayer deals combat damage to a player, choose one —\n• You draw a card and you lose 1 life.\n• Destroy target enchantment.\n• Remove up to three counters from target permanent. \ No newline at end of file +SVar:DBRemove:DB$ RemoveCounter | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | CounterType$ Any | CounterNum$ 3 | UpTo$ True | SpellDescription$ Remove up to three counters from target permanent. +Oracle:First strike, deathtouch\nWhenever Glissa Sunslayer deals combat damage to a player, choose one —\n• You draw a card and you lose 1 life.\n• Destroy target enchantment.\n• Remove up to three counters from target permanent. diff --git a/forge-gui/res/cardsfolder/g/grim_contest.txt b/forge-gui/res/cardsfolder/g/grim_contest.txt index e4ee269a31f..f611e491109 100644 --- a/forge-gui/res/cardsfolder/g/grim_contest.txt +++ b/forge-gui/res/cardsfolder/g/grim_contest.txt @@ -1,7 +1,7 @@ Name:Grim Contest ManaCost:1 B G Types:Instant -A:SP$ Pump | Cost$ 1 B G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBFight | SpellDescription$ Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. -SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | FightWithToughness$ True +A:SP$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose target creature you control | SubAbility$ DBEachDamage | StackDescription$ None | SpellDescription$ Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls | ToEachOther$ Targeted | NumDmg$ Count$CardToughness | StackDescription$ {c:Targeted} each deal damage equal to its toughness to the other. AI:RemoveDeck:All Oracle:Choose target creature you control and target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. diff --git a/forge-gui/res/cardsfolder/l/living_inferno.txt b/forge-gui/res/cardsfolder/l/living_inferno.txt index 4685a02324b..a4e908cb8e0 100644 --- a/forge-gui/res/cardsfolder/l/living_inferno.txt +++ b/forge-gui/res/cardsfolder/l/living_inferno.txt @@ -2,12 +2,8 @@ Name:Living Inferno ManaCost:6 R R Types:Creature Elemental PT:8/5 -A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select target creature to distribute damage to | NumDmg$ FirePower | TargetMin$ Min | TargetMax$ FirePower | DividedAsYouChoose$ FirePower | SubAbility$ Retribution | RememberTargets$ True | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to CARDNAME. -SVar:Retribution:DB$ EachDamage | ValidCards$ Creature.IsRemembered | ValidDescription$ of those creatures | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedPlayers$ Self | SubAbility$ DBCleanup | StackDescription$ then each of those creatures deals damage equal to its power to CARDNAME -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:X:Count$CardPower -SVar:FirePower:Count$CardPower -SVar:Min:SVar$FirePower/LimitMax.1 +A:AB$ DealDamage | Cost$ T | ValidTgts$ Creature | TgtPrompt$ Select any number of target creatures | NumDmg$ Count$CardPower | TargetMin$ Min | TargetMax$ Count$CardPower | DividedAsYouChoose$ Count$CardPower | SubAbility$ Retribution | SpellDescription$ CARDNAME deals damage equal to its power divided as you choose among any number of target creatures. +SVar:Retribution:DB$ EachDamage | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | Defined$ Self | StackDescription$ SpellDescription | SpellDescription$ Each of those creatures deals damage equal to its power to CARDNAME. AI:RemoveDeck:Random +SVar:Min:Count$CardPower/LimitMax.1 Oracle:{T}: Living Inferno deals damage equal to its power divided as you choose among any number of target creatures. Each of those creatures deals damage equal to its power to Living Inferno. diff --git a/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt b/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt index 7b8fdcde79e..236cd106b80 100644 --- a/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt +++ b/forge-gui/res/cardsfolder/m/mirrorhall_mimic_ghastly_mimicry.txt @@ -18,7 +18,7 @@ Types:Enchantment Aura K:Enchant creature A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ HighestEvaluation T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types. -SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | AddTypes$ Spirit | SpellDescription$ At the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types. +SVar:TrigCopy:DB$ CopyPermanent | Defined$ Enchanted | AddTypes$ Spirit R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard Oracle:Enchant creature\nAt the beginning of your upkeep, create a token that's a copy of enchanted creature, except it's a Spirit in addition to its other types.\nIf Ghastly Mimicry would be put into a graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/n/nissas_judgment.txt b/forge-gui/res/cardsfolder/n/nissas_judgment.txt index f6279c660a3..faaca10f539 100644 --- a/forge-gui/res/cardsfolder/n/nissas_judgment.txt +++ b/forge-gui/res/cardsfolder/n/nissas_judgment.txt @@ -1,8 +1,9 @@ Name:Nissa's Judgment ManaCost:4 G Types:Sorcery -A:SP$ PutCounter | Cost$ 4 G | AILogic$ PowerDmg | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DealToCreature | SpellDescription$ Support 2. (Put a +1/+1 counter on each of up to two target creatures.) -SVar:DealToCreature:DB$ EachDamage | AILogic$ PowerDmg | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | NumDmg$ X | TgtPrompt$ Choose target creature opponent controls | ValidTgts$ Creature.OppCtrl | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Each creature you control with a +1/+1 counter deals damage equal to its power to target creature opponent controls. +A:SP$ PutCounter | AILogic$ PowerDmg | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 2 | TgtPrompt$ Select up to two target creatures | CounterType$ P1P1 | SubAbility$ DealToCreature | StackDescription$ REP ._. ({c:ThisTargetedCard}) | SpellDescription$ Support 2. (Put a +1/+1 counter on each of up to two target creatures.) +SVar:DealToCreature:DB$ EachDamage | ValidCards$ Creature.YouCtrl+counters_GE1_P1P1 | NumDmg$ X | TgtPrompt$ Select up to one target creature an opponent controls | ValidTgts$ Creature.OppCtrl | TargetMin$ 0 | TargetMax$ 1 | StackDescription$ REP target creature opponent controls_{c:ThisTargetedCard} | SpellDescription$ Each creature you control with a +1/+1 counter deals damage equal to its power to target creature opponent controls. SVar:X:Count$CardPower +DeckHas:Ability$Counters AI:RemoveDeck:All Oracle:Support 2. (Put a +1/+1 counter on each of up to two target creatures.)\nChoose up to one target creature an opponent controls. Each creature you control with a +1/+1 counter on it deals damage equal to its power to that creature. diff --git a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt index c171afd4ef9..c426a2f855e 100644 --- a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt +++ b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt @@ -9,6 +9,7 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Pl SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ If it's a Goblin creature card, you may cast that card until the end of your next turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Z:Remembered$Valid Creature.Goblin +SVar:PlayMain1:TRUE DeckNeeds:Type$Goblin DeckHints:Type$Goblin Oracle:Other Goblins you control get +1/+1.\nWhenever Rundvelt Hordemaster or another Goblin you control dies, exile the top card of your library. If it's a Goblin creature card, you may cast that card until the end of your next turn. diff --git a/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt b/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt index 749b6c12705..e260a5173db 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_the_mad.txt @@ -6,10 +6,8 @@ A:AB$ Dig | Cost$ AddCounter<0/LOYALTY> | DigNum$ 1 | Reveal$ True | ChangeNum$ SVar:DBDamage:DB$ DealDamage | Defined$ Self | NumDmg$ Y | SubAbility$ DBCleanup | AILogic$ MadSarkhanDigDmg SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Remembered$CardManaCost -A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | TgtPrompt$ Select target creature | Sacrifice$ True | SubAbility$ DBToken | Planeswalker$ True | AILogic$ MadSarkhanDragon | SpellDescription$ Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying. +A:AB$ Destroy | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Creature | Sacrifice$ True | SubAbility$ DBToken | Planeswalker$ True | AILogic$ MadSarkhanDragon | SpellDescription$ Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying. SVar:DBToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_5_5_dragon_flying | TokenOwner$ TargetedController -#for this AF, the DefinedCards$ Self is the target for Each damaging. They EachDamage themselves. -A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | ValidCards$ Dragon.Creature+YouCtrl | ValidDescription$ Dragon creature you control | NumDmg$ X | DamageDesc$ damage equal to its power | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | Planeswalker$ True | Ultimate$ True | AILogic$ MadSarkhanUltimate | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player or planeswalker. -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. -SVar:X:Count$CardPower +A:AB$ EachDamage | Cost$ SubCounter<4/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidCards$ Dragon.Creature+YouCtrl | ValidDescription$ Dragon creature you control | NumDmg$ Count$CardPower | DamageDesc$ damage equal to its power | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | AILogic$ MadSarkhanUltimate | SpellDescription$ Each Dragon creature you control deals damage equal to its power to target player or planeswalker. +DeckHas:Ability$Sacrifice|Token & Type$Dragon Oracle:[0]: Reveal the top card of your library and put it into your hand. Sarkhan the Mad deals damage to himself equal to that card's mana value.\n[-2]: Target creature's controller sacrifices it, then that player creates a 5/5 red Dragon creature token with flying.\n[-4]: Each Dragon creature you control deals damage equal to its power to target player or planeswalker. diff --git a/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt b/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt index 8be155f720e..ecf99149a3b 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_the_masterless.txt @@ -3,8 +3,7 @@ ManaCost:3 R R Types:Legendary Planeswalker Sarkhan Loyalty:5 T:Mode$ Attacks | ValidCard$ Creature | Attacked$ You,Planeswalker.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever a creature attacks you or a planeswalker you control, each Dragon you control deals 1 damage to that creature. -SVar:TrigDamage:DB$ EachDamage | ValidCards$ Dragon.YouCtrl | DefinedPlayers$ TriggeredAttacker | StackDescription$ Each Dragon you control deals 1 damage to that creature. -SVar:X:Number$1 +SVar:TrigDamage:DB$ EachDamage | ValidCards$ Dragon.YouCtrl | NumDmg$ 1 | Defined$ TriggeredAttacker A:AB$ AnimateAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Power$ 4 | Toughness$ 4 | Types$ Creature,Dragon | Colors$ Red | OverwriteColors$ True | RemoveCardTypes$ True | Keywords$ Flying | ValidCards$ Planeswalker.YouCtrl | AILogic$ Always | SpellDescription$ Until end of turn, each planeswalker you control becomes a 4/4 red Dragon creature and gains flying. A:AB$ Token | Cost$ SubCounter<3/LOYALTY> | TokenAmount$ 1 | TokenScript$ r_4_4_dragon_flying | TokenOwner$ You | Planeswalker$ True | SpellDescription$ Create a 4/4 red Dragon creature token with flying. DeckHas:Ability$Token diff --git a/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt b/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt index ba5b6fb4583..49590bf287b 100644 --- a/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt +++ b/forge-gui/res/cardsfolder/s/sloppity_bilepiper.txt @@ -4,7 +4,7 @@ Types:Creature Demon PT:3/3 A:AB$ Effect | PrecostDesc$ Jolly Gutpipes — | Cost$ 2 T Sac<1/Creature> | StaticAbilities$ GrantCascade | Triggers$ ExileEffect | SpellDescription$ The next creature spell you cast this turn has cascade. (When you cast your next creature spell, exile cards from the top of your library until you exile a nonland card that costs less. You may cast it without paying its mana cost. Put the exiled cards on the bottom of your library in a random order.) SVar:GrantCascade:Mode$ Continuous | EffectZone$ Command | Affected$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ ExileEff | AddKeyword$ Cascade | Description$ The next noncreature spell you cast this turn has cascade. -SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | Valid$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True +SVar:ExileEffect:Mode$ SpellCast | EffectZone$ Command | ValidCard$ Card.Creature+YouCtrl | AffectedZone$ Stack | Execute$ RemoveEffect | Static$ True SVar:RemoveEffect:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self DeckHas:Keyword$Cascade & Ability$Sacrifice Oracle:Jolly Gutpipes — {2}, {T}, Sacrifice a creature: The next creature spell you cast this turn has cascade. (When you cast your next creature spell, exile cards from the top of your library until you exile a nonland card that costs less. 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/s/solar_blaze.txt b/forge-gui/res/cardsfolder/s/solar_blaze.txt index 9023c23c6ee..c1543f5351e 100644 --- a/forge-gui/res/cardsfolder/s/solar_blaze.txt +++ b/forge-gui/res/cardsfolder/s/solar_blaze.txt @@ -1,8 +1,7 @@ Name:Solar Blaze ManaCost:2 R W Types:Sorcery -A:SP$ EachDamage | Cost$ 2 R W | ValidCards$ Creature | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each creature deals damage to itself equal to its power. -SVar:X:Count$CardPower +A:SP$ EachDamage | ValidCards$ Creature | EachToItself$ True | NumDmg$ Count$CardPower | StackDescription$ SpellDescription | SpellDescription$ Each creature deals damage to itself equal to its power. AI:RemoveDeck:All AI:RemoveDeck:Random Oracle:Each creature deals damage to itself equal to its power. diff --git a/forge-gui/res/cardsfolder/t/the_akroan_war.txt b/forge-gui/res/cardsfolder/t/the_akroan_war.txt index f1700f0f7ac..1aa27ffe828 100644 --- a/forge-gui/res/cardsfolder/t/the_akroan_war.txt +++ b/forge-gui/res/cardsfolder/t/the_akroan_war.txt @@ -5,6 +5,5 @@ 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$ Effect | Duration$ UntilYourNextTurn | StaticAbilities$ MustAttack | SpellDescription$ Until your next turn, creatures your opponents control attack each combat if able. SVar:MustAttack:Mode$ MustAttack | ValidCreature$ Creature.OppCtrl | Description$ Until your next turn, creatures your opponents control attack each combat 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 +SVar:DBDamageTapped:DB$ EachDamage | ValidCards$ Creature.tapped | NumDmg$ Count$CardPower | EachToItself$ True | SpellDescription$ Each tapped creature deals damage to itself equal to its power. 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/thunderblade_charge.txt b/forge-gui/res/cardsfolder/t/thunderblade_charge.txt index 58f23394464..f308036f6de 100644 --- a/forge-gui/res/cardsfolder/t/thunderblade_charge.txt +++ b/forge-gui/res/cardsfolder/t/thunderblade_charge.txt @@ -2,6 +2,6 @@ Name:Thunderblade Charge ManaCost:1 R R Types:Sorcery A:SP$ DealDamage | Cost$ 1 R R | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. -T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.YouCtrl | TriggerZones$ Graveyard | ValidTarget$ Player | Execute$ TrigPlay | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, if CARDNAME is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. -SVar:TrigPlay:AB$ Play | Cost$ 2 R R R | ActivationZone$ Graveyard | WithoutManaCost$ True | Optional$ True +T:Mode$ DamageDoneOnce | CombatDamage$ True | ValidSource$ Creature.YouCtrl | ValidTarget$ Player | TriggerZones$ Graveyard | PresentZone$ Graveyard | IsPresent$ Card.StrictlySelf| Execute$ TrigPlay | TriggerDescription$ Whenever one or more creatures you control deal combat damage to a player, if CARDNAME is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. +SVar:TrigPlay:AB$ Play | Cost$ 2 R R R | WithoutManaCost$ True | Optional$ True Oracle:Thunderblade Charge deals 3 damage to any target.\nWhenever one or more creatures you control deal combat damage to a player, if Thunderblade Charge is in your graveyard, you may pay {2}{R}{R}{R}. If you do, you may cast it without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt new file mode 100644 index 00000000000..797a306646f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt @@ -0,0 +1,11 @@ +Name:Ancient Imperiosaur +ManaCost:5 G G +Types:Creature Dinosaur +PT:6/6 +K:Convoke +K:Trample +K:Ward:2 +K:etbCounter:P1P1:X +SVar:X:Convoked$Amount/Twice +DeckHas:Ability$Counters +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.)\nTrample, ward {2}\nAncient Imperiosaur enters the battlefield with two +1/+1 counters on it for each creature that convoked it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt new file mode 100644 index 00000000000..ccb063ad085 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt @@ -0,0 +1,13 @@ +Name:Archpriest of Shadows +ManaCost:3 B B +Types:Creature Human Warlock +PT:4/4 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Animate | Keywords$ Deathtouch | Triggers$ DamageTrig +SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. +K:Deathtouch +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. +SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature from your graveyard | Origin$ Graveyard | Destination$ Battlefield +DeckHas:Ability$Counters|Graveyard +DeckHints:Ability$Discard|Sacrifice +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following abilities until end of turn.)\nDeathtouch\nWhenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield. diff --git a/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt new file mode 100644 index 00000000000..d4513ce9674 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt @@ -0,0 +1,10 @@ +Name:Astral Wingspan +ManaCost:4 U +Types:Enchantment Aura +K:Convoke +K:Enchant creature +A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump +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.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying | Description$ Enchanted creature gets +2/+2 and has flying. +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.)\nEnchant creature\nWhen Astral Wingspan enters the battlefield, draw a card.\nEnchanted creature gets +2/+2 and has flying. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt new file mode 100644 index 00000000000..fb242d359aa --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt @@ -0,0 +1,24 @@ +Name:Ayara, Widow of the Realm +ManaCost:1 B B +Types:Legendary Creature Elf Noble +PT:3/3 +A:AB$ DealDamage | Cost$ T Sac<1/Creature.Other;Artifact.Other/another creature or artifact> | ValidTgts$ Opponent,Battle | TgtPrompt$ Select target opponent or battle | SubAbility$ DBGainLife | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value. +SVar:DBGainLife:DB$ GainLife | LifeAmount$ X +SVar:X:Sacrificed$CardManaCost +A:AB$ SetState | Cost$ 5 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform NICKNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +DeckHas:Ability$Sacrifice|LifeGain +Oracle:{T}, Sacrifice another creature or artifact: Ayara, Widow of the Realm deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value.\n{5}{R/P}: Transform Ayara. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.) + +ALTERNATE + +Name:Ayara, Furnace Queen +ManaCost:no cost +Colors:black,red +Types:Legendary Creature Phyrexian Elf Noble +PT:4/4 +T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Artifact.YouOwn,Creature.YouOwn | TgtPrompt$ Select up to one target artifact or creature from your graveyard | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Targeted | Duration$ Permanent | AtEOT$ Exile +DeckHas:Ability$Sacrifice|Graveyard +Oracle:At the beginning of combat on your turn, return up to one target artifact or creature card 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/upcoming/bloodfeather_phoenix.txt b/forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt new file mode 100644 index 00000000000..c4a67b9855d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bloodfeather_phoenix.txt @@ -0,0 +1,11 @@ +Name:Bloodfeather Phoenix +ManaCost:1 R +Types:Creature Phoenix +PT:2/2 +K:Flying +K:CARDNAME can't block. +T:Mode$ DamageDone | ValidSource$ Instant.YouCtrl,Sorcery.YouCtrl | ValidTarget$ Opponent,Battle | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever an instant or sorcery spell you control deals damage to an opponent or battle, you may pay {R}. If you do, return CARDNAME from your graveyard to the battlefield. It gains haste until end of turn. +SVar:TrigReturn:AB$ ChangeZone | Cost$ R | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Self +DeckHas:Ability$Graveyard +Oracle:Flying\nBloodfeather Phoenix can't block.\nWhenever an instant or sorcery spell you control deals damage to an opponent or battle, you may pay {R}. If you do, return Bloodfeather Phoenix from your graveyard to the battlefield. It gains haste until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt new file mode 100644 index 00000000000..ed4e7889ca5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt @@ -0,0 +1,11 @@ +Name:Boon-Bringer Valkyrie +ManaCost:3 W W +Types:Creature Angel Warrior +PT:4/4 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Pump | KW$ Flying & First Strike & Lifelink +K:Flying +K:First Strike +K:Lifelink +DeckHas:Ability$Counters|LifeGain +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that’s another creature, it gains the following abilities until end of turn.)\nFlying, first strike, lifelink diff --git a/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt new file mode 100644 index 00000000000..522fe9406b7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt @@ -0,0 +1,22 @@ +Name:Captive Weird +ManaCost:U +Types:Creature Weird +PT:1/3 +K:Defender +A:AB$ SetState | Cost$ 3 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:Defender\n{3}{R/P}: Transform Captive Weird. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.) + +ALTERNATE + +Name:Compleated Conjurer +ManaCost:no cost +Colors:blue,red +Types:Creature Phyrexian Weird +PT:3/3 +T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature transforms into CARDNAME, exile the top card of your library. Until the end of your next turn, you may play that card. +SVar:TrigExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | Duration$ UntilTheEndOfYourNextTurn | StaticAbilities$ Play | SubAbility$ DBCleanup | ForgetOnMoved$ 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 +Oracle:When this creature transforms into Compleated Conjurer, exile the top card of your library. Until the end of your next turn, you may play that card. diff --git a/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt new file mode 100644 index 00000000000..c32d55f8f3e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt @@ -0,0 +1,7 @@ +Name:Change the Equation +ManaCost:1 U +Types:Instant +A:SP$ Charm | Choices$ DBCounter,DBCounterBis +SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE2 | SpellDescription$ Counter target spell with mana value 2 or less. +SVar:DBCounterBis:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE6+Red,Card.cmcLE6+Green| SpellDescription$ Counter target red or green spell with mana value 6 or less. +Oracle:Choose one —\n• Counter target spell with mana value 2 or less.\n• Counter target red or green spell with mana value 6 or less. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt new file mode 100644 index 00000000000..a1b5febd10f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt @@ -0,0 +1,7 @@ +Name:Copper Host Crusher +ManaCost:6 G G +Types:Creature Phyrexian Bear Rhino +PT:8/8 +K:Trample +K:Hexproof +Oracle:Trample\nHexproof (This creature can’t be the target of spells or abilities your opponents control.) \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt new file mode 100644 index 00000000000..cb531538fb9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt @@ -0,0 +1,10 @@ +Name:Cragsmasher Yeti +ManaCost:4 R R +Types:Creature Yeti +PT:4/2 +K:TypeCycling:Mountain:2 +K:Backup:2:BackupAbility +SVar:BackupAbility:DB$ Pump | KW$ Trample +K:Trample +DeckHas:Ability$Counters +Oracle:Mountaincycling {2} ({2}, Discard this card: Search your library for a Mountain card, reveal it, put it into your hand, then shuffle.)\nBackup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\nTrample diff --git a/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt b/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt new file mode 100644 index 00000000000..bfc51b0c2c4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/deeproot_wayfinder.txt @@ -0,0 +1,9 @@ +Name:Deeproot Wayfinder +ManaCost:1 G +Types:Creature Merfolk Scout +PT:2/3 +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | CombatDamage$ True | Execute$ TrigSurveil | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or battle, surveil 1, then you may return a land card from your graveyard to the battlefield tapped. (To surveil 1, look at the top card of your library. You may put that card into your graveyard.) +SVar:TrigSurveil:DB$ Surveil | Amount$ 1 | SubAbility$ DBChangeZone +SVar:DBChangeZone:DB$ ChangeZone | Optional$ True | ChangeType$ Land.YouOwn | Origin$ Graveyard | Destination$ Battlefield | Hidden$ True | ChangeNum$ 1 | Tapped$ True +DeckHas:Ability$Graveyard +Oracle:Whenever Deeproot Wayfinder deals combat damage to a player or battle, surveil 1, then you may return a land card from your graveyard to the battlefield tapped. (To surveil 1, look at the top card of your library. You may put that card into your graveyard.) diff --git a/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt new file mode 100644 index 00000000000..3f58448fcc8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt @@ -0,0 +1,13 @@ +Name:Doomskar Warrior +ManaCost:2 G G +Types:Creature Human Warrior +PT:4/3 +K:Backup:1:BackupAbilities +SVar:BackupAbilities:DB$ Animate | Keywords$ Trample | Triggers$ DamageTrig +SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ 1 | ChangeValid$ Creature,Land | Optional$ True | DestinationZone$ Hand | RestRandomOrder$ True +K:Trample +T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. +SVar:X:TriggerCount$DamageAmount +DeckHas:Ability$Counters +Oracle:Backup 1\nTrample\nWhenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order. diff --git a/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt b/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt new file mode 100644 index 00000000000..9f0d9d3b3c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dusk_legion_duelist.txt @@ -0,0 +1,9 @@ +Name:Dusk Legion Duelist +ManaCost:1 W +Types:Creature Vampire Soldier +PT:2/2 +K:Vigilance +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | ActivationLimit$ 1 | TriggerZones$ Battlefield | CounterType$ P1P1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, draw a card. This ability triggers only once each turn. +SVar:TrigDraw:DB$ Draw | NumCards$ 1 +DeckHints:Ability$Counters +Oracle:Vigilance\nWhenever one or more +1/+1 counters are put on Dusk Legion Duelist, draw a card. This ability triggers only once each turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt new file mode 100644 index 00000000000..07431895a95 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt @@ -0,0 +1,9 @@ +Name:Fearless Skald +ManaCost:4 R +Types:Creature Dwarf Berserker +PT:3/2 +K:Backup:1:BackupAbility +SVar:BackupAbility:DB$ Pump | KW$ Double Strike +K:Double Strike +DeckHas:Ability$Counters +Oracle:Backup 1 (When this creature enters the battlefield, put a + 1/+ 1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nDouble strike diff --git a/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt b/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt new file mode 100644 index 00000000000..4d716cd75dd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glistening_deluge.txt @@ -0,0 +1,6 @@ +Name:Glistening Deluge +ManaCost:1 B B +Types:Sorcery +A:SP$ PumpAll | ValidCards$ Creature | NumAtt$ -1 | NumDef$ -1 | SubAbility$ DBDebuff | SpellDescription$ All creatures get -1/-1 until end of turn. Creatures that are green and/or white get an additional -2/-2 until end of turn. +SVar:DBDebuff:DB$ PumpAll | ValidCards$ Creature.White,Creature.Green | NumAtt$ -2 | NumDef$ -2 +Oracle:All creatures get -1/-1 until end of turn. Creatures that are green and/or white get an additional -2/-2 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt b/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt new file mode 100644 index 00000000000..4070f5f22bf --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/gnottvold_hermit_chrome_host_hulk.txt @@ -0,0 +1,19 @@ +Name:Gnottvold Hermit +ManaCost:3 G +Types:Creature Troll +PT:4/4 +A:AB$ SetState | Cost$ 5 UP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:{5}{U/P}: Transform Gnottvold Hermit. Activate only as a sorcery. ({U/P} can be paid with either {U} or 2 life.) + +ALTERNATE + +Name:Chrome Host Hulk +ManaCost:no cost +Colors:green,blue +Types:Creature Phyrexian Troll +PT:5/5 +T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigAnimate | TriggerDescription$ Whenever CARDNAME attacks, up to one other target creature has base power and toughness 5/5 until end of turn. +SVar:TrigAnimate:DB$ Animate | ValidTgts$ Creature.Other | TgtPrompt$ Select up to one other target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 5 | Toughness$ 5 +SVar:HasAttackEffect:TRUE +Oracle:Whenever Chrome Host Hulk attacks, up to one other target creature has base power and toughness 5/5 until end of turn. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt b/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt new file mode 100644 index 00000000000..1907d6ab48c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/harried_artisan_phyrexian_skyflayer.txt @@ -0,0 +1,19 @@ +Name:Harried Artisan +ManaCost:2 R +Types:Creature Human Artificer +PT:2/3 +K:Haste +A:AB$ SetState | Cost$ 3 WP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery. +AlternateMode:DoubleFaced +Oracle:Haste\n{3}{W/P}: Transform Harried Artisan. Activate only as a sorcery. ({W/P} can be paid with {W} or 2 life.) + +ALTERNATE + +Name:Phyrexian Skyflayer +ManaCost:no cost +Colors:red,white +Types:Creature Phyrexian Artificer +PT:3/4 +K:Flying +K:Haste +Oracle:Flying, haste \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt new file mode 100644 index 00000000000..e08f0773fa6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt @@ -0,0 +1,10 @@ +Name:Knight-Errant of Eos +ManaCost:4 W +Types:Creature Human Knight +PT:4/4 +K:Convoke +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked CARDNAME. Put the revealed cards into your hand, then shuffle. +SVar:TrigDig:DB$ Dig | DigNum$ 6 | ChangeNum$ 2 | Optional$ True | ChangeValid$ Creature.cmcLEX | SkipReorder$ True | SubAbility$ DBShuffle | ForceRevealToController$ True +SVar:DBShuffle:DB$ Shuffle | Defined$ You +SVar:X:Convoked$Amount +Oracle:Convoke\nWhen Knight-Errant of Eos enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked Knight-Errant of Eos. Put the revealed cards into your hand, then shuffle. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt new file mode 100644 index 00000000000..d07273f28db --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt @@ -0,0 +1,9 @@ +Name:Mirror-Shield Hoplite +ManaCost:R W +Types:Creature Human Soldier +PT:2/2 +K:Vigilance +T:Mode$ BecomesTarget | ValidTarget$ Creature.inZoneBattlefield+YouCtrl | ValidSource$ Ability.Backup | TriggerZones$ Battlefield | Execute$ TrigCopy | ActivationLimit$ 1 | TriggerDescription$ Whenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn. +SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredStackInstance | MayChooseTarget$ True +DeckNeeds:Keyword$Backup +Oracle:Vigilance\nWhenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn. diff --git a/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt b/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt index c6f97556cf7..1364cbf89d9 100644 --- a/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt +++ b/forge-gui/res/cardsfolder/upcoming/phyrexian_censor.txt @@ -1,6 +1,6 @@ Name:Phyrexian Censor ManaCost:2 W -Types:Phyrexian Wizard +Types:Creature Phyrexian Wizard PT:3/3 S:Mode$ CantBeCast | ValidCard$ Card.nonPhyrexian | Caster$ Player | NumLimitEachTurn$ 1 | Description$ Each player can't cast more than one non-Phyrexian spell each turn. R:Event$ Moved | ValidCard$ Creature.nonPhyrexian | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ Non-Phyrexian creatures enter the battlefield tapped. diff --git a/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt b/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt new file mode 100644 index 00000000000..c4251a94acd --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phyrexian_pegasus.txt @@ -0,0 +1,9 @@ +Name:Phyrexian Pegasus +ManaCost:2 W +Types:Creature Phyrexian Pegasus +PT:2/2 +K:Flying +T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, another target attacking creature without flying gains flying until end of turn. +SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.Other+attacking+withoutFlying | TgtPrompt$ Select another target attacking creature without flying | KW$ Flying +SVar:HasAttackEffect:TRUE +Oracle:Flying\nWhenever Phyrexian Pegasus attacks, another target attacking creature without flying gains flying until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/referee_squad.txt b/forge-gui/res/cardsfolder/upcoming/referee_squad.txt new file mode 100644 index 00000000000..d3d742785a4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/referee_squad.txt @@ -0,0 +1,11 @@ +Name:Referee Squad +ManaCost:2 U +Types:Creature Homunculus +PT:2/2 +K:Convoke +K:Vigilance +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | SubAbility$ DBCounter +SVar:DBCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ Stun | CounterNum$ 1 +DeckHas:Ability$Counters +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.)\nVigilance\nWhen Referee Squad enters the battlefield, tap target creature an opponent controls and put a stun counter on it. (If a permanent with a stun counter would become untapped, remove one from it instead.) diff --git a/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt b/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt new file mode 100644 index 00000000000..f215dc76b94 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/seedpod_caretaker.txt @@ -0,0 +1,11 @@ +Name:Seedpod Caretaker +ManaCost:2 W +Types:Creature Phyrexian Cleric +PT:2/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigCharm:DB$ Charm | Choices$ P1P1,Transform +SVar:P1P1:DB$ PutCounter | ValidTgts$ Artifact.YouCtrl,Creature.YouCtrl | TgtPrompt$ Select target artifact or creature you control | CounterType$ P1P1 | SpellDescription$ Put a +1/+1 counter on target artifact or creature you control. +SVar:Transform:DB$ SetState | ValidTgts$ Incubator.token+YouCtrl | TgtPrompt$ Select target Incubator token you control | Mode$ Transform | SpellDescription$ Transform target Incubator token you control. +DeckHas:Ability$Counters +DeckHints:Ability$Token & Type$Artifact +Oracle:When Seedpod Caretaker enters the battlefield, choose one —\n• Put a +1/+1 counter on target artifact or creature you control.\n• Transform target Incubator token you control. diff --git a/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt new file mode 100644 index 00000000000..faae830750d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt @@ -0,0 +1,10 @@ +Name:Streetwise Negotiator +ManaCost:1 G +Types:Creature Cat Citizen +PT:0/2 +K:Backup:1:BackupAbility +SVar:BackupAbility:DB$ Animate | staticAbilities$ CDT +SVar:CDT:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power. +S:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power. +DeckHas:Ability$Counters +Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nThis creature assigns combat damage equal to its toughness rather than its power. diff --git a/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt b/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt new file mode 100644 index 00000000000..67a179cf6c6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tandem_takedown.txt @@ -0,0 +1,6 @@ +Name:Tandem Takedown +ManaCost:1 G G +Types:Instant +A:SP$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | NumAtt$ +1 | AILogic$ PowerDmg | SubAbility$ DBEachDamage | StackDescription$ REP Up to two target creatures you control_{c:ThisTargetedCard} | SpellDescription$ Up to two target creatures you control each get +1/+0 until end of turn. +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature,Planeswalker,Battle | TgtPrompt$ Select another target creature, planeswalker, or battle | TargetUnique$ True | DefinedDamagers$ ParentTarget | NumDmg$ Count$CardPower | StackDescription$ REP another target creature, planeswalker, or battle_{c:ThisTargetedCard} | SpellDescription$ They each deal damage equal to their power to another target creature, planeswalker, or battle. +Oracle:Up to two target creatures you control each get +1/+0 until end of turn. They each deal damage equal to their power to another target creature, planeswalker, or battle. diff --git a/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt b/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt new file mode 100644 index 00000000000..fe758b5b931 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/the_great_aerie.txt @@ -0,0 +1,11 @@ +Name:The Great Aerie +ManaCost:no cost +Types:Plane Tarkir +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigBolster | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.) +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigBolster | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.) +SVar:TrigBolster:DB$ PutCounter | Bolster$ True | CounterNum$ 3 | CounterType$ P1P1 +T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever chaos ensues, choose up to one target creature you control and up to one target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. +SVar:RolledChaos:DB$ Pump | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Choose up to one target creature you control | TargetMin$ 0 | TargetMax$ 1 | SubAbility$ DBEachDamage +SVar:DBEachDamage:DB$ EachDamage | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose up to one target creature an opponent controls | TargetMin$ 0 | TargetMax$ 1 | ToEachOther$ Targeted | NumDmg$ Count$CardToughness +DeckHas:Ability$Counters +Oracle:When you planeswalk to The Great Aerie and at the beginning of your upkeep, bolster 3. (Choose a creature with the least toughness among creatures you control and put three +1/+1 counters on it.)\nWhenever chaos ensues, choose up to one target creature you control and up to one target creature an opponent controls. Each of those creatures deals damage equal to its toughness to the other. diff --git a/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt new file mode 100644 index 00000000000..534cd599a15 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt @@ -0,0 +1,11 @@ +Name:Voldaren Thrillseeker +ManaCost:2 R +Types:Creature Vampire Warrior +PT:1/1 +K:Backup:2:BackupAbility +SVar:BackupAbility:DB$ Animate | Abilities$ ABDealDamage +SVar:ABDealDamage:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target. +A:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target. +SVar:X:Sacrificed$CardPower +DeckHas:Ability$Counters|Sacrifice +Oracle:Backup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\n{1}, Sacrifice this creature: It deals damage equal to its power to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt new file mode 100644 index 00000000000..8e9662e6ee4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt @@ -0,0 +1,33 @@ +Name:Vorinclex +ManaCost:3 G G +Types:Legendary Creature Phyrexian Praetor +K:Trample +K:Reach +PT:6/6 +K:Trample +K:Reach +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle. +SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 2 +A:AB$ ChangeZone | Cost$ 6 G G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return it to the battlefield transformed under its owner’s control. Activate only as a sorcery. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +AlternateMode:DoubleFaced +Oracle:Trample, reach\nWhen Vorinclex enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle.\n{6}{G}{G}: Exile Vorinclex, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery. + +ALTERNATE + +Name:The Grand Evolution +ManaCost:no cost +Colors:green +Types:Enchantment Saga +K:Saga:3:DBMill,DBPutCounter,DBFight +SVar:DBMill:DB$ Mill | NumCards$ 10 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield. +SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Hidden$ True | Destination$ Battlefield | ChangeType$ Creature.IsRemembered | ChangeTypeDesc$ creature cards milled this way | ChangeNum$ 2 | SelectPrompt$ Choose two creature cards milled this way | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select any number of creatures you control to distribute counters to | CounterType$ P1P1 | CounterNum$ 7 | TargetMin$ 1 | TargetMax$ 7 | DividedAsYouChoose$ 7 | SpellDescription$ Distribute seven +1/+1 counters among any number of target creatures you control. +SVar:DBFight:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Abilities$ Fight | Duration$ UntilEndOfTurn | SubAbility$ DBExileSelf | SpellDescription$ Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile CARDNAME, then return it to the battlefield (front face up). +SVar:Fight:AB$ Fight | Cost$ 1 | Defined$ Self | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | SpellDescription$ This creature fights target creature you don't control. +SVar:DBExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturnSelf | RememberChanged$ True +SVar:DBReturnSelf:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup +DeckHas:Ability$Mill|Counters|Graveyard +Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.\nII — Distribute seven +1/+1 counters among any number of target creatures you control.\nIII — Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile The Grand Evolution, then return it to the battlefield (front face up). diff --git a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt index b8fe19278c8..c2504a0a110 100644 --- a/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt +++ b/forge-gui/res/cardsfolder/w/wave_of_reckoning.txt @@ -1,9 +1,7 @@ Name:Wave of Reckoning ManaCost:4 W Types:Sorcery -#for this AF, the DefinedCards$ Self is the target for Each damaging. They EachDamage themselves. -A:SP$ EachDamage | Cost$ 4 W | ValidCards$ Creature | NumDmg$ X | DamageDesc$ damage equal to its power | DefinedCards$ Self | SpellDescription$ Each creature deals damage to itself equal to its power. -#NumDmg isn't really used here. It is left for clarity. The AF pulls Damage straight from "X" hardcoded. +A:SP$ EachDamage | ValidCards$ Creature | EachToItself$ True | NumDmg$ Count$CardPower | StackDescription$ SpellDescription | SpellDescription$ Each creature deals damage to itself equal to its power. SVar:X:Count$CardPower AI:RemoveDeck:All AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt b/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt index ebc8a8e1221..a0d2af955c8 100644 --- a/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt +++ b/forge-gui/res/cardsfolder/y/your_temple_is_under_attack.txt @@ -3,5 +3,5 @@ ManaCost:2 W Types:Instant A:SP$ Charm | Choices$ DBPump,DBDraw SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SpellDescription$ Pray for Protection — Creatures you control gain indestructible until end of turn. -SVar:DBDraw:DB$ Draw | Defined$ TargetedAndYou | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Strike a Deal — You and target opponent each draw two cards. +SVar:DBDraw:DB$ Draw | NumCards$ 2 | Defined$ TargetedAndYou | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | SpellDescription$ Strike a Deal — You and target opponent each draw two cards. Oracle:Choose one —\n• Pray for Protection — Creatures you control gain indestructible until end of turn.\n• Strike a Deal — You and target opponent each draw two cards. diff --git a/forge-gui/res/editions/March of the Machine Commander.txt b/forge-gui/res/editions/March of the Machine Commander.txt index 349cae30668..85c4c51755b 100644 --- a/forge-gui/res/editions/March of the Machine Commander.txt +++ b/forge-gui/res/editions/March of the Machine Commander.txt @@ -11,23 +11,445 @@ ScryfallCode=MOC 3 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 4 M Kasla, the Broken Halo @Martina Fackova 5 M Sidar Jabari of Zhalfir @Simon Dominic +6 M Elenda and Azor @Randy Vargas +7 M Moira and Teshar @Josh Hass +8 M Rashmi and Ragavan @Joshua Cairos +9 M Saint Traft and Rem Karolus @Lucas Graciano +10 M Shalai and Hallar @Mila Pesic +11 R Chivalric Alliance @Jim Pavelec +12 R Conjurer's Mantle @Fiona Hsieh +13 R Darksteel Splicer @Steven Belledin +14 R Excise the Imperfect @Denis Zhbankov +15 R Filigree Vector +16 R Guardian Scalelord @Victor Adame Minguez +17 R Nesting Dovehawk @Alessandra Pisano +18 R Path of the Ghosthunter @Eli Minaya +19 R Vulpine Harvester @Brent Hollowell +20 R Wand of the Worldsoul @Alessandra Pisano +21 R Deluxe Dragster @Gabor Szikszai +22 R Herald of Hoofbeats @Randy Vargas +23 R Path of the Enigma @Jeremy Wilson +24 R Schema Thief @Artur Treffner +25 R Blight Titan @Martin de Diego Sádaba +26 R Exsanguinator Cavalry @Quintin Gleim +27 R Locthwain Lancer @Lars Grant-West +28 R Path of the Schemer @Josu Hernaiz +29 R Dance with Calamity @Fajareka Setiawan +30 R Death-Greeter's Champion @Jason Rainville +31 R Hedron Detonator @Caroline Gariba +32 R Mirror-Style Master @Chris Rallis +33 R Pain Distributor @Olivier Bernard +34 R Path of the Pyromancer @Dominik Mayer +35 R Uncivil Unrest @Lorenzo Mastroianni +36 R Conclave Sledge-Captain @Ilse Gort +37 R Emergent Woodwurm @Mathias Kollros +38 R Path of the Animist @Liiga Smilshkalne +39 R Sandsteppe War Riders @Kekai Kotaki +40 R Cutthroat Negotiator @Lucas Graciano +41 R Flockchaser Phantom @Lorenzo Mastroianni +42 R Mistmeadow Vanisher @Iris Compiet +43 R Vodalian Wave-Knight @Olivier Bernard +44 R Wildfire Awakener @Andrew Mar +45 R Bitterthorn, Nissa's Animus @Titus Lunter +46 R Ichor Elixir @Warren Mahy +47 C The Caldaia @Julian Kok Joon Wen +48 C Enigma Ridges @Eytan Zana 49 C Esper @Bruce Brenneise +50 C The Fertile Lands of Saulvinia @Lorenzo Lanfranconi +51 C Ghirapur @David Alvarez +52 C The Golden City of Orazca @Alayna Danner +53 C The Great Aerie @Julian Kok Joon Wen +54 C Inys Haen @Aldo Domínguez +55 C Ketria @Piotr Dura +56 C Littiara @Jonas De Ro +57 C Megaflora Jungle +58 C Naktamun @Robin Olausson +59 C New Argive @Leon Tukker +60 C Norn's Seedcore @Alexander Forssberg 61 C Nyx @Piotr Dura +62 C Paliano @Piotr Dura +63 C The Pit @Dave Kendall +64 C Riptide Island @Jesper Ejsing +65 C Strixhaven @Alexander Forssberg +66 C Ten Wizards Mountain @Iris Compiet 67 C Towashi @Kamila Szutenberg +68 C Unyaro @Robin Olausson +69 C Valor's Reach @Kamila Szutenberg +70 C The Western Cloud @Titus Lunter +71 C The Wilds @Chris Seaman +72 R Elspeth's Talent @Jeremy Wilson +73 R Firemane Commando @Andrew Mar +74 R Teferi's Talent @Dominik Mayer +75 M Infernal Sovereign @Chris Rallis +76 R Liliana's Talent @A. M. Sartor +77 R Rowan's Talent @Pauline Voss +78 R Vivien's Talent @Eli Minaya +79 M Begin the Invasion @Campbell White +80 R Elspeth's Talent @Jeremy Wilson +81 R Firemane Commando @Andrew Mar +82 R Teferi's Talent @Dominik Mayer +83 M Infernal Sovereign @Chris Rallis +84 R Liliana's Talent @A. M. Sartor +85 R Rowan's Talent @Pauline Voss +86 R Vivien's Talent @Eli Minaya +87 M Begin the Invasion @Campbell White 88 M Bright-Palm, Soul Awakener @Mila Pesic 89 M Brimaz, Blight of Oreskos @Uriah Voth +90 M Elenda and Azor @Randy Vargas 91 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 92 M Kasla, the Broken Halo @Martina Fackova +93 M Moira and Teshar @Josh Hass +94 M Rashmi and Ragavan @Joshua Cairos +95 M Saint Traft and Rem Karolus @Lucas Graciano +96 M Shalai and Hallar @Mila Pesic 97 M Sidar Jabari of Zhalfir @Simon Dominic +98 R Chivalric Alliance @Jim Pavelec +99 R Conjurer's Mantle @Fiona Hsieh +100 R Darksteel Splicer @Steven Belledin +101 R Excise the Imperfect @Denis Zhbankov +102 R Filigree Vector +103 R Guardian Scalelord @Victor Adame Minguez +104 R Nesting Dovehawk @Alessandra Pisano +105 R Path of the Ghosthunter @Eli Minaya +106 R Vulpine Harvester @Brent Hollowell +107 R Wand of the Worldsoul @Alessandra Pisano +108 R Deluxe Dragster @Gabor Szikszai +109 R Herald of Hoofbeats @Randy Vargas +110 R Path of the Enigma @Jeremy Wilson +111 R Schema Thief @Artur Treffner +112 R Blight Titan @Martin de Diego Sádaba +113 R Exsanguinator Cavalry @Quintin Gleim +114 R Locthwain Lancer @Lars Grant-West +115 R Path of the Schemer @Josu Hernaiz +116 R Dance with Calamity @Fajareka Setiawan +117 R Death-Greeter's Champion @Jason Rainville +118 R Hedron Detonator @Caroline Gariba +119 R Mirror-Style Master @Chris Rallis +120 R Pain Distributor @Olivier Bernard +121 R Path of the Pyromancer @Dominik Mayer +122 R Uncivil Unrest @Lorenzo Mastroianni +123 R Conclave Sledge-Captain @Ilse Gort +124 R Emergent Woodwurm @Mathias Kollros +125 R Path of the Animist @Liiga Smilshkalne +126 R Sandsteppe War Riders @Kekai Kotaki +127 R Cutthroat Negotiator @Lucas Graciano +128 R Flockchaser Phantom @Lorenzo Mastroianni +129 R Mistmeadow Vanisher @Iris Compiet +130 R Vodalian Wave-Knight @Olivier Bernard +131 R Wildfire Awakener @Andrew Mar +132 R Bitterthorn, Nissa's Animus @Titus Lunter +133 R Ichor Elixir @Warren Mahy 134 M Bright-Palm, Soul Awakener @Mila Pesic 135 M Brimaz, Blight of Oreskos @Uriah Voth 136 M Gimbal, Gremlin Prodigy @Fajareka Setiawan 137 M Kasla, the Broken Halo @Martina Fackova 138 M Sidar Jabari of Zhalfir @Simon Dominic +139 C The Aether Flues @Jason A. Engle +140 C Bloodhill Bastion @Mark Hyzer +141 C Chaotic Aether @Dan Scott +142 C Gavony @Dave Kendall +143 C Glimmervoid Basin @Lars Grant-West +144 C The Great Forest @Howard Lyon +145 C Grove of the Dreampods @Erica Yang +146 C Hedron Fields of Agadeem @Vincent Proce 147 C Isle of Vesuva @Zoltan Boros & Gabor Szikszai 148 C Jund @Aleksi Briclot +149 C Kharasha Foothills @Trevor Claxton +150 C Krosa @Steven Belledin +151 C Mutual Epiphany @Jason Felix +152 C Orochi Colony @Charles Urbach 153 C Panopticon @John Avon +154 C Planewide Disaster @Dave Kendall +155 C Reality Shaping @Dan Scott +156 C Selesnya Loft Gardens @Martina Pilcerova +157 C Sokenzan @Brian Snõddy 158 C Spatial Merging @Gabor Szikszai +159 C Stensia @Vincent Proce +160 C Stronghold Furnace @Jim Pavelec +161 C Truga Jungle @Jim Nelson +162 C Turri Island @Raymond Swanland +163 C Undercity Reaches @Stephan Martiniere +164 U Abzan Battle Priest @Chris Rahn +165 U Abzan Falconer @Steven Belledin +166 R Acclaimed Contender @David Gaillet +167 R Adeline, Resplendent Cathar @Bryan Sola +168 U Alharu, Solemn Ritualist @Chris Rallis +169 R Angel of Finality @Howard Lyon +170 R Angel of Salvation @D. Alexander Gregory +171 R Angel of the Ruins @Viko Menezes +172 R Austere Command @Anna Steinbauer +173 U Banisher Priest @Willian Murai +174 U Battle Screech @Anastasia Ovchinnikova +175 R Blade Splicer @Greg Staples +176 M Cataclysmic Gearhulk @Victor Adame Minguez +177 U Chant of Vitu-Ghazi @Stephen Tappin +178 U Conclave Tribunal @Seb McKinnon +179 U Constable of the Realm @Alexander Mokhov +180 U Devouring Light @Slawomir Maniak +181 U Elite Scaleguard @Steve Prescott +182 M Elspeth, Sun's Champion @Tyler Jacobson +183 R Emeria Angel @Jim Murray +184 C Ephemeral Shields @Yohann Schepacz +185 R Fell the Mighty @Raymond Swanland +186 U Flight of Equenauts @Zezhou Chen +187 U Generous Gift @Kev Walker +188 M Hero of Bladehold @Steven Belledin +189 R High Sentinels of Arashin @James Ryman +190 R Hour of Reckoning @Joseph Meehan +191 R Keeper of the Accord @Denman Rooke +192 R Knight Exemplar @Jason Chan +193 R Knight of the White Orchid @Mark Zug +194 U Master Splicer @Chippy +195 R Maul of the Skyclaves @Joseph Meehan +196 U Mentor of the Meek @Jana Schirmer & Johannes Voss +197 R Mikaeus, the Lunarch @Steven Belledin +198 U Path to Exile @Todd Lockwood +199 R Phyrexian Rebirth @Scott Chou +200 R Promise of Loyalty @Sara Winters +201 R Restoration Angel @Jake Murray +202 U Return to Dust @Wayne Reynolds +203 R Secure the Wastes @Scott Murphy +204 R Semester's End @Alayna Danner +205 U Seraph of the Masses @Zoltan Boros +206 U Shattered Angel @Kev Walker +207 R Silverwing Squadron @Johannes Voss +208 C Spirited Companion @Ilse Gort +209 R Sunscorch Regent @Matt Stewart +210 C Suture Priest @Igor Kieryluk +211 U Swords to Plowshares @Jesper Ejsing +212 R Together Forever @Aaron Miller +213 R Unbreakable Formation @Matt Stewart +214 R Valiant Knight @Jakub Kasper +215 R Venerated Loxodon @Zack Stella +216 C Village Bell-Ringer @David Palumbo +217 R Worthy Knight @Yongjae Choi +218 R Chasm Skulker @Jack Wang +219 C Cloud of Faeries @Iris Compiet +220 C Distant Melody +221 R Echo Storm @Mark Poole +222 M Ethersworn Adjudicator @Dan Scott +223 U Fallowsage @Paolo Parente +224 R Imprisoned in the Moon @Ryan Alexander Lee +225 U Junk Winder @Campbell White +226 R Master of Etherium @Matt Cavotta +227 R Masterful Replication @Victor Adame Minguez +228 R Nadir Kraken @Dan Scott +229 R Perplexing Test @Fariba Khamseh +230 R Pull from Tomorrow @Sara Winters +231 U Reality Shift @Howard Lyon +232 U Reverse Engineer @Chase Stone +233 R Rise and Shine @Franz Vohwinkel +234 R Saheeli's Artistry @Kieran Yanner +235 R Sharding Sphinx @Michael Bruinsma +236 R Shimmer Dragon @Lie Setiawan +237 R Spell Swindle @Victor Adame Minguez +238 R Stroke of Genius @Rovina Cai +239 U Syr Elenora, the Discerning @Mila Pesic +240 U Tetsuko Umezawa, Fugitive @Randy Vargas +241 R Thopter Spy Network @Jung Park +242 C Thoughtcast @Greg Hildebrandt +243 R Vedalken Humiliator @Jehan Choo +244 U Whirler Rogue @Winona Nelson +245 R Workshop Elders @Iain McCaig +246 U Ambition's Cost @Zezhou Chen +247 U Bone Shredder @Ron Spencer +248 C First-Sphere Gargantua @Randy Vargas +249 U Foulmire Knight @Alex Brock +250 U Go for the Throat @Kristina Carroll +251 U Graveshifter @Jakub Kasper +252 R Haakon, Stromgald Scourge @Mark Zug +253 R Josu Vess, Lich Knight @Tyler Jacobson +254 U Keskit, the Flesh Sculptor @Yongjae Choi +255 R Liliana's Standard Bearer @Josh Hass +256 M Massacre Wurm @Jason Chan +257 R Midnight Reaper @Sidharth Chaturvedi +258 R Murderous Rider @Josh Hass +259 C Night's Whisper @John Severin Brassell +260 M Noxious Gearhulk @Lius Lasahido +261 U Order of Midnight @Victor Adame Minguez +262 R Painful Truths @Winona Nelson +263 R Phyrexian Delver @Igor Kieryluk +264 C Phyrexian Ghoul @Pete Venters +265 C Phyrexian Rager @Brock Grossman +266 M Phyrexian Scriptures @Joseph Meehan +267 C Read the Bones @Lars Grant-West +268 C Smitten Swordmaster @Taylor Ingvarsson +269 U Syr Konrad, the Grim @Anna Steinbauer +270 U Victimize @Craig J Spearing +271 R Yawgmoth's Vile Offering @Chase Stone +272 R Brass's Bounty @Grzegorz Rutkowski +273 R Chaos Warp @Trevor Claxton +274 U Curse of Opulence @Kieran Yanner +275 R Everquill Phoenix @Lie Setiawan +276 U Falkenrath Exterminator @Winona Nelson +277 M Feldon of the Third Path @Chase Stone +278 R Fiery Confluence @Kieran Yanner +279 R Flamerush Rider @Min Yum +280 R Flameshadow Conjuring @Seb McKinnon +281 U Ghirapur Aether Grid @Cynthia Sheppard +282 C Goblin Instigator @Filip Burburan +283 C Goblin Medics @Caio Monteiro +284 R Hellkite Igniter @Jason Chan +285 C Impact Tremors @Lake Hurwitz +286 R Ion Storm @Michael Sutfin +287 R Krenko, Tin Street Kingpin @Viko Menezes +288 R Pia and Kiran Nalaar @Eric Deschamps +289 U Vampires' Vengeance @Chris Cold +290 R Aid from the Cowl @Viktor Titov +291 U Armorcraft Judge @David Palumbo +292 U Brawn @Matt Cavotta +293 R Champion of Lambholt @Christopher Moeller +294 C Crack Open @Yeong-Hao Han +295 C Cultivate @Anthony Palumbo +296 C Fertilid @Wayne Reynolds +297 R Forgotten Ancient @Mark Tedin +298 R Genesis Hydra @Donato Giancola +299 R Gilded Goose @Lindsey Look +300 R Gyre Sage @Tyler Jacobson +301 U Hindervines @Svetlin Velinov +302 R Incubation Druid @Daniel Ljunggren +303 R Inscription of Abundance @Zoltan Boros +304 U Inspiring Call @Dan Scott +305 M Kalonian Hydra @Chris Rahn +306 C Kodama's Reach @John Avon +307 R Managorger Hydra @Lucas Graciano +308 C Pridemalkin @Karl Kopinski +309 C Return to Nature @Mark Poole +310 R Rishkar, Peema Renegade @Todd Lockwood +311 C Root Out @Daniel Ljunggren +312 U Slurrk, All-Ingesting @Jehan Choo +313 U Tireless Provisioner @Josu Hernaiz +314 R Tireless Tracker @Eric Deschamps +315 U Weirding Wood @Jung Park +316 C Wood Elves @Josh Hass +317 U Arvad the Cursed @Lius Lasahido +318 R Aryel, Knight of Windgrace @Grzegorz Rutkowski +319 U Combine Chrysalis @Hector Ortiz +320 U Conclave Mentor @Raoul Vitale +321 U Corpse Knight @Karl Kopinski +322 U Despark @Slawomir Maniak +323 R Dromoka's Command @James Ryman +324 U Duergar Hedge-Mage @Dave Allsop +325 U Enduring Scalelord @Clint Cearley +326 U Good-Fortune Unicorn @Kee Lo +327 U Hamza, Guardian of Arashin @Wisnu Tan +328 R Heaven // Earth @Jonas De Ro +329 U Improbable Alliance @Zoltan Boros +330 U Juniper Order Ranger @Greg Hildebrandt +331 U Knight of the Last Breath @Milivoj Ćeran +332 U Knights of the Black Rose @Mark Zug +333 R Knights' Charge @Paul Scott Canavan +334 M Kykar, Wind's Fury @G-host Lee +335 M The Locust God @Lius Lasahido +336 U Migratory Route @Winona Nelson +337 U Mortify @Anthony Palumbo +338 U Saheeli, Sublime Artificer @Wesley Burt +339 U Struggle // Survive @Eric Deschamps +340 R Time Wipe @Svetlin Velinov +341 R Utter End @Mark Winters +342 M Vona, Butcher of Magan @Volkan Baǵa +343 U Wear // Tear @Ryan Pancoast +344 R Whirlwind of Thought @Bram Sels +345 U Wintermoor Commander @Tyler Jacobson +346 R Academy Manufactor @Campbell White +347 R Ancient Stone Idol @Josh Hass +348 C Arcane Signet @Dan Scott +349 R Bloodforged Battle-Axe @Alayna Danner +350 U Bloodline Pretender @Slawomir Maniak +351 U Burnished Hart @Yeong-Hao Han +352 C Commander's Sphere @Ryan Alexander Lee +353 R Coveted Jewel @Jason A. Engle +354 R Cultivator's Caravan @Mark Zug +355 R Duplicant @Thomas M. Baxa +356 U Fellwar Stone @John Avon +357 C Fractured Powerstone @Rob Alexander +358 C Gruul Signet @Efrem Palacios +359 U Hedron Archive @Craig J Spearing +360 U Herald's Horn @Jason Felix +361 R Inspiring Statuary @Kirsten Zirngibl +362 C Izzet Signet @Raoul Vitale +363 U Meteor Golem @Lake Hurwitz +364 U Mind Stone @Adam Rex +365 U Mindless Automaton @Chris Seaman +366 R Myr Battlesphere @Franz Vohwinkel +367 R Nettlecyst @Vincent Proce +368 C Orzhov Locket @Volkan Baǵa +369 C Orzhov Signet @Martina Pilcerova +370 M Phyrexian Triniform @Adam Paquette +371 R Psychosis Crawler @Stephan Martiniere +372 U Replicating Ring @Olena Richards +373 R Scrap Trawler @Daarken +374 R Sculpting Steel @Heather Hudson +375 R Scytheclaw @James Paick +376 U Shimmer Myr @Jana Schirmer & Johannes Voss +377 R Sigiled Sword of Valeron @John Stanko +378 C Simic Signet @Mike Sass +379 U Skullclamp @Luca Zontini +380 R Skyclave Relic @Daniel Ljunggren +381 U Sol Ring @Mike Bierek +382 M Soul of New Phyrexia @Daarken +383 R Spine of Ish Sah @Daniel Ljunggren +384 R Strionic Resonator @Sam White +385 U Talisman of Hierarchy @Lindsey Look +386 R Thopter Assembly @Svetlin Velinov +387 R Triskelion @Christopher Moeller +388 R Vanquisher's Banner @Milivoj Ćeran +389 C Wayfarer's Bauble @Tomas Duchek +390 U Arcane Sanctum @Anthony Francisco +391 C Bojuka Bog @Howard Lyon +392 U Bretagard Stronghold @Jung Park +393 R Canopy Vista @Adam Paquette +394 R Choked Estuary @Vincent Proce +395 R Cinder Glade @Adam Paquette +396 C Command Tower @Evan Shipard +397 C Evolving Wilds @Cliff Childs +398 R Exotic Orchard @Steven Belledin +399 R Fetid Heath @Daarken +400 U Field of Ruin @Chris Ostrowski +401 R Fortified Village @Cliff Childs +402 U Frontier Bivouac @Titus Lunter +403 R Frostboil Snarl @Sam Burley +404 R Furycalm Snarl @Sam Burley +405 R Game Trail @Adam Paquette +406 R Gavony Township @Julian Kok Joon Wen +407 C Goldmire Bridge @Aaron Miller +408 U Jungle Shrine @Wayne Reynolds +409 R Karn's Bastion @Adam Paquette +410 R Kessig Wolf Run @Eytan Zana +411 R Kher Keep @Paolo Parente +412 U Krosan Verge @Ruxing Gao +413 U Llanowar Reborn @Philip Straub +414 R Mossfire Valley @Yeong-Hao Han +415 R Mosswort Bridge @Jeremy Jarvis +416 U Myriad Landscape @Jonas De Ro +417 U Mystic Monastery @Florian de Gesincourt +418 C Path of Ancestry @Alayna Danner +419 R Port Town @Kamila Szutenberg +420 R Prairie Stream @Adam Paquette +421 U Rogue's Passage @Christine Choi +422 R Shineshadow Snarl @Sam Burley +423 C Silverquill Campus @Titus Lunter +424 C Simic Growth Chamber @John Avon +425 R Skycloud Expanse @Sam Burley +426 R Spire of Industry @John Avon +427 R Sungrass Prairie @Ron Spencer +428 R Sunken Hollow @Adam Paquette +429 U Tainted Field @Don Hazeltine +430 R Temple of Abandon @Adam Paquette +431 R Temple of Deceit @Jonas De Ro +432 R Temple of Enlightenment @Piotr Dura +433 R Temple of Epiphany @Adam Paquette +434 R Temple of Mystery @Piotr Dura +435 R Temple of Plenty @Chris Ostrowski +436 R Temple of Silence @Adam Paquette +437 U Temple of the False God @Brian Snõddy +438 R Temple of Triumph @Piotr Dura +439 C Terramorphic Expanse @Dan Scott +440 C Thriving Heath @Alayna Danner +441 C Thriving Isle @Jonas De Ro +442 C Thriving Moor @Titus Lunter +443 R Vault of the Archangel @John Avon +444 R Vineglimmer Snarl @Sam Burley 445 M Goro-Goro and Satoru @Johannes Voss 446 M Katilda and Lier @Justyna Dura 447 M Slimefoot and Squee @Victor Adame Minguez diff --git a/forge-gui/res/editions/March of the Machine The Aftermath.txt b/forge-gui/res/editions/March of the Machine The Aftermath.txt index c837fe9f989..b68a33ebaf9 100644 --- a/forge-gui/res/editions/March of the Machine The Aftermath.txt +++ b/forge-gui/res/editions/March of the Machine The Aftermath.txt @@ -7,3 +7,4 @@ ScryfallCode=MAT [cards] 34 R The Kenriths' Royal Funeral @Manuel Castañón +230 Jolrael, Voice of Zhalfir @Ernanda Souza diff --git a/forge-gui/res/editions/March of the Machine.txt b/forge-gui/res/editions/March of the Machine.txt index 0f3b05a55d2..447e45085e6 100644 --- a/forge-gui/res/editions/March of the Machine.txt +++ b/forge-gui/res/editions/March of the Machine.txt @@ -7,120 +7,221 @@ ScryfallCode=MOM [cards] 1 M Invasion of Ravnica @Leon Tukker +2 C Aerial Boost @Artur Nakhodkin +3 C Alabaster Host Intercessor @Konstantin Porubov 4 C Alabaster Host Sanctifier @Konstantin Porubov +5 C Angelic Intervention @Awanqi (Angela Wang) 6 M Archangel Elspeth @Cynthia Sheppard +7 C Attentive Skywarden @Jodie Muir +8 C Bola Slinger @Hendry Iwanaga 9 R Boon-Bringer Valkyrie @Heonhwa Choe +10 C Cut Short @Tran Nguyen 11 R Dusk Legion Duelist @Ryan Valle 12 M Elesh Norn @Magali Villeneuve 13 U Elspeth's Smite @Livia Prima +14 C Enduring Bondwarden @Kim Sokol +15 C Golden-Scale Aeronaut @Javier Charro 16 R Guardian of Ghirapur @Cynthia Sheppard 17 R Heliod, the Radiant Dawn @Victor Adame Minguez +18 C Infected Defector @Nino Vecia +19 C Inspired Charge @Vladimir Krisetskiy 20 U Invasion of Belenon @Antonio José Manzanedo 21 U Invasion of Dominaria @Denys Tsiperko 22 R Invasion of Gobakhan @Andreas Zafiratos 23 R Invasion of Theros @Johan Grenier +24 C Kithkin Billyrider @Zara Alfonso +25 C Knight of the New Coalition @Jake Murray 26 R Knight-Errant of Eos @Kevin Sidharta +27 C Kor Halberd @Bastien L. Deharme 28 M Monastery Mentor @Brian Valeza 29 U Norn's Inquisitor @Denis Zhbankov 30 U Phyrexian Awakening @Artur Nakhodkin 31 U Phyrexian Censor @Alexey Kruglov +32 R Progenitor Exarch @Marie Magny +33 C Realmbreaker's Grasp @Artur Nakhodkin +34 C Scrollshift @Bram Sels 35 U Seal from Existence @Anato Finnstark 36 U Seraph of New Capenna @Aaron J. Riley +37 C Sigiled Sentinel @Volkan Baǵa 38 U Sun-Blessed Guardian @Brian Valeza +39 C Sunder the Gateway @Titus Lunter 40 R Sunfall @Kasia 'Kafis' Zielińska 41 U Surge of Salvation @Dominik Mayer +42 C Swordsworn Cavalier @Stella Spente +43 C Tarkir Duneshaper @Denys Tsiperko 44 U Tiller of Flesh @Nino Vecia 45 U Zhalfirin Lancer @Nino Vecia 46 U Artistic Refusal @Olivier Bernard +47 C Assimilate Essence @Konstantin Porubov 48 U Astral Wingspan @Joseph Weston 49 U Captive Weird @Manuel Castañón 50 U Change the Equation @Alix Branwyn 51 R Chrome Host Seedshark @Donato Giancola 52 R Complete the Circuit @Eelis Kyttanen 53 U Corruption of Towashi @Artur Nakhodkin +54 C Disturbing Conversion @Anna Mitura-Laskowska +55 C Ephara's Dispersal @Awanqi (Angela Wang) +56 C Expedition Lookout @Johan Grenier +57 C Eyes of Gitaxias @Cristi Balanescu 58 R Faerie Mastermind @Joshua Raphael +59 C Furtive Analyst @Marcela Bolívar +60 C Halo-Charged Skaab @Igor Kieryluk 61 R Invasion of Arcavios @Dmitry Burmak 62 U Invasion of Kamigawa @Kekai Kotaki 63 R Invasion of Segovia @Edgar Sánchez Hidalgo 64 U Invasion of Vryn @Leon Tukker 65 M Jin-Gitaxias @Ekaterina Burmak +66 C Meeting of Minds @Milivoj Ćeran 67 C Moment of Truth @Rovina Cai 68 C Negate @Viko Menezes +69 C Oculus Whelp @Donato Giancola 70 U Omen Hawker @Josh Hass 71 U Oracle of Tragedy @Pavel Kolomeyets +72 C Order of the Mirror @Andrew Mar +73 C Preening Champion @Alix Branwyn +74 C Protocol Knight @Volkan Baǵa 75 R Rona, Herald of Invasion @Victor Adame Minguez +76 C Saiba Cryptomancer @Aaron J. Riley 77 R See Double @Marc Simonetti 78 U Skyclave Aerialist @Michal Ivan +79 C Stasis Field @Jinho Bae +80 C Temporal Cleansing @Dominik Mayer +81 C Thunderhead Squadron @PINDURSKI +82 C Tidal Terror @Nicholas Gregory 83 R Transcendent Message @Liiga Smilshkalne +84 U Wicked Slumber @Anato Finnstark 85 U Xerex Strobe-Knight @Pavel Kolomeyets 86 R Zephyr Singer @Lie Setiawan +87 C Zhalfirin Shapecraft @Aldo Domínguez +88 C Aetherblade Agent @Alexander Mokhov 89 R Archpriest of Shadows @Fariba Khamseh 90 R Ayara, Widow of the Realm @Anna Podedworna +91 C Bladed Battle-Fan @Colin Boyer 92 U Blightreaper Thallid @Marta Nael 93 R Bloated Processor @Brock Grossman 94 R Breach the Multiverse @Liiga Smilshkalne 95 U Collective Nightmare @Rovina Cai +96 U Compleated Huntmaster @Alex Brock +97 C Consuming Aetherborn @Aldo Domínguez +98 C Corrupted Conviction @Joseph Weston 99 C Deadly Derision @Gaboleps +100 C Dreg Recycler @Campbell White +101 C Etched Familiar @Colin Boyer +102 C Etched Host Doombringer @Helge C. Balzer +103 C Failed Conversion @Jodie Muir +104 C Final Flourish @Raluca Marinescu +105 C Flitting Guerrilla @Francisco Miyara 106 U Gift of Compleation @Artur Nakhodkin 107 U Glistening Deluge @Anastasia Balakchina +108 C Gloomfang Mauler @Denis Zhbankov 109 R Grafted Butcher @Zack Stella 110 R Hoarding Broodlord @Filip Burburan +111 C Ichor Drinker @Aurore Folny +112 C Ichor Shade @Nicholas Gregory 113 U Invasion of Eldraine @Cristi Balanescu 114 R Invasion of Fiora @Joshua Raphael 115 M Invasion of Innistrad @Alexey Kruglov 116 U Invasion of Ulgrotha @Viko Menezes 117 U Merciless Repurposing @Artur Nakhodkin 118 C Mirrodin Avenged @Scott Murphy +119 U Nezumi Freewheeler @Artur Nakhodkin +120 C Nezumi Informant @Steve Prescott 121 U Phyrexian Gargantua @Kevin Sidharta 122 R Pile On @Javier Charro 123 U Render Inert @Yigit Koroglu +124 U Scorn-Blade Berserker @Tuan Duong Chu 125 M Sheoldred @Ryan Pancoast +126 C Tenured Oilcaster @Francisco Miyara 127 C Traumatic Revelation @Cristi Balanescu +128 C Unseal the Necropolis @Isis +129 C Vanquish the Weak @Gaboleps +130 C Akki Scrapchomper @Wisnu Tan 131 C Beamtown Beatstick @Konstantin Porubov 132 R Bloodfeather Phoenix @Rudy Siswanto +133 C Burning Sun's Fury @Slawomir Maniak 134 M Chandra, Hope's Beacon @Kieran Yanner 135 R City on Fire @Jake Murray +136 C Coming In Hot @Cristi Balanescu 137 R Etali, Primal Conqueror @Ryan Pancoast 138 U Fearless Skald @Slawomir Maniak 139 U Furnace Gremlin @Tuan Duong Chu +140 C Furnace Host Charger @Andreas Zafiratos 141 U Furnace Reins @Brian Valeza +142 C Hangar Scrounger @Borja Pindado 143 U Harried Artisan @Caio Monteiro 144 R Into the Fire @Grzegorz Rutkowski 145 R Invasion of Kaldheim @Bryan Sola 146 R Invasion of Karsus @Zoltan Boros 147 U Invasion of Mercadia @Cristi Balanescu 148 U Invasion of Regatha @Daarken -149 M Invasion of Tarkir @Darren Tan +149 M Invasion of Tarkir @Darren Tan +150 C Karsus Depthguard @Tyler Jacobson 151 U Khenra Spellspear @Artur Nakhodkin 152 U Lithomantic Barrage @Viko Menezes +153 C Marauding Dreadship @Tiffany Turrill +154 C Mirran Banesplitter @Chris Seaman +155 R Nahiri's Warcrafting @Zara Alfonso +156 C Onakke Javelineer @Joseph Weston +157 C Pyretic Prankster @Francis Tneh +158 C Ral's Reinforcements @Nils Hamm 159 U Ramosian Greatsword @Jason A. Engle 160 R Rampaging Raptor @Denys Tsiperko +161 C Redcap Heelslasher @Alexey Kruglov 162 U Scrappy Bruiser @David Auden Nash +163 C Searing Barb @Tiffany Turrill +164 C Shatter the Source @Artur Nakhodkin 165 U Shivan Branch-Burner @Aaron Miller 166 U Stoke the Flames @Liiga Smilshkalne +167 C Thrashing Frontliner @Pavel Kolomeyets +168 C Trailblazing Historian @Jason A. Engle 169 M Urabrask @Campbell White +170 C Volcanic Spite @Kevin Sidharta 171 R Voldaren Thrillseeker @Viko Menezes +172 C War-Trained Slasher @Francis Tneh +173 C Wrenn's Resolve 174 R Ancient Imperiosaur @Piotr Foksowicz +175 C Arachnoid Adaptation @Isis +176 C Atraxa's Fall @Xavier Ribeiro +177 C Blighted Burgeoning @Piotr Foksowicz +178 C Bonded Herdbeast @Jokubas Uogintas +179 C Chomping Kavu @John Tedrick +180 C Converter Beast @Uriah Voth 181 U Copper Host Crusher @Nicholas Gregory +182 C Cosmic Hunger @Konstantin Porubov +183 C Crystal Carapace @Sam Burley 184 R Deeproot Wayfinder @Anna Pavleeva 185 R Doomskar Warrior @Chris Rallis +186 C Fertilid's Favor @Kevin Sidharta 187 R Glistening Dawn @Chris Ostrowski 188 U Gnottvold Hermit @Artur Nakhodkin +189 U Herbology Instructor @Sergey Glushakov 190 R Invasion of Ikoria @Antonio José Manzanedo 191 R Invasion of Ixalan @Viktor Titov 192 U Invasion of Muraganda @Adam Paquette 193 M Invasion of Shandalar @Adam Paquette 194 U Invasion of Zendikar @Diego Gisbert +195 C Iridescent Blademaster @Livia Prima 196 U Kami of Whispered Hopes @Filipe Pagliuso +197 C Overgrown Pest @Eelis Kyttanen 198 R Ozolith, the Shattered Spire @Daarken +199 C Placid Rottentail @Filip Burburan 200 R Polukranos Reborn @David Auden Nash +201 C Portent Tracker @Caroline Gariba 202 U Ravenous Sailback @Andrew Mar 203 U Sandstalker Moloch @Donato Giancola +204 C Seed of Hope @Gaboleps +205 C Serpent-Blade Assailant @Durion 206 U Storm the Seedcore @Jason Rainville 207 U Streetwise Negotiator @Brent Hollowell 208 U Tandem Takedown @Yigit Koroglu +209 U Tangled Skyline @Martin de Diego Sádaba +210 C Timberland Ancient @Pavel Kolomeyets 211 R Tribute to the World Tree @Kristina Carroll +212 C Vengeant Earth @Jonas De Ro 213 M Vorinclex @Daarken +214 C War Historian @Ryan Valle +215 C Wary Thespian @Billy Christian +216 C Wildwood Escort @Taras Susak 217 M Wrenn and Realmbreaker @Cristi Balanescu 218 R Baral and Kari Zev @Fariba Khamseh 219 M Borborygmos and Fblthp @Rudy Siswanto @@ -150,6 +251,7 @@ ScryfallCode=MOM 243 U Joyful Stormsculptor @Christina Kraus 244 R Kogla and Yidaro @Chris Rahn 245 M Kroxa and Kunoros @Ignatius Budi +246 U Marshal of Zhalfir @Darren Tan 247 U Mirror-Shield Hoplite @Alex Brock 248 U Mutagen Connoisseur @Alex Brock 249 R Omnath, Locus of All @Bryan Sola @@ -157,12 +259,19 @@ ScryfallCode=MOM 251 U Rampaging Geoderm @Randy Vargas 252 R Rankle and Torbran @Viko Menezes 253 U Sculpted Perfection @Chris Seaman +254 U Stormclaw Rager @Nicholas Elias 255 M Thalia and The Gitrog Monster @Howard Lyon 256 R Yargle and Multani @Slawomir Maniak 257 M Zimone and Dina @Lie Setiawan 258 M Zurgo and Ojutai @Daarken +259 C Flywheel Racer @Joshua Cairos +260 C Halo Hopper @Daniel Ljunggren +261 C Kitesail @Ben Hill +262 C Phyrexian Archivist @Daniel Romanovsky 263 R Realmbreaker, the Invasion Tree @Kekai Kotaki +264 C Skittering Surveyor @Igor Kieryluk 265 M Sword of Once and Future @Joshua Cairos +266 C Urn of Godfire @Ovidio Cartagena 267 C Bloodfell Caves @Jorge Jacinto 268 C Blossoming Sands @Robin Olausson 269 C Dismal Backwater @Chris Ostrowski @@ -188,11 +297,16 @@ ScryfallCode=MOM 289 L Mountain @Lucas Staniec 290 L Forest @Grady Frederick 291 L Forest @Henry Peters + +[showcase] 292 M Elesh Norn @Kekai Kotaki 293 R Heliod, the Radiant Dawn @Jason A. Engle 294 M Jin-Gitaxias @Dominik Mayer +295 R Rona, Herald of Invasion @Daniel Lieske 296 R Ayara, Widow of the Realm @Josu Hernaiz +297 M Sheoldred @Dominik Mayer 298 R Etali, Primal Conqueror @Yeong-Hao Han +299 M Urabrask @Kekai Kotaki 300 R Polukranos Reborn @Jason A. Engle 301 M Vorinclex @Flavio Girón 302 R Baral and Kari Zev @Magali Villeneuve @@ -213,9 +327,14 @@ ScryfallCode=MOM 317 R Yargle and Multani @Lisa Heidhoff 318 M Zimone and Dina @Anato Finnstark 319 M Zurgo and Ojutai @Adrian Smith + +[borderless] 320 M Archangel Elspeth @Denys Tsiperko 321 M Chandra, Hope's Beacon @Randy Vargas 322 M Wrenn and Realmbreaker @Jehan Choo +339 M Jin-Gitaxias @Julian Kok Joon Wen + +[jumpstart] 323 R Essence of Orthodoxy @Oriana Menendez 324 C Phyrexian Pegasus @Carlos Palma Cruchaga 325 U Seedpod Caretaker @Slawomir Maniak @@ -231,12 +350,14 @@ ScryfallCode=MOM 335 C Fairgrounds Trumpeter @Samuel Perin 336 U Ruins Recluse @Lorenzo Mastroianni 337 R Surrak and Goreclaw @Lucas Graciano -339 M Jin-Gitaxias @Julian Kok Joon Wen + +[extended art] 343 R Boon-Bringer Valkyrie @Heonhwa Choe 344 R Dusk Legion Duelist @Ryan Valle 345 R Guardian of Ghirapur @Cynthia Sheppard 346 R Knight-Errant of Eos @Kevin Sidharta 347 M Monastery Mentor @Brian Valeza +348 R Progenitor Exarch @Marie Magny 349 R Sunfall @Kasia 'Kafis' Zielińska 350 R Chrome Host Seedshark @Donato Giancola 351 R Complete the Circuit @Eelis Kyttanen @@ -250,8 +371,10 @@ ScryfallCode=MOM 359 R Grafted Butcher @Zack Stella 360 R Hoarding Broodlord @Filip Burburan 361 R Pile On @Javier Charro +362 R Bloodfeather Phoenix @Rudy Siswanto 363 R City on Fire @Jake Murray 364 R Into the Fire @Grzegorz Rutkowski +365 R Nahiri's Warcrafting @Zara Alfonso 366 R Rampaging Raptor @Denys Tsiperko 367 R Voldaren Thrillseeker @Viko Menezes 368 R Ancient Imperiosaur @Piotr Foksowicz @@ -267,10 +390,17 @@ ScryfallCode=MOM 378 R Terror of Towashi @Lius Lasahido 379 R Orthion, Hero of Lavabrink @Aaron Miller 380 R Surrak and Goreclaw @Lucas Graciano + +[promo] 381 U Norn's Inquisitor @Denis Zhbankov 382 U Scrappy Bruiser @David Auden Nash 383 U Kami of Whispered Hopes @Filipe Pagliuso 384 U Botanical Brawler @Jesper Ejsing 385 U Halo Forager @Kevin Sidharta 386 R Ghalta and Mavren @Betty Jiang + +[buy a box] 387 R Omnath, Locus of All @Helge C. Balzer + +[tokens] +incubator_c_0_0_a_phyrexian diff --git a/forge-gui/res/editions/Multiverse Legends.txt b/forge-gui/res/editions/Multiverse Legends.txt index 6b455f6ca21..c62f9e1a193 100644 --- a/forge-gui/res/editions/Multiverse Legends.txt +++ b/forge-gui/res/editions/Multiverse Legends.txt @@ -6,28 +6,75 @@ Type=Collector_Edition ScryfallCode=MUL [cards] +1 R Anafenza, Kin-Tree Spirit @Domenico Cava +2 U Daxos, Blessed by the Sun @Jason A. Engle 3 M Elesh Norn, Grand Cenobite @Flavio Girón +4 M Kenrith, the Returned King @Aaron Miller +5 U Kwende, Pride of Femeref +6 R Sram, Senior Edificer @Adam Paquette 7 R Thalia, Guardian of Thraben @Joshua Alvarado +8 R Baral, Chief of Compliance @Yeong-Hao Han 9 R Emry, Lurker of the Loch @Wylie Beckert 10 U Inga Rune-Eyes @rishxxv 11 M Jin-Gitaxias, Core Augur @Kekai Kotaki +12 U Tetsuko Umezawa, Fugitive @Serena Malyon +13 R Ayara, First of Locthwain @Omar Rayyan 14 R Horobi, Death's Wail @Rorubei +15 R Seizan, Perverter of Truth @Maji 16 M Sheoldred, Whispering One @Flavio Girón 17 M Skithiryx, the Blight Dragon @Kekai Kotaki +18 U Tymaret, Chosen from Death @Jason A. Engle 19 U Yargle, Glutton of Urborg @Serena Malyon 20 R Captain Lannery Storm @Jody Clark 21 M Ragavan, Nimble Pilferer @Magali Villeneuve +22 R Squee, the Immortal @Eshpur 23 M Urabrask the Hidden @Flavio Girón +24 U Valduk, Keeper of the Flame @Tyler Crook 25 U Zada, Hedron Grinder @Dominik Mayer +26 U Fynn, the Fangbearer @GodMachine +27 R Goreclaw, Terror of Qal Sisma @Domenico Cava +28 U Renata, Called to the Hunt @Jason A. Engle 29 M Vorinclex, Voice of Hunger @JungShan 30 R Yedora, Grave Gardener @Matthew G. Lewis +31 U Aegar, the Freezing Flame @Richard Luong +32 R Arixmethes, Slumbering Isle @Jason A. Engle 33 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez +34 R Atris, Oracle of Half-Truths @Jason A. Engle +35 M Aurelia, the Warleader @Alex Dos Diaz +36 R Brudiclad, Telchor Engineer @JungShan +37 U Dina, Soul Steeper @Benjamin Ee +38 M Ezuri, Claw of Progress @JungShan +39 R Firesong and Sunspeaker @Daniel Lieske +40 U Firja, Judge of Valor @WolfSkullJack +41 M Grimgrin, Corpse-Born @Cabrol +42 R Gyruda, Doom of Depths @Steve Ellis 43 U Imoti, Celebrant of Bounty @Bastien L. Deharme 44 R Jegantha, the Wellspring @Steve Ellis +45 R Judith, the Scourge Diva @Benjamin Ee +46 U Juri, Master of the Revue @Julie Dillon +47 R Kaheera, the Orphanguard @Denis Medri +48 R Keruga, the Macrosage @Denis Medri 49 M Kroxa, Titan of Death's Hunger @Jason A. Engle +50 R Lathiel, the Bounteous Dawn @Shawn Wood +51 R Lurrus of the Dream-Den @Steve Ellis +52 R Lutri, the Spellchaser @Justine Mara Andersen 53 M Niv-Mizzet Reborn @Illustranesia +54 R Obosh, the Preypiercer @Denis Medri +55 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez +56 U Raff, Weatherlight Stalwart @Nino Vecia +57 U Reyav, Master Smith @Warren Mahy +58 U Rona, Sheoldred's Faithful @Serena Malyon +59 U Shanna, Sisay's Legacy @Rhonda Libbey 60 R Taigam, Ojutai Master @Domenico Cava +61 R Teysa Karlov @Barbara Rosiak +62 R Umori, the Collector @Daniel Warren Johnson +63 M Yarok, the Desecrated +64 R Yorion, Sky Nomad @Justine Mara Andersen +65 R Zirda, the Dawnwaker @Justine Mara Andersen 68 M Elesh Norn, Grand Cenobite @Igor Kieryluk +69 M Kenrith, the Returned King @Kieran Yanner +71 R Sram, Senior Edificer @Chris Rahn +73 R Baral, Chief of Compliance @Wesley Burt 76 M Jin-Gitaxias, Core Augur @Eric Deschamps 81 M Sheoldred, Whispering One @Jana Schirmer & Johannes Voss 82 M Skithiryx, the Blight Dragon @Chippy @@ -35,5 +82,86 @@ ScryfallCode=MUL 88 M Urabrask the Hidden @Brad Rigney 90 U Zada, Hedron Grinder @Chris Rallis 94 M Vorinclex, Voice of Hunger @Karl Kopinski +97 R Arixmethes, Slumbering Isle @Dimitar Marinski +101 R Brudiclad, Telchor Engineer @Daarken +102 U Dina, Soul Steeper @Chris Rahn +105 U Firja, Judge of Valor @Livia Prima +107 R Gyruda, Doom of Depths @Tyler Jacobson +112 R Kaheera, the Orphanguard @Ryan Pancoast +113 R Keruga, the Macrosage @Dan Scott 114 M Kroxa, Titan of Death's Hunger @Vincent Proce +115 R Lathiel, the Bounteous Dawn @Lucas Graciano +116 R Lurrus of the Dream-Den @Slawomir Maniak +117 R Lutri, the Spellchaser @Lie Setiawan 118 M Niv-Mizzet Reborn @Raymond Swanland +119 R Obosh, the Preypiercer @Daarken +121 U Raff, Weatherlight Stalwart @Eelis Kyttanen +127 R Umori, the Collector @Jehan Choo +128 M Yarok, the Desecrated @Daarken +129 R Yorion, Sky Nomad @Steven Belledin +130 R Zirda, the Dawnwaker @Jesper Ejsing +131 R Anafenza, Kin-Tree Spirit @Domenico Cava +132 U Daxos, Blessed by the Sun @Jason A. Engle +133 M Elesh Norn, Grand Cenobite @Flavio Girón +134 M Kenrith, the Returned King @Aaron Miller +135 U Kwende, Pride of Femeref @Jody Clark +136 R Sram, Senior Edificer @Adam Paquette +137 R Thalia, Guardian of Thraben @Joshua Alvarado +138 R Baral, Chief of Compliance @Yeong-Hao Han +139 R Emry, Lurker of the Loch @Wylie Beckert +140 U Inga Rune-Eyes @rishxxv +141 M Jin-Gitaxias, Core Augur @Kekai Kotaki +142 U Tetsuko Umezawa, Fugitive @Serena Malyon +143 R Ayara, First of Locthwain @Omar Rayyan +144 R Horobi, Death's Wail @Rorubei +145 R Seizan, Perverter of Truth @Maji +146 M Sheoldred, Whispering One @Flavio Girón +147 M Skithiryx, the Blight Dragon @Kekai Kotaki +148 U Tymaret, Chosen from Death @Jason A. Engle +149 U Yargle, Glutton of Urborg @Serena Malyon +150 R Captain Lannery Storm @Jody Clark +151 M Ragavan, Nimble Pilferer @Magali Villeneuve +152 R Squee, the Immortal @Eshpur +153 M Urabrask the Hidden @Flavio Girón +154 U Valduk, Keeper of the Flame @Tyler Crook +155 U Zada, Hedron Grinder @Dominik Mayer +156 U Fynn, the Fangbearer @GodMachine +157 R Goreclaw, Terror of Qal Sisma @Domenico Cava +158 U Renata, Called to the Hunt @Jason A. Engle +159 M Vorinclex, Voice of Hunger @JungShan +160 R Yedora, Grave Gardener @Matthew G. Lewis +161 U Aegar, the Freezing Flame @Richard Luong +162 R Arixmethes, Slumbering Isle @Jason A. Engle +163 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez +164 R Atris, Oracle of Half-Truths @Jason A. Engle +165 M Aurelia, the Warleader @Alex Dos Diaz +166 R Brudiclad, Telchor Engineer @JungShan +167 U Dina, Soul Steeper @Benjamin Ee +168 M Ezuri, Claw of Progress @JungShan +169 R Firesong and Sunspeaker @Daniel Lieske +170 U Firja, Judge of Valor @WolfSkullJack +171 M Grimgrin, Corpse-Born @Cabrol +172 R Gyruda, Doom of Depths @Steve Ellis +173 U Imoti, Celebrant of Bounty @Bastien L. Deharme +174 R Jegantha, the Wellspring @Steve Ellis +175 R Judith, the Scourge Diva @Benjamin Ee +176 U Juri, Master of the Revue @Julie Dillon +177 R Kaheera, the Orphanguard @Denis Medri +178 R Keruga, the Macrosage @Denis Medri +179 M Kroxa, Titan of Death's Hunger @Jason A. Engle +180 R Lathiel, the Bounteous Dawn @Shawn Wood +181 R Lurrus of the Dream-Den @Steve Ellis +182 R Lutri, the Spellchaser @Justine Mara Andersen +183 M Niv-Mizzet Reborn @Illustranesia +184 R Obosh, the Preypiercer @Denis Medri +185 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez +186 U Raff, Weatherlight Stalwart @Nino Vecia +187 U Reyav, Master Smith @Warren Mahy +188 U Rona, Sheoldred's Faithful @Serena Malyon +189 U Shanna, Sisay's Legacy @Rhonda Libbey +190 R Taigam, Ojutai Master @Domenico Cava +191 R Teysa Karlov @Barbara Rosiak +192 R Umori, the Collector @Daniel Warren Johnson +193 M Yarok, the Desecrated +194 R Yorion, Sky Nomad @Justine Mara Andersen +195 R Zirda, the Dawnwaker @Justine Mara Andersen diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 8f3a7a2df9d..9daf0b5947a 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -684,6 +684,7 @@ ScryfallCode=SLD 724 R Lightning Strike @Frank Frazetta 726 R Zur the Enchanter @Chase Stone 727 R Fabled Passage @Warren Mahy +278 R Themberchaud @Yang Luo 900 R The Scarab God @Barely Human 1001 M Elspeth, Knight-Errant @Volkan Baǵa 1002 R Patron Wizard @Volkan Baǵa diff --git a/forge-gui/res/editions/The List.txt b/forge-gui/res/editions/The List.txt index 95f72f94310..0d024109fb8 100644 --- a/forge-gui/res/editions/The List.txt +++ b/forge-gui/res/editions/The List.txt @@ -182,7 +182,7 @@ ScryfallCode=PLIST 174 R Harmonize @Vance Kovacs 175 R Helix Pinnacle @Dan Scott 176 R Hua Tuo, Honored Physician @Gao Jianzhang -177 R Imperious Perfect @Scott M. Fischer +177 U Imperious Perfect @Scott M. Fischer 178 M Ishkanah, Grafwidow @Christine Choi 179 R Jadelight Ranger @Jason Rainville 180 M Kalonian Hydra @Chris Rahn @@ -1020,3 +1020,78 @@ F567 R Puresteel Angel @Lukas Litzsinger 1012 M Sword of War and Peace @Chris Rahn 1013 C Great Furnace @Rob Alexander 1014 U Interplanar Beacon @Adam Paquette +1015 R Austere Command @Wayne England +1016 C Brago's Representative @Anthony Palumbo +1017 M Heliod, God of the Sun @Jaime Jones +1018 U Ixalan's Binding @Chase Stone +1019 R Linden, the Steadfast Queen @Ryan Pancoast +1020 R Ravnica at War @Adam Paquette +1021 C Segovian Angel @Simon Dominic +1022 U Vryn Wingmare @Seb McKinnon +1023 R Archmage Emeritus @Caio Monteiro +1024 R Balance of Power @Adam Rex +1025 U Invasive Surgery @Steven Belledin +1026 R Laboratory Maniac @Jason Felix +1027 R Mass Polymorph @Christopher Moeller +1028 R Pulse of the Grid @Wayne England +1029 R Reshape @Jon Foster +1030 R Rite of Replication @Matt Cavotta +1031 R Rooftop Storm @John Stanko +1032 R Shared Fate @Matt Cavotta +1033 U Stormscape Battlemage @Christopher Moeller +1034 R Time Stretch @Paolo Parente +1035 R True-Name Nemesis @Zack Stella +1036 R Aether Snap @Kev Walker +1037 R Drinker of Sorrow @Carl Critchlow +1038 U Endless Obedience @Karl Kopinski +1039 U Ihsan's Shade @Daarken +1040 M Nashi, Moon Sage's Scion @Valera Lutfullina +1041 R Needle Specter @Christopher Moeller +1042 R Phyrexian Crusader @Eric Deschamps +1043 R Phyrexian Delver @Igor Kieryluk +1044 R Phyrexian Etchings @Ron Spears +1045 R Phyrexian Infiltrator @Darrell Riche +1046 R Phyrexian Vatmother @Stephan Martiniere +1047 R Rain of Daggers @Melissa A. Benson +1048 C Siege Zombie @Johann Bodin +1049 R Unmask @rk post +1050 R Eidolon of the Great Revel @Cyril Van Der Haegen +1051 R Etali, Primal Storm @Raymond Swanland +1052 R Five-Alarm Fire @Karl Kopinski +1053 U Mercadia's Downfall @Pete Venters +1054 R Pia and Kiran Nalaar @Eric Deschamps +1055 R Planeswalker's Fury @Christopher Moeller +1056 C Regathan Firecat @Eric Velhagen +1057 C Ruthless Invasion @Svetlin Velinov +1058 R Scorched Earth @Nicola Leonard +1059 R Siege of Towers @Anthony S. Waters +1060 R Slag Fiend @Mike Bierek +1061 M Soul of Shandalar @Raymond Swanland +1062 M Avenger of Zendikar @Zoltan Boros +1063 C Capenna Express @Viko Menezes +1064 R Dig Up @Slawomir Maniak +1065 R Ghalta, Primal Hunger @Chase Stone +1066 M The Great Aurora @Sam Burley +1067 R Muraganda Petroglyphs @Scott Altmann +1068 U Path to the World Tree @Daniel Ljunggren +1069 M Polukranos, World Eater @Johann Bodin +1070 C Primal Cocoon @Daniel Ljunggren +1071 C Sprout Swarm @Chippy +1072 R Anax and Cymede @Willian Murai +1073 M Borborygmos Enraged @Aleksi Briclot +1074 M Dragonlord Ojutai @Chase Stone +1075 M Gisa and Geralf @Karla Ortiz +1076 U Incubation // Incongruity @Mike Bierek +1077 M Kalamax, the Stormsire @Nicholas Gregory +1078 R Mina and Denn, Wildborn @Izzy +1079 U Reduce // Rubble @Eric Deschamps +1080 R Sarulf, Realm Eater @Chris Rahn +1081 R Dragon Throne of Tarkir @Daarken +1082 R Hope of Ghirapur @Lius Lasahido +1083 R Planar Portal @Mark Tedin +1084 R High Market @Carl Critchlow +1085 R Ketria Triome @Sam Burley +1086 R Okina, Temple to the Grandfathers @Keith Garletts +1087 R Sea of Clouds @Florian de Gesincourt +1088 R The World Tree @Anastasia Ovchinnikova +1089 U Zhalfirin Void @Chase Stone diff --git a/forge-gui/res/lists/planes-images.txt b/forge-gui/res/lists/planes-images.txt index 2c96cfb0e68..c5cb7ac15ae 100644 --- a/forge-gui/res/lists/planes-images.txt +++ b/forge-gui/res/lists/planes-images.txt @@ -10,10 +10,13 @@ https://downloads.cardforge.org/images/planes/Chaotic_Aether.jpg https://downloads.cardforge.org/images/planes/Cliffside_Market.jpg https://downloads.cardforge.org/images/planes/Edge_of_Malacol.jpg https://downloads.cardforge.org/images/planes/Eloren_Wilds.jpg +https://downloads.cardforge.org/images/planes/Enigma_Ridges.jpg +https://downloads.cardforge.org/images/planes/Esper.jpg https://downloads.cardforge.org/images/planes/Feeding_Grounds.jpg https://downloads.cardforge.org/images/planes/Fields_of_Summer.jpg https://downloads.cardforge.org/images/planes/Furnace_Layer.jpg https://downloads.cardforge.org/images/planes/Gavony.jpg +https://downloads.cardforge.org/images/planes/Ghirapur.jpg https://downloads.cardforge.org/images/planes/Glen_Elendra.jpg https://downloads.cardforge.org/images/planes/Glimmervoid_Basin.jpg https://downloads.cardforge.org/images/planes/Goldmeadow.jpg @@ -24,16 +27,20 @@ https://downloads.cardforge.org/images/planes/Hedron_Fields_of_Agadeem.jpg https://downloads.cardforge.org/images/planes/Horizon_Boughs.jpg https://downloads.cardforge.org/images/planes/Immersturm.jpg https://downloads.cardforge.org/images/planes/Interplanar_Tunnel.jpg +https://downloads.cardforge.org/images/planes/Inys_Haen.jpg https://downloads.cardforge.org/images/planes/Isle_of_Vesuva.jpg https://downloads.cardforge.org/images/planes/Izzet_Steam_Maze.jpg https://downloads.cardforge.org/images/planes/Jund.jpg https://downloads.cardforge.org/images/planes/Kessig.jpg +https://downloads.cardforge.org/images/planes/Ketria.jpg https://downloads.cardforge.org/images/planes/Kharasha_Foothills.jpg https://downloads.cardforge.org/images/planes/Kilnspire_District.jpg https://downloads.cardforge.org/images/planes/Krosa.jpg https://downloads.cardforge.org/images/planes/Lair_of_the_Ashen_Idol.jpg https://downloads.cardforge.org/images/planes/Lethe_Lake.jpg +https://downloads.cardforge.org/images/planes/Littiara.jpg https://downloads.cardforge.org/images/planes/Llanowar.jpg +https://downloads.cardforge.org/images/planes/Megaflora_Jungle.jpg https://downloads.cardforge.org/images/planes/Minamo.jpg https://downloads.cardforge.org/images/planes/Mirrored_Depths.jpg https://downloads.cardforge.org/images/planes/Morphic_Tide.jpg @@ -41,13 +48,18 @@ https://downloads.cardforge.org/images/planes/Mount_Keralia.jpg https://downloads.cardforge.org/images/planes/Murasa.jpg https://downloads.cardforge.org/images/planes/Mutual_Epiphany.jpg https://downloads.cardforge.org/images/planes/Naar_Isle.jpg +https://downloads.cardforge.org/images/planes/Naktamun.jpg https://downloads.cardforge.org/images/planes/Naya.jpg https://downloads.cardforge.org/images/planes/Nephalia.jpg +https://downloads.cardforge.org/images/planes/New_Argive.jpg https://downloads.cardforge.org/images/planes/Norn's_Dominion.jpg +https://downloads.cardforge.org/images/planes/Norn's_Seedcore.jpg +https://downloads.cardforge.org/images/planes/Nyx.jpg https://downloads.cardforge.org/images/planes/Onakke_Catacomb.jpg https://downloads.cardforge.org/images/planes/Orochi_Colony.jpg https://downloads.cardforge.org/images/planes/Orzhova.jpg https://downloads.cardforge.org/images/planes/Otaria.jpg +https://downloads.cardforge.org/images/planes/Paliano.jpg https://downloads.cardforge.org/images/planes/Panopticon.jpg https://downloads.cardforge.org/images/planes/Planewide_Disaster.jpg https://downloads.cardforge.org/images/planes/Pools_of_Becoming.jpg @@ -55,6 +67,7 @@ https://downloads.cardforge.org/images/planes/Prahv.jpg https://downloads.cardforge.org/images/planes/Quicksilver_Sea.jpg https://downloads.cardforge.org/images/planes/Raven's_Run.jpg https://downloads.cardforge.org/images/planes/Reality_Shaping.jpg +https://downloads.cardforge.org/images/planes/Riptide_Island.jpg https://downloads.cardforge.org/images/planes/Sanctum_of_Serra.jpg https://downloads.cardforge.org/images/planes/Sea_of_Sand.jpg https://downloads.cardforge.org/images/planes/Selesnya_Loft_Gardens.jpg @@ -64,23 +77,35 @@ https://downloads.cardforge.org/images/planes/Sokenzan.jpg https://downloads.cardforge.org/images/planes/Spatial_Merging.jpg https://downloads.cardforge.org/images/planes/Stairs_to_Infinity.jpg https://downloads.cardforge.org/images/planes/Stensia.jpg +https://downloads.cardforge.org/images/planes/Strixhaven.jpg https://downloads.cardforge.org/images/planes/Stronghold_Furnace.jpg https://downloads.cardforge.org/images/planes/Takenuma.jpg https://downloads.cardforge.org/images/planes/Talon_Gates.jpg https://downloads.cardforge.org/images/planes/Tazeem.jpg https://downloads.cardforge.org/images/planes/Tember_City.jpg +https://downloads.cardforge.org/images/planes/Ten_Wizards_Mountain.jpg https://downloads.cardforge.org/images/planes/The_Aether_Flues.jpg +https://downloads.cardforge.org/images/planes/The_Caldaia.jpg https://downloads.cardforge.org/images/planes/The_Dark_Barony.jpg https://downloads.cardforge.org/images/planes/The_Eon_Fog.jpg +https://downloads.cardforge.org/images/planes/The_Fertile_Lands_of_Saulvinia.jpg https://downloads.cardforge.org/images/planes/The_Fourth_Sphere.jpg +https://downloads.cardforge.org/images/planes/The_Golden_City_of_Orazca.jpg +https://downloads.cardforge.org/images/planes/The_Great_Aerie.jpg https://downloads.cardforge.org/images/planes/The_Great_Forest.jpg https://downloads.cardforge.org/images/planes/The_Hippodrome.jpg https://downloads.cardforge.org/images/planes/The_Maelstrom.jpg +https://downloads.cardforge.org/images/planes/The_Pit.jpg +https://downloads.cardforge.org/images/planes/The_Western_Cloud.jpg +https://downloads.cardforge.org/images/planes/The_Wilds.jpg https://downloads.cardforge.org/images/planes/The_Zephyr_Maze.jpg https://downloads.cardforge.org/images/planes/Time_Distortion.jpg +https://downloads.cardforge.org/images/planes/Towashi.jpg https://downloads.cardforge.org/images/planes/Trail_of_the_Mage-Rings.jpg https://downloads.cardforge.org/images/planes/Truga_Jungle.jpg https://downloads.cardforge.org/images/planes/Turri_Island.jpg https://downloads.cardforge.org/images/planes/Undercity_Reaches.jpg +https://downloads.cardforge.org/images/planes/Unyaro.jpg +https://downloads.cardforge.org/images/planes/Valor's_Reach.jpg https://downloads.cardforge.org/images/planes/Velis_Vel.jpg https://downloads.cardforge.org/images/planes/Windriddle_Palaces.jpg \ No newline at end of file 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 d2224eec428..faa4cc7e27d 100644 --- a/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java +++ b/forge-gui/src/main/java/forge/localinstance/properties/ForgeConstants.java @@ -245,6 +245,31 @@ public final class ForgeConstants { public static final String BG_84 = "Morphic_Tide.jpg"; public static final String BG_85 = "Mutual_Epiphany.jpg"; public static final String BG_86 = "Time_Distortion.jpg"; + public static final String BG_87 = "Enigma_Ridges.jpg"; + public static final String BG_88 = "Esper.jpg"; + public static final String BG_89 = "Ghirapur.jpg"; + public static final String BG_90 = "Inys_Haen.jpg"; + public static final String BG_91 = "Ketria.jpg"; + public static final String BG_92 = "Littiara.jpg"; + public static final String BG_93 = "Megaflora_Jungle.jpg"; + public static final String BG_94 = "Naktamun.jpg"; + public static final String BG_95 = "New_Argive.jpg"; + public static final String BG_96 = "Norn's_Seedcore.jpg"; + public static final String BG_97 = "Nyx.jpg"; + public static final String BG_98 = "Paliano.jpg"; + public static final String BG_99 = "Riptide_Island.jpg"; + public static final String BG_100 = "Strixhaven.jpg"; + public static final String BG_101 = "Ten_Wizards_Mountain.jpg"; + public static final String BG_102 = "The_Caldaia.jpg"; + public static final String BG_103 = "The_Fertile_Lands_of_Saulvinia.jpg"; + public static final String BG_104 = "The_Golden_City_of_Orazca.jpg"; + public static final String BG_105 = "The_Great_Aerie.jpg"; + public static final String BG_106 = "The_Pit.jpg"; + public static final String BG_107 = "The_Western_Cloud.jpg"; + public static final String BG_108 = "The_Wilds.jpg"; + public static final String BG_109 = "Towashi.jpg"; + public static final String BG_110 = "Unyaro.jpg"; + public static final String BG_111 = "Valor's_Reach.jpg"; //CARD BG public static final String IMG_CARDBG_A = "IMG_CARDBG_A.png"; public static final String IMG_CARDBG_B = "IMG_CARDBG_B.png";