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
This commit is contained in:
Northmoc
2024-03-06 02:02:22 -05:00
committed by GitHub
parent 3b90a746d3
commit 8c7283d02c
22 changed files with 130 additions and 98 deletions

View File

@@ -3,7 +3,7 @@ package forge.game.ability.effects;
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 class ChooseCardEffect extends SpellAbilityEffect {
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<Player> tgtPlayers = getDefinedPlayersOrTargeted(sa);
@@ -100,9 +100,22 @@ public class ChooseCardEffect extends SpellAbilityEffect {
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 class ChooseCardEffect extends SpellAbilityEffect {
}
}
}
} else if (sa.hasParam("ChooseParty")) {
Set<String> 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 class ChooseCardEffect extends SpellAbilityEffect {
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 class ChooseCardEffect extends SpellAbilityEffect {
}
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 class ChooseCardEffect extends SpellAbilityEffect {
} else if (sa.hasParam("EachDifferentPower")) {
List<Integer> 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 class ChooseCardEffect extends SpellAbilityEffect {
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 class ChooseCardEffect extends SpellAbilityEffect {
} 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 class ChooseCardEffect extends SpellAbilityEffect {
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 class ChooseCardEffect extends SpellAbilityEffect {
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 class ChooseCardEffect extends SpellAbilityEffect {
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);
}
}
}

View File

@@ -106,6 +106,7 @@ public class CopyPermanentEffect extends TokenEffectBase {
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 class CopyPermanentEffect extends TokenEffectBase {
List<Player> 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 class CopyPermanentEffect extends TokenEffectBase {
}
}
}
} 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);
}

View File

@@ -45,7 +45,7 @@ public class CountersPutAllEffect extends SpellAbilityEffect {
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 class CountersPutAllEffect extends SpellAbilityEffect {
}
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 class CountersPutAllEffect extends SpellAbilityEffect {
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 class CountersPutAllEffect extends SpellAbilityEffect {
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);

View File

@@ -113,6 +113,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
private Map<Long, CardCollection> mustBlockCards = Maps.newHashMap();
private List<Card> blockedThisTurn = Lists.newArrayList();
private List<Card> blockedByThisTurn = Lists.newArrayList();
private Map<Player, CardCollection> chosenMap = Maps.newHashMap();
private CardCollection untilLeavesBattlefield = new CardCollection();
@@ -1162,6 +1163,13 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
imprintedCards = view.clearCards(imprintedCards, TrackableProperty.ImprintedCards);
}
public final void addToChosenMap(final Player p, final CardCollection chosen) {
chosenMap.put(p, chosen);
}
public final Map<Player, CardCollection> getChosenMap() {
return chosenMap;
}
public final CardCollectionView getExiledCards() {
return CardCollection.getView(exiledCards);
}

View File

@@ -1076,24 +1076,6 @@ public class CardProperty {
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;

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.

View File

@@ -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.)

View File

@@ -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.)

View File

@@ -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.)

View File

@@ -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.

View File

@@ -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.)

View File

@@ -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.)

View File

@@ -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

View File

@@ -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

View File

@@ -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.)

View File

@@ -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.)

View File

@@ -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.)

View File

@@ -504,8 +504,7 @@ public final class CardScriptParser {
"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",