From 8c7283d02c5bc435dad8e28304afe512868ed22c Mon Sep 17 00:00:00 2001 From: Northmoc <103371817+Northmoc@users.noreply.github.com> Date: Wed, 6 Mar 2024 02:02:22 -0500 Subject: [PATCH] WHO: caught_in_a_parallel_universe.txt + support (#4093) * WHO: caught_in_a_parallel_universe.txt + support * coward_killer.txt tidy * human_time_lord_meta_crisis + support * more tweaks for grenzos_rebuttal and similar --- .../ability/effects/ChooseCardEffect.java | 68 ++++++++++++------- .../ability/effects/CopyPermanentEffect.java | 9 +++ .../ability/effects/CountersPutAllEffect.java | 23 +++++-- .../src/main/java/forge/game/card/Card.java | 8 +++ .../java/forge/game/card/CardProperty.java | 18 ----- .../cardsfolder/a/aragorn_company_leader.txt | 2 +- forge-gui/res/cardsfolder/c/cataclysm.txt | 10 +-- .../cardsfolder/c/cataclysmic_gearhulk.txt | 13 ++-- forge-gui/res/cardsfolder/c/coward_killer.txt | 7 +- .../res/cardsfolder/g/grenzos_rebuttal.txt | 13 ++-- .../res/cardsfolder/i/interplanar_tunnel.txt | 2 +- forge-gui/res/cardsfolder/m/morphic_tide.txt | 2 +- .../res/cardsfolder/m/mutual_epiphany.txt | 2 +- .../res/cardsfolder/m/mythos_of_snapdax.txt | 16 ++--- .../res/cardsfolder/p/planewide_disaster.txt | 2 +- .../res/cardsfolder/r/reality_shaping.txt | 2 +- .../res/cardsfolder/s/sculpted_sunburst.txt | 2 +- .../res/cardsfolder/s/stick_together.txt | 3 +- .../res/cardsfolder/t/time_distortion.txt | 2 +- .../caught_in_a_parallel_universe.txt | 9 +++ .../upcoming/human_time_lord_meta_crisis.txt | 12 ++++ .../java/forge/gui/card/CardScriptParser.java | 3 +- 22 files changed, 130 insertions(+), 98 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/caught_in_a_parallel_universe.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/human_time_lord_meta_crisis.txt 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 36c25a16e65..786da9aea6d 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 @@ -3,7 +3,7 @@ import java.util.*; import com.google.common.collect.Lists; -import com.google.common.collect.Sets; +import forge.game.Direction; import forge.game.player.DelayedReveal; import forge.game.player.PlayerView; import forge.util.CardTranslation; @@ -59,7 +59,7 @@ public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); final Player activator = sa.getActivatingPlayer(); final Game game = activator.getGame(); - CardCollection chosen = new CardCollection(); + CardCollection allChosen = new CardCollection(); final List tgtPlayers = getDefinedPlayersOrTargeted(sa); @@ -100,9 +100,22 @@ public void resolve(SpellAbility sa) { boolean revealTitle = (sa.hasParam("RevealTitle")); for (Player p : tgtPlayers) { + CardCollectionView pChoices = choices; + CardCollection chosen = new CardCollection(); if (!p.isInGame()) { p = getNewChooser(sa, activator, p); } + if (sa.hasParam("ControlledByPlayer")) { + final String param = sa.getParam("ControlledByPlayer"); + if (param.equals("Chooser")) { + pChoices = CardLists.filterControlledBy(pChoices, p); + } else if (param.equals("Left") || param.equals("Right")) { + pChoices = CardLists.filterControlledBy(pChoices, game.getNextPlayerAfter(p, + Direction.valueOf(param))); + } else { + pChoices = CardLists.filterControlledBy(pChoices, AbilityUtils.getDefinedPlayers(host, param, sa)); + } + } boolean dontRevealToOwner = true; if (sa.hasParam("EachBasicType")) { // Get all lands, @@ -123,16 +136,17 @@ public void resolve(SpellAbility sa) { } } } - } else if (sa.hasParam("ChooseParty")) { - Set partyTypes = Sets.newHashSet("Cleric", "Rogue", "Warrior", "Wizard"); - for (final String type : partyTypes) { - CardCollection valids = CardLists.filter(p.getCardsIn(ZoneType.Battlefield), - CardPredicates.isType(type)); - valids.removeAll(chosen); + } else if (sa.hasParam("ChooseEach")) { + final String s = sa.getParam("ChooseEach"); + final String[] types = s.equals("Party") ? new String[]{"Cleric","Thief","Warrior","Wizard"} + : s.split(" & "); + for (final String type : types) { + CardCollection valids = CardLists.filter(pChoices, CardPredicates.isType(type)); if (!valids.isEmpty()) { final String prompt = Localizer.getInstance().getMessage("lblChoose") + " " + Lang.nounWithNumeralExceptOne(1, type); - Card c = p.getController().chooseSingleEntityForEffect(valids, sa, prompt, true, null); + Card c = p.getController().chooseSingleEntityForEffect(valids, sa, prompt, + !sa.hasParam("Mandatory"), null); if (c != null) { chosen.add(c); } @@ -168,9 +182,9 @@ public void resolve(SpellAbility sa) { CardCollection chosenPool = new CardCollection(); String title = Localizer.getInstance().getMessage("lblChooseCreature"); Card choice = null; - while (!choices.isEmpty() && chosenPool.size() < validAmount) { + while (!pChoices.isEmpty() && chosenPool.size() < validAmount) { boolean optional = chosenPool.size() >= minAmount; - CardCollection creature = (CardCollection) choices; + CardCollection creature = (CardCollection) pChoices; if (!chosenPool.isEmpty()) { title = Localizer.getInstance().getMessage("lblChooseCreatureWithDiffPower"); } @@ -180,7 +194,7 @@ public void resolve(SpellAbility sa) { } chosenPool.add(choice); restrict = restrict + (restrict.contains(".") ? "+powerNE" : ".powerNE") + choice.getNetPower(); - choices = CardLists.getValidCards(choices, restrict, activator, host, sa); + pChoices = CardLists.getValidCards(pChoices, restrict, activator, host, sa); } if (choice != null) { chosenPool.add(choice); @@ -189,7 +203,7 @@ public void resolve(SpellAbility sa) { } else if (sa.hasParam("EachDifferentPower")) { List powers = new ArrayList<>(); CardCollection chosenPool = new CardCollection(); - for (Card c : choices) { + for (Card c : pChoices) { int pow = c.getNetPower(); if (!powers.contains(pow)) { powers.add(c.getNetPower()); @@ -200,7 +214,7 @@ public void resolve(SpellAbility sa) { re = re + (re.contains(".") ? "+powerEQ" : ".powerEQ"); for (int i : powers) { String restrict = re + i; - CardCollection valids = CardLists.getValidCards(choices, restrict, activator, host, sa); + CardCollection valids = CardLists.getValidCards(pChoices, restrict, activator, host, sa); Card choice = p.getController().chooseSingleEntityForEffect(valids, sa, Localizer.getInstance().getMessage("lblChooseCreatureWithXPower", i), false, null); chosenPool.add(choice); @@ -209,17 +223,17 @@ public void resolve(SpellAbility sa) { } else if (sa.hasParam("ControlAndNot")) { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseCreature"); // Targeted player (p) chooses N creatures that belongs to them - CardCollection tgtPlayerCtrl = CardLists.filterControlledBy(choices, p); + CardCollection tgtPlayerCtrl = CardLists.filterControlledBy(pChoices, p); chosen.addAll(p.getController().chooseCardsForEffect(tgtPlayerCtrl, sa, title + " " + "you control", minAmount, validAmount, !sa.hasParam("Mandatory"), null)); // Targeted player (p) chooses N creatures that don't belong to them - CardCollection notTgtPlayerCtrl = new CardCollection(choices); + CardCollection notTgtPlayerCtrl = new CardCollection(pChoices); notTgtPlayerCtrl.removeAll(tgtPlayerCtrl); chosen.addAll(p.getController().chooseCardsForEffect(notTgtPlayerCtrl, sa, title + " " + "you don't control", minAmount, validAmount, !sa.hasParam("Mandatory"), null)); - } else if (sa.hasParam("AtRandom") && !choices.isEmpty()) { + } else if (sa.hasParam("AtRandom") && !pChoices.isEmpty()) { // don't pass FCollection for direct modification, the Set part would get messed up - chosen = new CardCollection(Aggregates.random(choices, validAmount)); + chosen = new CardCollection(Aggregates.random(pChoices, validAmount)); dontRevealToOwner = false; } else { String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; @@ -252,7 +266,7 @@ public void resolve(SpellAbility sa) { DelayedReveal delayedReveal = new DelayedReveal(shown, ZoneType.Library, PlayerView.get(searched), CardTranslation.getTranslatedName(host.getName()) + " - " + Localizer.getInstance().getMessage("lblLookingCardIn") + " "); - Card choice = p.getController().chooseSingleEntityForEffect(choices, delayedReveal, sa, title, + Card choice = p.getController().chooseSingleEntityForEffect(pChoices, delayedReveal, sa, title, !sa.hasParam("Mandatory"), p, null); if (choice == null) { return; @@ -263,7 +277,7 @@ public void resolve(SpellAbility sa) { p.removeController(controlTimestamp); } } else { - chosen.addAll(p.getController().chooseCardsForEffect(choices, sa, title, minAmount, validAmount, + chosen.addAll(p.getController().chooseCardsForEffect(pChoices, sa, title, minAmount, validAmount, !sa.hasParam("Mandatory"), null)); } } @@ -271,26 +285,30 @@ public void resolve(SpellAbility sa) { game.getAction().reveal(chosen, p, dontRevealToOwner, revealTitle ? sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " ", !revealTitle); } + if (sa.hasParam("ChosenMap")) { + host.addToChosenMap(p, chosen); + } + allChosen.addAll(chosen); } if (sa.hasParam("Reveal") && sa.hasParam("SecretlyChoose")) { for (final Player p : tgtPlayers) { - game.getAction().reveal(chosen, p, true, revealTitle ? + game.getAction().reveal(allChosen, p, true, revealTitle ? sa.getParam("RevealTitle") : Localizer.getInstance().getMessage("lblChosenCards") + " ", !revealTitle); } } - host.setChosenCards(chosen); + host.setChosenCards(allChosen); if (sa.hasParam("ForgetOtherRemembered")) { host.clearRemembered(); } if (sa.hasParam("RememberChosen")) { - host.addRemembered(chosen); + host.addRemembered(allChosen); } if (sa.hasParam("ForgetChosen")) { - host.removeRemembered(chosen); + host.removeRemembered(allChosen); } if (sa.hasParam("ImprintChosen")) { - host.addImprintedCards(chosen); + host.addImprintedCards(allChosen); } } } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java index 71df45261c0..6f1d5b492d6 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopyPermanentEffect.java @@ -106,6 +106,7 @@ public void resolve(final SpellAbility sa) { final Player activator = sa.getActivatingPlayer(); final Game game = host.getGame(); boolean useZoneTable = true; + boolean chosenMap = "ChosenMap".equals(sa.getParam("Defined")); CardZoneTable triggerList = sa.getChangeZoneTable(); if (triggerList == null) { triggerList = new CardZoneTable(); @@ -130,6 +131,8 @@ public void resolve(final SpellAbility sa) { List controllers = Lists.newArrayList(); if (sa.hasParam("Controller")) { controllers = AbilityUtils.getDefinedPlayers(host, sa.getParam("Controller"), sa); + } else if (chosenMap) { + controllers.addAll(host.getChosenMap().keySet()); } if (controllers.isEmpty()) { controllers.add(activator); @@ -223,6 +226,12 @@ public void resolve(final SpellAbility sa) { } } } + } else if (chosenMap) { + if (sa.hasParam("ChosenMapIndex")) { + final int index = Integer.valueOf(sa.getParam("ChosenMapIndex")); + if (index >= host.getChosenMap().get(controller).size()) continue; + tgtCards.add(host.getChosenMap().get(controller).get(index)); + } else tgtCards = host.getChosenMap().get(controller); } else { tgtCards = getDefinedCardsOrTargeted(sa); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java index 5d8b12f6e5d..804c41d5b4c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutAllEffect.java @@ -45,7 +45,7 @@ public void resolve(SpellAbility sa) { final Card host = sa.getHostCard(); final Player activator = sa.getActivatingPlayer(); final CounterType type = CounterType.getType(sa.getParam("CounterType")); - final int counterAmount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("CounterNum", "1"), sa); + int counterAmount = AbilityUtils.calculateAmount(host, sa.getParamOrDefault("CounterNum", "1"), sa); final String valid = sa.getParam("ValidCards"); final ZoneType zone = sa.hasParam("ValidZone") ? ZoneType.smartValueOf(sa.getParam("ValidZone")) : ZoneType.Battlefield; final Game game = activator.getGame(); @@ -63,11 +63,13 @@ public void resolve(SpellAbility sa) { } Player placer = activator; - boolean placerPerCard = false; + String placerPerCard = ""; if (sa.hasParam("Placer")) { final String pstr = sa.getParam("Placer"); - if (pstr.contains("Controller")) { - placerPerCard = true; + if (pstr.equals("Controller")) { + placerPerCard = "Controller"; + } else if (pstr.equals("Owner")) { + placerPerCard = "Owner"; } else { placer = AbilityUtils.getDefinedPlayers(host, pstr, sa).get(0); } @@ -75,8 +77,17 @@ public void resolve(SpellAbility sa) { GameEntityCounterTable table = new GameEntityCounterTable(); for (final Card tgtCard : cards) { - if (placerPerCard) { + if (placerPerCard.equals("Controller")) { placer = tgtCard.getController(); + } else if (placerPerCard.equals("Owner")) { + placer = tgtCard.getOwner(); + } + if (sa.hasParam("AmountByChosenMap")) { + final String[] parse = sa.getParam("AmountByChosenMap").split(" INDEX "); + final int index = parse.length > 1 ? Integer.valueOf(parse[1]) : 0; + if (index >= host.getChosenMap().get(placer).size()) continue; + final Card chosen = host.getChosenMap().get(placer).get(index); + counterAmount = AbilityUtils.xCount(chosen, parse[0], sa); } tgtCard.addCounter(type, counterAmount, placer, table); } @@ -97,7 +108,7 @@ public void resolve(SpellAbility sa) { AbilityUtils.calculateAmount(host, sa.getParam("CounterNum2"), sa) : counterAmount; for (final Card tgtCard : cards) { - if (placerPerCard) { + if (placerPerCard.equals("Controller")) { placer = tgtCard.getController(); } tgtCard.addCounter(type2, counterAmount2, placer, table); 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 4554c46f3a4..9ee65e8c87a 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -113,6 +113,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { private Map mustBlockCards = Maps.newHashMap(); private List blockedThisTurn = Lists.newArrayList(); private List blockedByThisTurn = Lists.newArrayList(); + private Map chosenMap = Maps.newHashMap(); private CardCollection untilLeavesBattlefield = new CardCollection(); @@ -1162,6 +1163,13 @@ public final void clearImprintedCards() { imprintedCards = view.clearCards(imprintedCards, TrackableProperty.ImprintedCards); } + public final void addToChosenMap(final Player p, final CardCollection chosen) { + chosenMap.put(p, chosen); + } + public final Map getChosenMap() { + return chosenMap; + } + public final CardCollectionView getExiledCards() { return CardCollection.getView(exiledCards); } diff --git a/forge-game/src/main/java/forge/game/card/CardProperty.java b/forge-game/src/main/java/forge/game/card/CardProperty.java index 5527d0b7040..2d63b49521f 100644 --- a/forge-game/src/main/java/forge/game/card/CardProperty.java +++ b/forge-game/src/main/java/forge/game/card/CardProperty.java @@ -1076,24 +1076,6 @@ public static boolean cardHasProperty(Card card, String property, Player sourceC if (!card.wasMilled()) { return false; } - } else if (property.startsWith("ControlledByPlayerInTheDirection")) { - final String restrictions = property.split("ControlledByPlayerInTheDirection_")[1]; - final String[] res = restrictions.split("_"); - final Direction direction = Direction.valueOf(res[0]); - Player p = null; - if (res.length > 1) { - for (Player pl : game.getPlayers()) { - if (pl.isValid(res[1], sourceController, source, spellAbility)) { - p = pl; - break; - } - } - } else { - p = sourceController; - } - if (p == null || !controller.equals(game.getNextPlayerAfter(p, direction))) { - return false; - } } else if (property.equals("hasABasicLandType")) { if (!card.hasABasicLandType()) { return false; diff --git a/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt b/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt index 01040831428..51584e4d16b 100644 --- a/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt +++ b/forge-gui/res/cardsfolder/a/aragorn_company_leader.txt @@ -5,6 +5,6 @@ PT:3/3 T:Mode$ RingTemptsYou | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigPutCounters | TriggerDescription$ Whenever the Ring tempts you, if you chose a creature other than CARDNAME as your Ring-bearer, put your choice of a counter from among first strike, vigilance, deathtouch, and lifelink on NICKNAME. SVar:TrigPutCounters:DB$ PutCounter | CounterType$ First Strike,Vigilance,Deathtouch,Lifelink | Defined$ Self T:Mode$ CounterPlayerAddedAll | ValidObject$ Card.Self+inRealZoneBattlefield | TriggerZones$ Battlefield | ValidSource$ You | Execute$ TrigPutCountersOther | TriggerDescription$ Whenever you put one or more counters on NICKNAME, put one of each of those kinds of counters on up to one other target creature. -SVar:TrigPutCountersOther:DB$ PutCounter | Placer$ TriggeredSource | TriggeredCounterMap$ True | CounterMapValues$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one target other creature | ValidTgts$ Creature.Other +SVar:TrigPutCountersOther:DB$ PutCounter | Placer$ TriggeredSource | TriggeredCounterMap$ True | CounterMapValues$ 1 | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select up to one other target creature | ValidTgts$ Creature.Other DeckHas:Ability$Counters Oracle:Whenever the Ring tempts you, if you chose a creature other than Aragorn, Company Leader as your Ring-bearer, put your choice of a counter from among first strike, vigilance, deathtouch, and lifelink on Aragorn.\nWhenever you put one or more counters on Aragorn, put one of each of those kinds of counters on up to one other target creature. diff --git a/forge-gui/res/cardsfolder/c/cataclysm.txt b/forge-gui/res/cardsfolder/c/cataclysm.txt index 9ac10f6041a..ea5c18d0d15 100644 --- a/forge-gui/res/cardsfolder/c/cataclysm.txt +++ b/forge-gui/res/cardsfolder/c/cataclysm.txt @@ -1,12 +1,8 @@ Name:Cataclysm ManaCost:2 W W Types:Sorcery -A:SP$ RepeatEach | Cost$ 2 W W | RepeatPlayers$ Player | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers | SpellDescription$ Each player chooses from among the permanents they control an artifact, a creature, an enchantment, and a land, then sacrifices the rest. -SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChooseLand | RememberChosen$ True | Mandatory$ True -SVar:ChooseLand:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Land.RememberedPlayerCtrl | ChoiceTitle$ Choose a land to keep | RememberChosen$ True | Mandatory$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +A:SP$ ChooseCard | Defined$ Player | Choices$ Permanent | ChooseEach$ Artifact & Creature & Enchantment & Land | ControlledByPlayer$ Chooser | Mandatory$ True | Reveal$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses from among the permanents they control an artifact, a creature, an enchantment, and a land, then sacrifices the rest. +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonChosenCard AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:Each player chooses from among the permanents they control an artifact, a creature, an enchantment, and a land, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt b/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt index bdd52ece320..1fb759ab967 100644 --- a/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt +++ b/forge-gui/res/cardsfolder/c/cataclysmic_gearhulk.txt @@ -3,13 +3,10 @@ ManaCost:3 W W Types:Artifact Creature Construct PT:4/5 K:Vigilance -T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCataclysm | TriggerDescription$ When CARDNAME enters the battlefield, each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. -SVar:TrigCataclysm:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers -SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChoosePW | RememberChosen$ True | Mandatory$ True -SVar:ChoosePW:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a Planeswalker to keep | RememberChosen$ True | Mandatory$ True -SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. +SVar:TrigChoose:DB$ ChooseCard | Defined$ Player | Choices$ Permanent.nonLand | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Chooser | Reveal$ True | Mandatory$ True +SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+nonChosenCard | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:Vigilance\nWhen Cataclysmic Gearhulk enters the battlefield, each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. diff --git a/forge-gui/res/cardsfolder/c/coward_killer.txt b/forge-gui/res/cardsfolder/c/coward_killer.txt index f243ec6ba2d..5051cd74331 100644 --- a/forge-gui/res/cardsfolder/c/coward_killer.txt +++ b/forge-gui/res/cardsfolder/c/coward_killer.txt @@ -1,8 +1,7 @@ Name:Coward ManaCost:1 R Types:Sorcery -A:SP$ Pump | ValidTgts$ Creature | KW$ HIDDEN CARDNAME can't block. | IsCurse$ True | SubAbility$ DBAnimate | SpellDescription$ Target creature can't block this turn and becomes a Coward in addition to its other types until end of turn. -SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Types$ Coward | SubAbility$ DBTimeTravel +A:SP$ Animate | ValidTgts$ Creature | HiddenKeywords$ CARDNAME can't block. | Types$ Coward | IsCurse$ True | SubAbility$ DBTimeTravel | StackDescription$ REP Target creature_{c:Targeted} | SpellDescription$ Target creature can't block this turn and becomes a Coward in addition to its other types until end of turn. SVar:DBTimeTravel:DB$ TimeTravel | SpellDescription$ Time Travel. AlternateMode:Split Oracle:Target creature can't block this turn and becomes a Coward in addition to its other types until end of turn.\nTime travel. @@ -12,7 +11,7 @@ ALTERNATE Name:Killer ManaCost:2 R R Types:Sorcery -A:SP$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumDmg$ 3 | DamageMap$ True | SubAbility$ DamageSame | SpellDescription$ CARDNAME deals 3 damage to target creature and each other creature that shares a creature type with it. -SVar:DamageSame:DB$ DamageAll | ValidCards$ Creature.NotDefinedTargeted+sharesCreatureTypeWith Targeted | ValidDescription$ each other creature that shares a creature type with it | NumDmg$ 3 | SubAbility$ DBDamageResolve +A:SP$ DealDamage | ValidTgts$ Creature | NumDmg$ 3 | DamageMap$ True | SubAbility$ DamageSame | StackDescription$ REP target creature_{c:Targeted} | SpellDescription$ CARDNAME deals 3 damage to target creature and each other creature that shares a creature type with it. +SVar:DamageSame:DB$ DamageAll | ValidCards$ Creature.NotDefinedTargeted+sharesCreatureTypeWith Targeted | NumDmg$ 3 | SubAbility$ DBDamageResolve | StackDescription$ None SVar:DBDamageResolve:DB$ DamageResolve Oracle:Killer deals 3 damage to target creature and each other creature that shares a creature type with it. diff --git a/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt b/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt index 2d84f75fea0..c0163b8080f 100644 --- a/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt +++ b/forge-gui/res/cardsfolder/g/grenzos_rebuttal.txt @@ -1,12 +1,9 @@ Name:Grenzo's Rebuttal ManaCost:4 R R Types:Sorcery -A:SP$ Token | Cost$ 4 R R | TokenAmount$ 1 | TokenScript$ r_4_4_ogre | TokenOwner$ You | SubAbility$ DBRepeat | SpellDescription$ Create a 4/4 red Ogre creature token. Starting with you, each player chooses an artifact, a creature, and a land from among the permanents controlled by the player to their left. Destroy each permanent chosen this way. -SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ Player | StartingWithActivator$ True | RepeatSubAbility$ DBChooseArtifact | SubAbility$ DBDestroy -SVar:DBChooseArtifact:DB$ ChooseCard | Defined$ Remembered | Choices$ Artifact.ControlledByPlayerInTheDirection_Left_Player.IsRemembered | Mandatory$ True | ChoiceTitle$ Choose a artifact | SubAbility$ DBChooseCreature | RememberChosen$ True -SVar:DBChooseCreature:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.ControlledByPlayerInTheDirection_Left_Player.IsRemembered | ChoiceTitle$ Choose a creature | Mandatory$ True | SubAbility$ DBChooseLand | RememberChosen$ True -SVar:DBChooseLand:DB$ ChooseCard | Defined$ Remembered | Choices$ Land.ControlledByPlayerInTheDirection_Left_Player.IsRemembered | ChoiceTitle$ Choose a land | Mandatory$ True | RememberChosen$ True -SVar:DBDestroy:DB$ Destroy | Defined$ Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -AI:RemoveDeck:All +A:SP$ Token | TokenScript$ r_4_4_ogre | SubAbility$ DBChoose | SpellDescription$ Create a 4/4 red Ogre creature token. +SVar:DBChoose:DB$ ChooseCard | Defined$ Player | ChooseEach$ Artifact & Creature & Land | ControlledByPlayer$ Left | Mandatory$ True | SubAbility$ DBDestroy | StackDescription$ REP you_{p:You} | SpellDescription$ Starting with you, each player chooses an artifact, a creature, and a land from among the permanents controlled by the player to their left. +SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | SubAbility$ DBCleanup | StackDescription$ SpellDescription | SpellDescription$ Destroy each permanent chosen this way. +SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True +DeckHas:Ability$Token & Type$Ogre Oracle:Create a 4/4 red Ogre creature token. Starting with you, each player chooses an artifact, a creature, and a land from among the permanents controlled by the player to their left. Destroy each permanent chosen this way. diff --git a/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt b/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt index d1f4dd4887b..547811e254b 100644 --- a/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt +++ b/forge-gui/res/cardsfolder/i/interplanar_tunnel.txt @@ -5,6 +5,6 @@ T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescri SVar:TrigDig:DB$ DigUntil | Amount$ 5 | Valid$ Plane | DigZone$ PlanarDeck | ImprintFound$ True | RememberRevealed$ True | FoundDestination$ PlanarDeck | RevealedDestination$ PlanarDeck | SubAbility$ DBPutOnTop SVar:DBPutOnTop:DB$ ChangeZone | ChangeType$ Card.IsImprinted | Origin$ PlanarDeck | Destination$ PlanarDeck | LibraryPosition$ 0 | ForgetChanged$ True | SubAbility$ DBRestOnBottom SVar:DBRestOnBottom:DB$ ChangeZone | Defined$ Remembered | Origin$ PlanarDeck | Destination$ PlanarDeck | LibraryPosition$ -1 | RandomOrder$ True | SubAbility$ Replaneswalk -SVar:Replaneswalk:DB$ Planeswalk | Cost$ 0 | SubAbility$ DBCleanup +SVar:Replaneswalk:DB$ Planeswalk | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True Oracle:When you encounter Interplanar Tunnel, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/m/morphic_tide.txt b/forge-gui/res/cardsfolder/m/morphic_tide.txt index b30806ee308..fe65d16b233 100644 --- a/forge-gui/res/cardsfolder/m/morphic_tide.txt +++ b/forge-gui/res/cardsfolder/m/morphic_tide.txt @@ -11,5 +11,5 @@ SVar:ChangePermanent:DB$ ChangeZoneAll | ChangeType$ Artifact.IsRemembered,Creat SVar:ChangeEnchantment:DB$ ChangeZoneAll | ChangeType$ Enchantment.IsRemembered | Origin$ Library | Destination$ Battlefield | ForgetChanged$ True | SubAbility$ GotoBottom SVar:GotoBottom:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Library | Destination$ Library | LibraryPosition$ -1 | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ PWAway -SVar:PWAway:DB$ Planeswalk | Cost$ 0 +SVar:PWAway:DB$ Planeswalk Oracle:When you encounter Morphic Tide, each player shuffles all permanents they own into their library, then reveals that many cards from the top of their library. Each player puts all artifact, creature, land, and planeswalker cards revealed this way onto the battlefield, then does the same for enchantment cards, then puts all cards revealed this way that weren't put onto the battlefield on the bottom of their library in any order. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/m/mutual_epiphany.txt b/forge-gui/res/cardsfolder/m/mutual_epiphany.txt index c93095c6619..8cc47f3a06a 100644 --- a/forge-gui/res/cardsfolder/m/mutual_epiphany.txt +++ b/forge-gui/res/cardsfolder/m/mutual_epiphany.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Phenomenon T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Epiphany | TriggerDescription$ When you encounter CARDNAME, each player draws four cards. (Then planeswalk away from this phenomenon) SVar:Epiphany:DB$ Draw | Defined$ Player | NumCards$ 4 | SubAbility$ PWAway | SpellDescription$ Each player draws four cards. -SVar:PWAway:DB$ Planeswalk | Cost$ 0 +SVar:PWAway:DB$ Planeswalk Oracle:When you encounter Mutual Epiphany, each player draws four cards. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/m/mythos_of_snapdax.txt b/forge-gui/res/cardsfolder/m/mythos_of_snapdax.txt index f336b4db057..ab8a1d16d3b 100644 --- a/forge-gui/res/cardsfolder/m/mythos_of_snapdax.txt +++ b/forge-gui/res/cardsfolder/m/mythos_of_snapdax.txt @@ -1,17 +1,11 @@ Name:Mythos of Snapdax ManaCost:2 W W Types:Sorcery -A:SP$ RepeatEach | Cost$ 2 W W | ConditionManaSpent$ B R | RepeatPlayers$ Player | RepeatSubAbility$ ChooseArtfYou | SubAbility$ AllChoose | SpellDescription$ Each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. If {B}{R} was spent to cast this spell, you choose the permanents for each player instead. -SVar:ChooseArtfYou:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Artifact.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtrYou | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtrYou:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnchYou | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnchYou:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Enchantment.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChooseWalkYou | RememberChosen$ True | Mandatory$ True -SVar:ChooseWalkYou:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Planeswalker.RememberedPlayerCtrl | ChoiceTitle$ Choose a planeswalker to keep | RememberChosen$ True | Mandatory$ True -SVar:AllChoose:DB$ RepeatEach | ConditionManaNotSpent$ B R | RepeatPlayers$ Player | RepeatSubAbility$ ChooseArtf | SubAbility$ SacAllOthers -SVar:ChooseArtf:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Artifact.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an artifact to keep | SubAbility$ ChooseCrtr | RememberChosen$ True | Mandatory$ True -SVar:ChooseCrtr:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Creature.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose a creature to keep | SubAbility$ ChooseEnch | RememberChosen$ True | Mandatory$ True -SVar:ChooseEnch:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Enchantment.nonLand+RememberedPlayerCtrl | ChoiceTitle$ Choose an enchantment to keep | SubAbility$ ChooseWalk | RememberChosen$ True | Mandatory$ True -SVar:ChooseWalk:DB$ ChooseCard | Defined$ Remembered | Amount$ 1 | Choices$ Planeswalker.RememberedPlayerCtrl | ChoiceTitle$ Choose a planeswalker to keep | RememberChosen$ True | Mandatory$ True +A:SP$ RepeatEach | ConditionManaSpent$ B R | RepeatPlayers$ Player | RepeatSubAbility$ YouChoose | SubAbility$ AllChoose | SpellDescription$ Each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. If {B}{R} was spent to cast this spell, you choose the permanents for each player instead. +SVar:YouChoose:DB$ ChooseCard | Defined$ You | Choices$ Permanent.nonLand | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Remembered | Reveal$ True | RememberChosen$ True | Mandatory$ True +SVar:AllChoose:DB$ ChooseCard | ConditionManaNotSpent$ B R | Defined$ Player | Choices$ Permanent.nonLand | ChooseEach$ Artifact & Creature & Enchantment & Planeswalker | ControlledByPlayer$ Chooser | Reveal$ True | Mandatory$ True | RememberChosen$ True | SubAbility$ SacAllOthers SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Permanent.nonLand+IsNotRemembered | SubAbility$ DBCleanup | StackDescription$ None -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True AI:RemoveDeck:All +DeckHas:Ability$Sacrifice Oracle:Each player chooses an artifact, a creature, an enchantment, and a planeswalker from among the nonland permanents they control, then sacrifices the rest. If {B}{R} was spent to cast this spell, you choose the permanents for each player instead. diff --git a/forge-gui/res/cardsfolder/p/planewide_disaster.txt b/forge-gui/res/cardsfolder/p/planewide_disaster.txt index 8f3ddfb1156..a0947197e15 100644 --- a/forge-gui/res/cardsfolder/p/planewide_disaster.txt +++ b/forge-gui/res/cardsfolder/p/planewide_disaster.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Phenomenon T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Disaster | TriggerDescription$ When you encounter CARDNAME, destroy all creatures. (Then planeswalk away from this phenomenon) SVar:Disaster:DB$ DestroyAll | ValidCards$ Creature | SubAbility$ PWAway -SVar:PWAway:DB$ Planeswalk | Cost$ 0 +SVar:PWAway:DB$ Planeswalk Oracle:When you encounter Planewide Disaster, destroy all creatures. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/r/reality_shaping.txt b/forge-gui/res/cardsfolder/r/reality_shaping.txt index 924d95aa486..745d771e073 100644 --- a/forge-gui/res/cardsfolder/r/reality_shaping.txt +++ b/forge-gui/res/cardsfolder/r/reality_shaping.txt @@ -4,5 +4,5 @@ Types:Phenomenon T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigPutFromHand | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) SVar:TrigPutFromHand:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone | SubAbility$ PWAway SVar:DBChangeZone:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Choser$ Player.IsRemembered | ChangeType$ Permanent | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield -SVar:PWAway:DB$ Planeswalk | Cost$ 0 +SVar:PWAway:DB$ Planeswalk Oracle:When you encounter Reality Shaping, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt b/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt index 3ec0e3d3d22..bbafc2b474d 100644 --- a/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt +++ b/forge-gui/res/cardsfolder/s/sculpted_sunburst.txt @@ -3,7 +3,7 @@ ManaCost:3 W W Types:Sorcery A:SP$ ChooseCard | Choices$ Creature.YouCtrl | ChoiceDesc$ creature they control | Mandatory$ True | ChoiceTitle$ Choose a creature you control | RememberChosen$ True | ImprintChosen$ True | SubAbility$ DBRepeatEach | SpellDescription$ Choose a creature you control, then each opponent chooses a creature they control with equal or lesser power. SVar:DBRepeatEach:DB$ RepeatEach | RepeatPlayers$ Opponent | RepeatSubAbility$ DBChooseCard | SubAbility$ DBChangeZoneAll | StackDescription$ Then each opponent chooses a creature they control with equal or lesser power. -SVar:DBChooseCard:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl+powerLEX | Mandatory$ True | AILogic$ BestCard | ChoiceTitle$ Choose a creature you control with equal or lesser power | RememberChosen$ True +SVar:DBChooseCard:DB$ ChooseCard | Defined$ Remembered | Choices$ Creature.RememberedPlayerCtrl+powerLEX | Mandatory$ True | ChoiceTitle$ Choose a creature you control with equal or lesser power | RememberChosen$ True SVar:X:Imprinted$CardPower SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ConditionDefined$ Imprinted | ConditionPresent$ Creature | Origin$ Battlefield | Destination$ Exile | ChangeType$ Creature.IsNotRemembered | SubAbility$ DBCleanup | SpellDescription$ If you chose a creature this way, exile each creature not chosen by any player this way. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True | ClearChosenCard$ True diff --git a/forge-gui/res/cardsfolder/s/stick_together.txt b/forge-gui/res/cardsfolder/s/stick_together.txt index b97333a2366..948b6415436 100644 --- a/forge-gui/res/cardsfolder/s/stick_together.txt +++ b/forge-gui/res/cardsfolder/s/stick_together.txt @@ -1,8 +1,9 @@ Name:Stick Together ManaCost:3 W W Types:Sorcery -A:SP$ ChooseCard | Defined$ Player | ChooseParty$ True | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control, +A:SP$ ChooseCard | Defined$ Player | ChooseEach$ Party | SubAbility$ SacAllOthers | StackDescription$ SpellDescription | SpellDescription$ Each player chooses a party from among creatures they control, SVar:SacAllOthers:DB$ SacrificeAll | ValidCards$ Creature.nonChosenCard | StackDescription$ then sacrifices the rest. | SpellDescription$ then sacrifices the rest. (To choose a party, choose up to one each of Cleric, Rogue, Warrior, and Wizard.) +DeckHas:Ability$Sacrifice DeckHints:Ability$Party DeckNeeds:Type$Cleric|Rogue|Warrior|Wizard AI:RemoveDeck:Random diff --git a/forge-gui/res/cardsfolder/t/time_distortion.txt b/forge-gui/res/cardsfolder/t/time_distortion.txt index 6abb1a104d0..c76a4b93e3b 100644 --- a/forge-gui/res/cardsfolder/t/time_distortion.txt +++ b/forge-gui/res/cardsfolder/t/time_distortion.txt @@ -3,5 +3,5 @@ ManaCost:no cost Types:Phenomenon T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigReverse | TriggerDescription$ When you encounter CARDNAME, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.) SVar:TrigReverse:DB$ ReverseTurnOrder | SubAbility$ PWAway -SVar:PWAway:DB$ Planeswalk | Cost$ 0 +SVar:PWAway:DB$ Planeswalk Oracle:When you encounter Time Distortion, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/upcoming/caught_in_a_parallel_universe.txt b/forge-gui/res/cardsfolder/upcoming/caught_in_a_parallel_universe.txt new file mode 100644 index 00000000000..841a302c46d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/caught_in_a_parallel_universe.txt @@ -0,0 +1,9 @@ +Name:Caught in a Parallel Universe +ManaCost:no cost +Types:Phenomenon +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigChooseCard | TriggerDescription$ When you encounter CARDNAME, each player chooses a creature controlled by the player to their left. Each player creates a token that's a copy of the creature they chose, except it has menace. (Then planeswalk away from this phenomenon.) +SVar:TrigChooseCard:DB$ ChooseCard | Defined$ Player | Choices$ Creature | ControlledByPlayer$ Left | ChoiceTitle$ Choose a creature controlled by the player to your left | Reveal$ True | Mandatory$ True | ChosenMap$ True | SubAbility$ DBClone +SVar:DBClone:DB$ CopyPermanent | Defined$ ChosenMap | AddKeywords$ Menace | SubAbility$ DBPlaneswalk +SVar:DBPlaneswalk:DB$ Planeswalk +DeckHas:Ability$Token +Oracle:When you encounter Caught in a Parallel Universe, each player chooses a creature controlled by the player to their left. Each player creates a token that's a copy of the creature they chose, except it has menace. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/res/cardsfolder/upcoming/human_time_lord_meta_crisis.txt b/forge-gui/res/cardsfolder/upcoming/human_time_lord_meta_crisis.txt new file mode 100644 index 00000000000..9ceec89e843 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/human_time_lord_meta_crisis.txt @@ -0,0 +1,12 @@ +Name:Human-Time Lord Meta-Crisis +ManaCost:no cost +Types:Phenomenon +T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigChooseCard | TriggerDescription$ When you encounter CARDNAME, each player chooses one or two creatures they control. Each player creates a token that's a copy of the first creature they chose, except it isn't legendary. Then each player who chose a second creature puts a number of +1/+1 counters on the token they created equal to the power of the second creature they chose. (Then planeswalk away from this phenomenon.) +SVar:TrigChooseCard:DB$ ChooseCard | Defined$ Player | Choices$ Creature | ControlledByPlayer$ Chooser | ChoiceTitle$ Choose one or two creatures you control | Reveal$ True | MinAmount$ 1 | Amount$ 2 | Mandatory$ True | ChosenMap$ True | SubAbility$ DBClone +SVar:DBClone:DB$ CopyPermanent | Defined$ ChosenMap | ChosenMapIndex$ 0 | NonLegendary$ True | RememberTokens$ True | SubAbility$ DBPutCountersAll +SVar:DBPutCountersAll:DB$ PutCounterAll | Placer$ Owner | ValidCards$ Card.IsRemembered | CounterType$ P1P1 | AmountByChosenMap$ Count$CardPower INDEX 1 | SubAbility$ DBPlaneswalk +SVar:DBPlaneswalk:DB$ Planeswalk | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Token|Counters +DeckHints:Type$Legendary +Oracle:When you encounter Human-Time Lord Meta-Crisis, each player chooses one or two creatures they control. Each player creates a token that's a copy of the first creature they chose, except it isn't legendary. Then each player who chose a second creature puts a number of +1/+1 counters on the token they created equal to the power of the second creature they chose. (Then planeswalk away from this phenomenon.) diff --git a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java index aca434e25eb..c79ac40bb56 100644 --- a/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java +++ b/forge-gui/src/main/java/forge/gui/card/CardScriptParser.java @@ -504,8 +504,7 @@ private static boolean isValidLegal(final String valid) { "sharesCreatureTypeWith", "sharesCardTypeWith", "sharesLandTypeWith", "sharesNameWith", "doesNotShareNameWith", "sharesControllerWith", "sharesOwnerWith", - "ThisTurnEntered", "ControlledByPlayerInTheDirection", - "sharesTypeWith", "hasKeyword", "with", + "ThisTurnEntered", "sharesTypeWith", "hasKeyword", "with", "greatestPowerControlledBy", "greatestCMCControlledBy", "power", "toughness", "cmc", "totalPT", "counters", "non", "RememberMap", "wasCastFrom", "wasNotCastFrom", "set",