diff --git a/forge-adventure/src/main/config/forge-adventure-mac.sh b/forge-adventure/src/main/config/forge-adventure-mac.sh new file mode 100644 index 00000000000..eb3d4f9adb7 --- /dev/null +++ b/forge-adventure/src/main/config/forge-adventure-mac.sh @@ -0,0 +1,3 @@ +#!/bin/sh +cd $(dirname "${0}") +java -XstartOnFirstThread -Xmx4096m -Dfile.encoding=UTF-8 -jar $project.build.finalName$ diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java index c3d65a43026..e09742febc0 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeCombatantsEffect.java @@ -40,17 +40,24 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect { @Override public void resolve(SpellAbility sa) { boolean isCombatChanged = false; - final Game game = sa.getActivatingPlayer().getGame(); + final Player activator = sa.getActivatingPlayer(); + final Game game = activator.getGame(); final TargetRestrictions tgt = sa.getTargetRestrictions(); // TODO: may expand this effect for defined blocker (False Orders, General Jarkeld, Sorrow's Path, Ydwen Efreet) for (final Card c : getTargetCards(sa)) { + String cardString = CardTranslation.getTranslatedName(c.getName()) + " (" + c.getId() + ")"; + boolean isOptional = sa.hasParam("Optional"); + if (isOptional && !activator.getController().confirmAction(sa, null, + Localizer.getInstance().getMessage("lblChangeCombatantOption", cardString), null)) { + continue; + } if ((tgt == null) || c.canBeTargetedBy(sa)) { final Combat combat = game.getCombat(); final GameEntity originalDefender = combat.getDefenderByAttacker(c); final FCollection defs = new FCollection<>(); defs.addAll(sa.hasParam("PlayerOnly") ? combat.getDefendingPlayers() : combat.getDefenders()); - String title = Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", CardTranslation.getTranslatedName(c.getName())); + String title = Localizer.getInstance().getMessage("lblChooseDefenderToAttackWithCard", cardString); Map params = Maps.newHashMap(); params.put("Attacker", c); diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 3dec9d6ae4e..c6b275ab8d7 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -426,7 +426,7 @@ public class CountersPutEffect extends SpellAbilityEffect { if (sa.hasParam("EachFromSource")) { for (Card c : AbilityUtils.getDefinedCards(card, sa.getParam("EachFromSource"), sa)) { for (Entry cti : c.getCounters().entrySet()) { - if (gameCard != null && gameCard.canReceiveCounters(cti.getKey())) { + if (gameCard != null) { gameCard.addCounter(cti.getKey(), cti.getValue(), placer, table); } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java index fc6e1b89f8c..ab0db62815d 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigUntilEffect.java @@ -17,6 +17,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.PlayerZone; import forge.game.zone.ZoneType; +import forge.util.Lang; import forge.util.Localizer; import forge.util.MyRandom; @@ -40,8 +41,10 @@ public class DigUntilEffect extends SpellAbilityEffect { sb.append(pl).append(" "); } - sb.append("reveals cards from their library until revealing "); - sb.append(untilAmount).append(" ").append(desc).append(" card"); + final ZoneType revealed = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); + sb.append(revealed.equals(ZoneType.Exile) ? "exiles cards from their library until they exile " : + "reveals cards from their library until revealing "); + sb.append(Lang.nounWithNumeralExceptOne(untilAmount, desc + " card")); if (untilAmount != 1) { sb.append("s"); } @@ -49,27 +52,30 @@ public class DigUntilEffect extends SpellAbilityEffect { untilAmount = AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("MaxRevealed"), sa); sb.append(" or ").append(untilAmount).append(" card/s"); } - sb.append(". Put "); + sb.append("."); - final ZoneType found = ZoneType.smartValueOf(sa.getParam("FoundDestination")); - final ZoneType revealed = ZoneType.smartValueOf(sa.getParam("RevealedDestination")); - if (found != null) { - sb.append(untilAmount > 1 ? "those cards" : "that card"); - sb.append(" "); + if (!sa.hasParam("NoPutDesc")) { + sb.append(" Put "); - if (found.equals(ZoneType.Hand)) { - sb.append("into their hand "); - } + final ZoneType found = ZoneType.smartValueOf(sa.getParam("FoundDestination")); + if (found != null) { + sb.append(untilAmount > 1 ? "those cards" : "that card"); + sb.append(" "); - if (revealed.equals(ZoneType.Graveyard)) { - sb.append("and all other cards into their graveyard."); - } - if (revealed.equals(ZoneType.Exile)) { - sb.append("and exile all other cards revealed this way."); - } - } else if (revealed != null) { - if (revealed.equals(ZoneType.Hand)) { - sb.append("all cards revealed this way into their hand"); + if (found.equals(ZoneType.Hand)) { + sb.append("into their hand "); + } + + if (revealed.equals(ZoneType.Graveyard)) { + sb.append("and all other cards into their graveyard."); + } + if (revealed.equals(ZoneType.Exile)) { + sb.append("and exile all other cards revealed this way."); + } + } else if (revealed != null) { + if (revealed.equals(ZoneType.Hand)) { + sb.append("all cards revealed this way into their hand"); + } } } return sb.toString(); diff --git a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java index 0dfe4aea02a..1ec51488864 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/TwoPilesEffect.java @@ -96,8 +96,6 @@ public class TwoPilesEffect extends SpellAbilityEffect { title = Localizer.getInstance().getMessage("lblDivideCardIntoTwoPiles"); } - card.clearRemembered(); - // first, separate the cards into piles final CardCollectionView pile1 = separator.getController().chooseCardsForEffect(pool, sa, title, 0, size, false, null); final CardCollection pile2 = new CardCollection(pool); @@ -147,25 +145,36 @@ public class TwoPilesEffect extends SpellAbilityEffect { } + if (sa.hasParam("RememberChosen")) { + card.addRemembered(chosenPile); + } + // take action on the chosen pile if (sa.hasParam("ChosenPile")) { + if (card.hasRemembered()) { + card.clearRemembered(); + } card.addRemembered(chosenPile); SpellAbility sub = sa.getAdditionalAbility("ChosenPile"); if (sub != null) { AbilityUtils.resolve(sub); } + card.clearRemembered(); } // take action on the unchosen pile if (sa.hasParam("UnchosenPile")) { - card.clearRemembered(); + if (card.hasRemembered()) { + card.clearRemembered(); + } card.addRemembered(unchosenPile); SpellAbility sub = sa.getAdditionalAbility("UnchosenPile"); if (sub != null) { AbilityUtils.resolve(sub); } + card.clearRemembered(); } } } diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java index 58441905bce..9b78fc03bfe 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbility.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbility.java @@ -152,7 +152,7 @@ public class StaticAbility extends CardTraitBase implements IIdentifiable, Clone layers.add(StaticAbilityLayer.MODIFYPT); } - if (hasParam("AddHiddenKeyword") + if (hasParam("AddHiddenKeyword") || hasParam("MayPlay") || hasParam("IgnoreEffectCost") || hasParam("Goad") || hasParam("CanBlockAny") || hasParam("CanBlockAmount") || hasParam("AdjustLandPlays") || hasParam("ControlVote") || hasParam("AdditionalVote") || hasParam("AdditionalOptionalVote")) { layers.add(StaticAbilityLayer.RULES); diff --git a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java index cb2c9c4f2e8..e1a1831c45b 100644 --- a/forge-gui-mobile/src/forge/adventure/util/RewardActor.java +++ b/forge-gui-mobile/src/forge/adventure/util/RewardActor.java @@ -73,6 +73,8 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb if (generatedTooltip != null) generatedTooltip.dispose(); } + if (T != null) + T.dispose(); } public Reward getReward() { @@ -81,7 +83,45 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb @Override public void onImageFetched() { - setCardImage(ImageCache.getImage(reward.getCard().getImageKey(false), false)); + image = ImageCache.getImage(reward.getCard().getImageKey(false), false); + if (image != null) { + try { + TextureRegionDrawable drawable = new TextureRegionDrawable(ImageCache.croppedBorderImage(image)); + if(Forge.isLandscapeMode()) + drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f); + else + drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f); + if (toolTipImage != null) { + if (toolTipImage.getDrawable() instanceof Texture) { + ((Texture) toolTipImage.getDrawable()).dispose(); + } + } + toolTipImage.remove(); + toolTipImage = new Image(drawable); + if (GuiBase.isAndroid()) { + if (holdTooltip.tooltip_image.getDrawable() instanceof Texture) { + ((Texture) holdTooltip.tooltip_image.getDrawable()).dispose(); + } + Actor ht = holdTooltip.tooltip_actor.getCells().get(0).getActor(); + if (ht != null && ht instanceof Image) { + if (((Image) ht).getDrawable() instanceof Texture) { + ((Texture) ((Image) ht).getDrawable()).dispose(); + } + } + holdTooltip.tooltip_actor.add(toolTipImage); + } else { + Image renderedImage = tooltip.getActor(); + if (renderedImage != null && renderedImage.getDrawable() instanceof Texture) { + ((Texture) tooltip.getActor().getDrawable()).dispose(); + } + tooltip.setActor(toolTipImage); + } + if (T != null) + T.dispose(); + } catch (Exception e) { + e.printStackTrace(); + } + } } public RewardActor(Reward reward, boolean flippable) { @@ -106,13 +146,6 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } T = renderPlaceholder(G, reward.getCard()); //Now we can render the card. setCardImage(T); - if (image == null) { - if (T == null) - System.err.println("Error generating placeholder image for card: "+reward.getCard().getName()); - else - image = T; - } - //Set the fetcher regardless. It'll replace the preview once it lands. fetcher.fetchImage(reward.getCard().getImageKey(false), this); } } @@ -217,14 +250,19 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f); else drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f); - toolTipImage = new Image(drawable); - tooltip = new Tooltip(toolTipImage); - holdTooltip = new HoldTooltip(new Image(drawable)); - tooltip.setInstant(true); - if (frontSideUp()) { - if (GuiBase.isAndroid()) + if (toolTipImage == null) + toolTipImage = new Image(drawable); + if (GuiBase.isAndroid()) { + if (holdTooltip == null) + holdTooltip = new HoldTooltip(toolTipImage); + if (frontSideUp()) addListener(holdTooltip); - else + + } else { + if (tooltip == null) + tooltip = new Tooltip(toolTipImage); + tooltip.setInstant(true); + if (frontSideUp()) addListener(tooltip); } } catch (Exception e) { @@ -253,45 +291,56 @@ public class RewardActor extends Actor implements Disposable, ImageFetcher.Callb } private void setItemTooltips(Sprite icon) { - float icon_w = 64f; float icon_h = 64f; //Sizes for the embedded icon. Could be made smaller on smaller resolutions. - Matrix4 m = new Matrix4(); - ItemData item = getReward().getItem(); - FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false); - frameBuffer.begin(); - m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. - Graphics G = new Graphics(); - G.begin(preview_w, preview_h); - G.setProjectionMatrix(m); - G.startClip(); - //Draw item description panel. - G.fillRect(new Color(0f, 0f, 0f, 0.96f), 0, 0, preview_w, preview_h); //Translucent background. - G.drawRectLines(2, Color.WHITE, 0, 0, preview_w, preview_h); //Add a border. - G.drawImage(icon, 2, 2, icon_w, icon_h); //Draw the item's icon. - G.drawText(item.name, FSkinFont.get(24), Color.WHITE, icon_w + 2, 2, preview_w - (icon_w + 2), icon_h, false, 1, true); //Item name. - G.drawRectLines(1, Color.WHITE, 6, icon_h + 2, preview_w - 12, preview_h - (icon_h + 6)); //Description border. - G.drawText(item.getDescription(), FSkinFont.get(18), Color.WHITE, 10, icon_h + 8, preview_w - 10, preview_h - 4, true, Align.left, false); //Description. - G.end(); - G.endClip(); - Texture result = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled()); - frameBuffer.end(); - G.dispose(); - frameBuffer.dispose(); + if (generatedTooltip == null) { + float icon_w = 64f; float icon_h = 64f; //Sizes for the embedded icon. Could be made smaller on smaller resolutions. + Matrix4 m = new Matrix4(); + ItemData item = getReward().getItem(); + FrameBuffer frameBuffer = new FrameBuffer(Pixmap.Format.RGBA8888, preview_w, preview_h, false); + frameBuffer.begin(); + m.setToOrtho2D(0,preview_h, preview_w, -preview_h); //So it renders flipped directly. + Graphics G = new Graphics(); + G.begin(preview_w, preview_h); + G.setProjectionMatrix(m); + G.startClip(); + //Draw item description panel. + G.fillRect(new Color(0f, 0f, 0f, 0.96f), 0, 0, preview_w, preview_h); //Translucent background. + G.drawRectLines(2, Color.WHITE, 0, 0, preview_w, preview_h); //Add a border. + G.drawImage(icon, 2, 2, icon_w, icon_h); //Draw the item's icon. + G.drawText(item.name, FSkinFont.get(24), Color.WHITE, icon_w + 2, 2, preview_w - (icon_w + 2), icon_h, false, 1, true); //Item name. + G.drawRectLines(1, Color.WHITE, 6, icon_h + 2, preview_w - 12, preview_h - (icon_h + 6)); //Description border. + G.drawText(item.getDescription(), FSkinFont.get(18), Color.WHITE, 10, icon_h + 8, preview_w - 10, preview_h - 4, true, Align.left, false); //Description. + G.end(); + G.endClip(); + generatedTooltip = new Texture(Pixmap.createFromFrameBuffer(0, 0, preview_w, preview_h), Forge.isTextureFilteringEnabled()); + frameBuffer.end(); + G.dispose(); + frameBuffer.dispose(); + } + //Rendering code ends here. - TextureRegionDrawable drawable = new TextureRegionDrawable(result); + TextureRegionDrawable drawable = new TextureRegionDrawable(generatedTooltip); if(Forge.isLandscapeMode()) drawable.setMinSize((Scene.getIntendedHeight() / RewardScene.CARD_WIDTH_TO_HEIGHT) * 0.95f, Scene.getIntendedHeight() * 0.95f); else drawable.setMinSize(Scene.getIntendedWidth() * 0.95f, Scene.getIntendedWidth()* RewardScene.CARD_WIDTH_TO_HEIGHT * 0.95f); - toolTipImage = new Image(drawable); - tooltip = new Tooltip<>(toolTipImage); - holdTooltip = new HoldTooltip(new Image(drawable)); - tooltip.setInstant(true); + + if (toolTipImage == null) + toolTipImage = new Image(drawable); + if (frontSideUp()) { - if (GuiBase.isAndroid()) addListener(holdTooltip); - else addListener(tooltip); + if (GuiBase.isAndroid()) { + if (holdTooltip == null) + holdTooltip = new HoldTooltip(toolTipImage); + addListener(holdTooltip); + } else { + if (tooltip == null) { + tooltip = new Tooltip<>(toolTipImage); + tooltip.setInstant(true); + } + addListener(tooltip); + } } - generatedTooltip = result; //Dispose of this later. } private boolean frontSideUp() { diff --git a/forge-gui/res/cardsfolder/a/atris_oracle_of_half_truths.txt b/forge-gui/res/cardsfolder/a/atris_oracle_of_half_truths.txt index e22158e926d..9e504f4b56c 100644 --- a/forge-gui/res/cardsfolder/a/atris_oracle_of_half_truths.txt +++ b/forge-gui/res/cardsfolder/a/atris_oracle_of_half_truths.txt @@ -7,7 +7,6 @@ T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.S SVar:DBChoosePlayer:DB$ Pump | ValidTgts$ Opponent | IsCurse$ True | SubAbility$ DBPeekAndReveal SVar:DBPeekAndReveal:DB$ PeekAndReveal | Defined$ You | PeekAmount$ 3 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ Separate SVar:Separate:DB$ TwoPiles | Defined$ You | Separator$ Targeted | Chooser$ You | DefinedCards$ Remembered | ChosenPile$ DBHand | UnchosenPile$ DBGrave | Zone$ Library | FaceDown$ One | StackDescription$ None -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard Oracle:Menace\nWhen Atris, Oracle of Half-Truths enters the battlefield, target opponent looks at the top three cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt b/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt index c1cf5ea0625..06e95c2f373 100644 --- a/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt +++ b/forge-gui/res/cardsfolder/a/aven_mimeomancer.txt @@ -4,8 +4,9 @@ Types:Creature Bird Wizard PT:3/1 K:Flying T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature has base power and toughness 3/1 and has flying for as long as it has a feather counter on it. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ FEATHER | CounterNum$ 1 | SubAbility$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ Targeted | StaticAbilities$ MimeomancerStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ FEATHER | Duration$ Permanent +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ FEATHER | CounterNum$ 1 | RememberCards$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ MimeomancerStatic | ForgetOnMoved$ Battlefield | ForgetCounter$ FEATHER | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MimeomancerStatic:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | SetPower$ 3 | SetToughness$ 1 | AddKeyword$ Flying | Description$ CARDNAME is 3/1 and has flying for as long as it has a feather counter on it. AI:RemoveDeck:All Oracle:Flying\nAt the beginning of your upkeep, you may put a feather counter on target creature. If you do, that creature has base power and toughness 3/1 and has flying for as long as it has a feather counter on it. diff --git a/forge-gui/res/cardsfolder/b/boneyard_parley.txt b/forge-gui/res/cardsfolder/b/boneyard_parley.txt index 09f7e8723a7..15c9d48a972 100644 --- a/forge-gui/res/cardsfolder/b/boneyard_parley.txt +++ b/forge-gui/res/cardsfolder/b/boneyard_parley.txt @@ -1,9 +1,8 @@ Name:Boneyard Parley ManaCost:5 B B Types:Sorcery -A:SP$ ChangeZone | Cost$ 5 B B | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 5 | TgtPrompt$ Select up to five target cards in graveyards | ValidTgts$ Card.Creature | RememberTargets$ True | SubAbility$ DBTwoPiles | AITgtOwnCards$ True | AIMinTgts$ 3 | SpellDescription$ Exile up to five target creature cards from graveyards. An opponent separates those cards into two piles. Put all cards from the pile of your choice onto the battlefield under your control and the rest into their owners' graveyards. -SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBBattlefield | UnchosenPile$ DBGrave -SVar:DBBattlefield:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TargetMin$ 0 | TargetMax$ 5 | TgtPrompt$ Select up to five target cards in graveyards | ValidTgts$ Card.Creature | SubAbility$ DBTwoPiles | AITgtOwnCards$ True | AIMinTgts$ 3 | SpellDescription$ Exile up to five target creature cards from graveyards. An opponent separates those cards into two piles. Put all cards from the pile of your choice onto the battlefield under your control and the rest into their owners' graveyards. +SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Targeted | Separator$ Opponent | ChosenPile$ DBBattlefield | UnchosenPile$ DBGrave +SVar:DBBattlefield:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | GainControl$ True +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard Oracle:Exile up to five target creature cards from graveyards. An opponent separates those cards into two piles. Put all cards from the pile of your choice onto the battlefield under your control and the rest into their owners' graveyards. diff --git a/forge-gui/res/cardsfolder/b/brilliant_ultimatum.txt b/forge-gui/res/cardsfolder/b/brilliant_ultimatum.txt index d9720c143ad..fbfca4d27b3 100644 --- a/forge-gui/res/cardsfolder/b/brilliant_ultimatum.txt +++ b/forge-gui/res/cardsfolder/b/brilliant_ultimatum.txt @@ -1,10 +1,9 @@ Name:Brilliant Ultimatum ManaCost:W W U U U B B Types:Sorcery -A:SP$ Dig | Cost$ W W U U U B B | Defined$ You | DigNum$ 5 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBTwoPiles | SpellDescription$ Exile the top five cards of your library. An opponent separates those cards into two piles. You may play lands and cast spells from one of those piles. If you cast a spell this way, you cast it without paying its mana cost. -SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBPlay | SubAbility$ DBCleanup +A:SP$ Dig | Defined$ You | DigNum$ 5 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBTwoPiles | SpellDescription$ Exile the top five cards of your library. An opponent separates those cards into two piles. You may play lands and cast spells from one of those piles. If you cast a spell this way, you cast it without paying its mana cost. +SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBPlay SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | Amount$ All -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Count$InYourLibrary SVar:NeedsToPlayVar:Y GE8 Oracle:Exile the top five cards of your library. An opponent separates those cards into two piles. You may play lands and cast spells from one of those piles. If you cast a spell this way, you cast it without paying its mana cost. diff --git a/forge-gui/res/cardsfolder/c/choose_your_demise.txt b/forge-gui/res/cardsfolder/c/choose_your_demise.txt index 517db3c0228..26ac255bbcf 100644 --- a/forge-gui/res/cardsfolder/c/choose_your_demise.txt +++ b/forge-gui/res/cardsfolder/c/choose_your_demise.txt @@ -4,7 +4,6 @@ Types:Scheme T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ TwoPiles | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, look at the top four cards of your library and separate them into a face-down pile and a face-up pile. An opponent chooses one of those piles. Put the cards in that pile into your hand and the rest on the bottom of your library in any order. SVar:TwoPiles:DB$ PeekAndReveal | Defined$ You | PeekAmount$ 4 | NoReveal$ True | RememberPeeked$ True | SubAbility$ Separate | SpellDescription$ When you set this scheme in motion, look at the top four cards of your library and separate them into a face-down pile and a face-up pile. An opponent chooses one of those piles. Put the cards in that pile into your hand and the rest on the bottom of your library in any order. SVar:Separate:DB$ TwoPiles | Defined$ You | Separator$ You | Chooser$ Opponent | DefinedCards$ Remembered | ChosenPile$ DBHand | UnchosenPile$ DBLibraryBottom | Zone$ Library | FaceDown$ One | StackDescription$ None -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBLibraryBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBLibraryBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 Oracle:When you set this scheme in motion, look at the top four cards of your library and separate them into a face-down pile and a face-up pile. An opponent chooses one of those piles. Put the cards in that pile into your hand and the rest on the bottom of your library in any order. diff --git a/forge-gui/res/cardsfolder/c/cyclone_sire.txt b/forge-gui/res/cardsfolder/c/cyclone_sire.txt index fc3dbe27372..65ae2c021b9 100644 --- a/forge-gui/res/cardsfolder/c/cyclone_sire.txt +++ b/forge-gui/res/cardsfolder/c/cyclone_sire.txt @@ -4,6 +4,7 @@ Types:Creature Elemental PT:3/4 K:Flying T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Battlefield | Destination$ Graveyard | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ When CARDNAME dies, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | RememberCards$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Flying\nWhen Cyclone Sire dies, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt b/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt index 95d7885e422..2d10c8125c9 100644 --- a/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt +++ b/forge-gui/res/cardsfolder/d/demonlord_belzenlok.txt @@ -5,8 +5,8 @@ PT:6/6 K:Flying K:Trample T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigRepeat | TriggerDescription$ When CARDNAME enters the battlefield, exile cards from the top of your library until you exile a nonland card, then put that card into your hand. If the card's mana value is 4 or greater, repeat this process. CARDNAME deals 1 damage to you for each card put into your hand this way. -SVar:TrigRepeat:DB$ Repeat | RepeatSubAbility$ DBCleanup | RepeatDefined$ Remembered | RepeatPresent$ Card.cmcGE4 | RepeatCompare$ EQ1 | StackDescription$ Exile cards from the top of your library until you exile a nonland card, then put that card into your hand. If the card's mana value is 4 or greater, repeat this process. CARDNAME deals 1 damage to you for each card put into your hand this way. +SVar:TrigRepeat:DB$ Repeat | RepeatSubAbility$ DBCleanup | RepeatDefined$ Remembered | RepeatPresent$ Card.cmcGE4 | RepeatCompare$ EQ1 SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBDigUntil -SVar:DBDigUntil:DB$ DigUntil | ValidPlayer$ You | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Hand | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBDealDamage +SVar:DBDigUntil:DB$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Hand | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBDealDamage SVar:DBDealDamage:DB$ DealDamage | NumDmg$ 1 | Defined$ You Oracle:Flying, trample\nWhen Demonlord Belzenlok enters the battlefield, exile cards from the top of your library until you exile a nonland card, then put that card into your hand. If the card's mana value is 4 or greater, repeat this process. Demonlord Belzenlok deals 1 damage to you for each card put into your hand this way. diff --git a/forge-gui/res/cardsfolder/e/eldrazi_obligator.txt b/forge-gui/res/cardsfolder/e/eldrazi_obligator.txt index 6e88dea0762..1e7256f30a8 100644 --- a/forge-gui/res/cardsfolder/e/eldrazi_obligator.txt +++ b/forge-gui/res/cardsfolder/e/eldrazi_obligator.txt @@ -4,7 +4,7 @@ Types:Creature Eldrazi PT:3/1 K:Devoid T:Mode$ SpellCast | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When you cast this spell, you may pay {1}{C}. If you do, gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. ({C} represents colorless mana.) -SVar:TrigChange:AB$GainControl | Cost$ 1 C | TgtPrompt$ Choose target creature. | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. +SVar:TrigChange:AB$ GainControl | Cost$ 1 C | ValidTgts$ Creature | LoseControl$ EOT | Untap$ True | AddKWs$ Haste | SpellDescription$ Gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. K:Haste DeckHints:Ability$Mana.Colorless Oracle:Devoid (This card has no color.)\nWhen you cast this spell, you may pay {1}{C}. If you do, gain control of target creature until end of turn, untap that creature, and it gains haste until end of turn. ({C} represents colorless mana.)\nHaste diff --git a/forge-gui/res/cardsfolder/e/epiphany_at_the_drownyard.txt b/forge-gui/res/cardsfolder/e/epiphany_at_the_drownyard.txt index 7bf1fbb7213..bdc47942b6b 100644 --- a/forge-gui/res/cardsfolder/e/epiphany_at_the_drownyard.txt +++ b/forge-gui/res/cardsfolder/e/epiphany_at_the_drownyard.txt @@ -1,11 +1,10 @@ Name:Epiphany at the Drownyard ManaCost:X U Types:Instant -A:SP$ PeekAndReveal | Cost$ X U | PeekAmount$ Y | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top X plus one cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. +A:SP$ PeekAndReveal | PeekAmount$ Y | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top X plus one cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Opponent | DefinedCards$ Remembered | Separator$ You | ChosenPile$ DBHand | UnchosenPile$ DBGrave | AILogic$ Worst -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard SVar:Y:Count$xPaid/Plus.1 SVar:X:Count$xPaid DeckHints:Ability$Delirium diff --git a/forge-gui/res/cardsfolder/f/fact_or_fiction.txt b/forge-gui/res/cardsfolder/f/fact_or_fiction.txt index d263921f9b8..3c72438bf39 100644 --- a/forge-gui/res/cardsfolder/f/fact_or_fiction.txt +++ b/forge-gui/res/cardsfolder/f/fact_or_fiction.txt @@ -3,7 +3,6 @@ ManaCost:3 U Types:Instant A:SP$ PeekAndReveal | PeekAmount$ 5 | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBGrave | StackDescription$ An opponent separates those cards into two piles. {p:You} puts one pile into their hand and the other into their graveyard. -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard Oracle:Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/f/fight_or_flight.txt b/forge-gui/res/cardsfolder/f/fight_or_flight.txt index d0fbc653f9c..f011219de77 100644 --- a/forge-gui/res/cardsfolder/f/fight_or_flight.txt +++ b/forge-gui/res/cardsfolder/f/fight_or_flight.txt @@ -3,8 +3,7 @@ ManaCost:3 W Types:Enchantment T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ Player.Opponent | Execute$ TrigTwoPile | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on each opponent's turn, separate all creatures that player controls into two piles. Only creatures in the pile of their choice can attack this turn. SVar:TrigTwoPile:DB$ TwoPiles | Defined$ TriggeredPlayer | Chooser$ TriggeredPlayer | ValidCards$ Creature | Zone$ Battlefield | Separator$ You | ChosenPile$ DBEffect -SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STCantAttack | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STCantAttack SVar:STCantAttack:Mode$ CantAttack | EffectZone$ Command | ValidCard$ Creature.IsNotRemembered | Description$ Only creatures in the pile of their choice can attack this turn. SVar:NonStackingAttachEffect:True Oracle:At the beginning of combat on each opponent's turn, separate all creatures that player controls into two piles. Only creatures in the pile of their choice can attack this turn. diff --git a/forge-gui/res/cardsfolder/f/fortunes_favor.txt b/forge-gui/res/cardsfolder/f/fortunes_favor.txt index ca9b3f5d4eb..84963947845 100644 --- a/forge-gui/res/cardsfolder/f/fortunes_favor.txt +++ b/forge-gui/res/cardsfolder/f/fortunes_favor.txt @@ -1,11 +1,10 @@ Name:Fortune's Favor ManaCost:3 U Types:Instant -A:SP$ PeekAndReveal | Cost$ 3 U | Defined$ You | PeekAmount$ 4 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ Separate | SpellDescription$ Target opponent looks at the top four cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. +A:SP$ PeekAndReveal | PeekAmount$ 4 | NoPeek$ True | NoReveal$ True | RememberPeeked$ True | SubAbility$ Separate | SpellDescription$ Target opponent looks at the top four cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. SVar:Separate:DB$ TwoPiles | Defined$ You | Separator$ TargetedPlayer | Chooser$ You | ValidTgts$ Opponent | DefinedCards$ Remembered | ChosenPile$ DBHand | UnchosenPile$ DBGrave | Zone$ Library | FaceDown$ One | StackDescription$ None -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard DeckHints:Ability$Delirium DeckHas:Ability$Graveyard Oracle:Target opponent looks at the top four cards of your library and separates them into a face-down pile and a face-up pile. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/h/hatchet_bully.txt b/forge-gui/res/cardsfolder/h/hatchet_bully.txt index 81d12301cf5..31a5861ed90 100644 --- a/forge-gui/res/cardsfolder/h/hatchet_bully.txt +++ b/forge-gui/res/cardsfolder/h/hatchet_bully.txt @@ -2,6 +2,5 @@ Name:Hatchet Bully ManaCost:3 R Types:Creature Goblin Warrior PT:3/3 -A:AB$ PutCounter | Cost$ 2 R T | CounterType$ M1M1 | CounterNum$ 1 | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | SubAbility$ DBDamage | SpellDescription$ Put a -1/-1 counter on a creature you control: CARDNAME deals 2 damage to any target. -SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 +A:AB$ DealDamage | Cost$ 2 R T AddCounter<1/M1M1/Creature.YouCtrl/a creature you control> | | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to any target. Oracle:{2}{R}, {T}, Put a -1/-1 counter on a creature you control: Hatchet Bully deals 2 damage to any target. diff --git a/forge-gui/res/cardsfolder/i/illuna_apex_of_wishes.txt b/forge-gui/res/cardsfolder/i/illuna_apex_of_wishes.txt index d38f41bf11d..8006aae5385 100644 --- a/forge-gui/res/cardsfolder/i/illuna_apex_of_wishes.txt +++ b/forge-gui/res/cardsfolder/i/illuna_apex_of_wishes.txt @@ -6,7 +6,7 @@ K:Mutate:3 RG U U K:Flying K:Trample T:Mode$ Mutates | ValidCard$ Card.Self | Execute$ TrigDigUntil | TriggerDescription$ Whenever this creature mutates, exile cards from the top of your library until you exile a nonland permanent card. Put that card onto the battlefield or into your hand. -SVar:TrigDigUntil:DB$ DigUntil | ValidPlayer$ You | Valid$ Permanent.nonLand | ValidDescription$ nonland permanent | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBChoose +SVar:TrigDigUntil:DB$ DigUntil | Valid$ Permanent.nonLand | ValidDescription$ nonland permanent | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBChoose SVar:DBChoose:DB$ GenericChoice | Choices$ Battlefield,Hand | Defined$ You SVar:Battlefield:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup | SpellDescription$ Put the nonland permanent onto the battlefield SVar:Hand:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand | SubAbility$ DBCleanup | SpellDescription$ Put the nonland permanent into your hand diff --git a/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt b/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt index 7119157201d..a47ae8e4a43 100644 --- a/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt +++ b/forge-gui/res/cardsfolder/j/jace_architect_of_thought.txt @@ -8,7 +8,7 @@ SVar:JacePump:DB$ Pump | Defined$ TriggeredAttacker | NumAtt$ -1 A:AB$ PeekAndReveal | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | PeekAmount$ 3 | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top three cards of your library. An opponent separates them into two piles. Put one pile into your hand and the other on the bottom of your library in any order. SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBLibraryBottom SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand -SVar:DBLibraryBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup +SVar:DBLibraryBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 A:AB$ RepeatEach | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBJaceExile | SubAbility$ DBPlayIt | SpellDescription$ For each player, search that player's library for a nonland card and exile it, then that player shuffles. You may cast those cards without paying their mana costs. SVar:DBJaceExile:DB$ ChangeZone | Origin$ Library | Destination$ Exile | DefinedPlayer$ Remembered | Chooser$ You | ChangeType$ Card.nonLand | ChangeNum$ 1 | Imprint$ True | Shuffle$ True SVar:DBPlayIt:DB$ Play | Defined$ Imprinted | Amount$ All | Controller$ You | WithoutManaCost$ True | ValidSA$ Spell | Optional$ True | RememberPlayed$ True | SubAbility$ DBCleanup diff --git a/forge-gui/res/cardsfolder/l/liliana_of_the_veil.txt b/forge-gui/res/cardsfolder/l/liliana_of_the_veil.txt index 5eb19f2b660..b4b22a2ea76 100644 --- a/forge-gui/res/cardsfolder/l/liliana_of_the_veil.txt +++ b/forge-gui/res/cardsfolder/l/liliana_of_the_veil.txt @@ -5,6 +5,6 @@ Loyalty:3 A:AB$ Discard | Cost$ AddCounter<1/LOYALTY> | NumCards$ 1 | Mode$ TgtChoose | Defined$ Player | Planeswalker$ True | SpellDescription$ Each player discards a card. A:AB$ Sacrifice | Cost$ SubCounter<2/LOYALTY> | ValidTgts$ Player | SacValid$ Creature | SacMessage$ Creature | Planeswalker$ True | SpellDescription$ Target player sacrifices a creature. A:AB$ TwoPiles | Cost$ SubCounter<6/LOYALTY> | ValidTgts$ Player | TgtPrompt$ Select target player | Separator$ You | ChosenPile$ DBSacAll | ValidCards$ Permanent | Zone$ Battlefield | Planeswalker$ True | Ultimate$ True | AILogic$ Worst | SpellDescription$ Separate all permanents target player controls into two piles. That player sacrifices all permanents in the pile of their choice. -SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Permanent.IsRemembered | SubAbility$ Cleanup -SVar:Cleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBSacAll:DB$ SacrificeAll | ValidCards$ Permanent.IsRemembered +DeckHas:Ability$Discard|Sacrifice Oracle:[+1]: Each player discards a card.\n[-2]: Target player sacrifices a creature.\n[-6]: Separate all permanents target player controls into two piles. That player sacrifices all permanents in the pile of their choice. diff --git a/forge-gui/res/cardsfolder/m/make_an_example.txt b/forge-gui/res/cardsfolder/m/make_an_example.txt index c166afa8c09..31038102d22 100644 --- a/forge-gui/res/cardsfolder/m/make_an_example.txt +++ b/forge-gui/res/cardsfolder/m/make_an_example.txt @@ -2,8 +2,7 @@ Name:Make an Example ManaCost:3 B Types:Sorcery A:SP$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBTwoPiles | SubAbility$ DBSac | SpellDescription$ Each opponent separates the creatures they control into two piles. For each opponent, you choose one of their piles. -SVar:DBTwoPiles:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | Chooser$ You | ChosenPile$ DBImprint | ValidCards$ Creature.RememberedPlayerCtrl | Zone$ Battlefield -SVar:DBImprint:DB$ Pump | ImprintCards$ Remembered -SVar:DBSac:DB$ SacrificeAll | Defined$ Imprinted | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices the creatures in their chosen pile. | SpellDescription$ Each opponent sacrifices the creatures in their chosen pile. (Piles can be empty.) -SVar:DBCleanup:DB$ Cleanup | ClearImprinted$ True | ClearRemembered$ True +SVar:DBTwoPiles:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | Chooser$ You | RememberChosen$ True | ValidCards$ Creature.RememberedPlayerCtrl | Zone$ Battlefield +SVar:DBSac:DB$ SacrificeAll | Defined$ Remembered | SubAbility$ DBCleanup | StackDescription$ Each opponent sacrifices the creatures in their chosen pile. | SpellDescription$ Each opponent sacrifices the creatures in their chosen pile. (Piles can be empty.) +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Each opponent separates the creatures they control into two piles. For each opponent, you choose one of their piles. Each opponent sacrifices the creatures in their chosen pile. (Piles can be empty.) diff --git a/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt b/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt index 7cfc5f40b2e..6308104d642 100644 --- a/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt +++ b/forge-gui/res/cardsfolder/n/noyan_dar_roil_shaper.txt @@ -3,7 +3,8 @@ ManaCost:3 W U Types:Legendary Creature Merfolk Ally PT:4/4 T:Mode$ SpellCast | ValidCard$ Instant,Sorcery | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ Whenever you cast an instant or sorcery spell, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | RememberCards$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:BuffedBy:Instant,Sorcery Oracle:Whenever you cast an instant or sorcery spell, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt index 5c69359b4ff..2e286064731 100644 --- a/forge-gui/res/cardsfolder/p/phyrexian_portal.txt +++ b/forge-gui/res/cardsfolder/p/phyrexian_portal.txt @@ -1,11 +1,10 @@ Name:Phyrexian Portal ManaCost:3 Types:Artifact -A:AB$ Dig | Cost$ 3 | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Defined$ You | DigNum$ 10 | RememberRevealed$ True | NoLooking$ True | NoMove$ True | Choser$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription -SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Targeted | FaceDown$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | ChosenPile$ DBHand | UnchosenPile$ DBExile | SubAbility$ DBCleanup +A:AB$ Dig | Cost$ 3 | ValidTgts$ Opponent | DigNum$ 10 | RememberRevealed$ True | NoLooking$ True | NoMove$ True | Choser$ Targeted | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SubAbility$ DBTwoPiles | SpellDescription$ If your library has ten or more cards in it, target opponent looks at the top ten cards of your library and separates them into two face-down piles. Exile one of those piles. Search the other pile for a card, put it into your hand, then shuffle the rest of that pile into your library. | StackDescription$ SpellDescription +SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Targeted | FaceDown$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | ChosenPile$ DBHand | UnchosenPile$ DBExile SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | ChangeType$ Card | ChangeNum$ 1 | ChooseFromDefined$ True | Mandatory$ True | Shuffle$ True SVar:DBExile:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Exile -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True # This variable may be incorrect if the controller changes while the ability is on the stack SVar:X:Count$InYourLibrary AI:RemoveDeck:All diff --git a/forge-gui/res/cardsfolder/p/portal_mage.txt b/forge-gui/res/cardsfolder/p/portal_mage.txt index 2ac066df665..9b8022dfaf5 100644 --- a/forge-gui/res/cardsfolder/p/portal_mage.txt +++ b/forge-gui/res/cardsfolder/p/portal_mage.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Creature Human Wizard PT:2/2 K:Flash -T:Mode$ ChangesZone | Phase$ Declare Attackers | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeAttacker | OptionalDecider$ You | TriggerDescription$ When Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. +T:Mode$ ChangesZone | Phase$ Declare Attackers | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeAttacker | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. (It can't attack its controller or its controller's planeswalkers.) SVar:TrigChangeAttacker:DB$ ChangeCombatants | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature AI:RemoveDeck:All Oracle:Flash\nWhen Portal Mage enters the battlefield during the declare attackers step, you may reselect which player or planeswalker target attacking creature is attacking. (It can't attack its controller or its controller's planeswalkers.) diff --git a/forge-gui/res/cardsfolder/r/raging_river.txt b/forge-gui/res/cardsfolder/r/raging_river.txt index ad6e1dafcfb..1b28b97b896 100644 --- a/forge-gui/res/cardsfolder/r/raging_river.txt +++ b/forge-gui/res/cardsfolder/r/raging_river.txt @@ -10,11 +10,10 @@ SVar:DBDefLeftRight:DB$ TwoPiles | Defined$ Remembered | Separator$ Remembered | SVar:DBDefLeftPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Left+IsImprinted | ImprintCards$ Remembered | Duration$ Permanent | SubAbility$ DBLeftPump SVar:DBDefRightPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Right+IsImprinted | ImprintCards$ Remembered | Duration$ Permanent | SubAbility$ DBRightPump SVar:DBClearImprinted:DB$ Cleanup | ClearImprinted$ True -SVar:DBAtkLeftRight:DB$ TwoPiles | Defined$ You | Separator$ You | ValidCards$ Creature.attacking+YouCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBAtkLeftPile | UnchosenPile$ DBAtkRightPile | AILogic$ Random | SubAbility$ DBCleanup +SVar:DBAtkLeftRight:DB$ TwoPiles | Defined$ You | Separator$ You | ValidCards$ Creature.attacking+YouCtrl | Zone$ Battlefield | LeftRightPile$ True | ChosenPile$ DBAtkLeftPile | UnchosenPile$ DBAtkRightPile | AILogic$ Random SVar:DBAtkLeftPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Left | RememberObjects$ RememberedCard | Duration$ Permanent | SubAbility$ DBLeftPump SVar:DBAtkRightPile:DB$ Animate | Defined$ ValidCommand Effect.namedRaging River Right | RememberObjects$ RememberedCard | Duration$ Permanent | SubAbility$ DBRightPump SVar:DBLeftPump:DB$ Pump | Defined$ Remembered | KW$ "Left" pile | Duration$ UntilEndOfCombat SVar:DBRightPump:DB$ Pump | Defined$ Remembered | KW$ "Right" pile | Duration$ UntilEndOfCombat -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE Oracle:Whenever one or more creatures you control attack, each defending player divides all creatures without flying they control into a "left" pile and a "right" pile. Then, for each attacking creature you control, choose "left" or "right." That creature can't be blocked this combat except by creatures with flying and creatures in a pile with the chosen label. diff --git a/forge-gui/res/cardsfolder/s/sphinx_of_uthuun.txt b/forge-gui/res/cardsfolder/s/sphinx_of_uthuun.txt index 7d2558d0940..09d25928e1d 100644 --- a/forge-gui/res/cardsfolder/s/sphinx_of_uthuun.txt +++ b/forge-gui/res/cardsfolder/s/sphinx_of_uthuun.txt @@ -4,9 +4,8 @@ Types:Creature Sphinx PT:5/6 K:Flying T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When CARDNAME enters the battlefield, reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. -SVar:TrigChangeZone:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. +SVar:TrigChangeZone:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBGrave SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard Oracle:Flying\nWhen Sphinx of Uthuun enters the battlefield, reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/s/stand_or_fall.txt b/forge-gui/res/cardsfolder/s/stand_or_fall.txt index 346c76854d7..8651ab72c83 100644 --- a/forge-gui/res/cardsfolder/s/stand_or_fall.txt +++ b/forge-gui/res/cardsfolder/s/stand_or_fall.txt @@ -3,9 +3,8 @@ ManaCost:3 R Types:Enchantment T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ RepeatPlayer | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, for each defending player, separate all creatures that player controls into two piles and that player chooses one. Only creatures in the chosen piles can block this turn. SVar:RepeatPlayer:DB$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBTwoPiles | SubAbility$ DBOnlyBlock -SVar:DBTwoPiles:DB$ TwoPiles | Defined$ Player.IsRemembered | Chooser$ Player.IsRemembered | Zone$ Battlefield | ValidCards$ Creature.RememberedPlayerCtrl | Separator$ You | ChosenPile$ DBRemember | AILogic$ Best -SVar:DBRemember:DB$ Pump | ImprintCards$ Remembered -SVar:DBOnlyBlock:DB$ PumpAll | KW$ HIDDEN CARDNAME can't block. | ValidCards$ Creature.OppCtrl+IsNotImprinted | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True +SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Remembered | Zone$ Battlefield | ValidCards$ Creature.RememberedPlayerCtrl | Separator$ You | RememberChosen$ True | AILogic$ Best +SVar:DBOnlyBlock:DB$ PumpAll | KW$ HIDDEN CARDNAME can't block. | ValidCards$ Creature.OppCtrl+IsNotRemembered | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:PlayMain1:TRUE Oracle:At the beginning of combat on your turn, for each defending player, separate all creatures that player controls into two piles and that player chooses one. Only creatures in the chosen piles can block this turn. diff --git a/forge-gui/res/cardsfolder/s/steam_augury.txt b/forge-gui/res/cardsfolder/s/steam_augury.txt index 19b3100cac0..aa8d812673a 100644 --- a/forge-gui/res/cardsfolder/s/steam_augury.txt +++ b/forge-gui/res/cardsfolder/s/steam_augury.txt @@ -3,7 +3,6 @@ ManaCost:2 U R Types:Instant A:SP$ PeekAndReveal | PeekAmount$ 5 | RememberRevealed$ True | NoPeek$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Opponent | DefinedCards$ Remembered | Separator$ You | ChosenPile$ DBHand | UnchosenPile$ DBGrave | AILogic$ Worst -SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand | SubAbility$ DBCleanup -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard Oracle:Reveal the top five cards of your library and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/u/undying_flames.txt b/forge-gui/res/cardsfolder/u/undying_flames.txt index 6d2faaba003..4ab12c5d51b 100644 --- a/forge-gui/res/cardsfolder/u/undying_flames.txt +++ b/forge-gui/res/cardsfolder/u/undying_flames.txt @@ -2,7 +2,7 @@ Name:Undying Flames ManaCost:4 R R Types:Sorcery K:Epic -A:SP$ DigUntil | Cost$ 4 R R | Defined$ You | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ UndyingDamage | SpellDescription$ Exile cards from the top of your library until you exile a nonland card. Undying Flames deals damage to any target equal to that card's mana value. +A:SP$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ UndyingDamage | NoPutDesc$ True | SpellDescription$ Exile cards from the top of your library until you exile a nonland card. Undying Flames deals damage to any target equal to that card's mana value. SVar:UndyingDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ FlameX | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:FlameX:Remembered$CardManaCost diff --git a/forge-gui/res/cardsfolder/u/unesh_criosphinx_sovereign.txt b/forge-gui/res/cardsfolder/u/unesh_criosphinx_sovereign.txt index 29f49f4b0c0..5b7e43d6d61 100644 --- a/forge-gui/res/cardsfolder/u/unesh_criosphinx_sovereign.txt +++ b/forge-gui/res/cardsfolder/u/unesh_criosphinx_sovereign.txt @@ -8,7 +8,6 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self,Card.Sphinx+Other+YouCtrl | Origin$ A SVar:TrigChangeZone:DB$ PeekAndReveal | PeekAmount$ 4 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBTwoPiles | SpellDescription$ Reveal the top five cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. SVar:DBTwoPiles:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand | UnchosenPile$ DBGrave SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand -SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Graveyard SVar:BuffedBy:Sphinx Oracle:Flying\nSphinx spells you cast cost {2} less to cast.\nWhenever Unesh, Criosphinx Sovereign or another Sphinx enters the battlefield under your control, reveal the top four cards of your library. An opponent separates those cards into two piles. Put one pile into your hand and the other into your graveyard. diff --git a/forge-gui/res/cardsfolder/u/urza_academy_headmaster.txt b/forge-gui/res/cardsfolder/u/urza_academy_headmaster.txt index 778f1f970d0..c7854e6c2f9 100644 --- a/forge-gui/res/cardsfolder/u/urza_academy_headmaster.txt +++ b/forge-gui/res/cardsfolder/u/urza_academy_headmaster.txt @@ -50,7 +50,7 @@ SVar:Mill8M:DB$ Mill | ValidTgts$ Player | TgtPrompt$ Select target player | Num SVar:Dig9M:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBTwoPiles9M | SpellDescription$ Reveal the top five cards of your library. An opponent separates them into two piles. Put one pile into your hand and the other on the bottom of your library in any order. SVar:DBTwoPiles9M:DB$ TwoPiles | Defined$ You | DefinedCards$ Remembered | Separator$ Opponent | ChosenPile$ DBHand9M | UnchosenPile$ DBLibraryBottom9M SVar:DBHand9M:DB$ ChangeZone | Defined$ Remembered | Origin$ Library | Destination$ Hand -SVar:DBLibraryBottom9M:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup +SVar:DBLibraryBottom9M:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 SVar:Exile10M:DB$ ChangeZone | ValidTgts$ Permanent | TgtPrompt$ Select target permanent | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent. SVar:Reveal11M:DB$ PeekAndReveal | PeekAmount$ 5 | NoPeek$ True | RememberRevealed$ True | SubAbility$ DBChangeCreatures11M | SpellDescription$ Reveal the top five cards of your library. You may put all creature cards and/or land cards from among them into your hand. Put the rest into your graveyard. SVar:DBChangeCreatures11M:DB$ ChangeZoneAll | ChangeType$ Card.Creature+IsRemembered | Origin$ Library | Destination$ Hand | Optional$ True | OptionQuestion$ Put all creature cards into your hand? | ForgetChanged$ True | SubAbility$ DBChangeLands11M diff --git a/forge-gui/res/cardsfolder/upcoming/durnan_of_the_yawning_portal.txt b/forge-gui/res/cardsfolder/upcoming/durnan_of_the_yawning_portal.txt index 08d5e646e55..dbaaeb6cd74 100644 --- a/forge-gui/res/cardsfolder/upcoming/durnan_of_the_yawning_portal.txt +++ b/forge-gui/res/cardsfolder/upcoming/durnan_of_the_yawning_portal.txt @@ -5,7 +5,7 @@ PT:3/3 T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ Whenever NICKNAME attacks, look at the top four cards of your library. You may exile a creature card from among them. Put the rest on the bottom of your library in any order. For as long as that card remains exiled, you may cast it. That spell has undaunted. (It costs {1} less to cast for each opponent.) SVar:TrigDig:DB$ Dig | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Creature | DestinationZone$ Exile | DestinationZone2$ Library | LibraryPosition$ -1 | RememberChanged$ True | SubAbility$ DBEffect SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ STPlay | Duration$ Permanent | ForgetOnMoved$ Exile | SubAbility$ DBCleanup -SVar:STPlay:Mode$ Continuous | MayPlay$ True | MayPlayIgnoreType$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AddKeyword$ Undaunted | AffectedZone$ Exile | Description$ For as long as that card remains exiled, you may cast it. That spell has undaunted. (It costs {1} less to cast for each opponent.) +SVar:STPlay:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonLand | AddKeyword$ Undaunted | AffectedZone$ Exile | Description$ For as long as that card remains exiled, you may cast it. That spell has undaunted. (It costs {1} less to cast for each opponent.) SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:HasAttackEffect:TRUE K:Choose a Background diff --git a/forge-gui/res/cardsfolder/upcoming/sarevoks_tome.txt b/forge-gui/res/cardsfolder/upcoming/sarevoks_tome.txt new file mode 100644 index 00000000000..1c4d3a2d664 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sarevoks_tome.txt @@ -0,0 +1,12 @@ +Name:Sarevok's Tome +ManaCost:4 +Types:Artifact +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigInitiative | TriggerDescription$ When CARDNAME enters the battlefield, you take the initiative. +SVar:TrigInitiative:DB$ TakeInitiative +A:AB$ Mana | Cost$ T | Produced$ C | Amount$ X | SpellDescription$ Add {C}. If you have the initiative, add {C}{C} instead. +SVar:X:Count$Initiative.2.1 +A:AB$ DigUntil | Cost$ 3 T | Valid$ Card.nonLand | ValidDescription$ nonland | FoundDestination$ Exile | RevealedDestination$ Exile | RememberFound$ True | SubAbility$ DBPlay | CheckSVar$ Y | NoPutDesc$ True | SpellDescription$ Exile cards from the top of your library until you exile a nonland card. You may cast that card without paying its mana cost. Activate only if you've completed a dungeon. +SVar:DBPlay:DB$ Play | Defined$ Remembered | DefinedDesc$ that card | ValidSA$ Spell | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:Y:PlayerCountPropertyYou$DungeonsCompleted +Oracle:When Sarevok's Tome enters the battlefield, you take the initiative.\n{T}: Add {C}. If you have the initiative, add {C}{C} instead.\n{3}, {T}: Exile cards from the top of your library until you exile a nonland card. You may cast that card without paying its mana cost. Activate only if you've completed a dungeon. diff --git a/forge-gui/res/cardsfolder/upcoming/skyline_savior.txt b/forge-gui/res/cardsfolder/upcoming/skyline_savior.txt new file mode 100644 index 00000000000..d9c8bd1788e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skyline_savior.txt @@ -0,0 +1,15 @@ +Name:Skyline Savior +ManaCost:1 W W +Types:Creature Angel +PT:3/4 +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, return a permanent you control to its owner's hand. If it's a non-Angel creature card, it perpetually gets +1/+1, gains flying, and becomes an Angel in addition to its other types. +SVar:TrigChange:DB$ ChangeZone | Origin$ Battlefield | Destination$ Hand | TgtPrompt$ Return a permanent you control to its owner's hand | ValidTgts$ Permanent.YouCtrl | RememberChanged$ True | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | RememberObjects$ Remembered | StaticAbilities$ PerpetualP1P1Fly,PerpetualAbility | Duration$ Permanent | Triggers$ Update | Name$ Skyline Savior's Perpetual Effect | ConditionCheckSVar$ X | ConditionSVarCompare$ GE1 | SubAbility$ DBCleanup +SVar:PerpetualP1P1Fly:Mode$ Continuous | Affected$ Card.IsRemembered | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ Flying | EffectZone$ Command | AffectedZone$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command +SVar:PerpetualAbility:Mode$ Continuous | Affected$ Card.IsRemembered | AddType$ Angel & Creature | EffectZone$ Command | AffectedZon$ Battlefield,Hand,Graveyard,Exile,Stack,Library,Command +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Targeted$Valid Creature.nonAngel +SVar:Update:Mode$ ChangesZone | Origin$ Any | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBUpdate +SVar:DBUpdate:DB$ UpdateRemember +Oracle:Flying\nWhen Skyline Savior enters the battlefield, return a permanent you control to its owner's hand. If it's a non-Angel creature card, it perpetually gets +1/+1, gains flying, and becomes an Angel in addition to its other types. diff --git a/forge-gui/res/cardsfolder/upcoming/split_the_spoils.txt b/forge-gui/res/cardsfolder/upcoming/split_the_spoils.txt new file mode 100644 index 00000000000..214ddfef5e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/split_the_spoils.txt @@ -0,0 +1,9 @@ +Name:Split the Spoils +ManaCost:2 G +Types:Sorcery +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Exile | ValidTgts$ Permanent.YouOwn | TargetMin$ 0 | TargetMax$ 5 | TgtPrompt$ Select up to five target permanent cards from your graveyard | SubAbility$ DBTwoPiles | SpellDescription$ Exile up to five target permanent cards from your graveyard +SVar:DBTwoPiles:DB$ TwoPiles | Chooser$ Opponent | DefinedCards$ Targeted | Separator$ You | ChosenPile$ DBHand | UnchosenPile$ DBGrave | AILogic$ Worst | StackDescription$ {p:You} separates them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. | SpellDescription$ and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. (Piles can be empty.) +SVar:DBHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Hand +SVar:DBGrave:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Graveyard +DeckHas:Ability$Graveyard +Oracle:Exile up to five target permanent cards from your graveyard and separate them into two piles. An opponent chooses one of those piles. Put that pile into your hand and the other into your graveyard. (Piles can be empty.) diff --git a/forge-gui/res/cardsfolder/upcoming/windshaper_planetar.txt b/forge-gui/res/cardsfolder/upcoming/windshaper_planetar.txt new file mode 100644 index 00000000000..2a13aa21724 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/windshaper_planetar.txt @@ -0,0 +1,11 @@ +Name:Windshaper Planetar +ManaCost:4 W +Types:Creature Angel +PT:4/4 +K:Flash +K:Flying +T:Mode$ ChangesZone | Phase$ Declare Attackers | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigEachAttacker | TriggerDescription$ When CARDNAME enters the battlefield during the declare attackers step, for each attacking creature, you may reselect which player or planeswalker that creature is attacking. (It can't attack its controller or its controller's planeswalkers.) +SVar:TrigEachAttacker:DB$ RepeatEach | RepeatCards$ Creature.attacking | RepeatSubAbility$ DBChangeAttacker +SVar:DBChangeAttacker:DB$ ChangeCombatants | Defined$ Remembered | Optional$ True +AI:RemoveDeck:All +Oracle:Flash\nFlying\nWhen Windshaper Planetar enters the battlefield during the declare attackers step, for each attacking creature, you may reselect which player or planeswalker that creature is attacking. (It can't attack its controller or its controller's planeswalkers.) diff --git a/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt b/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt index f2925493bc2..34499417214 100644 --- a/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt +++ b/forge-gui/res/cardsfolder/w/wall_of_resurgence.txt @@ -4,6 +4,7 @@ Types:Creature Wall PT:0/6 K:Defender T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. -SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Defined$ ParentTarget | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent +SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Land.YouCtrl | TgtPrompt$ Select target land you control | CounterType$ P1P1 | CounterNum$ 3 | RememberCards$ True | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Haste | Duration$ Permanent | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:Defender\nWhen Wall of Resurgence enters the battlefield, you may put three +1/+1 counters on target land you control. If you do, that land becomes a 0/0 Elemental creature with haste that's still a land. diff --git a/forge-gui/res/languages/de-DE.properties b/forge-gui/res/languages/de-DE.properties index d9d41a58429..c63f535772c 100644 --- a/forge-gui/res/languages/de-DE.properties +++ b/forge-gui/res/languages/de-DE.properties @@ -1824,6 +1824,7 @@ lblSelectACardPair=Wähle Karte zum Verbinden lblChooseBlockerForAttacker=Wähle Kreatur um {0} zu blocken lblChooseBlockersForPile=Wähle Kreaturen für Stapel {0} (Anzahl kann Null sein) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard=Welchen Verteidiger mit {0} angreifen? #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=Möchtest du das Ziel von {0} ändern? diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index a6e33c102e0..fc272cc9e4b 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -1825,6 +1825,7 @@ lblSelectACardPair=Select a card to pair with lblChooseBlockerForAttacker=Choose a creature to block {0} lblChooseBlockersForPile=Choose creatures to put in pile {0} (can be empty) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard=Choose which defender to attack with {0} #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=Do you want to change targets of {0}? diff --git a/forge-gui/res/languages/es-ES.properties b/forge-gui/res/languages/es-ES.properties index a958ef3753e..e417b427b99 100644 --- a/forge-gui/res/languages/es-ES.properties +++ b/forge-gui/res/languages/es-ES.properties @@ -1823,6 +1823,7 @@ lblSelectACardPair=Selecciona una carta para emparejarla con lblChooseBlockerForAttacker=Elige una criatura para bloquear a {0} lblChooseBlockersForPile=Elige criaturas para poner en la pila {0} (puede estar vacía) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard=Elige con qué defensor atacar con {0} #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=¿Quieres cambiar los objetivos de {0}? diff --git a/forge-gui/res/languages/it-IT.properties b/forge-gui/res/languages/it-IT.properties index a05c4995887..08333e7521e 100644 --- a/forge-gui/res/languages/it-IT.properties +++ b/forge-gui/res/languages/it-IT.properties @@ -1822,6 +1822,7 @@ lblSelectACardPair=Seleziona una carta con cui abbinarsi lblChooseBlockerForAttacker=Scegli una creatura per bloccare {0} lblChooseBlockersForPile=Scegli le creature da mettere nella pila {0} (può essere vuota) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard=Scegli quale bloccante attaccare con {0} #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=Vuoi cambiare i bersagli di {0}? diff --git a/forge-gui/res/languages/ja-JP.properties b/forge-gui/res/languages/ja-JP.properties index b0dcf152e0f..263d2530cb3 100644 --- a/forge-gui/res/languages/ja-JP.properties +++ b/forge-gui/res/languages/ja-JP.properties @@ -1822,6 +1822,7 @@ lblSelectACardPair=組にしたいカードを選ぶ lblChooseBlockerForAttacker={0}をブロックするクリーチャーを選ぶ lblChooseBlockersForPile={0}番の束に入れるクリーチャーを選ぶ(空にできる) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard={0}が攻撃する対象を選ぶ #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets={0}の対象を変更しますか? diff --git a/forge-gui/res/languages/pt-BR.properties b/forge-gui/res/languages/pt-BR.properties index fe47d779f1a..05e5f4fdc0a 100644 --- a/forge-gui/res/languages/pt-BR.properties +++ b/forge-gui/res/languages/pt-BR.properties @@ -1884,6 +1884,7 @@ lblSelectACardPair=Escolha a carta para parear com lblChooseBlockerForAttacker=Escolha um criatura para bloquear {0} lblChooseBlockersForPile=Escolha criaturas para colocar na pilha {0} (pode estar vazio) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWithCard=Escolha qual defensor atacar com {0} #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=Você quer mudar os alvos de {0}? diff --git a/forge-gui/res/languages/zh-CN.properties b/forge-gui/res/languages/zh-CN.properties index 98aeec6bf1e..acd13c4113e 100644 --- a/forge-gui/res/languages/zh-CN.properties +++ b/forge-gui/res/languages/zh-CN.properties @@ -1826,6 +1826,7 @@ lblSelectACardPair=选择要组成搭档的牌 lblChooseBlockerForAttacker=选择一个用于阻挡{0}的生物 lblChooseBlockersForPile=选择要放入堆{0}中的生物(可以一个都不放) #ChangeCombatantsEffect.java +lblChangeCombatantOption=Do you want to reselect what {0} is attacking? lblChooseDefenderToAttackWith=选择守军进行进攻 #ChangeTargetsEffect.java lblDoYouWantChangeAbilityTargets=你是否想要更改{0}的目标