Commit fb4161a5 authored by Walter Adolph's avatar Walter Adolph

Merge remote-tracking branch 'remotes/upstream/master'

parents 16ae001c e3257e02
......@@ -2847,7 +2847,7 @@ public class ComputerUtil {
repParams.put("Source", source);
List<ReplacementEffect> list = player.getGame().getReplacementHandler().getReplacementList(repParams,
ReplacementLayer.None);
ReplacementLayer.Other);
if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "NoLife"))) {
return false;
......@@ -2878,7 +2878,7 @@ public class ComputerUtil {
repParams.put("Source", source);
List<ReplacementEffect> list = player.getGame().getReplacementHandler().getReplacementList(repParams,
ReplacementLayer.None);
ReplacementLayer.Other);
if (Iterables.any(list, CardTraitPredicates.hasParam("AiLogic", "NoLife"))) {
// no life gain is not negative
......
......@@ -2590,7 +2590,7 @@ public class ComputerUtilCombat {
// repParams.put("PreventMap", preventMap);
List<ReplacementEffect> list = game.getReplacementHandler().getReplacementList(repParams,
ReplacementLayer.None);
ReplacementLayer.Other);
return !list.isEmpty();
}
......
......@@ -113,7 +113,7 @@ public class ManifestAi extends SpellAbilityAi {
repParams.put("Origin", ZoneType.Library);
repParams.put("Destination", ZoneType.Battlefield);
repParams.put("Source", sa.getHostCard());
List<ReplacementEffect> list = game.getReplacementHandler().getReplacementList(repParams, ReplacementLayer.None);
List<ReplacementEffect> list = game.getReplacementHandler().getReplacementList(repParams, ReplacementLayer.Other);
if (!list.isEmpty()) {
return false;
}
......
......@@ -100,8 +100,7 @@ public class PaperToken implements InventoryItemFromSet, IPaperCard {
build.add(edition.getCode());
}
// Should future image file names be all lower case? Instead of Up case sets?
return StringUtils.join(build, "_").toLowerCase();
return StringUtils.join(build, "_").replace('*', 'x').toLowerCase();
}
public PaperToken(final CardRules c) { this(c, null, null); }
......
......@@ -52,7 +52,6 @@ import forge.util.maps.HashMapOfLists;
import forge.util.maps.MapOfLists;
import java.util.*;
import java.util.Map.Entry;
/**
* Methods for common actions performed during a game.
......@@ -1674,12 +1673,8 @@ public class GameAction {
// rule 103.4b
boolean isMultiPlayer = game.getPlayers().size() > 2;
int mulliganDelta = isMultiPlayer ? 0 : 1;
// https://magic.wizards.com/en/articles/archive/feature/checking-brawl-2018-07-09
if (game.getRules().hasAppliedVariant(GameType.Brawl) && !isMultiPlayer){
mulliganDelta = 0;
}
int mulliganDelta = isMultiPlayer || game.getRules().hasAppliedVariant(GameType.Brawl) ? 0 : 1;
boolean allKept;
do {
......@@ -1695,32 +1690,17 @@ public class GameAction {
}
if (toMulligan != null && !toMulligan.isEmpty()) {
if (!isCommander) {
toMulligan = new CardCollection(p.getCardsIn(ZoneType.Hand));
for (final Card c : toMulligan) {
moveToLibrary(c, null, null);
}
try {
Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up
} catch (InterruptedException e) {
e.printStackTrace();
}
p.shuffle(null);
p.drawCards(handSize[i] - mulliganDelta);
} else {
List<Card> toExile = Lists.newArrayList(toMulligan);
for (Card c : toExile) {
exile(c, null, null);
}
exiledDuringMulligans.addAll(p, toExile);
try {
Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up
} catch (InterruptedException e) {
e.printStackTrace();
}
p.drawCards(toExile.size() - 1);
toMulligan = new CardCollection(p.getCardsIn(ZoneType.Hand));
for (final Card c : toMulligan) {
moveToLibrary(c, null, null);
}
try {
Thread.sleep(100); //delay for a tiny bit to give UI a chance catch up
} catch (InterruptedException e) {
e.printStackTrace();
}
p.shuffle(null);
p.drawCards(handSize[i] - mulliganDelta);
p.onMulliganned();
allKept = false;
} else {
......@@ -1731,17 +1711,6 @@ public class GameAction {
mulliganDelta++;
} while (!allKept);
if (isCommander) {
for (Entry<Player, Collection<Card>> kv : exiledDuringMulligans.entrySet()) {
Player p = kv.getKey();
Collection<Card> cc = kv.getValue();
for (Card c : cc) {
moveToLibrary(c, null, null);
}
p.shuffle(null);
}
}
//Vancouver Mulligan
for(Player p : whoCanMulligan) {
if (p.getStartingHandSize() > p.getZone(ZoneType.Hand).size()) {
......
......@@ -28,6 +28,8 @@ import forge.game.cost.Cost;
import forge.game.spellability.*;
import forge.game.zone.ZoneType;
import forge.util.FileSection;
import io.sentry.Sentry;
import io.sentry.event.BreadcrumbBuilder;
import java.util.List;
import java.util.Map;
......@@ -130,7 +132,16 @@ public final class AbilityFactory {
String source = state.getName().isEmpty() ? abString : state.getName();
throw new RuntimeException("AbilityFactory : getAbility -- no API in " + source + ": " + abString);
}
return getAbility(mapParams, type, state, parent);
try {
return getAbility(mapParams, type, state, parent);
} catch (Error | Exception ex) {
String msg = "AbilityFactory:getAbility: crash when trying to create ability ";
Sentry.getContext().recordBreadcrumb(
new BreadcrumbBuilder().setMessage(msg)
.withData("Card", state.getName()).withData("Ability", abString).build()
);
throw new RuntimeException(msg + " of card: " + state.getName(), ex);
}
}
public static final SpellAbility getAbility(final Card hostCard, final String svar) {
......
......@@ -430,6 +430,9 @@ public class CardFactory {
private static void readCardFace(Card c, ICardFace face) {
// Name first so Senty has the Card name
c.setName(face.getName());
for (String r : face.getReplacements()) c.addReplacementEffect(ReplacementHandler.parseReplacement(r, c, true));
for (String s : face.getStaticAbilities()) c.addStaticAbility(s);
for (String t : face.getTriggers()) c.addTrigger(TriggerHandler.parseTrigger(t, c, true));
......@@ -439,7 +442,6 @@ public class CardFactory {
// keywords not before variables
c.addIntrinsicKeywords(face.getKeywords(), false);
c.setName(face.getName());
c.setManaCost(face.getManaCost());
c.setText(face.getNonAbilityText());
......
......@@ -25,7 +25,6 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Maps;
import com.google.common.collect.Sets;
import forge.GameCommand;
import forge.card.*;
import forge.card.mana.ManaAtom;
import forge.card.mana.ManaCost;
......@@ -2099,7 +2098,7 @@ public class CardFactoryUtil {
String abStr = "DB$ PutCounter | Defined$ Self | CounterType$ " + splitkw[1]
+ " | ETB$ True | CounterNum$ " + amount;
if (!StringUtils.isNumeric(amount)) {
if (!StringUtils.isNumeric(amount) && card.hasSVar(amount)) {
abStr += " | References$ " + amount;
}
......@@ -3452,12 +3451,10 @@ public class CardFactoryUtil {
sb.append(m);
sb.append(" (").append(inst.getReminderText()).append(")");
final ReplacementEffect re = makeEtbCounter(sb.toString(), card, intrinsic);
if ("Sunburst".equals(m)) {
card.setSVar(m, "Count$Converge");
re.getOverridingAbility().setSVar("Sunburst", "Count$Converge");
}
final ReplacementEffect re = makeEtbCounter(sb.toString(), card, intrinsic);
inst.addReplacement(re);
} else if (keyword.equals("Rebound")) {
String repeffstr = "Event$ Moved | ValidCard$ Card.Self+wasCastFromHand+YouOwn+YouCtrl "
......@@ -3512,6 +3509,19 @@ public class CardFactoryUtil {
String sb = "etbCounter:LORE:1:no Condition:no desc";
final ReplacementEffect re = makeEtbCounter(sb, card, intrinsic);
inst.addReplacement(re);
} else if (keyword.equals("Sunburst")) {
// Rule 702.43a If this object is entering the battlefield as a creature,
// ignoring any type-changing effects that would affect it
CounterType t = card.isCreature() ? CounterType.P1P1 : CounterType.CHARGE;
StringBuilder sb = new StringBuilder("etbCounter:");
sb.append(t).append(":Sunburst:no Condition:");
sb.append("Sunburst (").append(inst.getReminderText()).append(")");
final ReplacementEffect re = makeEtbCounter(sb.toString(), card, intrinsic);
re.getOverridingAbility().setSVar("Sunburst", "Count$Converge");
inst.addReplacement(re);
} else if (keyword.equals("Totem armor")) {
String repeffstr = "Event$ Destroy | ActiveZones$ Battlefield | ValidCard$ Card.EnchantedBy"
......@@ -4182,18 +4192,17 @@ public class CardFactoryUtil {
String effect = "AB$ PutCounter | Cost$ " + manacost + " ExileFromGrave<1/CARDNAME> " +
"| ActivationZone$ Graveyard | ValidTgts$ Creature | CounterType$ P1P1 " +
"| CounterNum$ ScavengeX | SorcerySpeed$ True | References$ ScavengeX " +
"| CounterNum$ ScavengeX | SorcerySpeed$ True " +
"| PrecostDesc$ Scavenge | CostDesc$ " + ManaCostParser.parse(manacost) +
"| SpellDescription$ (" + inst.getReminderText() + ")";
card.setSVar("ScavengeX", "Count$CardPower");
final SpellAbility sa = AbilityFactory.getAbility(effect, card);
sa.setSVar("ScavengeX", "Count$CardPower");
sa.setIntrinsic(intrinsic);
sa.setTemporary(!intrinsic);
inst.addSpellAbility(sa);
} else if (keyword.startsWith("Spectacle")) {
final String[] k = keyword.split(":");
final Cost cost = new Cost(k[1], false);
......@@ -4211,28 +4220,6 @@ public class CardFactoryUtil {
newSA.setTemporary(!intrinsic);
inst.addSpellAbility(newSA);
} else if (keyword.equals("Sunburst") && intrinsic) {
final GameCommand sunburstCIP = new GameCommand() {
private static final long serialVersionUID = 1489845860231758299L;
@Override
public void run() {
CounterType t = card.isCreature() ? CounterType.P1P1 : CounterType.CHARGE;
card.addCounter(t, card.getSunburstValue(), card.getController(), true);
}
};
final GameCommand sunburstLP = new GameCommand() {
private static final long serialVersionUID = -7564420917490677427L;
@Override
public void run() {
card.setSunburstValue(0);
}
};
card.addComesIntoPlayCommand(sunburstCIP);
card.addLeavesPlayCommand(sunburstLP);
} else if (keyword.startsWith("Surge")) {
final String[] k = keyword.split(":");
final Cost surgeCost = new Cost(k[1], false);
......
......@@ -39,7 +39,7 @@ public abstract class ReplacementEffect extends TriggerReplacementBase {
/** The ID. */
private int id;
private ReplacementLayer layer = ReplacementLayer.None;
private ReplacementLayer layer = ReplacementLayer.Other;
/** The has run. */
private boolean hasRun = false;
......
......@@ -8,8 +8,7 @@ package forge.game.replacement;
public enum ReplacementLayer {
Control,
Copy,
Other,
None;
Other;
/**
* TODO: Write javadoc for this method.
......
......@@ -3,9 +3,9 @@ ManaCost:2 W
Types:Creature Human Knight
PT:2/2
K:Kicker:2 W
R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike.
SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump
SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True | SubAbility$ DBMoveToPlay
SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked
SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPump | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike.
SVar:DBPump:DB$ Animate | Defined$ Self | Keywords$ First Strike | Permanent$ True
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/benalish_lancer.jpg
Oracle:Kicker {2}{W} (You may pay an additional {2}{W} as you cast this spell.)\nIf Benalish Lancer was kicked, it enters the battlefield with two +1/+1 counters on it and with first strike.
......@@ -3,9 +3,9 @@ ManaCost:2 G G
Types:Creature Lizard
PT:2/2
K:Devour:1
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on CARDNAME.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ Each other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on CARDNAME.
SVar:X:Count$CardCounters.P1P1
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/bloodspore_thrinax.jpg
Oracle:Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.)\nEach other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspore Thrinax.
\ No newline at end of file
Oracle:Devour 1 (As this enters the battlefield, you may sacrifice any number of creatures. This creature enters the battlefield with that many +1/+1 counters on it.)\nEach other creature you control enters the battlefield with an additional X +1/+1 counters on it, where X is the number of +1/+1 counters on Bloodspore Thrinax.
......@@ -2,9 +2,10 @@ Name:Bramblewood Paragon
ManaCost:1 G
Types:Creature Elf Warrior
PT:2/2
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Warrior+YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Warrior+YouCtrl+Other
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it.
S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddKeyword$ Trample | Description$ Each creature you control with a +1/+1 counter on it has trample.
DeckNeeds:Type$Warrior
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/bramblewood_paragon.jpg
Oracle:Each other Warrior creature you control enters the battlefield with an additional +1/+1 counter on it.\nEach creature you control with a +1/+1 counter on it has trample.
......@@ -3,8 +3,9 @@ ManaCost:4 W W
Types:Creature Spirit
PT:5/5
K:Flying
R:Event$ Moved | ActiveZones$ Graveyard | Destination$ Battlefield | ValidCard$ Creature.Human+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ As long as CARDNAME is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Human+YouCtrl
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ As long as CARDNAME is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it.
DeckNeeds:Type$Human
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/dearly_departed.jpg
Oracle:Flying\nAs long as Dearly Departed is in your graveyard, each Human creature you control enters the battlefield with an additional +1/+1 counter on it.
......@@ -3,9 +3,9 @@ ManaCost:1 G
Types:Creature Kavu
PT:2/2
K:Kicker:2 G
R:Event$ Moved | ValidCard$ Card.Self+kicked | Destination$ Battlefield | ReplaceWith$ DBPutCounter | Description$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with trample.
SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ Dustwalk
SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True | SubAbility$ DBMoveToPlay
SVar:DBMoveToPlay:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:DBPutCounter:Mandatory::Card.Self+kicked
SVar:DBPutCounter:DB$ PutCounter | ETB$ True | Defined$ Self | CounterType$ P1P1 | CounterNum$ 3 | SubAbility$ Dustwalk | SpellDescription$ If CARDNAME was kicked, it enters the battlefield with three +1/+1 counters on it and with trample.
SVar:Dustwalk:DB$ Animate | Defined$ Self | Keywords$ Trample | Permanent$ True
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/kavu_titan.jpg
Oracle:Kicker {2}{G} (You may pay an additional {2}{G} as you cast this spell.)\nIf Kavu Titan was kicked, it enters the battlefield with three +1/+1 counters on it and with trample.
......@@ -2,10 +2,10 @@ Name:Master Biomancer
ManaCost:2 G U
Types:Creature Elf Wizard
PT:2/4
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to CARDNAME's power and as a Mutant in addition to its other types.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Types$ Mutant | Permanent$ True | Defined$ ReplacedCard | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+Other
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBAnimate | SpellDescription$ Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to CARDNAME's power and as a Mutant in addition to its other types.
SVar:DBAnimate:DB$ Animate | Types$ Mutant | Permanent$ True | Defined$ ReplacedCard
SVar:X:Count$CardPower
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/master_biomancer.jpg
Oracle:Each other creature you control enters the battlefield with a number of additional +1/+1 counters on it equal to Master Biomancer's power and as a Mutant in addition to its other types.
......@@ -3,10 +3,10 @@ ManaCost:2
Types:Artifact Creature Shapeshifter
PT:2/1
K:ETBReplacement:Other:ChooseCT
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.ChosenType+Other+YouCtrl
SVar:ChooseCT:DB$ ChooseType | Type$ Creature | AILogic$ MostProminentInComputerDeck | SpellDescription$ As CARDNAME enters the battlefield, choose a creature type.
S:Mode$ Continuous | EffectZone$ All | Affected$ Card.Self | CharacteristicDefining$ True | AddType$ ChosenType | Description$ CARDNAME is the chosen type in addition to its other types.
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.ChosenType+Other+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it.
DeckHas:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/metallic_mimic.jpg
Oracle:As Metallic Mimic enters the battlefield, choose a creature type.\nMetallic Mimic is the chosen type in addition to its other types.\nEach other creature you control of the chosen type enters the battlefield with an additional +1/+1 counter on it.
......@@ -2,8 +2,7 @@ Name:Muzzio's Preparations
ManaCost:no cost
Types:Conspiracy
K:Hidden agenda
R:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl+NamedCard | ReplaceWith$ AddExtraCounter | Description$ Each creature with the named card you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Command:Creature.YouCtrl+NamedCard
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature with the named card you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AgendaLogic:MostProminentCreatureInComputerDeck
Oracle:Hidden agenda (Start the game with this conspiracy face down in the command zone and secretly name a card. You may turn this conspiracy face up any time and reveal the chosen name.)\nEach creature you control with the chosen name enters the battlefield with an additional +1/+1 counter on it.
......@@ -3,9 +3,9 @@ ManaCost:2 W
Types:Legendary Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 white Kor Ally creature tokens.
SVar:TrigToken:DB$Token | TokenImage$ w 1 1 kor ally | TokenName$ Kor Ally | TokenColors$ White | TokenTypes$ Creature,Kor,Ally | TokenPower$ 1 | TokenToughness$ 1 | TokenOwner$ You | TokenAmount$ 2
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Planeswalker.YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each planeswalker you control enters the battlefield with an additional loyalty counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ LOYALTY | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Planeswalker.YouCtrl
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ LOYALTY | CounterNum$ 1 | SpellDescription$ Each planeswalker you control enters the battlefield with an additional loyalty counter on it.
DeckHints:Type$Ally
SVar:Picture:http://www.wizards.com/global/images/magic/general/oath_of_gideon.jpg
Oracle:When Oath of Gideon enters the battlefield, create two 1/1 white Kor Ally creature tokens.\nEach planeswalker you control enters the battlefield with an additional loyalty counter on it.
......@@ -3,11 +3,12 @@ ManaCost:1 B
Types:Creature Faerie Rogue
PT:1/1
K:Flying
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Rogue+YouCtrl+Other | ReplaceWith$ AddExtraCounter | Description$ Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Rogue+Other+YouCtrl
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it.
T:Mode$ DamageDone | ValidSource$ Creature.YouCtrl+counters_GE1_P1P1 | ValidTarget$ Player | TriggerZones$ Battlefield | CombatDamage$ True | Execute$ TrigDiscardOpp | TriggerDescription$ Whenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card.
SVar:TrigDiscardOpp:DB$ Discard | Defined$ TriggeredTarget | NumCards$ 1 | Mode$ TgtChoose
SVar:PlayMain1:TRUE
DeckNeeds:Type$Rogue
DeckHas:Ability$Discard & Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/oonas_blackguard.jpg
Oracle:Flying\nEach other Rogue creature you control enters the battlefield with an additional +1/+1 counter on it.\nWhenever a creature you control with a +1/+1 counter on it deals combat damage to a player, that player discards a card.
......@@ -2,7 +2,7 @@ Name:Protean Raider
ManaCost:1 U R
Types:Creature Shapeshifter Pirate
PT:2/2
R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield.
R:Event$ Moved | Destination$ Battlefield | ValidCard$ Card.Self | Layer$ Clone | Optional$ True | ReplaceWith$ DBCopy | CheckSVar$ RaidTest | References$ RaidTest | Description$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield.
SVar:DBCopy:DB$ Clone | Choices$ Creature.Other | SubAbility$ DBChangeZone | SpellDescription$ Raid — If you attacked with a creature this turn, you may have CARDNAME enter the battlefield as a copy of any creature on the battlefield.
SVar:DBChangeZone:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
SVar:RaidTest:Count$AttackersDeclared
......
......@@ -2,11 +2,11 @@ Name:Sage of Fables
ManaCost:2 U
Types:Creature Merfolk Wizard
PT:2/2
R:Event$ Moved | ActiveZones$ Battlefield | Destination$ Battlefield | ValidCard$ Creature.Wizard+Other+YouCtrl | ReplaceWith$ AddExtraCounter | Description$ Each other Wizard creature you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Wizard+Other+YouCtrl
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each other Wizard creature you control enters the battlefield with an additional +1/+1 counter on it.
A:AB$ Draw | Cost$ 2 SubCounter<1/P1P1/Creature.YouCtrl/Creature you control> | NumCards$ 1 | SpellDescription$ Draw a card.
DeckNeeds:Type$Wizard
DeckHas:Ability$Counters
#TODO: The AI won't use the "draw a card" ability on this yet, needs some logic improvement. Otherwise, the AI uses this card fine
#and it may be good in a Wizard-themed deck.
SVar:Picture:http://www.wizards.com/global/images/magic/general/sage_of_fables.jpg
......
......@@ -6,7 +6,7 @@ A:AB$ Effect | Cost$ G U | Name$ Zameck Guildmage Effect | ReplacementEffects$ E
SVar:ExtraETBCounter:Event$ Moved | ActiveZones$ Command | Destination$ Battlefield | ValidCard$ Creature.YouCtrl | ReplaceWith$ AddExtraCounter | Description$ This turn, each creature you control enters the battlefield with an additional +1/+1 counter on it.
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ MoveToBattlefield
SVar:MoveToBattlefield:DB$ ChangeZone | Origin$ All | Destination$ Battlefield | Defined$ ReplacedCard
A:AB$ Draw |Cost$ G U SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card.
A:AB$ Draw | Cost$ G U SubCounter<1/P1P1/Creature.YouCtrl/Creature you Control> | Defined$ You | NumCards$ 1 | SpellDescription$ Draw a card.
DeckHas:Ability$Counters
DeckHints:Ability$Counters
SVar:Picture:http://www.wizards.com/global/images/magic/general/zameck_guildmage.jpg
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment