diff --git a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java index 71fd9251221..b8527341a1a 100644 --- a/forge-ai/src/main/java/forge/ai/SpellApiToAi.java +++ b/forge-ai/src/main/java/forge/ai/SpellApiToAi.java @@ -107,6 +107,7 @@ public enum SpellApiToAi { .put(ApiType.Investigate, InvestigateAi.class) .put(ApiType.Learn, LearnAi.class) .put(ApiType.LoseLife, LifeLoseAi.class) + .put(ApiType.LosePerpetual, AlwaysPlayAi.class) .put(ApiType.LosesGame, GameLossAi.class) .put(ApiType.MakeCard, AlwaysPlayAi.class) .put(ApiType.Mana, ManaEffectAi.class) diff --git a/forge-core/src/main/java/forge/card/CardType.java b/forge-core/src/main/java/forge/card/CardType.java index 4df15d6bb54..0cb5edbbb58 100644 --- a/forge-core/src/main/java/forge/card/CardType.java +++ b/forge-core/src/main/java/forge/card/CardType.java @@ -250,7 +250,7 @@ public final class CardType implements Comparable, CardTypeView { @Override public boolean isEmpty() { - return coreTypes.isEmpty() && supertypes.isEmpty() && subtypes.isEmpty() && !excludedCreatureSubtypes.isEmpty(); + return coreTypes.isEmpty() && supertypes.isEmpty() && subtypes.isEmpty() && excludedCreatureSubtypes.isEmpty(); } @Override diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 026b8bfe3f2..2318ee5b2a7 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -315,6 +315,16 @@ public class GameAction { } } + // perpetual stuff + if (c.hasIntensity()) { + copied.setIntensity(c.getIntensity(false)); + } + if (c.isSpecialized()) { + copied.setState(c.getCurrentStateName(), false); + } + if (c.hasPerpetual()) { + copied.setPerpetual(c); + } // ensure that any leftover keyword/type changes are cleared in the state view copied.updateStateForView(); @@ -577,15 +587,6 @@ public class GameAction { copied.clearEtbCounters(); } - // intensity is perpetual - if (c.hasIntensity()) { - copied.setIntensity(c.getIntensity(false)); - } - // specialize is perpetual - if (c.isSpecialized()) { - copied.setState(c.getCurrentStateName(), false); - } - // update state for view copied.updateStateForView(); 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 1083435c750..56171d63d64 100644 --- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java +++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java @@ -2154,6 +2154,10 @@ public class AbilityUtils { return doXMath(c.getRememberedCount(), expr, c, ctb); } + if (sq[0].startsWith("ChosenSize")) { + return doXMath(c.getChosenCards().size(), expr, c, ctb); + } + if (sq[0].startsWith("ImprintedSize")) { return doXMath(c.getImprintedCards().size(), expr, c, ctb); } diff --git a/forge-game/src/main/java/forge/game/ability/ApiType.java b/forge-game/src/main/java/forge/game/ability/ApiType.java index c9e27e6116a..8ccf0bfbbf1 100644 --- a/forge-game/src/main/java/forge/game/ability/ApiType.java +++ b/forge-game/src/main/java/forge/game/ability/ApiType.java @@ -107,6 +107,7 @@ public enum ApiType { Learn (LearnEffect.class), LookAt (LookAtEffect.class), LoseLife (LifeLoseEffect.class), + LosePerpetual (LosePerpetualEffect.class), LosesGame (GameLossEffect.class), MakeCard (MakeCardEffect.class), Mana (ManaEffect.class), diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java index c5be1bf341c..2b4e74ea629 100644 --- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java @@ -170,7 +170,8 @@ public abstract class SpellAbilityEffect { if ("}".equals(t)) { isPlainText = true; continue; } if (!isPlainText) { - if (t.startsWith("n:")) { // {n: } + if (t.length() <= 2) sb.append("{").append(t).append("}"); // string includes mana cost (e.g. {2}{R}) + else if (t.startsWith("n:")) { // {n: } String parts[] = t.substring(2).split(" ", 2); int n = AbilityUtils.calculateAmount(sa.getHostCard(), parts[0], sa); sb.append(parts.length == 1 ? Lang.getNumeral(n) : Lang.nounWithNumeral(n, parts[1])); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java index b6903ecb81e..7e16a5812a2 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateAllEffect.java @@ -22,7 +22,7 @@ public class AnimateAllEffect extends AnimateEffectBase { @Override protected String getStackDescription(SpellAbility sa) { - return "Animate all valid cards."; + return sa.getParamOrDefault("SpellDescription", "Animate all valid cards."); } @Override @@ -133,10 +133,12 @@ public class AnimateAllEffect extends AnimateEffectBase { CardCollectionView list; + ZoneType z = sa.hasParam("Zone") ? ZoneType.smartValueOf(sa.getParam("Zone")) : ZoneType.Battlefield; + if (sa.usesTargeting() || sa.hasParam("Defined")) { - list = getTargetPlayers(sa).getCardsIn(ZoneType.Battlefield); + list = getTargetPlayers(sa).getCardsIn(z); } else { - list = game.getCardsIn(ZoneType.Battlefield); + list = game.getCardsIn(z); } list = CardLists.getValidCards(list, valid, sa.getActivatingPlayer(), host, sa); diff --git a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java index d254d511975..4a365929222 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java +++ b/forge-game/src/main/java/forge/game/ability/effects/AnimateEffectBase.java @@ -18,7 +18,9 @@ package forge.game.ability.effects; import java.util.EnumSet; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Set; import com.google.common.collect.Lists; @@ -52,6 +54,7 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { final long timestamp, final String duration) { final Card source = sa.getHostCard(); final Game game = source.getGame(); + final boolean perpetual = "Perpetual".equals(duration); boolean addAllCreatureTypes = sa.hasParam("AddAllCreatureTypes"); @@ -79,15 +82,40 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { } if (!addType.isEmpty() || !removeType.isEmpty() || addAllCreatureTypes || !remove.isEmpty()) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("AddTypes", addType); + params.put("RemoveTypes", removeType); + params.put("RemoveXTypes", remove); + params.put("Timestamp", timestamp); + params.put("Category", "Types"); + c.addPerpetual(params); + } c.addChangedCardTypes(addType, removeType, addAllCreatureTypes, remove, timestamp, 0, true, false); } if (!keywords.isEmpty() || !removeKeywords.isEmpty() || removeAll) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("AddKeywords", keywords); + params.put("RemoveAll", removeAll); + params.put("Timestamp", timestamp); + params.put("Category", "Keywords"); + c.addPerpetual(params); + } c.addChangedCardKeywords(keywords, removeKeywords, removeAll, timestamp, 0); } // do this after changing types in case it wasn't a creature before if (power != null || toughness != null) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("Power", power); + params.put("Toughness", toughness); + params.put("Timestamp", timestamp); + params.put("Category", "NewPT"); + c.addPerpetual(params); + } c.addNewPT(power, toughness, timestamp, 0); } @@ -184,10 +212,16 @@ public abstract class AnimateEffectBase extends SpellAbilityEffect { || !addedAbilities.isEmpty() || !removedAbilities.isEmpty() || !addedTriggers.isEmpty() || !addedReplacements.isEmpty() || !addedStaticAbilities.isEmpty()) { c.addChangedCardTraits(addedAbilities, removedAbilities, addedTriggers, addedReplacements, - addedStaticAbilities, removeAll, removeNonManaAbilities, timestamp, 0); + addedStaticAbilities, removeAll, removeNonManaAbilities, timestamp, 0); + if (perpetual) { + Map params = new HashMap<>(); + params.put("Timestamp", timestamp); + params.put("Category", "Abilities"); + c.addPerpetual(params); + } } - if (!"Permanent".equals(duration)) { + if (!"Permanent".equals(duration) && !perpetual) { if ("UntilControllerNextUntap".equals(duration)) { game.getUntap().addUntil(c.getController(), unanimate); } else { diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index 9100282f812..688e7741340 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -45,7 +45,9 @@ public class ChooseCardEffect extends SpellAbilityEffect { } sb.append(Lang.nounWithNumeralExceptOne(numCards, desc)); if (sa.hasParam("FromDesc")) { - sb.append(" ").append(sa.getParam("FromDesc")); + sb.append(" from ").append(sa.getParam("FromDesc")); + } else if (sa.hasParam("ChoiceZone") && sa.getParam("ChoiceZone").equals("Hand")) { + sb.append(" in their hand"); } sb.append("."); diff --git a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java index 32b5c01718c..2f7978ae969 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DestroyEffect.java @@ -24,6 +24,8 @@ public class DestroyEffect extends SpellAbilityEffect { final StringBuilder sb = new StringBuilder(); final List tgtCards = getTargetCards(sa); + // up to X targets and chose 0 or similar situations + if (tgtCards.isEmpty()) return sa.getParamOrDefault("SpellDescription", ""); final boolean justOne = tgtCards.size() == 1; sb.append(sa.hasParam("Sacrifice") ? "Sacrifice " : "Destroy ").append(Lang.joinHomogenous(tgtCards)); diff --git a/forge-game/src/main/java/forge/game/ability/effects/LosePerpetualEffect.java b/forge-game/src/main/java/forge/game/ability/effects/LosePerpetualEffect.java new file mode 100644 index 00000000000..6f2ee113ecb --- /dev/null +++ b/forge-game/src/main/java/forge/game/ability/effects/LosePerpetualEffect.java @@ -0,0 +1,32 @@ +package forge.game.ability.effects; + +import com.google.common.collect.Table.Cell; + +import forge.game.ability.SpellAbilityEffect; +import forge.game.card.Card; +import forge.game.card.CardTraitChanges; +import forge.game.spellability.SpellAbility; +import forge.game.trigger.Trigger; + +public class LosePerpetualEffect extends SpellAbilityEffect { + + @Override + public void resolve(SpellAbility sa) { + final Card host = sa.getHostCard(); + long toRemove = (long) 0; + // currently only part of perpetual triggers... expand in future as needed + if (sa.getTrigger() != null) { + Trigger trig = sa.getTrigger(); + for (Cell cell : host.getChangedCardTraits().cellSet()) { + if (cell.getValue().getTriggers().contains(trig)) { + toRemove = cell.getRowKey(); + break; + } + } + if (toRemove != (long) 0) { + host.getChangedCardTraits().remove(toRemove, (long) 0); + host.removePerpetual(toRemove); + } + } + } +} diff --git a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java index 574f846f145..40b7c46be0e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PowerExchangeEffect.java @@ -1,6 +1,8 @@ package forge.game.ability.effects; +import java.util.HashMap; import java.util.List; +import java.util.Map; import forge.GameCommand; import forge.game.Game; @@ -34,6 +36,7 @@ public class PowerExchangeEffect extends SpellAbilityEffect { */ @Override public void resolve(SpellAbility sa) { + final boolean perpetual = "Perpetual".equals(sa.getParam("Duration")); final Card source = sa.getHostCard(); final Game game = source.getGame(); final Card c1; @@ -51,18 +54,28 @@ public class PowerExchangeEffect extends SpellAbilityEffect { if (!c1.isInPlay() || !c2.isInPlay()) { return; } - final int power1 = c1.getNetPower(); - final int power2 = c2.getNetPower(); + final boolean basePower = sa.hasParam("BasePower"); + final int power1 = basePower ? c1.getCurrentPower() : c1.getNetPower(); + final int power2 = basePower ? c2.getCurrentPower() : c2.getNetPower(); final long timestamp = game.getNextTimestamp(); + if (perpetual) { + Map params = new HashMap<>(); + params.put("Power", power2); + params.put("Timestamp", timestamp); + params.put("Category", "NewPT"); + c1.addPerpetual(params); + params.put("Power", power1); + c2.addPerpetual(params); + } c1.addNewPT(power2, null, timestamp, 0); c2.addNewPT(power1, null, timestamp, 0); game.fireEvent(new GameEventCardStatsChanged(c1)); game.fireEvent(new GameEventCardStatsChanged(c2)); - if (!"Permanent".equals(sa.getParam("Duration"))) { + if (!"Permanent".equals(sa.getParam("Duration")) && !perpetual) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java index 79132dd1c50..081450c75e3 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpAllEffect.java @@ -1,7 +1,9 @@ package forge.game.ability.effects; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import com.google.common.collect.Iterables; import com.google.common.collect.Lists; @@ -27,6 +29,7 @@ public class PumpAllEffect extends SpellAbilityEffect { final long timestamp = game.getNextTimestamp(); final List kws = Lists.newArrayList(); final List hiddenkws = Lists.newArrayList(); + final boolean perpetual = ("Perpetual").equals(sa.getParam("Duration")); for (String kw : keywords) { if (kw.startsWith("HIDDEN")) { @@ -38,25 +41,33 @@ public class PumpAllEffect extends SpellAbilityEffect { for (final Card tgtC : list) { // only pump things in the affected zones. - boolean found = false; - for (final ZoneType z : affectedZones) { - if (tgtC.isInZone(z)) { - found = true; - break; - } - } - if (!found) { + if (!tgtC.isInZones(affectedZones)) { continue; } boolean redrawPT = false; if (a != 0 || d != 0) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("Power", a); + params.put("Toughness", d); + params.put("Timestamp", timestamp); + params.put("Category", "PTBoost"); + tgtC.addPerpetual(params); + } tgtC.addPTBoost(a, d, timestamp, 0); redrawPT = true; } if (!kws.isEmpty()) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("AddKeywords", kws); + params.put("Timestamp", timestamp); + params.put("Category", "Keywords"); + tgtC.addPerpetual(params); + } tgtC.addChangedCardKeywords(kws, null, false, timestamp, 0); } if (redrawPT) { @@ -71,7 +82,7 @@ public class PumpAllEffect extends SpellAbilityEffect { sa.getHostCard().addRemembered(tgtC); } - if (!"Permanent".equals(sa.getParam("Duration"))) { + if (!"Permanent".equals(sa.getParam("Duration")) && !perpetual) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = 5415795460189457660L; diff --git a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java index c40f2295d6a..eac0bd64f28 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/PumpEffect.java @@ -1,7 +1,9 @@ package forge.game.ability.effects; import java.util.Arrays; +import java.util.HashMap; import java.util.List; +import java.util.Map; import org.apache.commons.lang3.StringUtils; @@ -40,6 +42,7 @@ public class PumpEffect extends SpellAbilityEffect { final Card host = sa.getHostCard(); final Game game = host.getGame(); final String duration = sa.getParam("Duration"); + final boolean perpetual = ("Perpetual").equals(duration); //if host is not on the battlefield don't apply // Suspend should does Affect the Stack @@ -70,12 +73,28 @@ public class PumpEffect extends SpellAbilityEffect { } if (a != 0 || d != 0) { + if (perpetual) { + Map params = new HashMap<>(); + params.put("Power", a); + params.put("Toughness", d); + params.put("Timestamp", timestamp); + params.put("Category", "PTBoost"); + gameCard.addPerpetual(params); + } gameCard.addPTBoost(a, d, timestamp, 0); redrawPT = true; } if (!kws.isEmpty()) { - gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, timestamp, 0); + if (perpetual) { + Map params = new HashMap<>(); + params.put("AddKeywords", kws); + params.put("Timestamp", timestamp); + params.put("Category", "Keywords"); + gameCard.addPerpetual(params); + } + gameCard.addChangedCardKeywords(kws, Lists.newArrayList(), false, timestamp, 0); + } if (!hiddenKws.isEmpty()) { gameCard.addHiddenExtrinsicKeywords(timestamp, 0, hiddenKws); @@ -96,7 +115,7 @@ public class PumpEffect extends SpellAbilityEffect { addLeaveBattlefieldReplacement(gameCard, sa, sa.getParam("LeaveBattlefield")); } - if (!"Permanent".equals(duration)) { + if (!"Permanent".equals(duration) && !perpetual) { // If not Permanent, remove Pumped at EOT final GameCommand untilEOT = new GameCommand() { private static final long serialVersionUID = -42244224L; @@ -434,8 +453,8 @@ public class PumpEffect extends SpellAbilityEffect { host.removeImprintedCards(AbilityUtils.getDefinedCards(host, sa.getParam("ForgetImprinted"), sa)); } - final ZoneType pumpZone = sa.hasParam("PumpZone") ? ZoneType.smartValueOf(sa.getParam("PumpZone")) - : ZoneType.Battlefield; + List pumpZones = sa.hasParam("PumpZone") ? ZoneType.listValueOf(sa.getParam("PumpZone")) + : ZoneType.listValueOf("Battlefield"); for (Card tgtC : tgtCards) { // CR 702.26e @@ -443,8 +462,8 @@ public class PumpEffect extends SpellAbilityEffect { continue; } - // only pump things in PumpZone - if (!tgtC.isInZone(pumpZone)) { + // only pump things in PumpZones + if (!tgtC.isInZones(pumpZones)) { continue; } @@ -488,7 +507,7 @@ public class PumpEffect extends SpellAbilityEffect { for (final Card tgtC : untargetedCards) { // only pump things in PumpZone - if (!tgtC.isInZone(pumpZone)) { + if (!tgtC.isInZones(pumpZones)) { continue; } 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 e6253473efd..11d508fd08d 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2175,8 +2175,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { final String[] upkeepCostParams = keyword.split(":"); sbLong.append(upkeepCostParams.length > 2 ? "— " + upkeepCostParams[2] : ManaCostParser.parse(upkeepCostParams[1])); sbLong.append("\r\n"); - } else if (keyword.startsWith("Alternative Cost")) { - sbLong.append("Has alternative cost."); } else if (keyword.startsWith("AlternateAdditionalCost")) { final String[] costs = keyword.split(":", 2)[1].split(":"); sbLong.append("As an additional cost to cast this spell, "); @@ -2386,7 +2384,8 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.startsWith("Encore") || keyword.startsWith("Mutate") || keyword.startsWith("Dungeon") || keyword.startsWith("Class") || keyword.startsWith("Blitz") || keyword.startsWith("Specialize") || keyword.equals("Ravenous") - || keyword.equals("For Mirrodin") || keyword.startsWith("Craft")) { + || keyword.equals("For Mirrodin") || keyword.startsWith("Craft") + || keyword.startsWith("Alternative Cost")) { // keyword parsing takes care of adding a proper description } else if (keyword.startsWith("Read ahead")) { sb.append(Localizer.getInstance().getMessage("lblReadAhead")).append(" (").append(Localizer.getInstance().getMessage("lblReadAheadDesc")); @@ -4393,6 +4392,59 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return intensity > 0; } + private List> perpetual = new ArrayList<>(); + public final boolean hasPerpetual() { + return !perpetual.isEmpty(); + } + public final List> getPerpetual() { + return perpetual; + } + + public final void addPerpetual(Map p) { + perpetual.add(p); + } + + public final void executePerpetual(Map p) { + final String category = (String) p.get("Category"); + if (category.equals("NewPT")) { + addNewPT((Integer) p.get("Power"), (Integer) p.get("Toughness"), (long) + p.get("Timestamp"), (long) 0); + } else if (category.equals("PTBoost")) { + addPTBoost((Integer) p.get("Power"), (Integer) p.get("Toughness"), (long) + p.get("Timestamp"), (long) 0); + } else if (category.equals("Keywords")) { + addChangedCardKeywords((List) p.get("AddKeywords"), Lists.newArrayList(), + (boolean) p.get("RemoveAll"), (long) p.get("Timestamp"), (long) 0); + } else if (category.equals("Types")) { + addChangedCardTypes((CardType) p.get("AddTypes"), (CardType) p.get("RemoveTypes"), + false, (Set) p.get("RemoveXTypes"), + (long) p.get("Timestamp"), (long) 0, true, false); + } + } + + public final void removePerpetual(final long timestamp) { + Map toRemove = Maps.newHashMap(); + for (Map p : perpetual) { + if (p.get("Timestamp").equals(timestamp)) { + toRemove = p; + break; + } + } + perpetual.remove(toRemove); + } + + public final void setPerpetual(final Card oldCard) { + final List> perp = oldCard.getPerpetual(); + perpetual = perp; + for (Map p : perp) { + if (p.get("Category").equals("Abilities")) { + long timestamp = (long) p.get("Timestamp"); + CardTraitChanges ctc = oldCard.getChangedCardTraits().get(timestamp, (long) 0).copy(this, false); + addChangedCardTraits(ctc, timestamp, (long) 0); + } else executePerpetual(p); + } + } + private int multiKickerMagnitude = 0; public final void addMultiKickerMagnitude(final int n) { multiKickerMagnitude += n; } public final void setKickerMagnitude(final int n) { multiKickerMagnitude = n; } @@ -4653,6 +4705,12 @@ public class Card extends GameEntity implements Comparable, IHasSVars { updateAbilityTextForView(); } + public final void addChangedCardTraits(CardTraitChanges ctc, long timestamp, long staticId) { + changedCardTraits.put(timestamp, staticId, ctc); + // update view + updateAbilityTextForView(); + } + public final boolean removeChangedCardTraits(long timestamp, long staticId) { boolean changed = false; changed |= changedCardTraitsByText.remove(timestamp, staticId) != null; @@ -6422,6 +6480,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return z != null && z.is(zone); } + public boolean isInZones(final List zones) { + boolean inZones = false; + Zone z = this.getLastKnownZone(); + for (ZoneType okZone : zones) { + if (z.is(okZone)) { + inZones = true; + break; + } + } + return z != null && inZones; + } + public final boolean canBeDestroyed() { return isInPlay() && !isPhasedOut() && (!hasKeyword(Keyword.INDESTRUCTIBLE) || (isCreature() && getNetToughness() <= 0)); } diff --git a/forge-game/src/main/java/forge/game/card/CardUtil.java b/forge-game/src/main/java/forge/game/card/CardUtil.java index b12ccf99b30..759e608ebd0 100644 --- a/forge-game/src/main/java/forge/game/card/CardUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardUtil.java @@ -291,6 +291,7 @@ public final class CardUtil { } newCopy.setIntensity(in.getIntensity(false)); + newCopy.setPerpetual(in); newCopy.addRemembered(in.getRemembered()); newCopy.addImprintedCards(in.getImprintedCards()); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index dda2778bdd1..e103aae8d2a 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -1000,7 +1000,7 @@ public class CardView extends GameEntityView { } CardStateView currentStateView = currentState.getView(); - if (getCurrentState() != currentStateView) { + if (getCurrentState() != currentStateView || c.hasPerpetual()) { set(TrackableProperty.CurrentState, currentStateView); currentStateView.updateName(currentState); currentStateView.updatePower(c); //ensure power, toughness, and loyalty updated when current state changes diff --git a/forge-gui/res/adventure/common/custom_cards/scarecrow_totem.txt b/forge-gui/res/adventure/common/custom_cards/scarecrow_totem.txt index b682296959a..98286dda704 100644 --- a/forge-gui/res/adventure/common/custom_cards/scarecrow_totem.txt +++ b/forge-gui/res/adventure/common/custom_cards/scarecrow_totem.txt @@ -1,10 +1,10 @@ Name:Scarecrow Totem ManaCost:no cost Types:Artifact -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigChoose | TriggerDescription$ At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library into your hand. The duplicate perpetually becomes an Artifact Scarecrow in addition to it's other types and has alternative manacost {4}. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Command | Execute$ TrigChoose | TriggerDescription$ At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library into your hand. The duplicate perpetually becomes an Artifact Scarecrow in addition to its other types and has alternative manacost {4}. SVar:TrigChoose:DB$ ChooseCard | Choices$ Creature.OppCtrl | ChoiceZone$ Library | AtRandom$ True | SubAbility$ DBConjure SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ChosenCard | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Scarecrow Captain's Perpetual Effect | SubAbility$ DBClearChosen -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ Alternative Cost:4 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | AddType$ Artifact & Scarecrow | Description$ That duplicate perpetually becomes an Artifact Scarecrow in addition to it's other types and has alternative manacost {4}. +SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ Alternative Cost:4 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | AddType$ Artifact & Scarecrow | Description$ That duplicate perpetually becomes an Artifact Scarecrow in addition to its other types and has alternative manacost {4}. SVar:DBClearChosen:DB$ Cleanup | ClearChosenCard$ True | ClearRemembered$ True -Oracle:At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library into your hand. The duplicate perpetually becomes an Artifact Scarecrow in addition to it's other types and has alternative manacost {4}. \ No newline at end of file +Oracle:At the beginning of your end step, conjure a duplicate of a random creature card from your opponent's library into your hand. The duplicate perpetually becomes an Artifact Scarecrow in addition to its other types and has alternative manacost {4}. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/a/absorb_energy.txt b/forge-gui/res/cardsfolder/a/absorb_energy.txt index 3367c76b869..f0cbc8b4302 100644 --- a/forge-gui/res/cardsfolder/a/absorb_energy.txt +++ b/forge-gui/res/cardsfolder/a/absorb_energy.txt @@ -1,11 +1,8 @@ Name:Absorb Energy ManaCost:1 U U Types:Instant -A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | RememberForCounter$ True | SubAbility$ DBEffect | SpellDescription$ Counter target spell. -SVar:DBEffect:DB$ Effect | ImprintCards$ Remembered | RememberObjects$ ValidHand Card.YouOwn+sharesCardTypeWith Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Absorb Energy's Perpetual Effect | SubAbility$ DBCleanup | SpellDescription$ Cards in your hand that share a card type with that spell perpetually gain "This spell costs {1} less to cast." -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddStaticAbility$ PerpetualReduceCost | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Cards in your hand that share a card type with that [imprinted] spell perpetually gain "This spell costs {1} less to cast." -SVar:PerpetualReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | RememberForCounter$ True | SubAbility$ DBAnimate | SpellDescription$ Counter target spell. +SVar:DBAnimate:DB$ AnimateAll | Zone$ Hand | Duration$ Perpetual | ValidCards$ Card.YouOwn+sharesCardTypeWith Remembered | staticAbilities$ ReduceCost | SubAbility$ DBCleanup | SpellDescription$ Cards in your hand that share a card type with that spell perpetually gain "This spell costs {1} less to cast." +SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Counter target spell. Cards in your hand that share a card type with that spell perpetually gain "This spell costs {1} less to cast." diff --git a/forge-gui/res/cardsfolder/a/accident_prone_apprentice_amphibian_accident.txt b/forge-gui/res/cardsfolder/a/accident_prone_apprentice_amphibian_accident.txt index 2814b208449..e51e8a11b9a 100644 --- a/forge-gui/res/cardsfolder/a/accident_prone_apprentice_amphibian_accident.txt +++ b/forge-gui/res/cardsfolder/a/accident_prone_apprentice_amphibian_accident.txt @@ -2,9 +2,8 @@ Name:Accident-Prone Apprentice ManaCost:1 R Types:Creature Otter Wizard PT:1/1 -T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield,Exile | Execute$ TrigEffect | TriggerDescription$ Whenever you cast a noncreature spell, CARDNAME perpetually gets +1/+1. This ability also triggers if CARDNAME is in exile. -SVar:TrigEffect:DB$ Effect | StaticAbilities$ PerpetualBuff | RememberObjects$ Self | Name$ Accident-Prone Apprentice's Perpetual Effect | Duration$ Permanent -SVar:PerpetualBuff:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gets +1/+1 +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | TriggerZones$ Battlefield,Exile | Execute$ TrigPump | TriggerDescription$ Whenever you cast a noncreature spell, CARDNAME perpetually gets +1/+1. This ability also triggers if CARDNAME is in exile. +SVar:TrigPump:DB$ Pump | PumpZone$ Battlefield,Exile | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual AlternateMode:Adventure Oracle:Whenever you cast a noncreature spell, Accident-Prone Apprentice perpetually gets +1/+1. This ability also triggers if Accident-Prone Apprentice is in exile. @@ -13,5 +12,5 @@ ALTERNATE Name:Amphibian Accident ManaCost:1 U Types:Instant Adventure -A:SP$ Animate | ValidTgts$ Creature | Power$ 1 | Toughness$ 1 | RemoveAllAbilities$ True | Colors$ Blue | OverwriteColors$ True | Types$ Frog | RemoveCreatureTypes$ True | SpellDescription$ Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. -Oracle:Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. \ No newline at end of file +A:SP$ Animate | ValidTgts$ Creature | Power$ 1 | Toughness$ 1 | RemoveAllAbilities$ True | Colors$ Blue | OverwriteColors$ True | Types$ Frog | RemoveCreatureTypes$ True | StackDescription$ REP target creature_{c:Targeted} | SpellDescription$ Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. +Oracle:Until end of turn, target creature loses all abilities and becomes a blue Frog with base power and toughness 1/1. diff --git a/forge-gui/res/cardsfolder/a/agent_of_raffine.txt b/forge-gui/res/cardsfolder/a/agent_of_raffine.txt index f5b0bc9422a..bde63569c69 100644 --- a/forge-gui/res/cardsfolder/a/agent_of_raffine.txt +++ b/forge-gui/res/cardsfolder/a/agent_of_raffine.txt @@ -3,12 +3,9 @@ ManaCost:U Types:Creature Human Rogue PT:1/2 A:AB$ Pump | Cost$ 2 T | ValidTgts$ Opponent | SubAbility$ DBConjure | StackDescription$ None | SpellDescription$ Choose target opponent. -SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ValidLibrary Card.TopLibrary+TargetedPlayerOwn | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect | StackDescription$ REP Conjure_{p:You} conjures & their_{p:Targeted}'s & your_their | SpellDescription$ Conjure a duplicate of the top card of their library into your hand. -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Agent of Raffine's Perpetual Effect | SubAbility$ DBCleanup | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." -SVar:PerpetualAbility:Mode$ Continuous | AddStaticAbility$ SpendAnyMana | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually gains "You may spend mana as though it were mana of any color to cast this spell." +SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ValidLibrary Card.TopLibrary+TargetedPlayerOwn | Zone$ Hand | RememberMade$ True | SubAbility$ DBAnimate | StackDescription$ REP Conjure_{p:You} conjures & their_{p:Targeted}'s & your_their | SpellDescription$ Conjure a duplicate of the top card of their library into your hand. +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | staticAbilities$ SpendAnyMana | Duration$ Perpetual | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:SpendAnyMana:Mode$ ManaConvert | EffectZone$ Stack | ValidPlayer$ You | ValidCard$ Card.Self | ValidSA$ Spell | ManaConversion$ AnyType->AnyColor | Description$ You may spend mana as though it were mana of any color to cast this spell. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBExileTop SVar:DBExileTop:DB$ Dig | Defined$ TargetedPlayer | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | ExileFaceDown$ True | StackDescription$ REP they exile_{p:Targeted} exiles | SpellDescription$ Then they exile the top card of their library face down. -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember Oracle:{2}, {T}: Choose target opponent. Conjure a duplicate of the top card of their library into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." Then they exile the top card of their library face down. diff --git a/forge-gui/res/cardsfolder/a/angel_of_unity.txt b/forge-gui/res/cardsfolder/a/angel_of_unity.txt index a6a7691e6a6..05f14cd41d1 100644 --- a/forge-gui/res/cardsfolder/a/angel_of_unity.txt +++ b/forge-gui/res/cardsfolder/a/angel_of_unity.txt @@ -6,9 +6,8 @@ K:Flying K:Lifelink T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME enters the battlefield or you cast a party spell, choose a party creature card in your hand. It perpetually gets +1/+1. (A party card or spell is a Cleric, Rogue, Warrior, or Wizard.) T:Mode$ SpellCast | ValidCard$ Card.Party | ValidActivatingPlayer$ You | Execute$ TrigChoose | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or you cast a party spell, choose a party creature card in your hand. It perpetually gets +1/+1. (A party card or spell is a Cleric, Rogue, Warrior, or Wizard.) -SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Creature.Party+YouOwn | ChoiceTitle$ Choose a party creature card in your hand | Amount$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualP1P1 | Name$ Angel of Unity's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.ChosenCard | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gets +1/+1. +SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Creature.Party+YouOwn | ChoiceTitle$ Choose a party creature card in your hand | Amount$ 1 | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ ChosenCard | PumpZone$ Hand | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True DeckHas:Ability$Party|LifeGain SVar:BuffedBy:Cleric,Rogue,Warrior,Wizard diff --git a/forge-gui/res/cardsfolder/a/antique_collector.txt b/forge-gui/res/cardsfolder/a/antique_collector.txt index b610ebefac6..d89eedd9c99 100644 --- a/forge-gui/res/cardsfolder/a/antique_collector.txt +++ b/forge-gui/res/cardsfolder/a/antique_collector.txt @@ -3,14 +3,11 @@ ManaCost:1 G Types:Creature Human Rogue PT:2/2 S:Mode$ CantBlockBy | ValidAttacker$ Creature.Self | ValidBlocker$ Creature.powerLE2 | Description$ CARDNAME can't be blocked by creatures with power 2 or less. -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEffect | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control perpetually gain "When this creature dies, you may shuffle it into its owner's library if it's in your graveyard. If you do, investigate." -SVar:TrigEffect:DB$ Effect | RememberObjects$ Valid Creature.YouCtrl | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Antique Collector's Perpetual Effect -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddTrigger$ DiesTrigger | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Creatures you control perpetually gain "When this creature dies, you may shuffle it into its owner's library if it's in your graveyard. If you do, investigate." +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAnimateAll | TriggerDescription$ When CARDNAME enters the battlefield, creatures you control perpetually gain "When this creature dies, you may shuffle it into its owner's library if it's in your graveyard. If you do, investigate." +SVar:TrigAnimateAll:DB$ AnimateAll | Duration$ Perpetual | ValidCards$ Creature.YouCtrl | Triggers$ DiesTrigger SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigShuffle | OptionalDecider$ You | TriggerDescription$ When this creature dies, you may shuffle it into its owner's library if it's in your graveyard. If you do, investigate. SVar:TrigShuffle:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ TriggeredNewCardLKICopy | RememberChanged$ True | SubAbility$ DBInvestigate -SVar:DBInvestigate:DB$ Investigate | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup +SVar:DBInvestigate:DB$ Investigate | ConditionDefined$ Remembered | ConditionPresent$ Card | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember -DeckHas:Ability$Investigate|Token +DeckHas:Ability$Investigate|Token|Graveyard & Type$Artifact|Clue Oracle:Antique Collector can't be blocked by creatures with power 2 or less.\nWhen Antique Collector enters the battlefield, creatures you control perpetually gain "When this creature dies, you may shuffle it into its owner's library if it's in your graveyard. If you do, investigate." diff --git a/forge-gui/res/cardsfolder/a/argivian_welcome.txt b/forge-gui/res/cardsfolder/a/argivian_welcome.txt index a3d2605360a..d946bc94848 100644 --- a/forge-gui/res/cardsfolder/a/argivian_welcome.txt +++ b/forge-gui/res/cardsfolder/a/argivian_welcome.txt @@ -1,8 +1,7 @@ Name:Argivian Welcome ManaCost:W U Types:Instant -A:SP$ Destroy | ValidTgts$ Creature.powerGE4 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target creature with power 4 or greater | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Destroy up to one target creature with power 4 or greater. Choose a nonland card in your hand. It perpetually gains flash. -SVar:DBChoose:DB$ ChooseCard | Mandatory$ True | ChoiceZone$ Hand | Choices$ Card.nonLand+YouOwn | ChoiceTitle$ Choose a nonland card in your hand | Amount$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualFlash | Name$ Argivian Welcome's Perpetual Effect | Duration$ Permanent -SVar:PerpetualFlash:Mode$ Continuous | Affected$ Card.ChosenCard | AddKeyword$ Flash | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gains flash. +A:SP$ Destroy | ValidTgts$ Creature.powerGE4 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target creature with power 4 or greater | SubAbility$ DBChoose | SpellDescription$ Destroy up to one target creature with power 4 or greater. +SVar:DBChoose:DB$ ChooseCard | Mandatory$ True | ChoiceZone$ Hand | Choices$ Card.nonLand+YouOwn | ChoiceDesc$ nonland | ChoiceTitle$ Choose a nonland card in your hand | Amount$ 1 | SubAbility$ DBPump | SpellDescription$ ,,,,,,Choose a nonland card in your hand. +SVar:DBPump:DB$ Pump | Defined$ ChosenCard | KW$ Flash | Duration$ Perpetual | PumpZone$ Hand | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains flash. Oracle:Destroy up to one target creature with power 4 or greater.\nChoose a nonland card in your hand. It perpetually gains flash. diff --git a/forge-gui/res/cardsfolder/a/argothian_elder.txt b/forge-gui/res/cardsfolder/a/argothian_elder.txt index d3172e23b06..ddaadb7d029 100644 --- a/forge-gui/res/cardsfolder/a/argothian_elder.txt +++ b/forge-gui/res/cardsfolder/a/argothian_elder.txt @@ -2,5 +2,5 @@ Name:Argothian Elder ManaCost:3 G Types:Creature Elf Druid PT:2/2 -A:AB$ Untap | Cost$ T | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Land | TgtPrompt$ Select target land | SpellDescription$ Untap two target lands. +A:AB$ Untap | Cost$ T | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Land | SpellDescription$ Untap two target lands. Oracle:{T}: Untap two target lands. diff --git a/forge-gui/res/cardsfolder/a/arming_gala.txt b/forge-gui/res/cardsfolder/a/arming_gala.txt index eee152045f2..41671afca61 100644 --- a/forge-gui/res/cardsfolder/a/arming_gala.txt +++ b/forge-gui/res/cardsfolder/a/arming_gala.txt @@ -1,9 +1,6 @@ Name:Arming Gala ManaCost:3 G W Types:Enchantment -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ DBEffect | TriggerDescription$ At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. -SVar:DBEffect:DB$ Effect | RememberObjects$ Valid Creature.YouCtrl,ValidHand Creature.YouOwn,ValidGraveyard Creature.YouOwn,ValidLibrary Creature.YouOwn | StaticAbilities$ PerpetualP1P1 | Name$ Arming Gala's Perpetual Effect | Duration$ Permanent -SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember -Oracle:At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. \ No newline at end of file +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPerpetualP1P1 | TriggerDescription$ At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. +SVar:TrigPerpetualP1P1:DB$ PumpAll | ValidCards$ Creature.YouCtrl | PumpZone$ Battlefield,Hand,Library,Graveyard | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual +Oracle:At the beginning of your end step, creatures you control and creature cards in your hand, library, and graveyard perpetually get +1/+1. diff --git a/forge-gui/res/cardsfolder/a/arvad_weatherlight_smuggler.txt b/forge-gui/res/cardsfolder/a/arvad_weatherlight_smuggler.txt index adf424883dc..f7942c595cb 100644 --- a/forge-gui/res/cardsfolder/a/arvad_weatherlight_smuggler.txt +++ b/forge-gui/res/cardsfolder/a/arvad_weatherlight_smuggler.txt @@ -4,12 +4,9 @@ Types:Legendary Creature Vampire Knight PT:1/1 K:Deathtouch K:Lifelink -T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield,Graveyard | CheckSVar$ X | Execute$ DBStore | TriggerDescription$ At the beginning of your end step, if a creature died this turn, CARDNAME perpetually gets +X/+X where X is the number of creatures that died this turn. This ability also triggers if NICKNAME is in your graveyard. -SVar:DBStore:DB$ StoreSVar | SVar$ Num | Type$ CountSVar | Expression$ X | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualPXPX | Name$ Arvad, Weatherlight Smuggler's Perpetual Effect | Duration$ Permanent -SVar:PerpetualPXPX:Mode$ Continuous | Affected$ Card.EffectSource | AddPower$ Num | AddToughness$ Num | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ CARDNAME perpetually gets +X/+X, where X is the number of creatures that died this turn. +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield,Graveyard | CheckSVar$ X | Execute$ TrigPump | TriggerDescription$ At the beginning of your end step, if a creature died this turn, CARDNAME perpetually gets +X/+X where X is the number of creatures that died this turn. This ability also triggers if NICKNAME is in your graveyard. +SVar:TrigPump:DB$ Pump | Defined$ Self | PumpZone$ Battlefield,Graveyard | NumAtt$ X | NumDef$ X | Duration$ Perpetual SVar:X:Count$ThisTurnEntered_Graveyard_from_Battlefield_Creature -SVar:Num:Number$0 DeckHas:Ability$Graveyard|LifeGain -DeckHints:Ability$Sacrifice -Oracle:Deathtouch, lifelink\nAt the beginning of your end step, if a creature died this turn, Arvad, Weatherlight Smuggler perpetually gets +X/+X, where X is the number of creature that died this turn. This ability also triggers if Arvad is in your graveyard. +DeckHints:Ability$Sacrifice|Graveyard +Oracle:Deathtouch, lifelink\nAt the beginning of your end step, if a creature died this turn, Arvad, Weatherlight Smuggler perpetually gets +X/+X where X is the number of creatures that died this turn. This ability also triggers if Arvad is in your graveyard. diff --git a/forge-gui/res/cardsfolder/b/baffling_defenses.txt b/forge-gui/res/cardsfolder/b/baffling_defenses.txt index 498ae83ea27..9b36c52d124 100644 --- a/forge-gui/res/cardsfolder/b/baffling_defenses.txt +++ b/forge-gui/res/cardsfolder/b/baffling_defenses.txt @@ -1,6 +1,5 @@ Name:Baffling Defenses ManaCost:1 W Types:Instant -A:SP$ Effect | StaticAbilities$ Perpetual0P | RememberObjects$ Targeted | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | Name$ Baffling Defenses's Perpetual Effect | Duration$ Permanent | SpellDescription$ Target creature's base power perpetually becomes 0. -SVar:Perpetual0P:Mode$ Continuous | Affected$ Card.IsRemembered | SetPower$ 0 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature's base power perpetually becomes 0. +A:SP$ Animate | ValidTgts$ Creature | IsCurse$ True | Power$ 0 | Duration$ Perpetual | StackDescription$ REP Target creature_{c:Targeted} | SpellDescription$ Target creature's base power perpetually becomes 0. Oracle:Target creature's base power perpetually becomes 0. diff --git a/forge-gui/res/cardsfolder/b/begin_anew.txt b/forge-gui/res/cardsfolder/b/begin_anew.txt index ca8c9228eef..bb3952df2e7 100644 --- a/forge-gui/res/cardsfolder/b/begin_anew.txt +++ b/forge-gui/res/cardsfolder/b/begin_anew.txt @@ -1,9 +1,6 @@ Name:Begin Anew ManaCost:G G W W Types:Sorcery -A:SP$ DestroyAll | ValidCards$ Creature | SubAbility$ DBEffect | SpellDescription$ Destroy all creatures. -SVar:DBEffect:DB$ Effect | RememberObjects$ ValidHand Creature.YouOwn | StaticAbilities$ PerpetualP1P1 | Duration$ Permanent | Triggers$ Update | Name$ Begin Anew's Perpetual Effect | SpellDescription$ Creature cards in your hand perpetually get +1/+1. -SVar:PerpetualP1P1:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Creature cards in your hand perpetually get +1/+1. -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember +A:SP$ DestroyAll | ValidCards$ Creature | SubAbility$ DBPumpAll | SpellDescription$ Destroy all creatures. +SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | PumpZone$ Hand | Duration$ Perpetual | NumAtt$ 1 | NumDef$ 1 | StackDescription$ REP your_{p:You}'s | SpellDescription$ Creature cards in your hand perpetually get +1/+1. Oracle:Destroy all creatures. Creature cards in your hand perpetually get +1/+1. diff --git a/forge-gui/res/cardsfolder/b/benalish_partisan.txt b/forge-gui/res/cardsfolder/b/benalish_partisan.txt index 9e6b9971c40..90d83e89ce5 100644 --- a/forge-gui/res/cardsfolder/b/benalish_partisan.txt +++ b/forge-gui/res/cardsfolder/b/benalish_partisan.txt @@ -4,10 +4,11 @@ Types:Creature Human Soldier PT:1/2 K:Lifelink T:Mode$ Cycled | ValidCard$ Card.Other | ValidPlayer$ You | TriggerZones$ Graveyard | Execute$ TrigReturn | TriggerDescription$ Whenever you cycle another card, you may pay {1}{W}. If you do, return CARDNAME from your graveyard to the battlefield tapped and it perpetually gets +1/+0. -SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 W | Defined$ Self | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualPump | RememberObjects$ Self | Name$ Benalish Partisan's Perpetual Effect | Duration$ Permanent -SVar:PerpetualPump:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ EFFECTSOURCE perpetually gets +1/+0. +SVar:TrigReturn:AB$ ChangeZone | Cost$ 1 W | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | RememberChanged$ True | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Remembered | NumAtt$ 1 | Duration$ Perpetual | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True K:Cycling:1 W DeckHas:Ability$LifeGain|Graveyard +DeckNeeds:Keyword$Cycling SVar:SacMe:2 Oracle:Lifelink\nWhenever you cycle another card, you may pay {1}{W}. If you do, return Benalish Partisan from your graveyard to the battlefield tapped and it perpetually gets +1/+0.\nCycling {1}{W} diff --git a/forge-gui/res/cardsfolder/b/better_offer.txt b/forge-gui/res/cardsfolder/b/better_offer.txt index 8c22aecb282..20beb943a57 100644 --- a/forge-gui/res/cardsfolder/b/better_offer.txt +++ b/forge-gui/res/cardsfolder/b/better_offer.txt @@ -1,11 +1,8 @@ Name:Better Offer ManaCost:X U Types:Sorcery -A:SP$ ChangeZone | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | ChangeType$ Creature.cmcLEX+TargetedPlayerOwn | ChangeNum$ 1 | Hidden$ True | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | GainControl$ True | RememberChanged$ True | SubAbility$ DBStore | StackDescription$ {p:You} puts a random creature card with mana value X or less from {p:Targeted}'s library onto the battlefield under their control. | SpellDescription$ Put a random creature card with mana value X or less from target opponent's library onto the battlefield under your control. -SVar:DBStore:DB$ StoreSVar | SVar$ Num | Type$ CountSVar | Expression$ X | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ Perpetual | Name$ Better Offer's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup | SpellDescription$ It perpetually has base power and toughness X/X and perpetually gains ward {1}. -SVar:Perpetual:Mode$ Continuous | Affected$ Card.IsRemembered | SetPower$ Num | SetToughness$ Num | AddKeyword$ Ward:1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The card perpetually has base power and toughness X/X and perpetually gains ward {1}. +A:SP$ ChangeZone | Origin$ Library | Destination$ Battlefield | ValidTgts$ Opponent | ChangeType$ Creature.cmcLEX+TargetedPlayerOwn | ChangeNum$ 1 | Hidden$ True | AtRandom$ True | NoShuffle$ True | Mandatory$ True | NoLooking$ True | GainControl$ True | RememberChanged$ True | SubAbility$ DBAnimate | StackDescription$ {p:You} puts a random creature card with mana value X or less from {p:Targeted}'s library onto the battlefield under their control. | SpellDescription$ Put a random creature card with mana value X or less from target opponent's library onto the battlefield under your control. +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ X | Toughness$ X | Keywords$ Ward:1 | Duration$ Perpetual | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ It perpetually has base power and toughness X/X and gains ward {1}. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -SVar:Num:Number$0 -Oracle:Put a random creature card with mana value X or less from target opponent's library onto the battlefield under your control. It perpetually has base power and toughness X/X and perpetually gains ward {1}. +Oracle:Put a random creature card with mana value X or less from target opponent's library onto the battlefield under your control. It perpetually has base power and toughness X/X and gains ward {1}. diff --git a/forge-gui/res/cardsfolder/b/bind_to_secrecy.txt b/forge-gui/res/cardsfolder/b/bind_to_secrecy.txt index e93c9bb1243..ac70299d247 100644 --- a/forge-gui/res/cardsfolder/b/bind_to_secrecy.txt +++ b/forge-gui/res/cardsfolder/b/bind_to_secrecy.txt @@ -1,15 +1,12 @@ Name:Bind to Secrecy ManaCost:U B Types:Instant -A:SP$ Charm | Choices$ CounterNonCreature,DBConjure | CharmNum$ 1 -SVar:CounterNonCreature:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target noncreature spell | ValidTgts$ Card.nonCreature | SubAbility$ TrigDraft | SpellDescription$ Counter target noncreature spell. -SVar:DBConjure:DB$ MakeCard | Conjure$ True | TgtPrompt$ Select target creature card in an opponent's graveyard | ValidTgts$ Creature.OppOwn+inZoneGraveyard | TgtZone$ Graveyard | DefinedName$ Targeted | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect | SpellDescription$ Conjure a duplicate of target creature card in an opponent's graveyard into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Bind to Secrecy's Perpetual Effect | SubAbility$ DBCleanup | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." -SVar:PerpetualAbility:Mode$ Continuous | AddStaticAbility$ SpendAnyMana | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The conjured card perpetually gains "You may spend mana as though it were mana of any color to cast this spell." +A:SP$ Charm | Choices$ CounterNonCreature,DBConjure | CharmNum$ 1 | SubAbility$ DBDraft +SVar:CounterNonCreature:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target noncreature spell | ValidTgts$ Card.nonCreature | SubAbility$ DBDraft | SpellDescription$ Counter target noncreature spell. +SVar:DBConjure:DB$ MakeCard | Conjure$ True | TgtPrompt$ Select target creature card in an opponent's graveyard | ValidTgts$ Creature.OppOwn+inZoneGraveyard | TgtZone$ Graveyard | DefinedName$ Targeted | Zone$ Hand | RememberMade$ True | SubAbility$ DBAnimate | SpellDescription$ Conjure a duplicate of target creature card in an opponent's graveyard into your hand. +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | staticAbilities$ SpendAnyMana | Duration$ Perpetual | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains "You may spend mana as though it were mana of any color to cast this spell." SVar:SpendAnyMana:Mode$ ManaConvert | EffectZone$ Stack | ValidPlayer$ You | ValidCard$ Card.Self | ValidSA$ Spell | ManaConversion$ AnyType->AnyColor | Description$ You may spend mana as though it were mana of any color to cast this spell. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ TrigDraft -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember -SVar:TrigDraft:DB$ Draft | ConditionCheckSVar$ X | ConditionSVarCompare$ GE5 | Spellbook$ Corpse Churn,Corpse Hauler,Courier Bat,Durable Coilbug,Fear of Death,Gorging Vulture,Locked in the Cemetery,Naga Oracle,Necrotic Wound,Obsessive Stitcher,Reassembling Skeleton,Strategic Planning,Unmarked Grave,Wonder | SpellDescription$ If there are five or more mana values among cards in your graveyard, draft a card from CARDNAME's spellbook. -SVar:X:Count$ValidGraveyard Card.YouOwn$DifferentCMC +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBDraft +SVar:DBDraft:DB$ Draft | ConditionCheckSVar$ Count$ValidGraveyard Card.YouOwn$DifferentCMC | ConditionSVarCompare$ GE5 | Spellbook$ Corpse Churn,Corpse Hauler,Courier Bat,Durable Coilbug,Fear of Death,Gorging Vulture,Locked in the Cemetery,Naga Oracle,Necrotic Wound,Obsessive Stitcher,Reassembling Skeleton,Strategic Planning,Unmarked Grave,Wonder | StackDescription$ SpellDescription | SpellDescription$ If there are five or more mana values among cards in your graveyard, draft a card from CARDNAME's spellbook. +DeckHints:Ability$Discard Oracle:Choose one —\n• Counter target noncreature spell.\n• Conjure a duplicate of target creature card in an opponent's graveyard into your hand. It perpetually gains "You may spend mana as though it were mana of any color to cast this spell."\nIf there are five or more mana values among cards in your graveyard, draft a card from Bind to Secrecy's spellbook. diff --git a/forge-gui/res/cardsfolder/b/bloodsprout_talisman.txt b/forge-gui/res/cardsfolder/b/bloodsprout_talisman.txt index d3af3c9e170..3e8f91d2efa 100644 --- a/forge-gui/res/cardsfolder/b/bloodsprout_talisman.txt +++ b/forge-gui/res/cardsfolder/b/bloodsprout_talisman.txt @@ -2,9 +2,8 @@ Name:Bloodsprout Talisman ManaCost:B G Types:Artifact K:CARDNAME enters the battlefield tapped. -A:AB$ ChooseCard | Cost$ T PayLife<1> | ChoiceZone$ Hand | Choices$ Card.nonLand+YouOwn | ChoiceTitle$ Choose a nonland card in your hand | Amount$ 1 | SubAbility$ DBEffect | SpellDescription$ Choose a nonland card in your hand. It perpetually gains "This spell costs {1} less to cast." -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility | Name$ Bloodsprout Talisman's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.ChosenCard | AddStaticAbility$ PerpetualReduce | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gains "This spell costs {1} less to cast." -SVar:PerpetualReduce:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. +A:AB$ ChooseCard | Cost$ T PayLife<1> | Mandatory$ True | ChoiceZone$ Hand | Choices$ Card.nonLand+YouOwn | ChoiceDesc$ nonland | ChoiceTitle$ Choose a nonland card in your hand | SubAbility$ DBAnimate | SpellDescription$ Choose a nonland card in your hand. +SVar:DBAnimate:DB$ Animate | Duration$ Perpetual | Defined$ ChosenCard | staticAbilities$ ReduceCost | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains "This spell costs {1} less to cast." +SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | SubAbility$ DBCleanup | Description$ This spell costs {1} less to cast. SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True -Oracle:Bloodsprout Talisman enters the battlefield tapped.\n{T), pay 1 life: Choose a nonland card in your hand. It perpetually gains "This spell costs {1} less to cast." \ No newline at end of file +Oracle:Bloodsprout Talisman enters the battlefield tapped.\n{T), pay 1 life: Choose a nonland card in your hand. It perpetually gains "This spell costs {1} less to cast." diff --git a/forge-gui/res/cardsfolder/b/boareskyr_tollkeeper.txt b/forge-gui/res/cardsfolder/b/boareskyr_tollkeeper.txt index a267ed00115..61752956a68 100644 --- a/forge-gui/res/cardsfolder/b/boareskyr_tollkeeper.txt +++ b/forge-gui/res/cardsfolder/b/boareskyr_tollkeeper.txt @@ -4,8 +4,9 @@ Types:Creature Orc Knight PT:3/1 T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigReveal | TriggerDescription$ When CARDNAME enters the battlefield, target opponent reveals all creature and land cards in their hand. Choose one of them. That card perpetually gains "This permanent enters the battlefield tapped." SVar:TrigReveal:DB$ Reveal | ValidTgts$ Opponent | RevealAllValid$ Creature.TargetedPlayerOwn,Land.TargetedPlayerOwn | SubAbility$ DBChooseCard | RememberRevealed$ True -SVar:DBChooseCard:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.IsRemembered | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility | Name$ Boareskyr Tollkeeper's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.ChosenCard | EffectZone$ Command | AddKeyword$ CARDNAME enters the battlefield tapped. | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gains "This permanent enters the battlefield tapped." +SVar:DBChooseCard:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.IsRemembered | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Duration$ Perpetual | Defined$ ChosenCard | Replacements$ ReplaceETB | SubAbility$ DBCleanup +SVar:ReplaceETB:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | Description$ This permanent enters the battlefield tapped. +SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True Oracle:When Boareskyr Tollkeeper enters the battlefield, target opponent reveals all creature and land cards in their hand. Choose one of them. That card perpetually gains "This permanent enters the battlefield tapped." diff --git a/forge-gui/res/cardsfolder/b/brittle_blast.txt b/forge-gui/res/cardsfolder/b/brittle_blast.txt index 6d7be329746..e8de5524bcb 100644 --- a/forge-gui/res/cardsfolder/b/brittle_blast.txt +++ b/forge-gui/res/cardsfolder/b/brittle_blast.txt @@ -1,8 +1,7 @@ Name:Brittle Blast ManaCost:2 R Types:Instant -A:SP$ Effect | RememberObjects$ Valid Creature.OppCtrl,Valid Planeswalker.OppCtrl | StaticAbilities$ MakeBrittle | Duration$ Permanent | Name$ Brittle Blast's Perpetual Effect | SubAbility$ DBDamage | SpellDescription$ Creatures and planeswalkers your opponents control perpetually gain "If this permanent would die, exile it instead." -SVar:MakeBrittle:Mode$ Continuous | Affected$ Card.IsRemembered | AddReplacementEffects$ BrittleExile | AddSVar$ BrittleRep | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Creatures and planeswalkers your opponents control perpetually gain "If this permanent would die, exile it instead." +A:SP$ AnimateAll | ValidCards$ Creature.OppCtrl,Planeswalker.OppCtrl | Duration$ Perpetual | Replacements$ BrittleExile | SubAbility$ DBDamage | StackDescription$ REP your_{p:You}'s | SpellDescription$ Creatures and planeswalkers your opponents control perpetually gain "If this permanent would die, exile it instead." SVar:BrittleExile:Event$ Moved | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | ReplaceWith$ BrittleRep | Description$ If this permanent would die, exile it instead. SVar:BrittleRep:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target creature or planeswalker. diff --git a/forge-gui/res/cardsfolder/b/brokers_safeguard.txt b/forge-gui/res/cardsfolder/b/brokers_safeguard.txt index ecfdd9f1dff..3acd1144b62 100644 --- a/forge-gui/res/cardsfolder/b/brokers_safeguard.txt +++ b/forge-gui/res/cardsfolder/b/brokers_safeguard.txt @@ -1,12 +1,11 @@ Name:Brokers' Safeguard ManaCost:W U Types:Instant -A:SP$ ChangeZone | ValidTgts$ Creature.nonArtifact+YouCtrl | TgtPrompt$ Select target nonartifact creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ DBEffect | SpellDescription$ Exile target target nonartifact creature you control. -SVar:DBEffect:DB$ Effect | Name$ Brokers' Safeguard's Perpetual Effect | RememberObjects$ RememberedLKI | StaticAbilities$ PerpetualStatic | Duration$ Permanent | SubAbility$ DBReturn | SpellDescription$ It perpetually gains "This creature enters the battlefield with an additional shield counter on it." -SVar:PerpetualStatic:Mode$ Continuous | Affected$ Card.IsRemembered | AddReplacementEffects$ ETBAddCounter | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains "This creature enters the battlefield with an additional shield counter on it." +A:SP$ ChangeZone | ValidTgts$ Creature.nonArtifact+YouCtrl | TgtPrompt$ Select target nonartifact creature you control | Origin$ Battlefield | Destination$ Exile | RememberTargets$ True | SubAbility$ DBAnimate | SpellDescription$ Exile target target nonartifact creature you control. +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Replacements$ ETBAddCounter | Duration$ Perpetual | SubAbility$ DBReturn | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains "This creature enters the battlefield with an additional shield counter on it." SVar:ETBAddCounter:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | ReplaceWith$ ETBAddExtraCounter | ReplacementResult$ Updated | Description$ This creature enters the battlefield with an additional shield counter on it. SVar:ETBAddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ SHIELD -SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup | StackDescription$ Then return {c:Remembered} to the battlefield under its owner's control. | SpellDescription$ Then return that card to the battlefield under its owner's control. +SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ All | Destination$ Battlefield | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ Then return that card to the battlefield under its owner's control. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Counters Oracle:Exile target nonartifact creature you control. It perpetually gains "This creature enters the battlefield with an additional shield counter on it." Then return that card to the battlefield under its owner's control. diff --git a/forge-gui/res/cardsfolder/b/by_elspeths_command.txt b/forge-gui/res/cardsfolder/b/by_elspeths_command.txt index 43350b9d5f8..a4a1cc85657 100644 --- a/forge-gui/res/cardsfolder/b/by_elspeths_command.txt +++ b/forge-gui/res/cardsfolder/b/by_elspeths_command.txt @@ -3,13 +3,11 @@ ManaCost:2 W Types:Enchantment T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ TrigCharm | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ PumpField,PumpHand,Token | ChoiceRestriction$ YourLastCombat -SVar:PumpField:DB$ Pump | ValidTgts$ Soldier | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target Soldier | SubAbility$ DBEffect | SpellDescription$ Up to one target Soldier perpetually gets +1/+1 and gains flying. -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualPump | RememberObjects$ Targeted | Name$ By Elspeth's Command's First Mode's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualPump:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Flying | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This Soldier perpetually gets +1/+1 and gains flying. -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True -SVar:PumpHand:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Soldier.YouOwn | ChoiceTitle$ Choose a Soldier card in your hand | Amount$ 1 | SubAbility$ DBEffect2 | SpellDescription$ Choose a Soldier card in your hand. It perpetually gets +1/+1 and gains vigilance. -SVar:DBEffect2:DB$ Effect | StaticAbilities$ PerpetualPump2 | Name$ By Elspeth's Command's Second Mode's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualPump2:Mode$ Continuous | Affected$ Card.ChosenCard | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Vigilance | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen Soldier card perpetually gets +1/+1 and gains vigilance. +SVar:PumpField:DB$ Pump | ValidTgts$ Soldier | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target Soldier | KW$ Flying | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual | SpellDescription$ Up to one target Soldier perpetually gets +1/+1 and gains flying. +SVar:PumpHand:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Soldier.YouOwn | ChoiceTitle$ Choose a Soldier card in your hand | Mandatory$ True | SubAbility$ DBPump | SpellDescription$ Choose a Soldier card in your hand. It perpetually gets +1/+1 and gains vigilance. +SVar:DBPump:DB$ Pump | Defined$ ChosenCard | PumpZone$ Hand | KW$ Vigilance | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:Token:DB$ Token | TokenScript$ c_1_1_a_soldier | SpellDescription$ Create a 1/1 colorless Soldier artifact creature token. DeckHas:Ability$Token & Type$Artifact|Soldier +DeckHints:Type$Soldier Oracle:At the beginning of combat on your turn, choose one that wasn't chosen during your last combat —\n• Up to one target Soldier perpetually gets +1/+1 and gains flying.\n• Choose a Soldier card in your hand. It perpetually gets +1/+1 and gains vigilance.\n• Create a 1/1 colorless Soldier artifact creature token. diff --git a/forge-gui/res/cardsfolder/c/conductive_current.txt b/forge-gui/res/cardsfolder/c/conductive_current.txt index b8dc2e6fbae..a36f6ec827c 100644 --- a/forge-gui/res/cardsfolder/c/conductive_current.txt +++ b/forge-gui/res/cardsfolder/c/conductive_current.txt @@ -2,11 +2,8 @@ Name:Conductive Current ManaCost:R R R Types:Sorcery A:SP$ DamageAll | NumDmg$ 3 | ValidCards$ Creature | ValidDescription$ each creature. | SubAbility$ DBChoose | SpellDescription$ CARDNAME deals 3 damage to each creature. -SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Instant.YouOwn,Sorcery.YouOwn | ChoiceTitle$ Choose an instant or sorcery card in your hand | Amount$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Conductive Current's Perpetual Effect | SubAbility$ DBCleanup -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddReplacementEffects$ PerpDamageRep | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gains "If this spell would deal noncombat damage to a permanent or player, it deals that much damage plus 2 instead." +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Instant.YouOwn,Sorcery.YouOwn | ChoiceDesc$ instant or sorcery | ChoiceTitle$ Choose an instant or sorcery card in your hand | Mandatory$ True | SubAbility$ DBAnimate | SpellDescription$ Choose an instant or sorcery card in your hand. +SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Replacements$ PerpDamageRep | Duration$ Perpetual | StackDescription$ SpellDescription | SpellDescription$ It perpetually gains "If this spell would deal noncombat damage to a permanent or player, it deals that much damage plus 2 instead." SVar:PerpDamageRep:Event$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Permanent,Player | ReplaceWith$ DmgPlus2 | Description$ If this spell would deal noncombat damage to a permanent or player, it deals that much damage plus 2 instead. -SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ X -SVar:X:ReplaceCount$DamageAmount/Plus.2 -SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +SVar:DmgPlus2:DB$ ReplaceEffect | VarName$ DamageAmount | VarValue$ ReplaceCount$DamageAmount/Plus.2 Oracle:Conductive Current deals 3 damage to each creature. Choose an instant or sorcery card in your hand. It perpetually gains "If this spell would deal noncombat damage to a permanent or player, it deals that much damage plus 2 instead." diff --git a/forge-gui/res/cardsfolder/d/divine_purge.txt b/forge-gui/res/cardsfolder/d/divine_purge.txt index aacd559143e..4420128fbf9 100644 --- a/forge-gui/res/cardsfolder/d/divine_purge.txt +++ b/forge-gui/res/cardsfolder/d/divine_purge.txt @@ -1,10 +1,11 @@ Name:Divine Purge ManaCost:1 W W Types:Sorcery -A:SP$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Artifact.cmcLE3,Creature.cmcLE3 | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile all artifacts and creatures with mana value 3 or less. They perpetually gain "This spell costs {2} more to cast" and "This permanent enters the battlefield tapped." For as long as each of them remain exiled, its owner may play it. -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Name$ Divine Purge's Perpetual Effect | SubAbility$ DBMayPlayEffect -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddStaticAbility$ RaiseCost & ETBTappedDesc | EffectZone$ Command | AddKeyword$ CARDNAME enters the battlefield tapped. | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | SubAbility$ DBMayPlayEffect | Description$ The exiled cards perpetually gain "This spell costs {2} more to cast" and "This permanent enters the battlefield tapped." +A:SP$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Artifact.cmcLE3,Creature.cmcLE3 | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Exile all artifacts and creatures with mana value 3 or less. +SVar:DBAnimate:DB$ Animate | Duration$ Perpetual | Defined$ Remembered | staticAbilities$ RaiseCost | Replacements$ ReplaceETB | SubAbility$ DBMayPlayEffect | StackDescription$ SpellDescription | SpellDescription$ They perpetually gain "This spell costs {2} more to cast" and "This permanent enters the battlefield tapped." SVar:RaiseCost:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 2 | EffectZone$ All | Description$ This spell costs {2} more to cast. +SVar:ReplaceETB:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | Description$ This permanent enters the battlefield tapped. +SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard SVar:ETBTappedDesc:Mode$ Continuous | Affected$ Card.Self | Description$ This permanent enters the battlefield tapped. SVar:DBMayPlayEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ OwnerMayPlay | Duration$ Permanent | SubAbility$ DBCleanup | ForgetOnMoved$ Exile | SpellDescription$ For as long as each of them remain exiled, its owner may play it. SVar:OwnerMayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | AffectedZone$ Exile | MayPlay$ True | EffectZone$ Command | MayPlayPlayer$ CardOwner | Description$ For as long as each of these remain exiled, its owner may play it. diff --git a/forge-gui/res/cardsfolder/e/ethereal_escort.txt b/forge-gui/res/cardsfolder/e/ethereal_escort.txt index e061bafff37..587bf7e57fa 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_escort.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_escort.txt @@ -5,9 +5,8 @@ PT:3/3 K:Lifelink T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, choose a card in your hand. It perpetually gains lifelink. T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | Secondary$ True | TriggerDescription$ Whenever CARDNAME enters the battlefield or attacks, choose a card in your hand. It perpetually gains lifelink. -SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.YouOwn | ChoiceTitle$ Choose a card in your hand | Amount$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualLifelink | Name$ Ethereal Escort's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualLifelink:Mode$ Continuous | Affected$ Card.ChosenCard | AddKeyword$ Lifelink | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The chosen card perpetually gains lifelink. +SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Card.YouOwn | ChoiceTitle$ Choose a card in your hand | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ ChosenCard | PumpZone$ Hand | KW$ Lifelink | Duration$ Perpetual | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True SVar:HasAttackEffect:TRUE DeckHas:Ability$LifeGain diff --git a/forge-gui/res/cardsfolder/e/ethereal_grasp.txt b/forge-gui/res/cardsfolder/e/ethereal_grasp.txt index 3d8ec657d1a..15ff8652c2a 100644 --- a/forge-gui/res/cardsfolder/e/ethereal_grasp.txt +++ b/forge-gui/res/cardsfolder/e/ethereal_grasp.txt @@ -1,8 +1,8 @@ Name:Ethereal Grasp ManaCost:2 U Types:Instant -A:SP$ Tap | ValidTgts$ Creature | TgtPrompt$ Select target creature | IsCurse$ True | SubAbility$ DBEffect | SpellDescription$ Tap target creature. That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature." -SVar:DBEffect:DB$ Effect | StaticAbilities$ EtherealGrasp | RememberObjects$ Targeted | Name$ Ethereal Grasp's Perpetual Effect | Duration$ Permanent | StackDescription$ That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature." -SVar:EtherealGrasp:Mode$ Continuous | Affected$ Card.IsRemembered | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | AddAbility$ Untap | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature." -SVar:Untap:AB$ Untap | Cost$ 8 | Defined$ Self | SpellDescription$ Untap this creature. +A:SP$ Tap | ValidTgts$ Creature | IsCurse$ True | SubAbility$ DBAnimate | SpellDescription$ Tap target creature. +SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Duration$ Perpetual | staticAbilities$ EtherealGrasp | Abilities$ Untap | StackDescription$ SpellDescription | SpellDescription$ That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature." +SVar:EtherealGrasp:Mode$ Continuous | Affected$ Card.Self | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature doesn't untap during your untap step. +SVar:Untap:AB$ Untap | Cost$ 8 | SpellDescription$ Untap this creature. Oracle:Tap target creature. That creature perpetually gains "This creature doesn't untap during your untap step" and "{8}: Untap this creature." diff --git a/forge-gui/res/cardsfolder/f/fallaji_antiquarian.txt b/forge-gui/res/cardsfolder/f/fallaji_antiquarian.txt index 362fa58995c..3bbd8e58209 100644 --- a/forge-gui/res/cardsfolder/f/fallaji_antiquarian.txt +++ b/forge-gui/res/cardsfolder/f/fallaji_antiquarian.txt @@ -4,9 +4,8 @@ Types:Creature Human Artificer PT:2/4 K:Haste T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigConjure | TriggerDescription$ When CARDNAME enters the battlefield, conjure a duplicate of another target nontoken creature or artifact you control into your graveyard. The duplicate perpetually gains unearth {1}{R}. -SVar:TrigConjure:DB$ MakeCard | Conjure$ True | TgtPrompt$ Select another target nontoken creature or artifact | DefinedName$ Targeted | ValidTgts$ Creature.YouCtrl+Other+nonToken,Artifact.YouCtrl+Other+nonToken | Zone$ Graveyard | RememberMade$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualUnearth | RememberObjects$ Remembered | Name$ Fallaji Antiquarian's perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualUnearth:Mode$ Continuous | Affected$ Card.IsRemembered | AddKeyword$ Unearth:2 R | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains unearth {1}{R}. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | TgtPrompt$ Select another target nontoken creature or artifact you control | DefinedName$ Targeted | ValidTgts$ Creature.YouCtrl+Other+nonToken,Artifact.YouCtrl+Other+nonToken | Zone$ Graveyard | RememberMade$ True | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Remembered | PumpZone$ Graveyard | KW$ Unearth:2 R | Duration$ Perpetual | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Ability$Graveyard DeckHints:Type$Artifact diff --git a/forge-gui/res/cardsfolder/f/flames_of_moradin.txt b/forge-gui/res/cardsfolder/f/flames_of_moradin.txt index 3f24cb0a689..325a038389a 100644 --- a/forge-gui/res/cardsfolder/f/flames_of_moradin.txt +++ b/forge-gui/res/cardsfolder/f/flames_of_moradin.txt @@ -1,11 +1,12 @@ Name:Flames of Moradin ManaCost:2 R R Types:Sorcery -A:SP$ Destroy | ValidTgts$ Artifact | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select up to three target artifacts | SubAbility$ DBConjure -SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ Targeted.nonToken | Zone$ Hand | RememberMade$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility | RememberObjects$ Remembered | Name$ Flames of Moradin's Perpetual Effect | Duration$ Permanent -SVar:PerpetualAbility:Mode$ Continuous | RememberObjects$ Targeted | AddKeyword$ Alternative Cost: R | Affected$ Card.IsRemembered | AddTrigger$ TrigSac | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gains "You may pay {R} rather than pay this spell's mana cost" and "at the beginning of your end step, sacrifice this artifact." -SVar:TrigSac:Mode$ Phase | ValidPlayer$ You | Phase$ End of Turn | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ Sacrifice CARDNAME at you end step. +A:SP$ Destroy | ValidTgts$ Artifact | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select up to three target artifacts | SubAbility$ DBConjure | SpellDescription$ Destroy up to three target artifacts. +SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ Targeted.nonToken | Zone$ Hand | RememberMade$ True | SubAbility$ DBAnimate | SpellDescription$ Conjure a duplicate of each nontoken artifact destroyed this way into your hand. +SVar:DBAnimate:DB$ Animate | Duration$ Perpetual | Defined$ Remembered | staticAbilities$ PerpAltCost | Triggers$ PhaseTrig | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ The duplicates perpetually gain "You may pay {R} rather than pay this spell's mana cost" and "at the beginning of your end step, sacrifice this artifact." +SVar:PerpAltCost:Mode$ Continuous | EffectZone$ All | MayPlay$ True | MayPlayAltManaCost$ R | MayPlayDontGrantZonePermissions$ True | Affected$ Card.Self | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ You may pay {R} rather than pay this spell's mana cost. +SVar:PhaseTrig:Mode$ Phase | ValidPlayer$ You | Phase$ End of Turn | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, sacrifice this artifact. SVar:TrigSacrifice:DB$ Sacrifice +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True DeckHas:Type$Artifact & Ability$Sacrifice -Oracle:Destroy up to three target artifacts. Conjure a duplicate of each nontoken artifact destroyed this way into your hand. The duplicates perpetually gain "You may pay {R} rather than pay this spell's mana cost" and "at the beginning of your end step, sacrifice this artifact.". +Oracle:Destroy up to three target artifacts. Conjure a duplicate of each nontoken artifact destroyed this way into your hand. The duplicates perpetually gain "You may pay {R} rather than pay this spell's mana cost" and "at the beginning of your end step, sacrifice this artifact." diff --git a/forge-gui/res/cardsfolder/g/goblin_morale_sergeant.txt b/forge-gui/res/cardsfolder/g/goblin_morale_sergeant.txt index 714577f155a..544dc1c7908 100644 --- a/forge-gui/res/cardsfolder/g/goblin_morale_sergeant.txt +++ b/forge-gui/res/cardsfolder/g/goblin_morale_sergeant.txt @@ -4,10 +4,8 @@ Types:Creature Goblin Soldier PT:2/1 K:Haste K:Enlist -T:Mode$ Enlisted | ValidCard$ Card.Self | ValidEnlisted$ Card.nonToken | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigConjure | TriggerDescription$ Whenever CARDNAME enlists a nontoken creature, you may conjure a duplicate of that creature into the top five cards of your library at random. The duplicate perpetually gets +1/+0 and gains haste. -SVar:TrigConjure:DB$ MakeCard | Conjure$ True | DefinedName$ TriggeredEnlisted | Zone$ Library | LibraryPosition$ Z | RememberMade$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | Name$ Goblin Morale Sergeant's Perpetual Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualAbility | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualAbility:Mode$ Continuous | AddPower$ 1 | AddKeyword$ Haste | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ The duplicate perpetually gets +1/+0 and gains haste. +T:Mode$ Enlisted | ValidCard$ Card.Self | ValidEnlisted$ Creature.nonToken | TriggerZones$ Battlefield | OptionalDecider$ You | Execute$ TrigConjure | TriggerDescription$ Whenever CARDNAME enlists a nontoken creature, you may conjure a duplicate of that creature into the top five cards of your library at random. The duplicate perpetually gets +1/+0 and gains haste. +SVar:TrigConjure:DB$ MakeCard | Conjure$ True | DefinedName$ TriggeredEnlisted | Zone$ Library | LibraryPosition$ Count$Random.0.4 | RememberMade$ True | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Remembered | PumpZone$ Library | KW$ Haste | NumAtt$ 1 | Duration$ Perpetual | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -SVar:Z:Count$Random.0.4 Oracle:Haste\nEnlist\nWhenever Goblin Morale Sergeant enlists a nontoken creature, you may conjure a duplicate of that creature into the top five cards of your library at random. The duplicate perpetually gets +1/+0 and gains haste. diff --git a/forge-gui/res/cardsfolder/g/goblin_trapfinder.txt b/forge-gui/res/cardsfolder/g/goblin_trapfinder.txt index d04ac152795..1aab98db43f 100644 --- a/forge-gui/res/cardsfolder/g/goblin_trapfinder.txt +++ b/forge-gui/res/cardsfolder/g/goblin_trapfinder.txt @@ -3,13 +3,11 @@ ManaCost:R Types:Creature Goblin PT:1/1 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ DBSeek | TriggerDescription$ When CARDNAME dies, seek a creature card with mana value 3 or less. That card perpetually gains haste, "This spell costs {1} less to cast," and "At the beginning of your end step, sacrifice this creature." -SVar:DBSeek:DB$ Seek | Type$ Creature.cmcLE3+YouOwn | RememberFound$ True | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | StaticAbilities$ PerpetualAbility | RememberObjects$ Remembered | Triggers$ Update | Name$ Goblin Trapfinder's Perpetual Effect | Duration$ Permanent -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddTrigger$ TrigSac | AddStaticAbility$ PerpetualReduceCost | AddKeyword$ Haste | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This card perpetually gains haste, "This spell costs {1} less to cast," and "At the beginning of your end step, sacrifice this creature." -SVar:PerpetualReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. -SVar:TrigSac:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, sacrifice this creature. +SVar:DBSeek:DB$ Seek | Type$ Creature.cmcLE3+YouOwn | RememberFound$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | staticAbilities$ ReduceCost | Triggers$ SacTrig | Keywords$ Haste | Duration$ Perpetual +SVar:ReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. +SVar:SacTrig:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigSacrifice | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your end step, sacrifice this creature. SVar:TrigSacrifice:DB$ Sacrifice -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember DeckHas:Ability$Sacrifice +DeckHints:Ability$Sacrifice Oracle:When Goblin Trapfinder dies, seek a creature card with mana value 3 or less. That card perpetually gains haste, "This spell costs {1} less to cast," and "At the beginning of your end step, sacrifice this creature." diff --git a/forge-gui/res/cardsfolder/h/heir_to_dragonfire.txt b/forge-gui/res/cardsfolder/h/heir_to_dragonfire.txt index 0dfd872a33f..a052f2cf173 100644 --- a/forge-gui/res/cardsfolder/h/heir_to_dragonfire.txt +++ b/forge-gui/res/cardsfolder/h/heir_to_dragonfire.txt @@ -3,7 +3,7 @@ ManaCost:1 R Types:Creature Human Warlock PT:2/2 A:AB$ Pump | Cost$ R | NumAtt$ +1 | SpellDescription$ CARDNAME gets +1/+0 until end of turn. -A:AB$ Effect | Cost$ 2 Reveal<1/CARDNAME> | StaticAbilities$ PerpetualPump | RememberObjects$ Self | Name$ Heir to Dragonfire's Perpetual Effect | Duration$ Permanent | ActivationZone$ Hand | SpellDescription$ CARDNAME perpetually becomes a Dragon, gets +3/+3, and gains flying. -SVar:PerpetualPump:Mode$ Continuous | Affected$ Card.IsRemembered | AddType$ Dragon | AddPower$ 3 | AddToughness$ 3 | EffectZone$ Command | AddKeyword$ Flying | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ EFFECTSOURCE perpetually becomes a Dragon, gets +3/+3, and gains flying. +A:AB$ Animate | Cost$ 2 R Reveal<1/CARDNAME> | Duration$ Perpetual | Types$ Dragon | RemoveCreatureTypes$ True | ActivationZone$ Hand | SubAbility$ DBPump | StackDescription$ SpellDescription | SpellDescription$ CARDNAME perpetually becomes a Dragon, +SVar:DBPump:DB$ Pump | Defined$ Self | PumpZone$ Hand | NumAtt$ 3 | NumDef$ 3 | KW$ Flying | Duration$ Perpetual | StackDescription$ SpellDescription | SpellDescription$ gets +3/+3, and gains flying. DeckHas:Type$Dragon -Oracle:{R}: Heir to Dragonfire gets +1/+0 until end of turn.\n{2}{R}, Reveal Heir to Dragonfire from your hand: Heir to Dragonfire perpetually becomes a Dragon, gets +3/+3, and gains flying. \ No newline at end of file +Oracle:{R}: Heir to Dragonfire gets +1/+0 until end of turn.\n{2}{R}, Reveal Heir to Dragonfire from your hand: Heir to Dragonfire perpetually becomes a Dragon, gets +3/+3, and gains flying. diff --git a/forge-gui/res/cardsfolder/h/high_fae_prankster.txt b/forge-gui/res/cardsfolder/h/high_fae_prankster.txt new file mode 100644 index 00000000000..9ba45fc31dd --- /dev/null +++ b/forge-gui/res/cardsfolder/h/high_fae_prankster.txt @@ -0,0 +1,12 @@ +Name:High Fae Prankster +ManaCost:2 U B +Types:Creature Faerie Rogue +PT:1/4 +K:Flying +K:Deathtouch +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY +SVar:TrigCharm:DB$ Charm | MinCharmNum$ 0 | CharmNum$ 1 | Choices$ Exchange,Switch +SVar:Exchange:DB$ ExchangePower | ValidTgts$ Creature | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | BasePower$ True | Duration$ Perpetual | SpellDescription$ Perpetually exchange target creature's base power with another target creature's base power. +SVar:Switch:DB$ Animate | Duration$ Perpetual | Power$ 4 | Toughness$ 1 | SpellDescription$ CARDNAME perpetually has base power and toughness 4/1. +SVar:NeedsToPlay:Creature.OppCtrl+powerGE4 +Oracle:Flying, deathtouch\nWhen High Fae Prankster enters the battlefield, choose up to one —\n• Perpetually exchange target creature's base power with another target creature's base power.\n• High Fae Prankster perpetually has base power and toughness 4/1. diff --git a/forge-gui/res/cardsfolder/h/holographic_double.txt b/forge-gui/res/cardsfolder/h/holographic_double.txt index 4c9c6327fa4..a53954a9a49 100644 --- a/forge-gui/res/cardsfolder/h/holographic_double.txt +++ b/forge-gui/res/cardsfolder/h/holographic_double.txt @@ -2,7 +2,7 @@ Name:Holographic Double ManaCost:U Types:Creature Illusion PT:1/1 -A:AB$ ChooseCard | Cost$ U ExileFromHand<1/CARDNAME> | ActivationZone$ Hand | Mandatory$ True | ChoiceZone$ Hand | Choices$ Creature.YouOwn | ChoiceDesc$ creature | FromDesc$ from their hand | ChoiceTitle$ Choose a creature card in your hand | Amount$ 1 | SubAbility$ DBConjure | SpellDescription$ Choose a creature card in your hand. +A:AB$ ChooseCard | Cost$ U ExileFromHand<1/CARDNAME> | ActivationZone$ Hand | Mandatory$ True | ChoiceZone$ Hand | Choices$ Creature.YouOwn | ChoiceDesc$ creature | ChoiceTitle$ Choose a creature card in your hand | Amount$ 1 | SubAbility$ DBConjure | SpellDescription$ Choose a creature card in your hand. SVar:DBConjure:DB$ MakeCard | Conjure$ True | DefinedName$ ChosenCard | Zone$ Hand | SubAbility$ DBCleanup | StackDescription$ {p:You} conjures a duplicate of it into their hand. | SpellDescription$ Conjure a duplicate of it into your hand. SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True Oracle:{U}, Exile Holographic Double from your hand: Choose a creature card in your hand. Conjure a duplicate of it into your hand. diff --git a/forge-gui/res/cardsfolder/n/nightsnare.txt b/forge-gui/res/cardsfolder/n/nightsnare.txt index bae5b954d81..ea18f730757 100644 --- a/forge-gui/res/cardsfolder/n/nightsnare.txt +++ b/forge-gui/res/cardsfolder/n/nightsnare.txt @@ -2,7 +2,7 @@ Name:Nightsnare ManaCost:3 B Types:Sorcery A:SP$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose | SpellDescription$ Target opponent reveals their hand. -SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ from it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. SVar:DBBranch:DB$ Branch | BranchCondition$ ChosenCard | TrueSubAbility$ DBDiscard | FalseSubAbility$ DBDiscard2 | StackDescription$ If they do, {p:Targeted} discards that card. If they don't, {p:Targeted} discards two cards. | SpellDescription$ If you do, that player discards that card. If you don't, that player discards two cards. SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup SVar:DBDiscard2:DB$ Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/r/racketeer_boss.txt b/forge-gui/res/cardsfolder/r/racketeer_boss.txt index f8b9c797710..75d7ec76fd0 100644 --- a/forge-gui/res/cardsfolder/r/racketeer_boss.txt +++ b/forge-gui/res/cardsfolder/r/racketeer_boss.txt @@ -3,11 +3,11 @@ ManaCost:R G Types:Creature Cat Warrior PT:3/2 T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, you may choose 2 creature and/or planeswalker cards in your hand. They perpetually gain "When you cast this spell, create a Treasure token and this spell perpetually loses this ability." -SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Creature.YouOwn,Planeswalker.YouOwn | ChoiceTitle$ Choose up to two creature and/or planeswalker cards in your hand. | MinAmount$ 0 | Amount$ 2 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ ChosenCard | ForgetOnCast$ True | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ GE1 | StaticAbilities$ PerpetualEffect | Name$ Racketeer Boss's Perpetual Effect | Duration$ Permanent | SubAbility$ DBCleanup -SVar:PerpetualEffect:Mode$ Continuous | Affected$ Card.IsRemembered | AddTrigger$ SpellCastTrig | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ When you cast this spell, create a Treasure token and this spell perpetually loses this ability. +SVar:TrigChoose:DB$ ChooseCard | ChoiceZone$ Hand | Choices$ Creature.YouOwn,Planeswalker.YouOwn | ChoiceTitle$ Choose up to two creature and/or planeswalker cards in your hand | MinAmount$ 0 | Amount$ 2 | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ ChosenCard | Triggers$ SpellCastTrig | Duration$ Perpetual | SubAbility$ DBCleanup SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigTreasure | TriggerDescription$ When you cast this spell, create a Treasure token and this spell perpetually loses this ability. -SVar:TrigTreasure:DB$ Token | TokenScript$ c_a_treasure_sac +SVar:TrigTreasure:DB$ Token | TokenScript$ c_a_treasure_sac | SubAbility$ DBLosePerpAbility +SVar:DBLosePerpAbility:DB$ LosePerpetual SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True DeckHints:Type$Planeswalker DeckHas:Ability$Token|Sacrifice & Type$Treasure|Artifact diff --git a/forge-gui/res/cardsfolder/r/raffines_guidance.txt b/forge-gui/res/cardsfolder/r/raffines_guidance.txt index f23aedee01d..b09866b10b1 100644 --- a/forge-gui/res/cardsfolder/r/raffines_guidance.txt +++ b/forge-gui/res/cardsfolder/r/raffines_guidance.txt @@ -6,4 +6,4 @@ A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. SVar:AltCost:Cost$ 2 W | ActivationZone$ Graveyard | Description$ You may cast CARDNAME from your graveyard by paying {2}{W} rather than paying its mana cost. DeckHas:Ability$Graveyard -Oracle:Enchant creature\nEnchanted creature gets +1/+1.\nYou may cast Raffine's Guidance from your graveyard by paying {2}{W} instead of its mana cost. +Oracle:Enchant creature\nEnchanted creature gets +1/+1.\nYou may cast Raffine's Guidance from your graveyard by paying {2}{W} rather than paying its mana cost. diff --git a/forge-gui/res/cardsfolder/r/reckoner_shakedown.txt b/forge-gui/res/cardsfolder/r/reckoner_shakedown.txt index af849b2eb72..7e16e0b6c6d 100644 --- a/forge-gui/res/cardsfolder/r/reckoner_shakedown.txt +++ b/forge-gui/res/cardsfolder/r/reckoner_shakedown.txt @@ -2,7 +2,7 @@ Name:Reckoner Shakedown ManaCost:2 B Types:Sorcery A:SP$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberRevealed$ True | SubAbility$ DBChoose | SpellDescription$ Target opponent reveals their hand. -SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ from it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. SVar:DBBranch:DB$ Branch | BranchCondition$ ChosenCard | TrueSubAbility$ DBDiscard | FalseSubAbility$ DBPutCounter | StackDescription$ If they do, {p:Targeted} discards that card. If they don't, they put two +1/+1 counters on a creature or Vehicle they control. | SpellDescription$ If you do, that player discards that card. If you don't, put two +1/+1 counters on a creature or Vehicle you control. SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup SVar:DBPutCounter:DB$ PutCounter | Choices$ Creature.YouCtrl,Vehicle.YouCtrl | ChoiceTitle$ Choose a creature or Vehicle you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/s/sarkhan_wanderer_to_shiv.txt b/forge-gui/res/cardsfolder/s/sarkhan_wanderer_to_shiv.txt index 5715dbc26b0..ff1d7fe174d 100644 --- a/forge-gui/res/cardsfolder/s/sarkhan_wanderer_to_shiv.txt +++ b/forge-gui/res/cardsfolder/s/sarkhan_wanderer_to_shiv.txt @@ -2,12 +2,9 @@ Name:Sarkhan, Wanderer to Shiv ManaCost:3 R Types:Legendary Planeswalker Sarkhan Loyalty:4 -A:AB$ Effect | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | RememberObjects$ ValidHand Dragon.YouOwn | StaticAbilities$ PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Sarkhan, Wanderer to Shiv's Perpetual Effect | SpellDescription$ Dragon cards in your hand perpetually gain "This spell costs {1} less to cast," and "You may pay {X} rather than pay this spell's mana cost, where X is its mana value." -SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddStaticAbility$ DragonReduceCost & DragonAltCost | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ Dragon cards in your hand perpetually gain "This spell costs {1} less to cast," and "You may pay {X} rather than pay this spell's mana cost, where X is its mana value." +A:AB$ AnimateAll | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidCards$ Dragon.YouOwn | Zone$ Hand | staticAbilities$ DragonReduceCost,DragonAltCost | Duration$ Perpetual | SpellDescription$ Dragon cards in your hand perpetually gain "This spell costs {1} less to cast," and "You may pay {X} rather than pay this spell's mana cost, where X is its mana value." SVar:DragonReduceCost:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ 1 | EffectZone$ All | Description$ This spell costs {1} less to cast. -SVar:DragonAltCost:Mode$ Continuous | CharacteristicDefining$ True | AddKeyword$ Alternative Cost:ConvertedManaCost | Description$ You may pay {X} rather than pay this spell's mana cost, where X is its mana value. -SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate -SVar:DBUpdate:DB$ UpdateRemember +SVar:DragonAltCost:Mode$ Continuous | EffectZone$ All | MayPlay$ True | MayPlayAltManaCost$ ConvertedManaCost | MayPlayDontGrantZonePermissions$ True | Affected$ Card.Self | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ You may pay {X} rather than pay this spell's mana cost, where X is its mana value. A:AB$ MakeCard | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Conjure$ True | Name$ Shivan Dragon | Zone$ Hand | SpellDescription$ Conjure a Shivan Dragon card into your hand. A:AB$ DealDamage | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to target creature. DeckHints:Type$Dragon diff --git a/forge-gui/res/cardsfolder/s/second_little_pig.txt b/forge-gui/res/cardsfolder/s/second_little_pig.txt index 85a450e01a8..f28aa8bfb31 100644 --- a/forge-gui/res/cardsfolder/s/second_little_pig.txt +++ b/forge-gui/res/cardsfolder/s/second_little_pig.txt @@ -2,7 +2,6 @@ Name:Second Little Pig ManaCost:1 WB Types:Creature Boar PT:2/3 -A:AB$ Effect | Cost$ 2 WB WB | StaticAbilities$ PerpetualSpirit | IsPresent$ Card.Self+!Spirit | RememberObjects$ Self | Name$ Second Little Pig's Perpetual Effect | Duration$ Permanent | SpellDescription$ CARDNAME perpetually becomes a Boar Spirit with base power and toughness 4/4 and gains flying. Activate only if CARDNAME isn't a Spirit. -SVar:PerpetualSpirit:Mode$ Continuous | AddKeyword$ Flying | Affected$ Card.IsRemembered | SetPower$ 4 | SetToughness$ 4 | AddType$ Spirit | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually becomes a Boar Spirit with base power and toughness 4/4 and gains flying. +A:AB$ Animate | Cost$ 2 WB WB | Duration$ Perpetual | Types$ Boar,Spirit | RemoveCreatureTypes$ True | Power$ 4 | Toughness$ 4 | Keywords$ Flying | IsPresent$ Card.Self+!Spirit | StackDescription$ CARDNAME perpetually becomes a Boar Spirit with base power and toughness 4/4 and gains flying. | SpellDescription$ CARDNAME perpetually becomes a Boar Spirit with base power and toughness 4/4 and gains flying. Activate only if CARDNAME isn't a Spirit. DeckHas:Type$Spirit Oracle:{2}{W/B}{W/B}: Second Little Pig perpetually becomes a Boar Spirit with base power and toughness 4/4 and gains flying. Activate only if Second Little Pig isn't a Spirit. diff --git a/forge-gui/res/cardsfolder/t/third_little_pig.txt b/forge-gui/res/cardsfolder/t/third_little_pig.txt index 0e5e4a0e14e..e048d588bdb 100644 --- a/forge-gui/res/cardsfolder/t/third_little_pig.txt +++ b/forge-gui/res/cardsfolder/t/third_little_pig.txt @@ -2,7 +2,6 @@ Name:Third Little Pig ManaCost:1 BG Types:Creature Boar PT:2/2 -T:Mode$ ConjureAll | ValidPlayer$ You | ValidCard$ Card | TriggerZones$ Battlefield,Graveyard | Execute$ TrigEffect | TriggerDescription$ Whenever you conjure one or more other cards, CARDNAME perpetually gets +1/+1. This ability also triggers if CARDNAME is in your graveyard. -SVar:TrigEffect:DB$ Effect | StaticAbilities$ PerpetualBuff | RememberObjects$ Self | Name$ Third Little Pig's Perpetual Effect | Duration$ Permanent -SVar:PerpetualBuff:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command | Description$ This creature perpetually gets +1/+1. -Oracle:Whenever you conjure one or more other cards, Third Little Pig perpetually gets +1/+1. This ability also triggers if Third Little Pig is in your graveyard. \ No newline at end of file +T:Mode$ ConjureAll | ValidPlayer$ You | ValidCard$ Card | TriggerZones$ Battlefield,Graveyard | Execute$ TrigPump | TriggerDescription$ Whenever you conjure one or more other cards, CARDNAME perpetually gets +1/+1. This ability also triggers if CARDNAME is in your graveyard. +SVar:TrigPump:DB$ Pump | Defined$ Self | PumpZone$ Battlefield,Graveyard | NumAtt$ 1 | NumDef$ 1 | Duration$ Perpetual +Oracle:Whenever you conjure one or more other cards, Third Little Pig perpetually gets +1/+1. This ability also triggers if Third Little Pig is in your graveyard. diff --git a/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt b/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt index ab69fa71449..eca8f6ed9a5 100644 --- a/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt +++ b/forge-gui/res/cardsfolder/t/toils_of_night_and_day.txt @@ -1,7 +1,7 @@ Name:Toils of Night and Day ManaCost:2 U Types:Instant Arcane -A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | SubAbility$ DBTapOrUntap | SpellDescription$ You may tap or untap target permanent, then you may tap or untap another target permanent. -SVar:DBTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select target permanent (2) | TargetUnique$ True +A:SP$ TapOrUntap | Cost$ 2 U | ValidTgts$ Permanent | SubAbility$ DBTapOrUntap | SpellDescription$ You may tap or untap target permanent, then you may tap or untap another target permanent. +SVar:DBTapOrUntap:DB$ TapOrUntap | ValidTgts$ Permanent | TgtPrompt$ Select another target permanent | TargetUnique$ True AI:RemoveDeck:All Oracle:You may tap or untap target permanent, then you may tap or untap another target permanent. diff --git a/forge-gui/res/cardsfolder/upcoming/cogwork_progenitor.txt b/forge-gui/res/cardsfolder/upcoming/cogwork_progenitor.txt new file mode 100644 index 00000000000..99c6893381b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cogwork_progenitor.txt @@ -0,0 +1,10 @@ +Name:Cogwork Progenitor +ManaCost:1 W +Types:Artifact Creature Gnome +PT:2/2 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigSeek | TriggerDescription$ At the beginning of your end step, you may exile another artifact you control or an artifact card in your graveyard. If you do, seek an artifact card. That card perpetually has base power and toughness 1/1 and becomes a Gnome creature in addition to its other types. +SVar:TrigSeek:AB$ Seek | Cost$ ExileCtrlOrGrave<1/Artifact.Other> | Type$ Artifact | RememberFound$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 1 | Toughness$ 1 | Types$ Creature,Gnome | Duration$ Perpetual | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckNeeds:Type$Artifact +Oracle:At the beginning of your end step, you may exile another artifact you control or an artifact card in your graveyard. If you do, seek an artifact card. That card perpetually has base power and toughness 1/1 and becomes a Gnome creature in addition to its other types.