mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
Clean up (#2182)
This commit is contained in:
@@ -76,22 +76,23 @@ public class GameCopier {
|
|||||||
for (RegisteredPlayer p : origPlayers) {
|
for (RegisteredPlayer p : origPlayers) {
|
||||||
newPlayers.add(clonePlayer(p));
|
newPlayers.add(clonePlayer(p));
|
||||||
}
|
}
|
||||||
|
|
||||||
GameRules currentRules = origGame.getRules();
|
GameRules currentRules = origGame.getRules();
|
||||||
Match newMatch = new Match(currentRules, newPlayers, origGame.getView().getTitle());
|
Match newMatch = new Match(currentRules, newPlayers, origGame.getView().getTitle());
|
||||||
Game newGame = new Game(newPlayers, currentRules, newMatch);
|
Game newGame = new Game(newPlayers, currentRules, newMatch);
|
||||||
|
|
||||||
for (int i = 0; i < origGame.getPlayers().size(); i++) {
|
for (int i = 0; i < origGame.getPlayers().size(); i++) {
|
||||||
Player origPlayer = origGame.getPlayers().get(i);
|
Player origPlayer = origGame.getPlayers().get(i);
|
||||||
Player newPlayer = newGame.getPlayers().get(i);
|
Player newPlayer = newGame.getPlayers().get(i);
|
||||||
newPlayer.setLife(origPlayer.getLife(), null);
|
newPlayer.setLife(origPlayer.getLife(), null);
|
||||||
newPlayer.setDamageReceivedThisTurn(origPlayer.getDamageReceivedThisTurn());
|
|
||||||
newPlayer.setActivateLoyaltyAbilityThisTurn(origPlayer.getActivateLoyaltyAbilityThisTurn());
|
|
||||||
for (int j = 0; j < origPlayer.getSpellsCastThisTurn(); j++)
|
|
||||||
newPlayer.addSpellCastThisTurn();
|
|
||||||
newPlayer.setLandsPlayedThisTurn(origPlayer.getLandsPlayedThisTurn());
|
|
||||||
newPlayer.setCounters(Maps.newHashMap(origPlayer.getCounters()));
|
|
||||||
newPlayer.setLifeLostLastTurn(origPlayer.getLifeLostLastTurn());
|
newPlayer.setLifeLostLastTurn(origPlayer.getLifeLostLastTurn());
|
||||||
newPlayer.setLifeLostThisTurn(origPlayer.getLifeLostThisTurn());
|
newPlayer.setLifeLostThisTurn(origPlayer.getLifeLostThisTurn());
|
||||||
newPlayer.setLifeGainedThisTurn(origPlayer.getLifeGainedThisTurn());
|
newPlayer.setLifeGainedThisTurn(origPlayer.getLifeGainedThisTurn());
|
||||||
|
newPlayer.setLifeStartedThisTurnWith(origPlayer.getLifeStartedThisTurnWith());
|
||||||
|
newPlayer.setDamageReceivedThisTurn(origPlayer.getDamageReceivedThisTurn());
|
||||||
|
newPlayer.setActivateLoyaltyAbilityThisTurn(origPlayer.getActivateLoyaltyAbilityThisTurn());
|
||||||
|
newPlayer.setLandsPlayedThisTurn(origPlayer.getLandsPlayedThisTurn());
|
||||||
|
newPlayer.setCounters(Maps.newHashMap(origPlayer.getCounters()));
|
||||||
newPlayer.setBlessing(origPlayer.hasBlessing());
|
newPlayer.setBlessing(origPlayer.hasBlessing());
|
||||||
newPlayer.setRevolt(origPlayer.hasRevolt());
|
newPlayer.setRevolt(origPlayer.hasRevolt());
|
||||||
newPlayer.setLibrarySearched(origPlayer.getLibrarySearched());
|
newPlayer.setLibrarySearched(origPlayer.getLibrarySearched());
|
||||||
|
|||||||
@@ -3,8 +3,6 @@ package forge.game.ability.effects;
|
|||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
import com.google.common.collect.Lists;
|
||||||
|
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
@@ -14,6 +12,7 @@ import forge.game.card.Card;
|
|||||||
import forge.game.event.GameEventCombatChanged;
|
import forge.game.event.GameEventCombatChanged;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.trigger.TriggerType;
|
import forge.game.trigger.TriggerType;
|
||||||
|
import forge.util.Lang;
|
||||||
|
|
||||||
public class BecomesBlockedEffect extends SpellAbilityEffect {
|
public class BecomesBlockedEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
@@ -21,9 +20,7 @@ public class BecomesBlockedEffect extends SpellAbilityEffect {
|
|||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
final List<Card> tgtCards = getTargetCards(sa);
|
sb.append(Lang.joinHomogenous(getTargetCards(sa)));
|
||||||
|
|
||||||
sb.append(StringUtils.join(tgtCards, ", "));
|
|
||||||
sb.append(" becomes blocked.");
|
sb.append(" becomes blocked.");
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|||||||
@@ -1,10 +1,7 @@
|
|||||||
package forge.game.ability.effects;
|
package forge.game.ability.effects;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
|
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
@@ -19,6 +16,7 @@ import forge.game.player.Player;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.spellability.SpellAbilityStackInstance;
|
import forge.game.spellability.SpellAbilityStackInstance;
|
||||||
import forge.util.CardTranslation;
|
import forge.util.CardTranslation;
|
||||||
|
import forge.util.Lang;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
import forge.util.collect.FCollection;
|
import forge.util.collect.FCollection;
|
||||||
|
|
||||||
@@ -28,10 +26,9 @@ public class ChangeCombatantsEffect extends SpellAbilityEffect {
|
|||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
final List<Card> tgtCards = getTargetCards(sa);
|
|
||||||
// should update when adding effects for defined blocker
|
// should update when adding effects for defined blocker
|
||||||
sb.append("Reselect the defender of ");
|
sb.append("Reselect the defender of ");
|
||||||
sb.append(StringUtils.join(tgtCards, ", "));
|
sb.append(Lang.joinHomogenous(getTargetCards(sa)));
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -68,7 +68,6 @@ public class ChangeZoneAllEffect extends SpellAbilityEffect {
|
|||||||
if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && !sa.getActivatingPlayer().canSearchLibraryWith(sa, p)) {
|
if (origin.contains(ZoneType.Library) && sa.hasParam("Search") && !sa.getActivatingPlayer().canSearchLibraryWith(sa, p)) {
|
||||||
cards.removeAll(p.getCardsIn(ZoneType.Library));
|
cards.removeAll(p.getCardsIn(ZoneType.Library));
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if (origin.contains(ZoneType.Library) && sa.hasParam("Search")) {
|
if (origin.contains(ZoneType.Library) && sa.hasParam("Search")) {
|
||||||
// Search library using changezoneall effect need a param "Search"
|
// Search library using changezoneall effect need a param "Search"
|
||||||
|
|||||||
@@ -28,8 +28,9 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
|||||||
@Override
|
@Override
|
||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
final Player pl = !sa.hasParam("DefinedPlayer") ? sa.getActivatingPlayer() :
|
final Player pl = sa.hasParam("DefinedPlayer") ?
|
||||||
AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst();
|
AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst()
|
||||||
|
: sa.getActivatingPlayer();
|
||||||
sb.append(pl.getName());
|
sb.append(pl.getName());
|
||||||
|
|
||||||
if (sa.hasParam("CounterType")) {
|
if (sa.hasParam("CounterType")) {
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import forge.game.player.PlayerController;
|
|||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.zone.Zone;
|
import forge.game.zone.Zone;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.Lang;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
|
|
||||||
public class CountersRemoveEffect extends SpellAbilityEffect {
|
public class CountersRemoveEffect extends SpellAbilityEffect {
|
||||||
@@ -53,13 +54,9 @@ public class CountersRemoveEffect extends SpellAbilityEffect {
|
|||||||
}
|
}
|
||||||
sb.append(" from");
|
sb.append(" from");
|
||||||
|
|
||||||
for (final Card c : getTargetCards(sa)) {
|
sb.append(Lang.joinHomogenous(getTargetCards(sa)));
|
||||||
sb.append(" ").append(c);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (final Player tgtPlayer : getTargetPlayers(sa)) {
|
sb.append(Lang.joinHomogenous(getTargetPlayers(sa)));
|
||||||
sb.append(" ").append(tgtPlayer);
|
|
||||||
}
|
|
||||||
|
|
||||||
sb.append(".");
|
sb.append(".");
|
||||||
|
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ import forge.game.card.CardLists;
|
|||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.game.zone.ZoneType;
|
import forge.game.zone.ZoneType;
|
||||||
|
import forge.util.Lang;
|
||||||
import forge.util.collect.FCollectionView;
|
import forge.util.collect.FCollectionView;
|
||||||
|
|
||||||
public class DamageEachEffect extends DamageBaseEffect {
|
public class DamageEachEffect extends DamageBaseEffect {
|
||||||
@@ -38,9 +39,7 @@ public class DamageEachEffect extends DamageBaseEffect {
|
|||||||
sb.append(sa.getParam("StackDescription"));
|
sb.append(sa.getParam("StackDescription"));
|
||||||
} else {
|
} else {
|
||||||
sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to ");
|
sb.append("Each ").append(desc).append(" deals ").append(dmg).append(" to ");
|
||||||
for (final Player p : getTargetPlayers(sa)) {
|
Lang.joinHomogenous(getTargetPlayers(sa));
|
||||||
sb.append(p);
|
|
||||||
}
|
|
||||||
if (sa.hasParam("DefinedCards")) {
|
if (sa.hasParam("DefinedCards")) {
|
||||||
if (sa.getParam("DefinedCards").equals("Self")) {
|
if (sa.getParam("DefinedCards").equals("Self")) {
|
||||||
sb.append(" itself");
|
sb.append(" itself");
|
||||||
|
|||||||
@@ -1,9 +1,5 @@
|
|||||||
package forge.game.ability.effects;
|
package forge.game.ability.effects;
|
||||||
|
|
||||||
import java.util.List;
|
|
||||||
|
|
||||||
import org.apache.commons.lang3.StringUtils;
|
|
||||||
|
|
||||||
import forge.game.Game;
|
import forge.game.Game;
|
||||||
import forge.game.ability.AbilityUtils;
|
import forge.game.ability.AbilityUtils;
|
||||||
import forge.game.ability.SpellAbilityEffect;
|
import forge.game.ability.SpellAbilityEffect;
|
||||||
@@ -12,6 +8,7 @@ import forge.game.card.CardCollection;
|
|||||||
import forge.game.combat.Combat;
|
import forge.game.combat.Combat;
|
||||||
import forge.game.player.Player;
|
import forge.game.player.Player;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
|
import forge.util.Lang;
|
||||||
|
|
||||||
public class RemoveFromCombatEffect extends SpellAbilityEffect {
|
public class RemoveFromCombatEffect extends SpellAbilityEffect {
|
||||||
|
|
||||||
@@ -19,10 +16,8 @@ public class RemoveFromCombatEffect extends SpellAbilityEffect {
|
|||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
|
|
||||||
final List<Card> tgtCards = getTargetCards(sa);
|
|
||||||
|
|
||||||
sb.append("Remove ");
|
sb.append("Remove ");
|
||||||
sb.append(StringUtils.join(tgtCards, ", "));
|
sb.append(Lang.joinHomogenous(getTargetCards(sa)));
|
||||||
sb.append(" from combat.");
|
sb.append(" from combat.");
|
||||||
|
|
||||||
return sb.toString();
|
return sb.toString();
|
||||||
|
|||||||
@@ -563,6 +563,11 @@ public final class StaticAbilityContinuous {
|
|||||||
p.setMaxHandSize(max);
|
p.setMaxHandSize(max);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (params.containsKey("RaiseMaxHandSize")) {
|
||||||
|
String rmhs = params.get("RaiseMaxHandSize");
|
||||||
|
int rmax = AbilityUtils.calculateAmount(hostCard, rmhs, stAb);
|
||||||
|
p.setMaxHandSize(p.getMaxHandSize() + rmax);
|
||||||
|
}
|
||||||
|
|
||||||
if (params.containsKey("AdjustLandPlays")) {
|
if (params.containsKey("AdjustLandPlays")) {
|
||||||
String mhs = params.get("AdjustLandPlays");
|
String mhs = params.get("AdjustLandPlays");
|
||||||
@@ -573,6 +578,7 @@ public final class StaticAbilityContinuous {
|
|||||||
p.addMaxLandPlays(se.getTimestamp(), add);
|
p.addMaxLandPlays(se.getTimestamp(), add);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.containsKey("ControlOpponentsSearchingLibrary")) {
|
if (params.containsKey("ControlOpponentsSearchingLibrary")) {
|
||||||
Player cntl = Iterables.getFirst(AbilityUtils.getDefinedPlayers(hostCard, params.get("ControlOpponentsSearchingLibrary"), stAb), null);
|
Player cntl = Iterables.getFirst(AbilityUtils.getDefinedPlayers(hostCard, params.get("ControlOpponentsSearchingLibrary"), stAb), null);
|
||||||
p.addControlledWhileSearching(se.getTimestamp(), cntl);
|
p.addControlledWhileSearching(se.getTimestamp(), cntl);
|
||||||
@@ -592,12 +598,6 @@ public final class StaticAbilityContinuous {
|
|||||||
p.addAdditionalOptionalVote(se.getTimestamp(), add);
|
p.addAdditionalOptionalVote(se.getTimestamp(), add);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (params.containsKey("RaiseMaxHandSize")) {
|
|
||||||
String rmhs = params.get("RaiseMaxHandSize");
|
|
||||||
int rmax = AbilityUtils.calculateAmount(hostCard, rmhs, stAb);
|
|
||||||
p.setMaxHandSize(p.getMaxHandSize() + rmax);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (params.containsKey("ManaConversion")) {
|
if (params.containsKey("ManaConversion")) {
|
||||||
AbilityUtils.applyManaColorConversion(p.getManaPool(), params);
|
AbilityUtils.applyManaColorConversion(p.getManaPool(), params);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,8 +5,6 @@ K:Enchant creature
|
|||||||
A:SP$ Attach | Cost$ 3 W W W | ValidTgts$ Creature | AILogic$ Pump
|
A:SP$ Attach | Cost$ 3 W W W | ValidTgts$ Creature | AILogic$ Pump
|
||||||
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3.
|
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 3 | AddToughness$ 3 | Description$ Enchanted creature gets +3/+3.
|
||||||
T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | Execute$ TrigSetLife | CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, double its controller's life total.
|
T:Mode$ DamageDone | ValidSource$ Card.AttachedBy | ValidTarget$ Player | Execute$ TrigSetLife | CombatDamage$ True | TriggerDescription$ Whenever enchanted creature deals combat damage to a player, double its controller's life total.
|
||||||
SVar:TrigSetLife:DB$ Pump | RememberObjects$ TriggeredSourceController | SubAbility$ DBSet
|
SVar:TrigSetLife:DB$ SetLife | Defined$ TriggeredSourceController | LifeAmount$ X
|
||||||
SVar:DBSet:DB$ SetLife | Defined$ Remembered | LifeAmount$ X | SubAbility$ DBCleanup
|
SVar:X:PlayerCountDefinedTriggeredSourceController$LifeTotal/Twice
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
|
||||||
SVar:X:PlayerCountRemembered$LifeTotal/Twice
|
|
||||||
Oracle:Enchant creature\nEnchanted creature gets +3/+3.\nWhenever enchanted creature deals combat damage to a player, double its controller's life total.
|
Oracle:Enchant creature\nEnchanted creature gets +3/+3.\nWhenever enchanted creature deals combat damage to a player, double its controller's life total.
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ ManaCost:1 W U
|
|||||||
Types:Creature Vedalken Wizard
|
Types:Creature Vedalken Wizard
|
||||||
PT:1/3
|
PT:1/3
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When CARDNAME enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until CARDNAME leaves the battlefield.
|
||||||
SVar:TrigExile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ DBChangeZoneAll | Duration$ UntilHostLeavesPlay
|
SVar:TrigExile:DB$ Pump | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ DBChangeZoneAll
|
||||||
SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Permanent.nonLand+NotDefinedTargeted+sharesNameWith Targeted+ControlledBy TargetedOrController | Duration$ UntilHostLeavesPlay
|
SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ TargetedCard.Self,Permanent.nonLand+NotDefinedTargeted+sharesNameWith Targeted+ControlledBy TargetedController | Duration$ UntilHostLeavesPlay
|
||||||
Oracle:When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield.
|
Oracle:When Deputy of Detention enters the battlefield, exile target nonland permanent an opponent controls and all other nonland permanents that player controls with the same name as that permanent until Deputy of Detention leaves the battlefield.
|
||||||
|
|||||||
@@ -3,6 +3,6 @@ ManaCost:1 B B
|
|||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ Charm | Choices$ DBDraw,DBDebuff
|
A:SP$ Charm | Choices$ DBDraw,DBDebuff
|
||||||
SVar:DBDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBLoseLife | SpellDescription$ You draw two cards and you lose 2 life.
|
SVar:DBDraw:DB$ Draw | NumCards$ 2 | SubAbility$ DBLoseLife | SpellDescription$ You draw two cards and you lose 2 life.
|
||||||
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1
|
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2
|
||||||
SVar:DBDebuff:DB$ PumpAll | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn.
|
SVar:DBDebuff:DB$ PumpAll | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn.
|
||||||
Oracle:Choose one —\n• You draw two cards and you lose 2 life.\n• Creatures your opponents control get -1/-1 until end of turn.
|
Oracle:Choose one —\n• You draw two cards and you lose 2 life.\n• Creatures your opponents control get -1/-1 until end of turn.
|
||||||
@@ -1,6 +1,7 @@
|
|||||||
Name:Legions to Ashes
|
Name:Legions to Ashes
|
||||||
ManaCost:1 W B
|
ManaCost:1 W B
|
||||||
Types:Sorcery
|
Types:Sorcery
|
||||||
A:SP$ ChangeZoneAll | TgtPrompt$ Select target nonland permanent an opponent controls | ValidTgts$ Permanent.nonLand+OppCtrl | ChangeType$ TargetedCard.Self,Creature.NotDefinedTargeted+token+sharesNameWith Targeted | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target nonland permanent an opponent controls and all tokens that player controls with the same name as that permanent.
|
A:SP$ Pump | ValidTgts$ Permanent.nonland | TgtPrompt$ Select target nonland permanent an opponent controls | SubAbility$ ExileAll | SpellDescription$ Exile target nonland permanent an opponent controls and all tokens that player controls with the same name as that permanent.
|
||||||
|
SVar:ExileAll:DB$ ChangeZoneAll | ChangeType$ TargetedCard.Self,Card.NotDefinedTargeted+token+sharesNameWith Targeted+ControlledBy TargetedController | Origin$ Battlefield | Destination$ Exile
|
||||||
AI:RemoveDeck:Random
|
AI:RemoveDeck:Random
|
||||||
Oracle:Exile target nonland permanent an opponent controls and all tokens that player controls with the same name as that permanent.
|
Oracle:Exile target nonland permanent an opponent controls and all tokens that player controls with the same name as that permanent.
|
||||||
Reference in New Issue
Block a user