mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-20 20:58:03 +00:00
@@ -1315,7 +1315,7 @@ public abstract class GameState {
|
|||||||
c.setBackSide(true);
|
c.setBackSide(true);
|
||||||
}
|
}
|
||||||
else if (info.startsWith("OnAdventure")) {
|
else if (info.startsWith("OnAdventure")) {
|
||||||
String abAdventure = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
|
String abAdventure = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.!copiedSpell";
|
||||||
SpellAbility saAdventure = AbilityFactory.getAbility(abAdventure, c);
|
SpellAbility saAdventure = AbilityFactory.getAbility(abAdventure, c);
|
||||||
StringBuilder sbPlay = new StringBuilder();
|
StringBuilder sbPlay = new StringBuilder();
|
||||||
sbPlay.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure");
|
sbPlay.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure");
|
||||||
|
|||||||
@@ -842,7 +842,6 @@ public class GameAction {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (zoneTo.is(ZoneType.Stack)) {
|
if (zoneTo.is(ZoneType.Stack)) {
|
||||||
// zoneFrom maybe null if the spell is cast from "Ouside the game", ex. ability of Garth One-Eye
|
|
||||||
c.setCastFrom(zoneFrom);
|
c.setCastFrom(zoneFrom);
|
||||||
if (cause != null && cause.isSpell() && c.equals(cause.getHostCard())) {
|
if (cause != null && cause.isSpell() && c.equals(cause.getHostCard())) {
|
||||||
c.setCastSA(cause);
|
c.setCastSA(cause);
|
||||||
|
|||||||
@@ -854,7 +854,7 @@ public final class GameActionUtil {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fromZone != null) { // and not a copy
|
if (fromZone != null && !fromZone.is(ZoneType.None)) { // and not a copy
|
||||||
// might have been an alternative lki host
|
// might have been an alternative lki host
|
||||||
oldCard = ability.getCardState().getCard();
|
oldCard = ability.getCardState().getCard();
|
||||||
|
|
||||||
|
|||||||
@@ -21,12 +21,6 @@ import forge.util.Localizer;
|
|||||||
|
|
||||||
public class PhasesEffect extends SpellAbilityEffect {
|
public class PhasesEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
// ******************************************
|
|
||||||
// ************** Phases ********************
|
|
||||||
// ******************************************
|
|
||||||
// Phases generally Phase Out. Time and Tide is the only card that can force
|
|
||||||
// Phased Out cards in.
|
|
||||||
|
|
||||||
/* (non-Javadoc)
|
/* (non-Javadoc)
|
||||||
* @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility)
|
* @see forge.card.abilityfactory.SpellEffect#resolve(java.util.Map, forge.card.spellability.SpellAbility)
|
||||||
*/
|
*/
|
||||||
@@ -56,10 +50,8 @@ public class PhasesEffect extends SpellAbilityEffect {
|
|||||||
tgtCards = game.getCardsIn(ZoneType.Battlefield);
|
tgtCards = game.getCardsIn(ZoneType.Battlefield);
|
||||||
}
|
}
|
||||||
tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa);
|
tgtCards = AbilityUtils.filterListByType(tgtCards, sa.getParam("AllValid"), sa);
|
||||||
} else if (sa.hasParam("Defined")) {
|
|
||||||
tgtCards = AbilityUtils.getDefinedCards(source, sa.getParam("Defined"), sa);
|
|
||||||
} else {
|
} else {
|
||||||
tgtCards = getTargetCards(sa);
|
tgtCards = getDefinedCardsOrTargeted(sa);
|
||||||
}
|
}
|
||||||
if (sa.hasParam("AnyNumber")) {
|
if (sa.hasParam("AnyNumber")) {
|
||||||
tgtCards = activator.getController().chooseCardsForEffect(tgtCards, sa,
|
tgtCards = activator.getController().chooseCardsForEffect(tgtCards, sa,
|
||||||
|
|||||||
@@ -169,6 +169,7 @@ public class PlayEffect extends SpellAbilityEffect {
|
|||||||
// so it gets added to stack
|
// so it gets added to stack
|
||||||
card.setCopiedPermanent(card);
|
card.setCopiedPermanent(card);
|
||||||
card.setToken(true);
|
card.setToken(true);
|
||||||
|
card.setZone(controller.getZone(ZoneType.None));
|
||||||
tgtCards = new CardCollection(card);
|
tgtCards = new CardCollection(card);
|
||||||
} else {
|
} else {
|
||||||
tgtCards = new CardCollection();
|
tgtCards = new CardCollection();
|
||||||
|
|||||||
@@ -1700,7 +1700,7 @@ public class CardFactoryUtil {
|
|||||||
final String[] k = keyword.split(":");
|
final String[] k = keyword.split(":");
|
||||||
|
|
||||||
String renownTrig = "Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player"
|
String renownTrig = "Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player"
|
||||||
+ " | IsPresent$ Card.Self+IsNotRenowned | CombatDamage$ True | Secondary$ True"
|
+ " | IsPresent$ Card.Self+!IsRenowned | CombatDamage$ True | Secondary$ True"
|
||||||
+ " | TriggerDescription$ Renown " + k[1] +" (" + inst.getReminderText() + ")";
|
+ " | TriggerDescription$ Renown " + k[1] +" (" + inst.getReminderText() + ")";
|
||||||
|
|
||||||
final String effect = "DB$ PutCounter | Defined$ Self | "
|
final String effect = "DB$ PutCounter | Defined$ Self | "
|
||||||
@@ -3229,7 +3229,7 @@ public class CardFactoryUtil {
|
|||||||
String desc = "Monstrosity " + magnitude;
|
String desc = "Monstrosity " + magnitude;
|
||||||
|
|
||||||
String effect = "AB$ PutCounter | Cost$ " + manacost + " | ConditionPresent$ "
|
String effect = "AB$ PutCounter | Cost$ " + manacost + " | ConditionPresent$ "
|
||||||
+ "Card.Self+IsNotMonstrous | Monstrosity$ True | CounterNum$ " + magnitude
|
+ "Card.Self+!IsMonstrous | Monstrosity$ True | CounterNum$ " + magnitude
|
||||||
+ " | CounterType$ P1P1 | StackDescription$ SpellDescription";
|
+ " | CounterType$ P1P1 | StackDescription$ SpellDescription";
|
||||||
if (reduceCost != null) {
|
if (reduceCost != null) {
|
||||||
effect += "| ReduceCost$ " + reduceCost;
|
effect += "| ReduceCost$ " + reduceCost;
|
||||||
@@ -4149,7 +4149,7 @@ public class CardFactoryUtil {
|
|||||||
|
|
||||||
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
SpellAbility saExile = AbilityFactory.getAbility(abExile, card);
|
||||||
|
|
||||||
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell+nonToken";
|
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ForgetOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.!copiedSpell+nonToken";
|
||||||
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
|
||||||
|
|
||||||
StringBuilder sbPlay = new StringBuilder();
|
StringBuilder sbPlay = new StringBuilder();
|
||||||
|
|||||||
@@ -1456,10 +1456,6 @@ public class CardProperty {
|
|||||||
if (!card.isCopiedSpell()) {
|
if (!card.isCopiedSpell()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.startsWith("nonCopiedSpell")) {
|
|
||||||
if (card.isCopiedSpell()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.startsWith("hasXCost")) {
|
} else if (property.startsWith("hasXCost")) {
|
||||||
ManaCost cost = card.getManaCost();
|
ManaCost cost = card.getManaCost();
|
||||||
if (cost == null || cost.countX() <= 0) {
|
if (cost == null || cost.countX() <= 0) {
|
||||||
@@ -1481,10 +1477,6 @@ public class CardProperty {
|
|||||||
if (!source.getExploited().contains(card)) {
|
if (!source.getExploited().contains(card)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.startsWith("unequalPT")) {
|
|
||||||
if (card.getNetPower() == card.getNetToughness()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.startsWith("equalPT")) {
|
} else if (property.startsWith("equalPT")) {
|
||||||
if (card.getNetPower() != card.getNetToughness()) {
|
if (card.getNetPower() != card.getNetToughness()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1899,18 +1891,10 @@ public class CardProperty {
|
|||||||
if (card.getDevouredCards().isEmpty()) {
|
if (card.getDevouredCards().isEmpty()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("HasNotDevoured")) {
|
|
||||||
if (!card.getDevouredCards().isEmpty()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.equals("IsMonstrous")) {
|
} else if (property.equals("IsMonstrous")) {
|
||||||
if (!card.isMonstrous()) {
|
if (!card.isMonstrous()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("IsNotMonstrous")) {
|
|
||||||
if (card.isMonstrous()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.equals("IsUnearthed")) {
|
} else if (property.equals("IsUnearthed")) {
|
||||||
if (!card.isUnearthed()) {
|
if (!card.isUnearthed()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1919,10 +1903,6 @@ public class CardProperty {
|
|||||||
if (!card.isRenowned()) {
|
if (!card.isRenowned()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("IsNotRenowned")) {
|
|
||||||
if (card.isRenowned()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.equals("IsSolved")) {
|
} else if (property.equals("IsSolved")) {
|
||||||
if (!card.isSolved()) {
|
if (!card.isSolved()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1945,10 +1925,6 @@ public class CardProperty {
|
|||||||
if (!card.isSuspected()) {
|
if (!card.isSuspected()) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
} else if (property.equals("IsUnsuspected")) {
|
|
||||||
if (card.isSuspected()) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
} else if (property.equals("IsRemembered")) {
|
} else if (property.equals("IsRemembered")) {
|
||||||
if (!source.isRemembered(card)) {
|
if (!source.isRemembered(card)) {
|
||||||
return false;
|
return false;
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Clay Golem
|
|||||||
ManaCost:4
|
ManaCost:4
|
||||||
Types:Artifact Creature Golem
|
Types:Artifact Creature Golem
|
||||||
PT:4/4
|
PT:4/4
|
||||||
A:AB$ PutCounter | Cost$ 6 RollDice<1/8/X> | ConditionPresent$ Card.Self+IsNotMonstrous | Monstrosity$ True | CounterNum$ X | CounterType$ P1P1 | AILogic$ FromDiceRoll | StackDescription$ SpellDescription | SpellDescription$ Monstrosity X, where X is the result. (If this creature isn't monstrous, put X +1/+1 counters on it and it becomes monstrous.)
|
A:AB$ PutCounter | Cost$ 6 RollDice<1/8/X> | ConditionPresent$ Card.Self+!IsMonstrous | Monstrosity$ True | CounterNum$ X | CounterType$ P1P1 | AILogic$ FromDiceRoll | StackDescription$ SpellDescription | SpellDescription$ Monstrosity X, where X is the result. (If this creature isn't monstrous, put X +1/+1 counters on it and it becomes monstrous.)
|
||||||
T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Berserk — When CARDNAME becomes monstrous, destroy target permanent.
|
T:Mode$ BecomeMonstrous | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigDestroy | TriggerDescription$ Berserk — When CARDNAME becomes monstrous, destroy target permanent.
|
||||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Permanent
|
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Permanent
|
||||||
DeckHas:Ability$Counters
|
DeckHas:Ability$Counters
|
||||||
|
|||||||
@@ -4,5 +4,5 @@ Types:Creature Elf Warrior
|
|||||||
PT:4/3
|
PT:4/3
|
||||||
K:Menace
|
K:Menace
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters, you may destroy target non-Elf creature whose power and toughness aren't equal.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDestroy | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters, you may destroy target non-Elf creature whose power and toughness aren't equal.
|
||||||
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonElf+unequalPT | TgtPrompt$ Select target non-Elf creature whose power and toughness aren't equal.
|
SVar:TrigDestroy:DB$ Destroy | ValidTgts$ Creature.nonElf+!equalPT | TgtPrompt$ Select target non-Elf creature whose power and toughness aren't equal.
|
||||||
Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhen Gilt-Leaf Winnower enters, you may destroy target non-Elf creature whose power and toughness aren't equal.
|
Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nWhen Gilt-Leaf Winnower enters, you may destroy target non-Elf creature whose power and toughness aren't equal.
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Stonebinder's Familiar
|
|||||||
ManaCost:W
|
ManaCost:W
|
||||||
Types:Creature Spirit Dog
|
Types:Creature Spirit Dog
|
||||||
PT:1/1
|
PT:1/1
|
||||||
T:Mode$ ChangesZoneAll | ValidCards$ Card.nonToken+nonCopiedSpell | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | PlayerTurn$ True | ActivationLimit$ 1 | TriggerDescription$ Whenever one or more cards are put into exile during your turn, put a +1/+1 counter on CARDNAME. This ability triggers only once each turn.
|
T:Mode$ ChangesZoneAll | ValidCards$ Card.nonToken+!copiedSpell | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutcounter | PlayerTurn$ True | ActivationLimit$ 1 | TriggerDescription$ Whenever one or more cards are put into exile during your turn, put a +1/+1 counter on CARDNAME. This ability triggers only once each turn.
|
||||||
SVar:TrigPutcounter:DB$ PutCounter | CounterType$ P1P1 | Defined$ Self | CounterNum$ 1
|
SVar:TrigPutcounter:DB$ PutCounter | CounterType$ P1P1 | Defined$ Self | CounterNum$ 1
|
||||||
DeckHas:Ability$Counters
|
DeckHas:Ability$Counters
|
||||||
Oracle:Whenever one or more cards are put into exile during your turn, put a +1/+1 counter on Stonebinder's Familiar. This ability triggers only once each turn.
|
Oracle:Whenever one or more cards are put into exile during your turn, put a +1/+1 counter on Stonebinder's Familiar. This ability triggers only once each turn.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:2 R W
|
|||||||
Types:Legendary Creature Time Lord Doctor
|
Types:Legendary Creature Time Lord Doctor
|
||||||
PT:3/5
|
PT:3/5
|
||||||
T:Mode$ PhaseOutAll | ValidCards$ Permanent.phasedOutOther | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more other permanents phase out and whenever one or more other cards are put into exile from anywhere, put a time counter on CARDNAME.
|
T:Mode$ PhaseOutAll | ValidCards$ Permanent.phasedOutOther | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever one or more other permanents phase out and whenever one or more other cards are put into exile from anywhere, put a time counter on CARDNAME.
|
||||||
T:Mode$ ChangesZoneAll | ValidCards$ Card.Other+nonToken+nonCopiedSpell | Origin$ Any | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever one or more other permanents phase out and whenever one or more other cards are put into exile from anywhere, put a time counter on CARDNAME.
|
T:Mode$ ChangesZoneAll | ValidCards$ Card.Other+nonToken+!copiedSpell | Origin$ Any | Destination$ Exile | TriggerZones$ Battlefield | Execute$ TrigPutCounter | Secondary$ True | TriggerDescription$ Whenever one or more other permanents phase out and whenever one or more other cards are put into exile from anywhere, put a time counter on CARDNAME.
|
||||||
SVar:TrigPutCounter:DB$ PutCounter | CounterType$ TIME
|
SVar:TrigPutCounter:DB$ PutCounter | CounterType$ TIME
|
||||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals damage equal to the number of time counters on it to any target. If a creature dealt damage this way would die this turn, exile it instead.
|
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ Whenever CARDNAME attacks, it deals damage equal to the number of time counters on it to any target. If a creature dealt damage this way would die this turn, exile it instead.
|
||||||
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | DamageSource$ TriggeredAttackerLKICopy | NumDmg$ Count$CardCounters.TIME | ReplaceDyingDefined$ Targeted.Creature
|
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | DamageSource$ TriggeredAttackerLKICopy | NumDmg$ Count$CardCounters.TIME | ReplaceDyingDefined$ Targeted.Creature
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
Name:Uphill Battle
|
Name:Uphill Battle
|
||||||
ManaCost:2 R
|
ManaCost:2 R
|
||||||
Types:Enchantment
|
Types:Enchantment
|
||||||
R:Event$ Moved | ValidCard$ Creature.OppCtrl | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ Creatures played by your opponents enter tapped.
|
R:Event$ Moved | ValidCard$ Creature | ValidCause$ LandAbility.OppCtrl,Spell.wasCast+Permanent+CastSa Spell.OppCtrl | Destination$ Battlefield | ReplaceWith$ ETBTapped | ReplacementResult$ Updated | ActiveZones$ Battlefield | Description$ Creatures played by your opponents enter tapped.
|
||||||
SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard
|
SVar:ETBTapped:DB$ Tap | ETB$ True | Defined$ ReplacedCard
|
||||||
Oracle:Creatures played by your opponents enter tapped.
|
Oracle:Creatures played by your opponents enter tapped.
|
||||||
|
|||||||
@@ -486,13 +486,13 @@ public final class CardScriptParser {
|
|||||||
"blockedBySourceThisTurn", "isBlockedByRemembered", "blockedRemembered",
|
"blockedBySourceThisTurn", "isBlockedByRemembered", "blockedRemembered",
|
||||||
"blockedByRemembered", "unblocked", "attackersBandedWith",
|
"blockedByRemembered", "unblocked", "attackersBandedWith",
|
||||||
"kicked", "kicked1", "kicked2", "evoked",
|
"kicked", "kicked1", "kicked2", "evoked",
|
||||||
"HasDevoured", "HasNotDevoured", "IsMonstrous", "IsNotMonstrous",
|
"HasDevoured", "IsMonstrous",
|
||||||
"CostsPhyrexianMana", "IsRemembered", "IsNotRemembered",
|
"CostsPhyrexianMana", "IsRemembered", "IsNotRemembered",
|
||||||
"IsImprinted", "IsNotImprinted", "hasActivatedAbilityWithTapCost",
|
"IsImprinted", "IsNotImprinted", "hasActivatedAbilityWithTapCost",
|
||||||
"hasActivatedAbility", "hasManaAbility",
|
"hasActivatedAbility", "hasManaAbility",
|
||||||
"hasNonManaActivatedAbility", "NoAbilities", "HasCounters",
|
"hasNonManaActivatedAbility", "NoAbilities", "HasCounters",
|
||||||
"wasNotCast", "ChosenType", "IsNotChosenType", "IsCommander",
|
"wasNotCast", "ChosenType", "IsNotChosenType", "IsCommander",
|
||||||
"IsNotCommander","IsRenowned", "IsNotRenowned");
|
"IsNotCommander", "IsRenowned");
|
||||||
private static final Set<String> VALID_EXCLUSIVE_STARTSWITH = ImmutableSortedSet
|
private static final Set<String> VALID_EXCLUSIVE_STARTSWITH = ImmutableSortedSet
|
||||||
.of("named", "notnamed", "OwnedBy", "ControlledBy",
|
.of("named", "notnamed", "OwnedBy", "ControlledBy",
|
||||||
"ControllerControls", "AttachedTo", "EnchantedBy",
|
"ControllerControls", "AttachedTo", "EnchantedBy",
|
||||||
@@ -504,7 +504,7 @@ public final class CardScriptParser {
|
|||||||
"ThisTurnEntered", "sharesTypeWith", "hasKeyword", "with",
|
"ThisTurnEntered", "sharesTypeWith", "hasKeyword", "with",
|
||||||
"greatestPowerControlledBy", "greatestCMCControlledBy",
|
"greatestPowerControlledBy", "greatestCMCControlledBy",
|
||||||
"power", "toughness", "cmc", "totalPT", "counters", "non",
|
"power", "toughness", "cmc", "totalPT", "counters", "non",
|
||||||
"RememberMap", "wasCastFrom", "wasNotCastFrom", "set",
|
"RememberMap", "wasCastFrom", "set",
|
||||||
"inZone", "HasSVar");
|
"inZone", "HasSVar");
|
||||||
|
|
||||||
private static boolean isValidExclusive(String valid) {
|
private static boolean isValidExclusive(String valid) {
|
||||||
|
|||||||
Reference in New Issue
Block a user