...
 
Commits (40)
......@@ -426,12 +426,18 @@ public class CountersPutAi extends SpellAbilityAi {
list = CardLists.filter(list, new Predicate<Card>() {
@Override
public boolean apply(final Card c) {
CounterType ct;
// don't put the counter on the dead creature
if (sacSelf && c.equals(source)) {
return false;
}
return sa.canTarget(c) && c.canReceiveCounters(CounterType.valueOf(type));
try {
ct = CounterType.valueOf(type);
} catch (Exception e) {
return false;
}
return sa.canTarget(c) && c.canReceiveCounters(ct);
}
});
......
......@@ -1270,13 +1270,15 @@ public class Card extends GameEntity implements Comparable<Card> {
// Run triggers
int curCounters = oldValue == null ? 0 : oldValue;
final Map<String, Object> runParams = Maps.newTreeMap();
runParams.put("Card", this);
runParams.put("CounterType", counterName);
for (int i = 0; i < delta && curCounters != 0; i++) {
final Map<String, Object> runParams = Maps.newTreeMap();
runParams.put("Card", this);
runParams.put("CounterType", counterName);
runParams.put("NewCounterAmount", --curCounters);
getGame().getTriggerHandler().runTrigger(TriggerType.CounterRemoved, runParams, false);
}
runParams.put("CounterAmount", delta);
getGame().getTriggerHandler().runTrigger(TriggerType.CounterRemovedOnce, runParams, false);
}
@Override
......
......@@ -54,22 +54,22 @@ public class TriggerCounterRemoved extends Trigger {
final CounterType addedType = (CounterType) runParams2.get("CounterType");
final Integer addedNewCounterAmount = (Integer) runParams2.get("NewCounterAmount");
if (this.mapParams.containsKey("ValidCard")) {
if (!addedTo.isValid(this.mapParams.get("ValidCard").split(","), this.getHostCard().getController(),
if (hasParam("ValidCard")) {
if (!addedTo.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(),
this.getHostCard(), null)) {
return false;
}
}
if (this.mapParams.containsKey("CounterType")) {
final String type = this.mapParams.get("CounterType");
if (hasParam("CounterType")) {
final String type = getParam("CounterType");
if (!type.equals(addedType.toString())) {
return false;
}
}
if (this.mapParams.containsKey("NewCounterAmount")) {
final String amtString = this.mapParams.get("NewCounterAmount");
if (hasParam("NewCounterAmount")) {
final String amtString = getParam("NewCounterAmount");
int amt = Integer.parseInt(amtString);
if(amt != addedNewCounterAmount.intValue()) {
return false;
......
/*
* Forge: Play Magic: the Gathering.
* Copyright (C) 2011 Forge Team
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package forge.game.trigger;
import forge.game.card.Card;
import forge.game.card.CounterType;
import forge.game.spellability.SpellAbility;
/**
* <p>
* Trigger_CounterRemovedOnce class.
* </p>
*
* @author Forge
* @version $Id: TriggerCounterRemovedOnce.java 12297 2011-11-28 19:56:47Z jendave $
*/
public class TriggerCounterRemovedOnce extends Trigger {
/**
* <p>
* Constructor for Trigger_CounterRemovedOnce.
* </p>
*
* @param params
* a {@link java.util.HashMap} object.
* @param host
* a {@link forge.game.card.Card} object.
* @param intrinsic
* the intrinsic
*/
public TriggerCounterRemovedOnce(final java.util.Map<String, String> params, final Card host, final boolean intrinsic) {
super(params, host, intrinsic);
}
/** {@inheritDoc} */
@Override
public final boolean performTest(final java.util.Map<String, Object> runParams2) {
final Card removedFrom = (Card) runParams2.get("Card");
final CounterType removedType = (CounterType) runParams2.get("CounterType");
if (hasParam("ValidCard")) {
if (!removedFrom.isValid(getParam("ValidCard").split(","), this.getHostCard().getController(),
this.getHostCard(), null)) {
return false;
}
}
if (hasParam("CounterType")) {
final String type = getParam("CounterType");
if (!type.equals(removedType.toString())) {
return false;
}
}
return true;
}
/** {@inheritDoc} */
@Override
public final void setTriggeringObjects(final SpellAbility sa) {
sa.setTriggeringObject("Card", this.getRunParams().get("Card"));
sa.setTriggeringObject("Amount", this.getRunParams().get("CounterAmount"));
}
@Override
public String getImportantStackObjects(SpellAbility sa) {
StringBuilder sb = new StringBuilder();
sb.append("Removed from: ").append(sa.getTriggeringObject("Card"));
sb.append(" Amount: ").append(sa.getTriggeringObject("Amount"));
return sb.toString();
}
}
......@@ -14,20 +14,20 @@ public class TriggerCrewed extends Trigger {
@Override
public boolean performTest(Map<String, Object> runParams2) {
if (this.mapParams.containsKey("ValidVehicle")) {
if (!matchesValid(runParams2.get("Vehicle"), this.mapParams.get("ValidVehicle").split(","),
if (hasParam("ValidVehicle")) {
if (!matchesValid(runParams2.get("Vehicle"), getParam("ValidVehicle").split(","),
this.getHostCard())) {
return false;
}
}
if (this.mapParams.containsKey("ValidCrew")) {
if (hasParam("ValidCrew")) {
if (runParams2.get("Crew") == null) {
return false;
}
boolean passes = false;
for (Object member : (CardCollection)runParams2.get("Crew")) {
passes |= matchesValid(member, this.mapParams.get("ValidCrew").split(","),
passes |= matchesValid(member, getParam("ValidCrew").split(","),
this.getHostCard());
}
if (!passes)
......
......@@ -38,6 +38,7 @@ public enum TriggerType {
CounterAddedOnce(TriggerCounterAddedOnce.class),
Countered(TriggerCountered.class),
CounterRemoved(TriggerCounterRemoved.class),
CounterRemovedOnce(TriggerCounterRemovedOnce.class),
Crewed(TriggerCrewed.class),
Cycled(TriggerCycled.class),
DamageDealtOnce(TriggerDamageDealtOnce.class),
......
......@@ -92,8 +92,10 @@ public class GridArchetype {
}
public void setSave() {
if (doSave)
return;
System.out.println("Setting save: "+archName);
doSave = true;
set.setSave();
}
public String keyword(){
......@@ -114,7 +116,7 @@ public class GridArchetype {
public boolean setNewestFile(String test){
if (!isSeeded())
return false;
String prev = archProperties.getProperty("NewsetFile","");
String prev = archProperties.getProperty("NewestFile","");
if (!prev.equals(test)) {
System.out.println("\tNewest: "+prev+" -> "+test);
archProperties.setProperty("NewestFile",test);
......@@ -153,7 +155,7 @@ public class GridArchetype {
public void setKeyword(String value){
archProperties.setProperty("Keyword",value);
setSave();
//setSave();
}
public GridArchetype(GridSet rs, String n, String k) {
......
......@@ -416,6 +416,8 @@ public class GridBoOMatch extends HostedMatch {
gamesPlayed++;
recordMatch(true,n);
recordMatch(false,1-n);
players[n].tribe.eloWins ++;
}
void recordMatch(Boolean win, int n){
......
......@@ -303,6 +303,7 @@ public class GridBoORound implements Runnable{
}
}
calcTribeElo();
}
public void cloneMatch(GridBoOMatch rm){
......@@ -318,4 +319,36 @@ public class GridBoORound implements Runnable{
GridTourney.activeTourney.tokenAndQuit("Too many games aborted!",-42);
}
}
private void calcTribeElo() {
Double[] eloTrans = new Double[2];
Double[] expected = new Double[2];
Double[] eloScore = new Double[2];
Double[] adjusted = new Double[2];
eloTrans[0] = Math.pow(10.0,tribes[0].getElo()/400.0);
eloTrans[1] = Math.pow(10.0,tribes[1].getElo()/400.0);
expected[0] = eloTrans[0]/(eloTrans[0]+eloTrans[1]);
expected[1] = eloTrans[1]/(eloTrans[0]+eloTrans[1]);
double eloSum = tribes[0].eloWins + tribes[1].eloWins;
if (eloSum <= 0)
return;
eloScore[0] = tribes[0].eloWins/eloSum;
eloScore[1] = tribes[1].eloWins/eloSum;
adjusted[0] = k_value*(eloScore[0]-expected[0]);
adjusted[1] = k_value*(eloScore[1]-expected[1]);
tribes[0].addElo(adjusted[0]);
tribes[1].addElo(adjusted[1]);
System.out.println("Tribe Result: "+tribes[0].eloWins+" - "+tribes[1].eloWins);
System.out.println((int)Math.round(tribes[0].getElo())+" "+tribes[0].getViewName()+" Tribe Expected: "+expected[0]+"\tScore: "+eloScore[0]+"\tAdjustment: "+adjusted[0]);
System.out.println((int)Math.round(tribes[1].getElo())+" "+tribes[1].getViewName()+" Tribe Expected: "+expected[1]+"\tScore: "+eloScore[1]+"\tAdjustment: "+adjusted[1]);
tribes[0].eloWins = 0;
tribes[1].eloWins = 0;
}
}
......@@ -272,7 +272,7 @@ public class GridDeck {
//if (GridRound.skipNumber(id,tribe.tier()))
// return;
eloAdjust += amt;
tribe.addElo(amt/25.0);
//tribe.addElo(amt/25.0);
}
public void applyElo(){
if (eloAdjust == 0) return;
......
......@@ -416,6 +416,8 @@ public class GridMatch extends HostedMatch {
gamesPlayed++;
recordMatch(true,n);
recordMatch(false,1-n);
players[n].tribe.eloWins ++;
}
void recordMatch(Boolean win, int n){
......@@ -554,9 +556,11 @@ public class GridMatch extends HostedMatch {
expected[0] = eloTrans[0]/(eloTrans[0]+eloTrans[1]);
expected[1] = eloTrans[1]/(eloTrans[0]+eloTrans[1]);
eloScore[0] = (matchPoints[0]-matchPoints[1]+3)/6.0;
eloScore[1] = (matchPoints[1]-matchPoints[0]+3)/6.0;
//eloScore[0] = (matchPoints[0]-matchPoints[1]+3)/6.0;
//eloScore[1] = (matchPoints[1]-matchPoints[0]+3)/6.0;
eloScore[0] = (matchPoints[0]-matchPoints[1]+1)/2.0;
eloScore[1] = (matchPoints[1]-matchPoints[0]+1)/2.0;
adjusted[0] = k_value*(eloScore[0]-expected[0]);
adjusted[1] = k_value*(eloScore[1]-expected[1]);
......@@ -564,8 +568,6 @@ public class GridMatch extends HostedMatch {
players[0].addElo(adjusted[0]);
players[1].addElo(adjusted[1]);
System.out.println((int)Math.round(players[0].getElo())+" "+players[0].getName()+" Expected: "+expected[0]+"\tScore: "+eloScore[0]+"\tAdjustment: "+adjusted[0]);
System.out.println((int)Math.round(players[1].getElo())+" "+players[1].getName()+" Expected: "+expected[1]+"\tScore: "+eloScore[1]+"\tAdjustment: "+adjusted[1]);
......
......@@ -175,7 +175,10 @@ public class GridRound implements Runnable{
System.out.println(sb.toString());
completedCount = counter;
}
if (completedCount >= matches.length) finished = true;
if (completedCount >= matches.length){
finished = true;
//calcTribeElo();
}
}
public void run() {
......@@ -185,8 +188,10 @@ public class GridRound implements Runnable{
tribes[0].setTier(tribes[1].tier());
roundRuns++;
roundStart = System.currentTimeMillis();
tribes[0].loadAllDecks();
tribes[1].loadAllDecks();
for (int x = 0; x<=1; x++) {
tribes[x].loadAllDecks();
tribes[x].eloWins = 0;
}
GridUtilities.Log(tribes[0].getViewName() +" ["+tribes[0].getElo()+"] vs "+tribes[1].getViewName()+" ["+tribes[1].getElo()+"]");
......@@ -253,6 +258,7 @@ public class GridRound implements Runnable{
}
}
calcTribeElo();
}
public void cloneMatch(GridMatch rm){
......@@ -268,4 +274,38 @@ public class GridRound implements Runnable{
GridTourney.activeTourney.tokenAndQuit("Too many games aborted!",-42);
}
}
private void calcTribeElo() {
Double[] eloTrans = new Double[2];
Double[] expected = new Double[2];
Double[] eloScore = new Double[2];
Double[] adjusted = new Double[2];
eloTrans[0] = Math.pow(10.0,tribes[0].getElo()/400.0);
eloTrans[1] = Math.pow(10.0,tribes[1].getElo()/400.0);
expected[0] = eloTrans[0]/(eloTrans[0]+eloTrans[1]);
expected[1] = eloTrans[1]/(eloTrans[0]+eloTrans[1]);
double eloSum = tribes[0].eloWins + tribes[1].eloWins;
if (eloSum <= 0)
return;
eloScore[0] = tribes[0].eloWins/eloSum;
eloScore[1] = tribes[1].eloWins/eloSum;
adjusted[0] = k_value*(eloScore[0]-expected[0]);
adjusted[1] = k_value*(eloScore[1]-expected[1]);
tribes[0].addElo(adjusted[0]);
tribes[1].addElo(adjusted[1]);
System.out.println((int)Math.round(tribes[0].getElo())+" "+tribes[0].getViewName()+" Tribe Expected: "+expected[0]+"\tScore: "+eloScore[0]+"\tAdjustment: "+adjusted[0]);
System.out.println((int)Math.round(tribes[1].getElo())+" "+tribes[1].getViewName()+" Tribe Expected: "+expected[1]+"\tScore: "+eloScore[1]+"\tAdjustment: "+adjusted[1]);
tribes[0].eloWins = 0;
tribes[1].eloWins = 0;
}
}
......@@ -23,7 +23,7 @@ public class GridTourney implements Runnable {
public static GridTourney activeTourney;
static Random rand = new Random();
public static final boolean viewGames = true;
public static final boolean viewGames = false;
public static ArchID forceArch = null;//new ArchID(GridFormat.Arena, RenColour.Simic, "Extra Turn");
public static GridFormat highestBase = GridFormat.Origin;
public static final boolean loadPreBase = false;//ShivaUtility.rand.nextBoolean();
......
......@@ -31,6 +31,8 @@ public class GridTribe {
public RenColour colour;
public int id;
public int eloWins = 0;
public GridDeck bestDeck = null;
public final GreatPool pool = new GreatPool(this);
......@@ -44,6 +46,15 @@ public class GridTribe {
return archetype.getArchDir()+"/"+colour+"/"+id;
}
public void setSave(){
if (doSave)
return;
try {
//throw new Exception();
} catch (Exception e){
e.printStackTrace();
System.exit(-42);
}
System.out.println("Setting Save: " +getViewName());
doSave = true;
archetype.setSave();
}
......@@ -70,6 +81,8 @@ public class GridTribe {
return i;
}
public void setRunCount(int val){
if (val == getRunCount())
return;
tribeProperties.setProperty("RunCount",val+"");
setRecordRunCount(val);
setSave();
......@@ -80,8 +93,9 @@ public class GridTribe {
return i;
}
public void storeBoOWin(int val){
if (val == storedBoOWins())
return;
tribeProperties.setProperty("storedBoOWins",val+"");
setRecordRunCount(val);
setSave();
}
......@@ -92,7 +106,7 @@ public class GridTribe {
}
public void setRecordRunCount(int amt){
if (amt < getRunCount())
if (amt <= getRunCount())
return;
tribeProperties.setProperty("RecordRunCount",amt+"");
setSave();
......@@ -230,6 +244,8 @@ public class GridTribe {
}
public void setTier(int tier){
if (tier == getLadderTier())
return;
tribeProperties.setProperty("Tier",""+tier);
setSave();
}
......
......@@ -765,6 +765,12 @@ public class GridUtilities {
return true;
if (checkTheme(pc, "Teferi"))
return true;
if (checkTheme(pc, "Kaya"))
return true;
if (checkTheme(pc, "Nissa"))
return true;
if (checkTheme(pc, "Liliana"))
return true;
}
case 'N':
if (theme.equals("Nicol Bolas")){
......@@ -772,30 +778,8 @@ public class GridUtilities {
return true;
if (textSearch(pc, "God Pharoah") || textSearch(pc, "God-Pharoah"))
return true;
if (checkTheme(pc, "Vraska"))
return true;
if (checkTheme(pc, "Ral"))
return true;
if (checkTheme(pc, "Liliana"))
return true;
if (checkTheme(pc, "Tezzeret"))
return true;
if (checkTheme(pc, "Izzet"))
return true;
if (checkTheme(pc, "Golgari"))
return true;
if (checkTheme(pc, "Dovin"))
return true;
if (checkTheme(pc, "Kaya"))
return true;
if (checkTheme(pc, "Domri"))
return true;
if (checkTheme(pc, "Azorius"))
return true;
if (checkTheme(pc, "Orzhov"))
return true;
if (checkTheme(pc, "Gruul"))
return true;
}
if (theme.equals("Nicol Bolas") && checkTheme(pc, "God") && checkTheme(pc, "Pharoah"))
return true;
......
......@@ -3,7 +3,7 @@ ManaCost:3 B
Types:Creature Human Shaman
PT:4/2
S:Mode$ ReduceCost | ValidTarget$ Card.Self | Activator$ Player.Opponent | Type$ Spell | Amount$ 1 | Description$ Spells your opponents cast that target CARDNAME cost {1} less to cast.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME dies, return it to the battlefield transformed under your control attached to target opponent.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, return it to the battlefield transformed under your control attached to target opponent.
SVar:TrigChoose:DB$ Pump | ValidTgts$ Opponent | TgtPrompt$ Choose a opponent | IsCurse$ True | SubAbility$ DBChange
SVar:DBChange:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Battlefield | AttachedToPlayer$ ParentTarget | Transformed$ True | GainControl$ True
SVar:Picture:http://www.wizards.com/global/images/magic/general/accursed_witch.jpg
......
......@@ -3,7 +3,7 @@ ManaCost:4 W W
Types:Creature Angel
PT:3/5
K:Flying
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME dies, you may shuffle it into its owner's library.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | OptionalDecider$ You | ValidCard$ Card.Self | Execute$ TrigChange | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, you may shuffle it into its owner's library.
SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Defined$ TriggeredCard
SVar:Picture:http://www.wizards.com/global/images/magic/general/angel_of_fury.jpg
Oracle:Flying\nWhen Angel of Fury dies, you may shuffle it into its owner's library.
Name:Angrath's Rampage
ManaCost:B R
Types:Sorcery
A:SP$ Charm | Cost$ B R | Choices$ SacArtifact,SacCreature,SacPW
SVar:SacArtifact:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Artifact | Amount$ 1 | SpellDescription$ Target player sacrifices an artifact.
SVar:SacCreature:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Creature | Amount$ 1 | SpellDescription$ Target player sacrifices an creature.
SVar:SacPW:DB$ Sacrifice | ValidTgts$ Player | SacValid$ Planeswalker | Amount$ 1 | SpellDescription$ Target player sacrifices an planeswalker.
Oracle:Choose one —\n• Target player sacrifices an artifact.\n• Target player sacrifices a creature.\n• Target player sacrifices a planeswalker.
Name:Arlinn, Voice of the Pack
ManaCost:4 G G
Types:Legendary Planeswalker Arlinn
Loyalty:7
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.Wolf+YouCtrl,Creature.Werewolf+YouCtrl
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$Each creature you control that's a Wolf or Werewolf enters the battlefield with an additional +1/+1 counter on it.
SVar:PlayMain1:TRUE
DeckHints:Type$Wolf & Type$Werewolf
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ g_2_2_wolf | TokenOwner$ You | LegacyImage$ g 2 2 wolf war | SpellDescription$ Create a 2/2 green Wolf creature token.
Oracle:Each creature you control that's a Wolf or Werewolf enters the battlefield with an additional +1/+1 counter on it.\n[-2]: Create a 2/2 green Wolf creature token.
Name:Band Together
ManaCost:2 G
Types:Instant
A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select up to two target creatures you control | AILogic$ PowerDamage | SubAbility$ SoulsDamage | TargetMin$ 0 | TargetMax$ 2 | StackDescription$ None | SpellDescription$ Up to two target creatures you control each deal damage equal to their power to another target creature.
SVar:SoulsDamage:DB$ DealDamage | ValidTgts$ Creature | TgtPrompt$ Select target creature to be dealt damage | NumDmg$ X | References$ X | TargetUnique$ True | AILogic$ PowerDamage
SVar:X:ParentTargeted$CardPower/HalfUp
Oracle:Up to two target creatures you control each deal damage equal to their power to another target creature.
Name:Blast Zone
ManaCost:no cost
Types:Land
K:etbCounter:CHARGE:1
A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}.
A:AB$ PutCounter | Cost$ X X T | CounterType$ CHARGE | CounterNum$ X | References$ X | SpellDescription$ Put X charge counters on CARDNAME.
SVar:X:Count$xPaid
AI:RemoveDeck:All
A:AB$ DestroyAll | Cost$ 3 T Sac<1/CARDNAME> | ValidCards$ Permanent.nonLand+cmcEQY | References$ Y | SpellDescription$ Destroy each nonland permanent with converted mana cost equal to the number of charge counters on CARDNAME.
SVar:Y:Count$CardCounters.CHARGE
Oracle:Blast Zone enters the battlefield with a charge counter on it.\n{T}: Add {C}.\n{X}{X}, {T}: Put X charge counters on Blast Zone.\n{3}, {T}, Sacrifice Blast Zone: Destroy each nonland permanent with converted mana cost equal to the number of charge counters on Blast Zone.
Name:Bond of Insight
ManaCost:3 U
Types:Sorcery
A:SP$ Mill | Cost$ 3 U | NumCards$ 4 | Defined$ Player | SubAbility$ DBChangeZone | SpellDescription$ Each player puts the top four cards of their library into their graveyard. Return up to two instant and/or sorcery cards from your graveyard to your hand. Exile CARDNAME.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TargetMin$ 0 | TargetMax$ 2| TgtPrompt$ Choose up to two instant and/or sorcery cards in your graveyard. | ValidTgts$ Instant.YouCtrl,Sorcery.YouCtrl | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZone | Origin$ Stack | Destination$ Exile
Oracle:Each player puts the top four cards of their library into their graveyard. Return up to two instant and/or sorcery cards from your graveyard to your hand. Exile Bond of Insight.
Name:Casualties of War
ManaCost:2 B B G G
Types:Sorcery
A:SP$ Charm | Cost$ 2 B B G G | MinCharmNum$ 1 | CharmNum$ 5 | Choices$ DestroyArtifact,DestroyCreature,DestroyEnchantment,DestroyLand,DestroyPlaneswalker
SVar:DestroyArtifact:DB$ Destroy | ValidTgts$ Artifact | Tgtprompt$ Select target artifact | Spelldescription$ Destroy target artifact
SVar:DestroyCreature:DB$ Destroy | ValidTgts$ Creature | Tgtprompt$ Select target creature | Spelldescription$ Destroy target creature.
SVar:DestroyEnchantment:DB$ Destroy | ValidTgts$ Enchantment | Tgtprompt$ Select target Enchantment | Spelldescription$ Destroy target Enchantment.
SVar:DestroyLand:DB$ Destroy | ValidTgts$ Land | Tgtprompt$ Select target land | Spelldescription$ Destroy target land.
SVar:DestroyPlaneswalker:DB$ Destroy | ValidTgts$ Planeswalker | Tgtprompt$ Select target planeswalker | Spelldescription$ Destroy target planeswalker.
Oracle:Choose one or more —\n• Destroy target artifact.\n• Destroy target creature.\n• Destroy target enchantment.\n• Destroy target land.\n• Destroy target planeswalker.
Name:Chandra, Fire Artisan
ManaCost:2 R R
Types:Legendary Planeswalker Chandra
Loyalty:4
T:Mode$ CounterRemovedOnce | ValidCard$ Card.Self | CounterType$ LOYALTY | TriggerZones$ Battlefield | Execute$ TrigDmg | TriggerDescription$ Whenever one or more loyalty counters are removed from CARDNAME, CARDNAME deals that much damage to target opponent or planeswalker.
SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Opponent,Planeswalker | TgtPrompt$ Select target opponent or planeswalker | NumDmg$ X | References$ X
SVar:X:TriggerCount$Amount
A:AB$ Mill | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 1 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play it this turn.
SVar:DBEffect:DB$ Effect | StaticAbilities$ STPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup
SVar:STPlay:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Exile | Affected$ Card.IsRemembered | MayPlay$ True | Description$ You may play the card(s) this turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
A:AB$ Mill | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Defined$ You | NumCards$ 7 | Destination$ Exile | RememberMilled$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top seven cards of your library. You may play them this turn.
Oracle:Whenever one or more loyalty counters are removed from Chandra, Fire Artisan, she deals that much damage to target opponent or planeswalker.\n[+1]: Exile the top card of your library. You may play it this turn.\n[-7]: Exile the top seven cards of your library. You may play them this turn.
Name:Chandra's Triumph
ManaCost:1 R
Types:Instant
A:SP$ DealDamage | Cost$ 1 R | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | TgtPrompt$ Select target creature or planeswalker an opponent controls | NumDmg$ X | References$ X,Y | SpellDescription$ CARDNAME deals 3 damage to target creature or planeswalker an opponent controls. CARDNAME deals 5 damage to that permanent instead if you control a Chandra planeswalker.
SVar:Y:Count$Valid Planeswalker.Chandra+YouCtrl
SVar:X:Count$Compare Y GE1.5.3
Oracle:Chandra's Triumph deals 3 damage to target creature or planeswalker an opponent controls. Chandra's Triumph deals 5 damage to that permanent instead if you control a Chandra planeswalker.
Name:Charity Extractor
ManaCost:3 B
Types:Creature Human Knight
PT:1/5
K:Lifelink
Oracle:Lifelink
Name:Despark
ManaCost:W B
Types:Instant
A:SP$ ChangeZone | Cost$ W B | ValidTgts$ Permanent.cmcGE4 | TgtPrompt$ Select target permanent with converted mana cost 4 or greater | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target permanent with converted mana cost 4 or greater.
Oracle:Exile target permanent with converted mana cost 4 or greater.
Name:Divine Arrow
ManaCost:1 W
Types:Instant
A:SP$ DealDamage | Cost$ 1 W | ValidTgts$ Creature.attacking,Creature.blocking | TgtPrompt$ Select target attacking or blocking creature | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to target attacking or blocking creature.
Oracle:Divine Arrow deals 4 damage to target attacking or blocking creature.
Name:Dovin, Hand of Control
ManaCost:2 W/U
Types:Legendary Planeswalker Dovin
Loyalty:5
S:Mode$ RaiseCost | ValidCard$ Artifact,Instant,Sorcery | Activator$ Opponent | Type$ Spell | Amount$ 1 | Description$ Artifact, instant, and sorcery spells your opponents cast cost {1} more to cast.
A:AB$ Pump | Cost$ SubCounter<1/LOYALTY> | ValidTgts$ Permanent.OppCtrl | TgtPrompt$ Select target permanent an opponent controls | Planeswalker$ True | KW$ Prevent all damage that would be dealt to and dealt by CARDNAME. | IsCurse$ True | UntilYourNextTurn$ True | SpellDescription$ Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls.
AI:RemoveDeck:All
Oracle:Artifact, instant, and sorcery spells your opponents cast cost {1} more to cast.\n[-1]: Until your next turn, prevent all damage that would be dealt to and dealt by target permanent an opponent controls.
Name:Duskmantle Operative
ManaCost:1 B
Types:Creature Human Rogue
PT:2/2
K:CantBeBlockedBy Creature.powerGE4
Oracle:Duskmantle Operative can't be blocked by creatures with power 4 or greater.
Name:Finale of Devastation
ManaCost:X G G
Types:Sorcery
A:SP$ ChangeZone | Cost$ X G G | ChangeType$ Creature.YouCtrl+cmcLEX | Hidden$ True | Origin$ Library | OriginChoice$ True | OriginAlternative$ Graveyard | AlternativeMessage$ Would you like to search your library with this ability? If you do, your library will be shuffled. | Destination$ Battlefield | ShuffleNonMandatory$ True | SubAbility$ DBPump | SpellDescription$ Search your library and/or graveyard for a creature card with converted mana cost X or less and put it onto the battlefield. If you search your library this way, shuffle it. If X is 10 or more, creatures you control get +X/+X and gain haste until end of turn.
SVar:DBPump:DB$ PumpAll | ValidCards$ Creature.YouCtrl | KW$ Haste | NumAtt$ X | NumDef$ X | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:X:Count$xPaid
Oracle:Search your library and/or graveyard for a creature card with converted mana cost X or less and put it onto the battlefield. If you search your library this way, shuffle it. If X is 10 or more, creatures you control get +X/+X and gain haste until end of turn.
Name:Finale of Eternity
ManaCost:X B B
Types:Sorcery
A:SP$ Destroy | Cost$ X B B | References$ X | TargetMin$ 0 | TargetMax$ 3 | ValidTgts$ Creature.toughnessLEX | SubAbility$ DBChangeZone | SpellDescription$ Destroy up to three target creatures with toughness X or less. If X is 10 or more, return all creature cards from your graveyard to the battlefield.
SVar:DBChangeZone:DB$ ChangeZoneAll | ChangeType$ Creature.YouCtrl | Origin$ Graveyard | Destination$ Battlefield | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:X:Count$xPaid
Oracle:Destroy up to three target creatures with toughness X or less. If X is 10 or more, return all creature cards from your graveyard to the battlefield.
\ No newline at end of file
Name:Finale of Glory
ManaCost:X W W
Types:Sorcery
A:SP$ Token | Cost$ X W W | TokenAmount$ X | References$ X | TokenScript$ w_2_2_soldier_vigilance | TokenOwner$ You | SubAbility$ DBAngels | SpellDescription$ Create X 2/2 white Soldier creature tokens with vigilance. If X is 10 or more, also create X 4/4 white Angel creature tokens with flying and vigilance.
SVar:DBAngels:DB$ Token | TokenAmount$ X | References$ X | TokenScript$ w_4_4_angel_flying_vigilance | TokenOwner$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:X:Count$xPaid
Oracle:Create X 2/2 white Soldier creature tokens with vigilance. If X is 10 or more, also create X 4/4 white Angel creature tokens with flying and vigilance.
\ No newline at end of file
Name:Finale of Promise
ManaCost:X R R
Types:Sorcery
A:SP$ Pump | Cost$ X R R | ValidTgts$ Instant.YouOwn+cmcLEX | TgtZone$ Graveyard | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target instant card in your graveyard with converted mana cost X or less | RememberObjects$ Targeted | SubAbility$ DBPump | References$ X | SpellDescription$ You may cast up to one target instant card and/or sorcery card from your graveyard each with converted mana cost X or less without paying their mana costs. If a card cast this way would be put into your graveyard this turn, exile it instead. If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies.
SVar:DBPump:DB$ Pump | ValidTgts$ Sorcery.YouOwn+cmcLEX | TgtZone$ Graveyard | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target sorcery card in your graveyard with converted mana cost X or less | RememberObjects$ Targeted | SubAbility$ DBPlay | References$ X | StackDescription$ None
SVar:DBPlay:DB$ Play | Valid$ Card.IsRemembered | ValidZone$ Graveyard | Controller$ You | CopyCard$ True | CopyOnce$ True | WithoutManaCost$ True | Optional$ True | Amount$ All | SubAbility$ DBRepeat
SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ Remembered | ClearRemembered$ True | ChooseOrder$ True | RepeatSubAbility$ DBCopy | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:DBCopy:DB$ CopySpellAbility | Amount$ 2 | Defined$ Remembered
SVar:X:Count$xPaid
Oracle:You may cast up to one target instant card and/or sorcery card from your graveyard each with converted mana cost X or less without paying their mana costs. If a card cast this way would be put into your graveyard this turn, exile it instead. If X is 10 or more, copy each of those spells twice. You may choose new targets for the copies.
\ No newline at end of file
Name:Finale of Revelation
ManaCost:X U U
Types:Sorcery
A:SP$ ChangeZoneAll | Cost$ X U U | ChangeType$ Card | Origin$ Graveyard | Destination$ Library | Shuffle$ True | Random$ True | SubAbility$ DBDraw | UseAllOriginZones$ True | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10 | SpellDescription$ Draw X cards. If X is 10 or more, instead shuffle your graveyard into your library, draw X cards, untap up to five lands, and you have no maximum hand size for the rest of the game.
SVar:DBDraw:DB$ Draw | NumCards$ X | References$ X | SubAbility$ DBUntap
SVar:DBUntap:DB$ Untap | UntapUpTo$ True | UntapType$ Land | Amount$ 5 | SubAbility$ DBEffect | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:DBEffect:DB$ Effect | Name$ Finale of Revelation Effect | StaticAbilities$ STHandSize | Duration$ Permanent | SubAbility$ DBChange | References$ X | ConditionCheckSVar$ X | ConditionSVarCompare$ GE10
SVar:STHandSize:Mode$ Continuous | EffectZone$ Command | Affected$ You | SetMaxHandSize$ Unlimited | Description$ You have no maximum hand size.
SVar:DBChange:DB$ ChangeZone | Origin$ Stack | Destination$ Exile | StackDescription$ Exile CARDNAME
SVar:X:Count$xPaid
Oracle:Draw X cards. If X is 10 or more, instead shuffle your graveyard into your library, draw X cards, untap up to five lands, and you have no maximum hand size for the rest of the game.\nExile Finale of Revelation.
Name:Gideon's Triumph
ManaCost:1 W
Types:Instant
A:SP$ Sacrifice | Cost$ 1 W | ValidTgts$ Opponent | SacValid$ Creature.attackedThisTurn,Creature.blockedThisTurn | SacMessage$ Creature that attacked or blocked this turn | Amount$ X | References$ X SpellDescription$ Target opponent sacrifices a creature that attacked or blocked this turn. If you control a Gideon planeswalker, that player sacrifices two of those creatures instead.
SVar:Y:Count$Valid Planeswalker.Gideon+YouCtrl
SVar:X:Count$Compare Y GE1.2.1
Oracle:Target opponent sacrifices a creature that attacked or blocked this turn. If you control a Gideon planeswalker, that player sacrifices two of those creatures instead.
Name:God-Eternal Oketra
ManaCost:3 W W
Types:Legendary Creature Zombie God
PT:3/6
K:Double Strike
T:Mode$ SpellCast | ValidCard$ Creature | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, create a 4/4 black Zombie Warrior creature token with vigilance.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ b_4_4_zombie_warrior_vigilance | TokenOwner$ You | LegacyImage$ b 4 4 zombie warrior vigilance war
DeckHas:Ability$Token
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Exile | ValidCard$ Card.Self | Execute$ TrigChange | OptionalDecider$ You | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies or is put into exile from the battlefield, you may put it into its owner's library third from the top.
SVar:TrigChange:DB$ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 2
Oracle:Double strike\nWhenever you cast a creature spell, create a 4/4 black Zombie Warrior creature token with vigilance.\nWhen God-Eternal Oketra dies or is put into exile from the battlefield, you may put it into its owner's library third from the top.
Name:Guildpact Informant
ManaCost:2 U
Types:Creature Faerie Rogue
PT:1/1
K:Flying
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | CombatDamage$ True | Execute$ TrigProliferate | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or planeswalker, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
SVar:TrigProliferate:DB$ Proliferate
DeckHas:Ability$Proliferate
DeckNeeds:Ability$Counters
Oracle:Flying\nWhenever Guildpact Informant deals combat damage to a player or planeswalker, proliferate. (Choose any number of permanents and/or players, then give each another counter of each kind already there.)
Name:Heartfire
ManaCost:1 R
Types:Instant
A:SP$ DealDamage | Cost$ 1 R Sac<1/Creature;Planeswalker/creature or planeswalker> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 4 | SpellDescription$ CARDNAME deals 4 damage to any target.
SVar:AIPreference:SacCost$Creature.token,Planeswalker.cmcLE2
Oracle:As an additional cost to cast this spell, sacrifice a creature or planeswalker.\nHeartfire deals 4 damage to any target.
Name:Huatli, the Sun's Heart
ManaCost:2 G/W
Types:Legendary Planeswalker Huatli
Loyalty:7
S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddHiddenKeyword$ CARDNAME assigns combat damage equal to its toughness rather than its power | Description$ Each creature you control assigns combat damage equal to its toughness rather than its power.
A:AB$ GainLife | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the greatest toughness among creatures you control.
SVar:X:Count$GreatestToughness_Creature.YouCtrl
SVar:NeedsToPlay:Creature.YouCtrl
AI:RemoveDeck:Random
DeckNeeds:Ability$LifeGain
Oracle:Each creature you control assigns combat damage equal to its toughness rather than its power.\n[-3]: You gain life equal to the greatest toughness among creatures you control.
Name:Jace, Arcane Strategist
ManaCost:4 U U
Types:Legendary Planeswalker Jace
Loyalty:4
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | CheckSVar$ X | SVarCompare$ EQ2 | TriggerDescription$ Whenever you draw your second card each turn, put a +1/+1 counter on target creature you control.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control | CounterType$ P1P1 | CounterNum$ 1
AI:RemoveDeck:Random
DeckHas:Ability$Counters
A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card.
A:AB$ PumpAll | Cost$ SubCounter<7/LOYALTY> | ValidCards$ Creature.YouCtrl | KW$ HIDDEN Unblockable | SpellDescription$ Creatures you control can't be blocked this turn.
SVar:X:Count$YouDrewThisTurn
Oracle:Whenever you draw your second card each turn, put a +1/+1 counter on target creature you control.\n[+1]: Draw a card.\n[-7]: Creatures you control can't be blocked this turn.
......@@ -7,7 +7,7 @@ SVar:Win:DB$WinsGame | Defined$ You
A:AB$ Mill | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | RememberMilled$ True | SubAbility$ DBDraw | SpellDescription$ Target player puts the top two cards of their library into their graveyard. Draw a card.
SVar:DBDraw:DB$ Draw | NumCards$ 1
A:AB$ Draw | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | NumCards$ 7 | SubAbility$ WinGame | SpellDescription$ Draw seven cards. Then if your library has no cards in it, you win the game.
SVar:Win:DB$WinGame | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X
SVar:WinGame:DB$WinsGame | Defined$ You | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ0 | References$ X
SVar:X:Count$InYourLibrary
AI:RemoveDeck:Random
Oracle:If you would draw a card while your library has no cards in it, you win the game instead.\n[+1]: Target player puts the top two cards of their library into their graveyard. Draw a card.\n[-8]: Draw seven cards. Then if your library has no cards in it, you win the game.
Name:Jace's Projection
ManaCost:2 U U
Types:Creature Wizard Illusion
PT:2/2
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you draw a card, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
A:AB$ PutCounter | Cost$ 3 U | ValidTgts$ Planeswalker.Jace | TgtPrompt$ Select target Jace | CounterType$ LOYALTY | CounterNum$ 1 | SpellDescription$ Put a loyalty counter on target Jace planeswalker.
Oracle:Whenever you draw a card, put a +1/+1 counter on Jace's Projection.\n{3}{U}: Put a loyalty counter on target Jace planeswalker.
Name:Jace's Ruse
ManaCost:3 U U
Types:Sorcery
A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SubAbility$ DBSearch | SpellDescription$ Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Wizards, reveal it, and put it into your hand. If you search your library this way, shuffle it.
SVar:DBSearch:DB$ChangeZone | Origin$ Library,Graveyard | Destination$ Hand | ChangeType$ Card.namedJace; Arcane Strategist | ChangeNum$ 1 | Optional$ True
DeckHints:Name$Jace, Arcane Strategist
Oracle:Return up to two target creatures to their owner's hand. You may search your library and/or graveyard for a card named Jace, Arcane Strategist, reveal it, and put it into your hand. If you search your library this way, shuffle it.
Name:Jace's Triumph
ManaCost:2 U
Types:Sorcery
A:SP$ Draw | Cost$ 2 U | NumCards$ X | References$ X | SpellDescription$ Draw two cards. If you control a Jace Planeswalker, draw three cards instead.
SVar:Y:Count$Valid Planeswalker.Jace+YouCtrl
SVar:X:Count$Compare Y GE1.3.2
Oracle:Draw two cards. If you control a Jace Planeswalker, draw three cards instead.
\ No newline at end of file
Name:Jiang Yanggu, Wildcrafter
ManaCost:2 G
Types:Legendary Planeswalker Yanggu
Loyalty:3
S:Mode$ Continuous | Affected$ Creature.YouCtrl+counters_GE1_P1P1 | AddAbility$ AnyMana | Description$ Each creature you control with a +1/+1 counter on it has "{T}: Add one mana of any color."
SVar:AnyMana:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
DeckHints:Ability$Counters
A:AB$ PutCounter | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature.
Oracle:Each creature you control with a +1/+1 counter on it has "{T}: Add one mana of any color."\n[-1]: Put a +1/+1 counter on target creature.
Name:Kraul Stinger
ManaCost:2 G
Types:Creature Insect Assassin
PT:2/2
K:Deathtouch
Oracle:Deathtouch
......@@ -3,6 +3,7 @@ ManaCost:2 R/W R/W
Types:Legendary Planeswalker Nahiri
Loyalty:6
S:Mode$ Continuous | Affected$ Creature.YouCtrl | EffectZone$ Battlefield | AddKeyword$ First Strike | Condition$ PlayerTurn | Description$ As long as it's your turn, creatures you control have first strike and equip abilities you activate cost {1} less to activate.
A:AB$ DealDamage | Cost$ SubCounter<X/LOYALTY> | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to target tapped creature.
S:Mode$ ReduceCost | ValidCard$ Card | ValidSpell$ Activated.Equip | Activator$ You | Amount$ 1 | Condition$ PlayerTurn | Secondary$ True | Description$ Equip abilities you activate cost {1} less to activate.
A:AB$ DealDamage | Cost$ SubCounter<X/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | NumDmg$ X | References$ X | SpellDescription$ CARDNAME deals X damage to target tapped creature.
SVar:X:Count$xPaid
Oracle:As long as it's your turn, creatures you control have first strike and equip abilities you activate cost {1} less to activate.\n-X: Nahiri, Storm of Stone deals X damage to target tapped creature.
Name:Narset, Parter of Veils
ManaCost:1 U U
Types:Legendary Planeswalker Narset
Loyalty:5
S:Mode$ Continuous | Affected$ Opponent | AddKeyword$ You can't draw more than one card each turn. | Description$ Each opponent can't draw more than one card each turn.
A:AB$ Dig | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | DigNum$ 4 | ChangeNum$ 1 | Optional$ True | ChangeValid$ Card.nonCreature+nonLand | RestRandomOrder$ True | SpellDescription$ Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
Oracle:Each opponent can't draw more than one card each turn.\n[-2]: Look at the top four cards of your library. You may reveal a noncreature, nonland card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
Name:Neheb, Dreadhorde Champion
ManaCost:2 R R
Types:Legendary Creature Zombie Minotaur Warrior
PT:5/4
K:Trample
T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | Execute$ TrigDiscard | CombatDamage$ True | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME deals combat damage to a player or planeswalker, you may discard any number of cards. If you do, draw that many cards and add that many {R}. Until end of turn, you don't lose this mana as steps and phases end.
SVar:TrigDiscard:DB$ Discard | AnyNumber$True | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SubAbility$ DBMana
SVar:DBMana:DB$ Mana | Produced$ R | Amount$ X | References$ X | PersistentMana$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Remembered$Amount
Oracle:Trample\nWhenever Neheb, Dreadhorde Champion deals combat damage to a player or planeswalker, you may discard any number of cards. If you do, draw that many cards and add that much {R}. Until end of turn, you don't lose this mana as steps and phases end.
Name:Neoform
ManaCost:G U
Types:Sorcery
A:SP$ ChangeZone | Cost$ G U Sac<1/Creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcEQX | ChangeNum$ 1 | References$ X | RememberChanged$ True | SubAbility$ DBCounter | StackDescription$ SpellDescription | SpellDescription$ Search your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield with an additional +1/+1 counter on it, then shuffle your library.
SVar:DBCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ 1 | Static$ True | SubAbility$ DBCleanup |
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Sacrificed$CardManaCost/Plus.1
AI:RemoveDeck:Random
Oracle:As an additional cost to cast this spell, sacrifice a creature.\nSearch your library for a creature card with converted mana cost equal to 1 plus the sacrificed creature's converted mana cost, put that card onto the battlefield with an additional +1/+1 counter on it, then shuffle your library.
Name:Nicol Bolas, Dragon-God
ManaCost:U B B B R
Types:Legendary Planeswalker Bolas
Loyalty:4
S:Mode$ Continuous | Affected$ Card.Self | EffectZone$ Battlefield | GainsAbilitiesOf$ Planeswalker.Other | Description$ CARDNAME has all loyalty abilities of all other planeswalkers on the battlefield.
A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | NumCards$ 1 | SubAbility$ DBChangeZone | Planeswalker$ True | SpellDescription$ You draw a card. Each opponent exiles a card from their hand or a permanent they control.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Battlefield,Hand | Destination$ Exile | DefinedPlayer$ Player.Opponent | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True |
AI:RemoveDeck:Random
A:AB$ Destroy | Cost$ SubCounter<3/LOYALTY> | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | Planeswalker$ True | SpellDescription$ Destroy target creature or planeswalker.
A:AB$ LosesGame | Cost$ SubCounter<8/LOYALTY> | Defined$ Player.Opponent+controlsLegendary.Creature_EQ0+controlsPlaneswalker_LE0 | Planeswalker$ True | Ultimate$ True | SpellDescription$ Each opponent who doesn't control a legendary creature or planeswalker loses the game.
Oracle:Nicol Bolas, Dragon-God has all loyalty abilities of all other planeswalkers on the battlefield.\n[+1]: You draw a card. Each opponent exiles a card from their hand or a permanent they control. [-3]: Destroy target creature or planeswalker.\n[-8]: Each opponent who doesn't control a legendary creature or planeswalker loses the game.
Name:Nissa, Who Shakes the World
ManaCost:3 G G
Types:Legendary Planeswalker Nissa
Loyalty:5
T:Mode$ TapsForMana | ValidCard$ Forest.YouCtrl | Execute$ TrigMana | TriggerZones$ Battlefield | Static$ True | TriggerDescription$ Whenever you tap a Forest for mana, add an additional {G}.
SVar:TrigMana:DB$Mana | Produced$ G | Amount$ 1
A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | CounterType$ P1P1 | CounterNum$ 3 | ValidTgts$ Land.nonCreature+YouCtrl | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target noncreature land you control | SubAbility$ DBUntap | SpellDescription$ Put three +1/+1 counters on up to one target noncreature land you control. Untap it. It becomes a 0/0 Elemental creature with vigilance and haste that's still a land.
SVar:DBUntap:DB$ Untap | Defined$ Targeted | SubAbility$ DBAnimate
SVar:DBAnimate:DB$ Animate | Defined$ Targeted | Power$ 0 | Toughness$ 0 | Types$ Creature,Elemental | Keywords$ Vigilance & Haste | Permanent$ True
A:AB$ Effect | Cost$ SubCounter<8/LOYALTY> | Name$ Emblem - Nissa, Who Shakes the World | Image$ emblem_nissa_who_shakes_the_world | Duration$ Permanent | Stackable$ False | Planeswalker$ True | Ultimate$ True | StaticAbilities$ STIndestructible | SubAbility$ DBChangeZone | SpellDescription$ You get an emblem with "Lands you control have indestructible." Search your library for any number of Forest cards, put them onto the battlefield tapped, then shuffle your library.
SVar:STIndestructible:Mode$ Continuous | EffectZone$ Command | Affected$ Land.YouCtrl | AffectedZone$ Battlefield | AddKeyword$ Indestructible | Description$ Lands you control have indestructible.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Forest | ChangeNum$ XFetch | References$ XFetch | Tapped$ True | StackDescription$ Search your library for any number of Forest cards, put them onto the battlefield tapped, then shuffle your library.
SVar:XFetch:Count$TypeInYourLibrary.Forest
Oracle:Whenever you tap a Forest for mana, add an additional {G}.\n[+1]: Put three +1/+1 counters on up to one target noncreature land you control. Untap it. It becomes a 0/0 Elemental creature with vigilance and haste that's still a land.\n[-8]: You get an emblem with "Lands you control have indestructible." Search your library for any number of Forest cards, put them onto the battlefield tapped, then shuffle your library.
Name:Nissa's Triumph
ManaCost:G G
Types:Sorcery
A:SP$ ChangeZone | Cost$ G G | Origin$ Library | Destination$ Hand | ChangeType$ Land.Basic+Forest | ChangeNum$ 2 | ConditionPresent$ Planeswalker.Nissa+YouCtrl | ConditionCompare$ EQ0 | SubAbility$ DBChangeZone | SpellDescription$ Search your library for up to two basic Forest cards. If you control a Nissa planeswalker, instead search your library for up to three land cards. Reveal those cards, put them into your hand, then shuffle your library.
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Land | ChangeNum$ 3 | ConditionPresent$ Planeswalker.Nissa+YouCtrl | ConditionCompare$ GE1 |
Oracle:Search your library for up to two basic Forest cards. If you control a Nissa planeswalker, instead search your library for up to three land cards. Reveal those cards, put them into your hand, then shuffle your library.
......@@ -6,7 +6,7 @@ K:Flying
K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put two +1/+1 counters on another target creature you control.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.Other+YouCtrl | TgtPrompt$ Select another target creature you control | CounterType$ P1P1 | CounterNum$ 2
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME dies, proliferate, then proliferate again.
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | TriggerController$ TriggeredCardController | Execute$ TrigProliferate | TriggerDescription$ When CARDNAME dies, proliferate, then proliferate again.
SVar:TrigProliferate:DB$ Proliferate | SubAbility$ TrigProliferate2
SVar:TrigProliferate2:DB$ Proliferate
DeckHas:Ability$Proliferate
......
Name:Rubblebelt Rioters
ManaCost:1 R G
Types:Creature Human Berserker
PT:0/4
K:Haste
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, it gets +X/+0 until end of turn, where X is the greatest power among creatures you control.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ X | References$ X
SVar:X:Count$GreatestPower_Creature.YouCtrl
Oracle:Haste\nWhenever Rubblebelt Rioters attacks, it gets +X/+0 until end of turn, where X is the greatest power among creatures you control.
Name:Sarkhan's Catharsis
ManaCost:4 R
Types:Instant
A:SP$ DealDamage | Cost$ 4 R | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ 5 | SpellDescription$ CARDNAME deals 5 damage to target player or planeswalker.
Oracle:Sarkhan's Catharsis deals 5 damage to target player or planeswalker.
Name:Snarespinner
ManaCost:1 G
Types:Creature Spider
PT:1/3
K:Reach
T:Mode$ AttackerBlocked | ValidCard$ Creature.withFlying | ValidBlocker$ Card.Self | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME blocks a creature with flying, CARDNAME gets +2/+0 until end of turn.
SVar:TrigPump:DB$Pump | Defined$ Self | NumAtt$ 2
Oracle:Reach\nWhenever Snarespinner blocks a creature with flying, Snarespinner gets +2/+0 until end of turn.
Name:Soul Diviner
ManaCost:U B
Types:Creature Zombie Wizard
PT:2/3
A:AB$ Draw | Cost$ T RemoveAnyCounter<1/Card.Artifact, Card.Creature, Card.Land, Card.Planeswalker/artifact, creature, land or planeswalker> | NumCards$ 1 | SpellDescription$ Draw a card.
AI:RemoveDeck:Random
Oracle:{T}, Remove a counter from an artifact, creature, land, or planeswalker you control: Draw a card.
Name:Spark Reaper
ManaCost:2 B
Types:Creature Zombie
PT:2/3
A:AB$ GainLife | Cost$ 3 Sac<1/Creature, Planeswalker/creature or planeswalker> | Defined$ You | LifeAmount$ 1 | SubAbility$ DBDraw | SpellDescription$ You gain 1 life and draw a card.
SVar:DBDraw:DB$ Draw | NumCards$ 1
AI:RemoveDeck:Random
Oracle:{3}, Sacrifice a creature or planeswalker: You gain 1 life and draw a card.
Name:The Elderspell
ManaCost:B B
Types:Sorcery
A:SP$ Destroy | Cost$ B B | ValidTgts$ Planeswalker | TgtPrompt$ Select target planeswalker | TargetMin$ 0 | TargetMax$ MaxTargets | References$ MaxTargets | SubAbility$ DBChooseCard | RememberDestroyed$ True | SpellDescription$ Destroy any number of target planeswalkers. Choose a planeswalker you control. Put two loyalty counters on it for each planeswalker destroyed this way.
SVar:DBChooseCard:DB$ ChooseCard | Defined$ You | Amount$ 1 | Choices$ Planeswalker.YouCtrl | Mandatory$ True | SubAbility$ DBPutLoyalty
SVar:DBPutLoyalty:DB$ PutCounter | Defined$ ChosenCard | CounterType$ LOYALTY | CounterNum$ X | References$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:MaxTargets:Count$Valid Planeswalker
SVar:X:Count$RememberedSize/Twice
Oracle:Destroy any number of target planeswalkers. Choose a planeswalker you control. Put two loyalty counters on it for each planeswalker destroyed this way.
Name:Tibalt, Rakish Instigator
ManaCost:2 R
Types:Legendary Planeswalker Tibalt
Loyalty:5
S:Mode$ Continuous | Affected$ Player.Opponent | AddKeyword$ You can't gain life. | Description$ Your opponents can't gain life.
A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | TokenAmount$ 1 | TokenScript$ r_1_1_devil_burn | TokenOwner$ You | LegacyImage$ r 1 1 devil burn war | Planeswalker$ True | SpellDescription$ Create a 1/1 red Devil creature token "When this creature dies, it deals 1 damage to any target."
DeckHas:Ability$Token
Oracle:Your opponents can't gain life.\n[-2]: Create a 1/1 red Devil creature token with "When this creature dies, it deals 1 damage to any target."
Name:Tithebearer Giant
ManaCost:5 B
Types:Creature Giant Warrior
PT:4/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, you draw a card and you lose 1 life.
SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 1
Oracle:When Tithebearer Giant enters the battlefield, you draw a card and you lose 1 life.
Name:Trusted Pegasus
ManaCost:2 W
Types:Creature Pegasus
PT:2/2
K:Flying
T:Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever CARDNAME attacks, target attacking creature without flying gains flying until end of turn.
SVar:TrigPump:DB$ Pump | ValidTgts$ Creature.attacking+withoutFlying | TgtPrompt$ Select target attacking creature without flying | KW$ Flying
Oracle:Flying\nWhenever Trusted Pegasus attacks, target attacking creature without flying gains flying until end of turn.
Name:Ugin's Conjurant
ManaCost:X
Types:Creature Spirit Monk
PT:0/0
K:etbCounter:P1P1:X
SVar:X:Count$xPaid
R:Event$ DamageDone | ActiveZones$ Battlefield | ValidTarget$ Card.Self+counters_GE1_P1P1 | ReplaceWith$ Counters | PreventionEffect$ True | Description$ If damage would be dealt to CARDNAME while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from CARDNAME.
SVar:Counters:DB$ RemoveCounter | Defined$ ReplacedTarget | CounterType$ P1P1 | CounterNum$ CounterNum$ Y | References$ Y
SVar:Y:ReplaceCount$DamageAmount
Oracle:Ugin's Conjurant enters the battlefield with X +1/+1 counters on it.\nIf damage would be dealt to Ugin's Conjurant while it has a +1/+1 counter on it, prevent that damage and remove that many +1/+1 counters from Ugin's Conjurant.
Name:Unlikely Aid
ManaCost:1 B
Types:Instant
A:SP$ Pump | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ Indestructible | SpellDescription$ Target creature gets +2/+0 and gains indestructible until end of turn.
Oracle:Target creature gets +2/+0 and gains indestructible until end of turn. (Damage and effects that say "destroy" don't destroy it.)
Name:Vampire Opportunist
ManaCost:1 B
Types:Creature Vampire
PT:2/1
A:AB$ LoseLife | Cost$ 6 B | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life.
SVar:DBGainLife:DB$GainLife | LifeAmount$ 2
Oracle:{6}{B}: Each opponent loses 2 life and you gain 2 life.
......@@ -6,7 +6,7 @@ Code2=WAR
MciCode=war
Type=Expansion
BoosterCovers=5
Booster=10 Common, 3 Uncommon, 1 RareMythic, 1 fromSheet
Booster=10 Common, 3 Uncommon, 1 RareMythic
[cards]
1 R Karn, the Great Creator
......
[metadata]
Name:Possibility Storm - Ravnica Allegiance Sunset Puzzle
URL:http://www.possibilitystorm.com/wp-content/uploads/2019/04/109.-RNA004.jpg
Goal:Win
Turns:1
Difficulty:Uncommon
Description:Win this turn. You don't start with the City's Blessing. Assume your opponent has five cards in hand, but can't cast any this turn. Your Ravenous Chupacabra is exiled by your opponent's Hostage Taker.
[state]
humanlife=5
ailife=10
turn=1
activeplayer=human
activephase=MAIN1
humanhand=Dauntless Bodyguard;Goblin Cratermaker;Gruesome Menagerie;Mind Rot
humangraveyard=Electrostatic Field;Tin Street Dodger;Tocatli Honor Guard;Deadeye Tormentor;Plaguecrafter;Haazda Officer
humanbattlefield=Mausoleum Harpy;Fire Shrine Keeper;Fell Specter;Dire Fleet Hoarder;Sacred Foundry|NoETBTrigs;Swamp;Swamp;Azor's Gateway|Transformed;Ravenous Chupacabra|Id:100
aihand=Hostage Taker;Hostage Taker;Hostage Taker;Citywatch Sphinx;Citywatch Sphinx
aibattlefield=Hostage Taker|ExecuteScript:TrigExile->100;Citywatch Sphinx;Amulet of Safekeeping;Amulet of Safekeeping
Name:Zombie Warrior
ManaCost:no cost
Types:Creature Zombie Warrior
Colors:black
PT:4/4
K:Vigilance
Oracle:Vigilance
Name:Soldier
ManaCost:no cost
Types:Creature Soldier
Colors:white
PT:2/2
K:Vigilance
Oracle:Vigilance