CopyPerm: rewoke and update with Populate

This commit is contained in:
Hanmac
2018-04-09 07:50:44 +02:00
parent 15772e20ac
commit 0bc12e744e
18 changed files with 144 additions and 103 deletions

View File

@@ -4,6 +4,7 @@ import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import forge.ai.*; import forge.ai.*;
import forge.game.Game;
import forge.game.ability.AbilityUtils; import forge.game.ability.AbilityUtils;
import forge.game.card.*; import forge.game.card.*;
import forge.game.card.CardPredicates.Presets; import forge.game.card.CardPredicates.Presets;
@@ -13,7 +14,9 @@ import forge.game.player.Player;
import forge.game.player.PlayerActionConfirmMode; import forge.game.player.PlayerActionConfirmMode;
import forge.game.player.PlayerCollection; import forge.game.player.PlayerCollection;
import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbility;
import forge.game.zone.ZoneType;
import java.util.Collection;
import java.util.List; import java.util.List;
public class CopyPermanentAi extends SpellAbilityAi { public class CopyPermanentAi extends SpellAbilityAi {
@@ -67,6 +70,12 @@ public class CopyPermanentAi extends SpellAbilityAi {
@Override @Override
protected boolean doTriggerAINoCost(final Player aiPlayer, SpellAbility sa, boolean mandatory) { protected boolean doTriggerAINoCost(final Player aiPlayer, SpellAbility sa, boolean mandatory) {
final Card host = sa.getHostCard();
final Player activator = sa.getActivatingPlayer();
final Game game = host.getGame();
final String sourceName = ComputerUtilAbility.getAbilitySourceName(sa);
// //// // ////
// Targeting // Targeting
if (sa.usesTargeting()) { if (sa.usesTargeting()) {
@@ -81,7 +90,7 @@ public class CopyPermanentAi extends SpellAbilityAi {
} }
// Saheeli Rai + Felidar Guardian combo support // Saheeli Rai + Felidar Guardian combo support
if (sa.getHostCard().getName().equals("Saheeli Rai")) { if ("Saheeli Rai".equals(sourceName)) {
CardCollection felidarGuardian = CardLists.filter(list, CardPredicates.nameEquals("Felidar Guardian")); CardCollection felidarGuardian = CardLists.filter(list, CardPredicates.nameEquals("Felidar Guardian"));
if (felidarGuardian.size() > 0) { if (felidarGuardian.size() > 0) {
// can copy a Felidar Guardian and combo off, so let's do it // can copy a Felidar Guardian and combo off, so let's do it
@@ -131,6 +140,14 @@ public class CopyPermanentAi extends SpellAbilityAi {
list.remove(choice); list.remove(choice);
sa.getTargets().add(choice); sa.getTargets().add(choice);
} }
} else if (sa.hasParam("Choices")) {
// only check for options, does not select there
CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
Collection<Card> betterChoices = getBetterOptions(aiPlayer, sa, choices, !mandatory);
if (betterChoices.isEmpty()) {
return mandatory;
}
} else { } else {
// if no targeting, it should always be ok // if no targeting, it should always be ok
} }
@@ -153,8 +170,20 @@ public class CopyPermanentAi extends SpellAbilityAi {
@Override @Override
public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) { public Card chooseSingleCard(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional, Player targetedPlayer) {
// Select a card to attach to // Select a card to attach to
CardCollection betterOptions = getBetterOptions(ai, sa, options, isOptional);
if (!betterOptions.isEmpty()) {
options = betterOptions;
}
return ComputerUtilCard.getBestAI(options); return ComputerUtilCard.getBestAI(options);
} }
private CardCollection getBetterOptions(Player ai, SpellAbility sa, Iterable<Card> options, boolean isOptional) {
final Card host = sa.getHostCard();
final Player ctrl = host.getController();
final String filter = "Permanent.YouDontCtrl,Permanent.nonLegendary";
// TODO add filter to not select Legendary from Other Player when ai already have a Legendary with that name
return CardLists.getValidCards(options, filter.split(","), ctrl, host, sa);
}
@Override @Override
protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) { protected Player chooseSinglePlayer(Player ai, SpellAbility sa, Iterable<Player> options) {

View File

@@ -17,6 +17,7 @@
*/ */
package forge.card; package forge.card;
import java.util.Collection;
import java.util.Collections; import java.util.Collections;
import java.util.EnumSet; import java.util.EnumSet;
import java.util.Iterator; import java.util.Iterator;
@@ -24,10 +25,11 @@ import java.util.List;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import forge.util.TextUtil;
import org.apache.commons.lang3.NotImplementedException; import org.apache.commons.lang3.NotImplementedException;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.base.Predicate;
import com.google.common.collect.BiMap; import com.google.common.collect.BiMap;
import com.google.common.collect.HashBiMap; import com.google.common.collect.HashBiMap;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
@@ -181,6 +183,20 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
subtypes.clear(); subtypes.clear();
calculatedType = null; calculatedType = null;
} }
public boolean remove(final Supertype st) {
return supertypes.remove(st);
}
public boolean setCreatureTypes(Collection<String> ctypes) {
// if it isn't a creature then this has no effect
if (coreTypes.contains(CoreType.Creature)) {
return false;
}
boolean changed = Iterables.removeIf(subtypes, Predicates.IS_CREATURE_TYPE);
subtypes.addAll(ctypes);
return changed;
}
@Override @Override
public boolean isEmpty() { public boolean isEmpty() {
@@ -552,6 +568,15 @@ public final class CardType implements Comparable<CardType>, CardTypeView {
// plural -> singular // plural -> singular
public static final BiMap<String,String> singularTypes = pluralTypes.inverse(); public static final BiMap<String,String> singularTypes = pluralTypes.inverse();
} }
public static class Predicates {
public static Predicate<String> IS_CREATURE_TYPE = new Predicate<String>() {
@Override
public boolean apply(String input) {
return CardType.isACreatureType(input);
}
};
}
///////// Utility methods ///////// Utility methods
public static boolean isACardType(final String cardType) { public static boolean isACardType(final String cardType) {

View File

@@ -2,6 +2,7 @@ package forge.game.ability.effects;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterables; import com.google.common.collect.Iterables;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import com.google.common.collect.Maps; import com.google.common.collect.Maps;
@@ -45,6 +46,9 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
@Override @Override
protected String getStackDescription(SpellAbility sa) { protected String getStackDescription(SpellAbility sa) {
if (sa.hasParam("Populate")) {
return "Populate. (Create a token that's a copy of a creature token you control.)";
}
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
@@ -61,8 +65,9 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
*/ */
@Override @Override
public void resolve(final SpellAbility sa) { public void resolve(final SpellAbility sa) {
final Card hostCard = sa.getHostCard(); final Card host = sa.getHostCard();
final Game game = hostCard.getGame(); final Player activator = sa.getActivatingPlayer();
final Game game = host.getGame();
final List<String> keywords = Lists.newArrayList(); final List<String> keywords = Lists.newArrayList();
final List<String> types = Lists.newArrayList(); final List<String> types = Lists.newArrayList();
final List<String> svars = Lists.newArrayList(); final List<String> svars = Lists.newArrayList();
@@ -74,7 +79,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
final long timestamp = game.getNextTimestamp(); final long timestamp = game.getNextTimestamp();
if (sa.hasParam("Optional")) { if (sa.hasParam("Optional")) {
if (!sa.getActivatingPlayer().getController().confirmAction(sa, null, "Copy this permanent?")) { if (!activator.getController().confirmAction(sa, null, "Copy this permanent?")) {
return; return;
} }
} }
@@ -99,28 +104,28 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
if (sa.hasParam("Triggers")) { if (sa.hasParam("Triggers")) {
triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(" & "))); triggers.addAll(Arrays.asList(sa.getParam("Triggers").split(" & ")));
} }
final int numCopies = sa.hasParam("NumCopies") ? AbilityUtils.calculateAmount(hostCard, final int numCopies = sa.hasParam("NumCopies") ? AbilityUtils.calculateAmount(host,
sa.getParam("NumCopies"), sa) : 1; sa.getParam("NumCopies"), sa) : 1;
Player controller = null; Player controller = null;
if (sa.hasParam("Controller")) { if (sa.hasParam("Controller")) {
final FCollectionView<Player> defined = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("Controller"), sa); final FCollectionView<Player> defined = AbilityUtils.getDefinedPlayers(host, sa.getParam("Controller"), sa);
if (!defined.isEmpty()) { if (!defined.isEmpty()) {
controller = defined.getFirst(); controller = defined.getFirst();
} }
} }
if (controller == null) { if (controller == null) {
controller = sa.getActivatingPlayer(); controller = activator;
} }
List<Card> tgtCards = getTargetCards(sa); List<Card> tgtCards = Lists.newArrayList();
if (sa.hasParam("ValidSupportedCopy")) { if (sa.hasParam("ValidSupportedCopy")) {
List<PaperCard> cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards()); List<PaperCard> cards = Lists.newArrayList(StaticData.instance().getCommonCards().getUniqueCards());
String valid = sa.getParam("ValidSupportedCopy"); String valid = sa.getParam("ValidSupportedCopy");
if (valid.contains("X")) { if (valid.contains("X")) {
valid = TextUtil.fastReplace(valid, valid = TextUtil.fastReplace(valid,
"X", Integer.toString(AbilityUtils.calculateAmount(hostCard, "X", sa))); "X", Integer.toString(AbilityUtils.calculateAmount(host, "X", sa)));
} }
if (StringUtils.containsIgnoreCase(valid, "creature")) { if (StringUtils.containsIgnoreCase(valid, "creature")) {
Predicate<PaperCard> cpp = Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES); Predicate<PaperCard> cpp = Predicates.compose(CardRulesPredicates.Presets.IS_CREATURE, PaperCard.FN_GET_RULES);
@@ -134,12 +139,12 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
List<PaperCard> copysource = Lists.newArrayList(cards); List<PaperCard> copysource = Lists.newArrayList(cards);
List<Card> choice = Lists.newArrayList(); List<Card> choice = Lists.newArrayList();
final String num = sa.hasParam("RandomNum") ? sa.getParam("RandomNum") : "1"; final String num = sa.hasParam("RandomNum") ? sa.getParam("RandomNum") : "1";
int ncopied = AbilityUtils.calculateAmount(hostCard, num, sa); int ncopied = AbilityUtils.calculateAmount(host, num, sa);
while(ncopied > 0) { while(ncopied > 0) {
final PaperCard cp = Aggregates.random(copysource); final PaperCard cp = Aggregates.random(copysource);
Card possibleCard = Card.fromPaperCard(cp, sa.getActivatingPlayer()); // Need to temporarily set the Owner so the Game is set Card possibleCard = Card.fromPaperCard(cp, activator); // Need to temporarily set the Owner so the Game is set
if (possibleCard.isValid(valid, hostCard.getController(), hostCard, sa)) { if (possibleCard.isValid(valid, host.getController(), host, sa)) {
choice.add(possibleCard); choice.add(possibleCard);
copysource.remove(cp); copysource.remove(cp);
ncopied -= 1; ncopied -= 1;
@@ -149,21 +154,34 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
} else if (sa.hasParam("DefinedName")) { } else if (sa.hasParam("DefinedName")) {
String name = sa.getParam("DefinedName"); String name = sa.getParam("DefinedName");
if (name.equals("NamedCard")) { if (name.equals("NamedCard")) {
if (!hostCard.getNamedCard().isEmpty()) { if (!host.getNamedCard().isEmpty()) {
name = hostCard.getNamedCard(); name = host.getNamedCard();
} }
} }
Predicate<PaperCard> cpp = Predicates.compose(CardRulesPredicates.name(StringOp.EQUALS, name), PaperCard.FN_GET_RULES); Predicate<PaperCard> cpp = Predicates.compose(CardRulesPredicates.name(StringOp.EQUALS, name), PaperCard.FN_GET_RULES);
cards = Lists.newArrayList(Iterables.filter(cards, cpp)); cards = Lists.newArrayList(Iterables.filter(cards, cpp));
tgtCards.clear();
if (!cards.isEmpty()) { if (!cards.isEmpty()) {
tgtCards.add(Card.fromPaperCard(cards.get(0), controller)); tgtCards.add(Card.fromPaperCard(cards.get(0), controller));
} }
} }
} if (sa.hasParam("Choices")) {
CardCollectionView choices = game.getCardsIn(ZoneType.Battlefield);
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, host);
if (!choices.isEmpty()) {
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : "Choose a card ";
Card choosen = activator.getController().chooseSingleEntityForEffect(choices, sa, title, false);
if (choosen != null) {
tgtCards.add(choosen);
}
}
} else {
tgtCards = getTargetCards(sa);
} }
hostCard.clearClones(); host.clearClones();
for (final Card c : tgtCards) { for (final Card c : tgtCards) {
if (!sa.usesTargeting() || c.canBeTargetedBy(sa)) { if (!sa.usesTargeting() || c.canBeTargetedBy(sa)) {
@@ -190,7 +208,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
final List<Card> crds = Lists.newArrayListWithCapacity(multiplier); final List<Card> crds = Lists.newArrayListWithCapacity(multiplier);
for (int i = 0; i < multiplier; i++) { for (int i = 0; i < multiplier; i++) {
final Card copy = CardFactory.copyCopiableCharacteristics(c, sa.getActivatingPlayer()); final Card copy = CardFactory.copyCopiableCharacteristics(c, activator);
copy.setToken(true); copy.setToken(true);
copy.setCopiedPermanent(c); copy.setCopiedPermanent(c);
// add keywords from sa // add keywords from sa
@@ -198,35 +216,10 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
copy.addIntrinsicKeyword(kw); copy.addIntrinsicKeyword(kw);
} }
if (asNonLegendary) { if (asNonLegendary) {
String typeLine = ""; copy.removeType(CardType.Supertype.Legendary);
for (CardType.Supertype st : copy.getType().getSupertypes()) {
if (!st.equals(CardType.Supertype.Legendary)) {
typeLine += st.name() + " ";
}
}
for (CardType.CoreType ct : copy.getType().getCoreTypes()) {
typeLine += ct.name() + " ";
}
for (String subt: copy.getType().getSubtypes()) {
typeLine += subt + " ";
}
StringBuilder newType = new StringBuilder(typeLine);
copy.setType(CardType.parse(newType.toString()));
} }
if (sa.hasParam("SetCreatureTypes")) { if (sa.hasParam("SetCreatureTypes")) {
String typeLine = ""; copy.setCreatureTypes(ImmutableList.copyOf(sa.getParam("SetCreatureTypes").split(" ")));
for (CardType.Supertype st : copy.getType().getSupertypes()) {
typeLine += st.name() + " ";
}
for (CardType.CoreType ct : copy.getType().getCoreTypes()) {
typeLine += ct.name() + " ";
}
StringBuilder newType = new StringBuilder(typeLine);
newType.append(sa.getParam("SetCreatureTypes"));
copy.setType(CardType.parse(newType.toString()));
} }
if (sa.hasParam("SetColor")) { if (sa.hasParam("SetColor")) {
@@ -237,7 +230,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
copy.addType(type); copy.addType(type);
} }
for (final String svar : svars) { for (final String svar : svars) {
String actualsVar = hostCard.getSVar(svar); String actualsVar = host.getSVar(svar);
String name = svar; String name = svar;
if (actualsVar.startsWith("SVar:")) { if (actualsVar.startsWith("SVar:")) {
actualsVar = actualsVar.split("SVar:")[1]; actualsVar = actualsVar.split("SVar:")[1];
@@ -247,7 +240,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
copy.setSVar(name, actualsVar); copy.setSVar(name, actualsVar);
} }
for (final String s : triggers) { for (final String s : triggers) {
final String actualTrigger = hostCard.getSVar(s); final String actualTrigger = host.getSVar(s);
final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, copy, true); final Trigger parsedTrigger = TriggerHandler.parseTrigger(actualTrigger, copy, true);
copy.addTrigger(parsedTrigger); copy.addTrigger(parsedTrigger);
} }
@@ -354,14 +347,14 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
// when copying something stolen: // when copying something stolen:
copyInPlay.setSetCode(c.getSetCode()); copyInPlay.setSetCode(c.getSetCode());
copyInPlay.setCloneOrigin(hostCard); copyInPlay.setCloneOrigin(host);
sa.getHostCard().addClone(copyInPlay); sa.getHostCard().addClone(copyInPlay);
if (!pumpKeywords.isEmpty()) { if (!pumpKeywords.isEmpty()) {
copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.<String>newArrayList(), false, timestamp); copyInPlay.addChangedCardKeywords(pumpKeywords, Lists.<String>newArrayList(), false, timestamp);
} }
crds.add(copyInPlay); crds.add(copyInPlay);
if (sa.hasParam("RememberCopied")) { if (sa.hasParam("RememberCopied")) {
hostCard.addRemembered(copyInPlay); host.addRemembered(copyInPlay);
} }
if (sa.hasParam("Tapped")) { if (sa.hasParam("Tapped")) {
copyInPlay.setTapped(true); copyInPlay.setTapped(true);
@@ -373,7 +366,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
FCollectionView<GameEntity> defs = game.getCombat().getDefenders(); FCollectionView<GameEntity> defs = game.getCombat().getDefenders();
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false); defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c, false);
} else { } else {
defender = AbilityUtils.getDefinedPlayers(hostCard, sa.getParam("CopyAttacking"), sa).get(0); defender = AbilityUtils.getDefinedPlayers(host, sa.getParam("CopyAttacking"), sa).get(0);
if (sa.hasParam("ChoosePlayerOrPlaneswalker") && defender != null) { if (sa.hasParam("ChoosePlayerOrPlaneswalker") && defender != null) {
FCollectionView<GameEntity> defs = game.getCombat().getDefendersControlledBy((Player) defender); FCollectionView<GameEntity> defs = game.getCombat().getDefendersControlledBy((Player) defender);
defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c + " {defender: "+ defender + "}", false); defender = c.getController().getController().chooseSingleEntityForEffect(defs, sa, "Choose which defender to attack with " + c + " {defender: "+ defender + "}", false);
@@ -385,7 +378,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
if (sa.hasParam("CopyBlocking") && game.getPhaseHandler().inCombat() && copyInPlay.isCreature()) { if (sa.hasParam("CopyBlocking") && game.getPhaseHandler().inCombat() && copyInPlay.isCreature()) {
final Combat combat = game.getPhaseHandler().getCombat(); final Combat combat = game.getPhaseHandler().getCombat();
final Card attacker = Iterables.getFirst(AbilityUtils.getDefinedCards(hostCard, sa.getParam("CopyBlocking"), sa), null); final Card attacker = Iterables.getFirst(AbilityUtils.getDefinedCards(host, sa.getParam("CopyBlocking"), sa), null);
if (attacker != null) { if (attacker != null) {
final boolean wasBlocked = combat.isBlocked(attacker); final boolean wasBlocked = combat.isBlocked(attacker);
combat.addBlocker(attacker, copyInPlay); combat.addBlocker(attacker, copyInPlay);
@@ -402,13 +395,13 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
} }
if (sa.hasParam("AttachedTo")) { if (sa.hasParam("AttachedTo")) {
CardCollectionView list = AbilityUtils.getDefinedCards(hostCard, sa.getParam("AttachedTo"), sa); CardCollectionView list = AbilityUtils.getDefinedCards(host, sa.getParam("AttachedTo"), sa);
if (list.isEmpty()) { if (list.isEmpty()) {
list = copyInPlay.getController().getGame().getCardsIn(ZoneType.Battlefield); list = copyInPlay.getController().getGame().getCardsIn(ZoneType.Battlefield);
list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copyInPlay.getController(), copyInPlay); list = CardLists.getValidCards(list, sa.getParam("AttachedTo"), copyInPlay.getController(), copyInPlay);
} }
if (!list.isEmpty()) { if (!list.isEmpty()) {
Card attachedTo = sa.getActivatingPlayer().getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to."); Card attachedTo = activator.getController().chooseSingleEntityForEffect(list, sa, copyInPlay + " - Select a card to attach to.");
if (copyInPlay.isAura()) { if (copyInPlay.isAura()) {
if (attachedTo.canBeEnchantedBy(copyInPlay)) { if (attachedTo.canBeEnchantedBy(copyInPlay)) {
copyInPlay.enchantEntity(attachedTo); copyInPlay.enchantEntity(attachedTo);
@@ -435,7 +428,7 @@ public class CopyPermanentEffect extends SpellAbilityEffect {
registerDelayedTrigger(sa, sa.getParam("AtEOT"), crds); registerDelayedTrigger(sa, sa.getParam("AtEOT"), crds);
} }
if (sa.hasParam("ImprintCopied")) { if (sa.hasParam("ImprintCopied")) {
hostCard.addImprintedCards(crds); host.addImprintedCards(crds);
} }
} // end canBeTargetedBy } // end canBeTargetedBy
} // end foreach Card } // end foreach Card

View File

@@ -2703,6 +2703,14 @@ public class Card extends GameEntity implements Comparable<Card> {
public final void addType(final String type0) { public final void addType(final String type0) {
currentState.addType(type0); currentState.addType(type0);
} }
public final void removeType(final CardType.Supertype st) {
currentState.removeType(st);
}
public final void setCreatureTypes(Collection<String> ctypes) {
currentState.setCreatureTypes(ctypes);
}
public final CardTypeView getType() { public final CardTypeView getType() {
return getType(currentState); return getType(currentState);

View File

@@ -115,6 +115,18 @@ public class CardState extends GameObject {
view.updateType(this); view.updateType(this);
} }
public final void removeType(final CardType.Supertype st) {
if (type.remove(st)) {
view.updateType(this);
}
}
public final void setCreatureTypes(Collection<String> ctypes) {
if (type.setCreatureTypes(ctypes)) {
view.updateType(this);
}
}
public final ManaCost getManaCost() { public final ManaCost getManaCost() {
return manaCost; return manaCost;
} }

View File

@@ -1,10 +1,8 @@
Name:Coursers' Accord Name:Coursers' Accord
ManaCost:4 G W ManaCost:4 G W
Types:Sorcery Types:Sorcery
A:SP$ Token | Cost$ 4 G W | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rtr | SubAbility$ DBChoose | SpellDescription$ Create a 3/3 green Centaur creature token, then populate. (Create a token that's a copy of a creature token you control.) A:SP$ Token | Cost$ 4 G W | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rtr | SubAbility$ DBCopy | SpellDescription$ Create a 3/3 green Centaur creature token, then populate. (Create a token that's a copy of a creature token you control.)
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/coursers_accord.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/coursers_accord.jpg

View File

@@ -1,11 +1,9 @@
Name:Druid's Deliverance Name:Druid's Deliverance
ManaCost:1 G ManaCost:1 G
Types:Instant Types:Instant
A:SP$ Effect | Cost$ 1 G | Name$ Druid's Deliverance Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SubAbility$ DBChoose | SpellDescription$ Prevent all combat damage that would be dealt to you this turn. Populate. (Create a token that's a copy of a creature token you control.) A:SP$ Effect | Cost$ 1 G | Name$ Druid's Deliverance Effect | StaticAbilities$ STPrevent | AILogic$ Fog | SubAbility$ DBCopy | SpellDescription$ Prevent all combat damage that would be dealt to you this turn. Populate. (Create a token that's a copy of a creature token you control.)
SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | CombatDamage$ True | Target$ You | Description$ Prevent all combat damage that would be dealt to you this turn. SVar:STPrevent:Mode$ PreventDamage | EffectZone$ Command | CombatDamage$ True | Target$ You | Description$ Prevent all combat damage that would be dealt to you this turn.
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/druids_deliverance.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/druids_deliverance.jpg
Oracle:Prevent all combat damage that would be dealt to you this turn. Populate. (Create a token that's a copy of a creature token you control.) Oracle:Prevent all combat damage that would be dealt to you this turn. Populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -1,10 +1,8 @@
Name:Eyes in the Skies Name:Eyes in the Skies
ManaCost:3 W ManaCost:3 W
Types:Instant Types:Instant
A:SP$ Token | Cost$ 3 W | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenImage$ w 1 1 bird rtr | SubAbility$ DBChoose | SpellDescription$ Create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.) A:SP$ Token | Cost$ 3 W | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenImage$ w 1 1 bird rtr | SubAbility$ DBCopy | SpellDescription$ Create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.)
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | Mandatory$ True | SubAbility$ DBCopy | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/eyes_in_the_skies.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/eyes_in_the_skies.jpg

View File

@@ -1,10 +1,8 @@
Name:Growing Ranks Name:Growing Ranks
ManaCost:2 GW GW ManaCost:2 GW GW
Types:Enchantment Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ TrigChoose | TriggerDescription$ At the beginning of your upkeep, populate. (Create a token that's a copy of a creature token you control.) T:Mode$ Phase | Phase$ Upkeep | TriggerZones$ Battlefield | ValidPlayer$ You | Execute$ DBCopy | TriggerDescription$ At the beginning of your upkeep, populate. (Create a token that's a copy of a creature token you control.)
SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckNeeds:Ability$Token DeckNeeds:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/growing_ranks.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/growing_ranks.jpg
Oracle:At the beginning of your upkeep, populate. (Create a token that's a copy of a creature token you control.) Oracle:At the beginning of your upkeep, populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -1,10 +1,8 @@
Name:Horncaller's Chant Name:Horncaller's Chant
ManaCost:7 G ManaCost:7 G
Types:Sorcery Types:Sorcery
A:SP$ Token | Cost$ 7 G | TokenAmount$ 1 | TokenName$ Rhino | TokenTypes$ Creature,Rhino | TokenColors$ Green | TokenOwner$ You | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Trample | TokenImage$ g 4 4 rhino rtr | SubAbility$ DBChoose | SpellDescription$ Create a 4/4 green Rhino creature token with trample, then populate. (Create a token that's a copy of a creature token you control.) A:SP$ Token | Cost$ 7 G | TokenAmount$ 1 | TokenName$ Rhino | TokenTypes$ Creature,Rhino | TokenColors$ Green | TokenOwner$ You | TokenPower$ 4 | TokenToughness$ 4 | TokenKeywords$ Trample | TokenImage$ g 4 4 rhino rtr | SubAbility$ DBCopy | SpellDescription$ Create a 4/4 green Rhino creature token with trample, then populate. (Create a token that's a copy of a creature token you control.)
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/horncallers_chant.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/horncallers_chant.jpg

View File

@@ -1,10 +1,8 @@
Name:Rootborn Defenses Name:Rootborn Defenses
ManaCost:2 W ManaCost:2 W
Types:Instant Types:Instant
A:SP$ ChooseCard | Cost$ 2 W | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | AILogic$ Clone | Mandatory$ True | SpellDescription$ Populate. Creatures you control gain indestructible until end of turn. (To populate, create a token that's a copy of a creature token you control.) A:SP$ CopyPermanent | Cost$ 2 W | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True | SubAbility$ DBPumpAll | StackDescription$ SpellDescription | SpellDescription$ Populate. Creatures you control gain indestructible until end of turn. (To populate, create a token that's a copy of a creature token you control.)
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Indestructible | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/rootborn_defenses.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/rootborn_defenses.jpg
Oracle:Populate. Creatures you control gain indestructible until end of turn. (To populate, create a token that's a copy of a creature token you control.) Oracle:Populate. Creatures you control gain indestructible until end of turn. (To populate, create a token that's a copy of a creature token you control.)

View File

@@ -3,10 +3,8 @@ ManaCost:3 W W
Types:Creature Elemental Types:Creature Elemental
PT:4/4 PT:4/4
T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.) T:Mode$ ChangesZone | ValidCard$ Card.wasCastFromHand+Self | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.)
SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenImage$ w 1 1 bird rtr | SubAbility$ DBChoose SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenName$ Bird | TokenTypes$ Creature,Bird | TokenColors$ White | TokenPower$ 1 | TokenToughness$ 1 | TokenKeywords$ Flying | TokenImage$ w 1 1 bird rtr | SubAbility$ DBCopy
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | Mandatory$ True | AILogic$ Clone | SubAbility$ DBCopy SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_vitu_ghazi.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/scion_of_vitu_ghazi.jpg
Oracle:When Scion of Vitu-Ghazi enters the battlefield, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.) Oracle:When Scion of Vitu-Ghazi enters the battlefield, if you cast it from your hand, create a 1/1 white Bird creature token with flying, then populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -1,10 +1,8 @@
Name:Sundering Growth Name:Sundering Growth
ManaCost:GW GW ManaCost:GW GW
Types:Instant Types:Instant
A:SP$ Destroy | Cost$ GW GW | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBChoose | SpellDescription$ Destroy target artifact or enchantment, then populate. (Create a token that's a copy of a creature token you control.) A:SP$ Destroy | Cost$ GW GW | ValidTgts$ Artifact,Enchantment | TgtPrompt$ Select target artifact or enchantment | SubAbility$ DBCopy | SpellDescription$ Destroy target artifact or enchantment, then populate. (Create a token that's a copy of a creature token you control.)
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/sundering_growth.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/sundering_growth.jpg
Oracle:Destroy target artifact or enchantment, then populate. (Create a token that's a copy of a creature token you control.) Oracle:Destroy target artifact or enchantment, then populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -5,9 +5,7 @@ PT:2/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain life equal to that creature's toughness. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever another creature enters the battlefield under your control, you gain life equal to that creature's toughness.
SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ Life | References$ Life SVar:TrigGainLife:DB$GainLife | Defined$ You | LifeAmount$ Life | References$ Life
SVar:Life:TriggeredCard$CardToughness SVar:Life:TriggeredCard$CardToughness
A:AB$ ChooseCard | Cost$ 1 G W T | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.) A:AB$ CopyPermanent | Cost$ 1 G W T | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True | StackDescription$ SpellDescription | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.)
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/trostani_selesnyas_voice.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/trostani_selesnyas_voice.jpg
Oracle:Whenever another creature enters the battlefield under your control, you gain life equal to that creature's toughness.\n{1}{G}{W}, {T}: Populate. (Create a token that's a copy of a creature token you control.) Oracle:Whenever another creature enters the battlefield under your control, you gain life equal to that creature's toughness.\n{1}{G}{W}, {T}: Populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -1,10 +1,8 @@
Name:Trostani's Judgment Name:Trostani's Judgment
ManaCost:5 W ManaCost:5 W
Types:Instant Types:Instant
A:SP$ ChangeZone | Cost$ 5 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBChoose | SpellDescription$ Exile target creature, then populate. (Create a token that's a copy of a creature token you control.) A:SP$ ChangeZone | Cost$ 5 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBCopy | SpellDescription$ Exile target creature, then populate. (Create a token that's a copy of a creature token you control.)
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/trostanis_judgment.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/trostanis_judgment.jpg
Oracle:Exile target creature, then populate. (Create a token that's a copy of a creature token you control.) Oracle:Exile target creature, then populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -3,9 +3,7 @@ ManaCost:G W
Types:Creature Dryad Shaman Types:Creature Dryad Shaman
PT:2/2 PT:2/2
A:AB$ Token | Cost$ 4 G W | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rtr | SpellDescription$ Create a 3/3 green Centaur creature token. A:AB$ Token | Cost$ 4 G W | TokenAmount$ 1 | TokenName$ Centaur | TokenTypes$ Creature,Centaur | TokenOwner$ You | TokenColors$ Green | TokenPower$ 3 | TokenToughness$ 3 | TokenImage$ g 3 3 centaur rtr | SpellDescription$ Create a 3/3 green Centaur creature token.
A:AB$ ChooseCard | Cost$ 2 G W | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.) A:AB$ CopyPermanent | Cost$ 2 G W | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True | StackDescription$ SpellDescription | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.)
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Token DeckHas:Ability$Token
DeckHints:Ability$Token DeckHints:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/vitu_ghazi_guildmage.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/vitu_ghazi_guildmage.jpg

View File

@@ -1,9 +1,7 @@
Name:Wake the Reflections Name:Wake the Reflections
ManaCost:W ManaCost:W
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | Cost$ W | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | AILogic$ Clone | SubAbility$ DBCopy | Mandatory$ True | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.) A:SP$ CopyPermanent | Cost$ W | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True | SpellDescription$ Populate. (Create a token that's a copy of a creature token you control.)
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckNeeds:Ability$Token DeckNeeds:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_the_reflections.jpg SVar:Picture:http://www.wizards.com/global/images/magic/general/wake_the_reflections.jpg
Oracle:Populate. (Create a token that's a copy of a creature token you control.) Oracle:Populate. (Create a token that's a copy of a creature token you control.)

View File

@@ -4,10 +4,8 @@ Types:Creature Elemental
PT:*/* PT:*/*
S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures you control. S:Mode$ Continuous | EffectZone$ All | CharacteristicDefining$ True | SetPower$ X | SetToughness$ X | Description$ CARDNAME's power and toughness are each equal to the number of creatures you control.
SVar:X:Count$Valid Creature.YouCtrl SVar:X:Count$Valid Creature.YouCtrl
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ TrigPopulate | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, populate. (Create a token that's a copy of a creature token you control.) T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player | CombatDamage$ True | Execute$ DBCopy | TriggerDescription$ Whenever CARDNAME deals combat damage to a player, populate. (Create a token that's a copy of a creature token you control.)
SVar:TrigPopulate:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Creature.token+YouCtrl | SubAbility$ DBCopy | Mandatory$ True | AILogic$ Clone SVar:DBCopy:DB$ CopyPermanent | Choices$ Creature.token+YouCtrl | NumCopies$ 1 | Populate$ True
SVar:DBCopy:DB$ CopyPermanent | Defined$ ChosenCard | NumCopies$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
SVar:BuffedBy:Creature SVar:BuffedBy:Creature
SVar:NoZeroToughnessAI:True SVar:NoZeroToughnessAI:True
DeckHints:Ability$Token DeckHints:Ability$Token