Merge remote-tracking branch 'remotes/core/master' into newBranch

This commit is contained in:
Anthony Calosa
2020-04-06 06:15:52 +08:00
22 changed files with 255 additions and 26 deletions

View File

@@ -150,6 +150,19 @@ public class CountersPutEffect extends SpellAbilityEffect {
CardCollection leastToughness = new CardCollection(Aggregates.listWithMin(creatsYouCtrl, CardPredicates.Accessors.fnGetDefense)); CardCollection leastToughness = new CardCollection(Aggregates.listWithMin(creatsYouCtrl, CardPredicates.Accessors.fnGetDefense));
tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false)); tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false));
tgtObjects.addAll(tgtCards); tgtObjects.addAll(tgtCards);
} else if (sa.hasParam("Choices")) {
ZoneType choiceZone = ZoneType.Battlefield;
if (sa.hasParam("ChoiceZone")) {
choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone"));
}
CardCollection choices = new CardCollection(game.getCardsIn(choiceZone));
int n = sa.hasParam("ChoiceAmount") ? Integer.parseInt(sa.getParam("ChoiceAmount")) : 1;
choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, card);
String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " ";
tgtObjects.addAll(new CardCollection(pc.chooseCardsForEffect(choices, sa, title, n, n, !sa.hasParam("ChoiceOptional"))));
} else { } else {
tgtObjects.addAll(getDefinedOrTargeted(sa, "Defined")); tgtObjects.addAll(getDefinedOrTargeted(sa, "Defined"));
} }

View File

@@ -129,6 +129,8 @@ public class Card extends GameEntity implements Comparable<Card> {
private final Multimap<Long, Keyword> cantHaveKeywords = MultimapBuilder.hashKeys().enumSetValues(Keyword.class).build(); private final Multimap<Long, Keyword> cantHaveKeywords = MultimapBuilder.hashKeys().enumSetValues(Keyword.class).build();
private final Map<CounterType, Long> counterTypeTimestamps = Maps.newEnumMap(CounterType.class);
private final Map<Long, Integer> canBlockAdditional = Maps.newTreeMap(); private final Map<Long, Integer> canBlockAdditional = Maps.newTreeMap();
private final Set<Long> canBlockAny = Sets.newHashSet(); private final Set<Long> canBlockAny = Sets.newHashSet();
@@ -1305,12 +1307,44 @@ public class Card extends GameEntity implements Comparable<Card> {
getController().addCounterToPermThisTurn(counterType, addAmount); getController().addCounterToPermThisTurn(counterType, addAmount);
view.updateCounters(this); view.updateCounters(this);
} }
if (newValue <= 0) {
removeCounterTimestamp(counterType);
} else {
addCounterTimestamp(counterType);
}
if (table != null) { if (table != null) {
table.put(this, counterType, addAmount); table.put(this, counterType, addAmount);
} }
return addAmount; return addAmount;
} }
public boolean addCounterTimestamp(CounterType counterType) {
return addCounterTimestamp(counterType, true);
}
public boolean addCounterTimestamp(CounterType counterType, boolean updateView) {
if (!counterType.isKeywordCounter()) {
return false;
}
removeCounterTimestamp(counterType);
long timestamp = game.getNextTimestamp();
counterTypeTimestamps.put(counterType, timestamp);
addChangedCardKeywords(List.of(counterType.getKeyword().toString()), null, false, false, timestamp, updateView);
return true;
}
public boolean removeCounterTimestamp(CounterType counterType) {
return removeCounterTimestamp(counterType, true);
}
public boolean removeCounterTimestamp(CounterType counterType, boolean updateView) {
Long old = counterTypeTimestamps.remove(counterType);
if (old != null) {
removeChangedCardKeywords(old, updateView);
}
return old != null;
}
/** /**
* <p> * <p>
* addCountersAddedBy. * addCountersAddedBy.
@@ -1358,6 +1392,10 @@ public class Card extends GameEntity implements Comparable<Card> {
setCounters(counterName, newValue); setCounters(counterName, newValue);
view.updateCounters(this); view.updateCounters(this);
if (newValue <= 0) {
this.removeCounterTimestamp(counterName);
}
//fire card stats changed event if p/t bonuses or loyalty changed from subtracted counters //fire card stats changed event if p/t bonuses or loyalty changed from subtracted counters
if (powerBonusBefore != getPowerBonusFromCounters() || toughnessBonusBefore != getToughnessBonusFromCounters() || loyaltyBefore != getCurrentLoyalty()) { if (powerBonusBefore != getPowerBonusFromCounters() || toughnessBonusBefore != getToughnessBonusFromCounters() || loyaltyBefore != getCurrentLoyalty()) {
getGame().fireEvent(new GameEventCardStatsChanged(this)); getGame().fireEvent(new GameEventCardStatsChanged(this));
@@ -1380,8 +1418,23 @@ public class Card extends GameEntity implements Comparable<Card> {
@Override @Override
public final void setCounters(final Map<CounterType, Integer> allCounters) { public final void setCounters(final Map<CounterType, Integer> allCounters) {
boolean changed = false;
for (CounterType ct : counters.keySet()) {
if (removeCounterTimestamp(ct, false)) {
changed = true;
}
}
counters = allCounters; counters = allCounters;
view.updateCounters(this); view.updateCounters(this);
for (CounterType ct : counters.keySet()) {
if (addCounterTimestamp(ct, false)) {
changed = true;
}
}
if (changed) {
updateKeywords();
}
} }
@Override @Override
@@ -1389,6 +1442,16 @@ public class Card extends GameEntity implements Comparable<Card> {
if (counters.isEmpty()) { return; } if (counters.isEmpty()) { return; }
counters.clear(); counters.clear();
view.updateCounters(this); view.updateCounters(this);
boolean changed = false;
for (CounterType ct : counterTypeTimestamps.keySet()) {
if (removeCounterTimestamp(ct, false)) {
changed = true;
}
}
if (changed) {
updateKeywords();
}
} }
public final String getSVar(final String var) { public final String getSVar(final String var) {

View File

@@ -20,6 +20,8 @@ package forge.game.card;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import forge.game.keyword.Keyword;
/** /**
* The class Counters. * The class Counters.
* *
@@ -309,7 +311,23 @@ public enum CounterType {
EXPERIENCE("EXP"), EXPERIENCE("EXP"),
POISON("POISN"); POISON("POISN"),
// Keyword Counters
FLYING("Flying"),
FIRST_STRIKE("First Strike"),
DOUBLE_STRIKE("Double Strike"),
DEATHTOUCH("Deathtouch"),
HEXPROOF("Hexproof"),
INDESTRUCTIBLE("Indestructible"),
LIFELINK("Lifelink"),
MENACE("Menace"),
REACH("Reach"),
TRAMPLE("Trample"),
VIGILANCE("Vigilance")
;
private String name, counterOnCardDisplayName; private String name, counterOnCardDisplayName;
private int red, green, blue; private int red, green, blue;
@@ -365,6 +383,39 @@ public enum CounterType {
return Enum.valueOf(CounterType.class, replacedName); return Enum.valueOf(CounterType.class, replacedName);
} }
public boolean isKeywordCounter() {
return this.getKeyword() != null;
}
public Keyword getKeyword() {
switch (this) {
case FLYING:
return Keyword.FLYING;
case FIRST_STRIKE:
return Keyword.FIRST_STRIKE;
case DOUBLE_STRIKE:
return Keyword.DOUBLE_STRIKE;
case DEATHTOUCH:
return Keyword.DEATHTOUCH;
case HEXPROOF:
return Keyword.HEXPROOF;
case INDESTRUCTIBLE:
return Keyword.INDESTRUCTIBLE;
case LIFELINK:
return Keyword.LIFELINK;
case MENACE:
return Keyword.MENACE;
case REACH:
return Keyword.REACH;
case TRAMPLE:
return Keyword.TRAMPLE;
case VIGILANCE:
return Keyword.VIGILANCE;
default:
return null;
}
}
public static final ImmutableList<CounterType> values = ImmutableList.copyOf(values()); public static final ImmutableList<CounterType> values = ImmutableList.copyOf(values());
} }

View File

@@ -76,7 +76,7 @@ public class Main extends AndroidApplication {
text.setTypeface(Typeface.SERIF); text.setTypeface(Typeface.SERIF);
String title="Forge needs Storage Permission to run properly...\n" + String title="Forge needs Storage Permission to run properly...\n" +
"Follow this simple steps below:\n\n"; "Follow these simple steps:\n\n";
String steps = " 1) Tap \"Open App Details\" Button.\n" + String steps = " 1) Tap \"Open App Details\" Button.\n" +
" 2) Tap Permissions\n"+ " 2) Tap Permissions\n"+
" 3) Turn on the Storage Permission.\n\n"+ " 3) Turn on the Storage Permission.\n\n"+

View File

@@ -1,13 +1,9 @@
Name:Dismantle Name:Dismantle
ManaCost:2 R ManaCost:2 R
Types:Sorcery Types:Sorcery
A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | RememberTargets$ True | SubAbility$ DBChoice | SpellDescription$ Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control. A:SP$ Destroy | Cost$ 2 R | ValidTgts$ Artifact | TgtPrompt$ Select target artifact | SubAbility$ DBChoice | SpellDescription$ Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control.
SVar:DBChoice:DB$ GenericChoice | Choices$ DBP1P1,DBCharge | ConditionDefined$ Targeted | ConditionPresent$ Card.HasCounters | ConditionCompare$ GE1 | StackDescription$ put that many +1/+1 counters or charge counters on an artifact you control. SVar:DBChoice:DB$ GenericChoice | Choices$ DBPutP1P1,DBPutCharge | ConditionDefined$ Targeted | ConditionPresent$ Card.HasCounters | ConditionCompare$ GE1 | StackDescription$ put that many +1/+1 counters or charge counters on an artifact you control.
SVar:DBP1P1:DB$ ChooseCard | Choices$ Artifact.YouCtrl | Amount$ 1 | SpellDescription$ +1/+1 | SubAbility$ DBPutP1P1 SVar:DBPutP1P1:DB$ PutCounter | Choices$ Artifact.YouCtrl | CounterType$ P1P1 | CounterNum$ X | References$ X | SpellDescription$ +1/+1
SVar:DBPutP1P1:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | CounterNum$ X | References$ X | SubAbility$ DBCleanup SVar:DBPutCharge:DB$ PutCounter | Choices$ Artifact.YouCtrl | CounterType$ CHARGE | CounterNum$ X | References$ X | SpellDescription$ Charge
SVar:DBCharge:DB$ ChooseCard | Choices$ Artifact.YouCtrl | Amount$ 1 | SpellDescription$ charge | SubAbility$ DBPutCharge SVar:X:TargetedLKI$CardCounters.ALL
SVar:DBPutCharge:DB$ PutCounter | Defined$ ChosenCard | CounterType$ CHARGE | CounterNum$ X | References$ X | SpellDescription$ Charge | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:RememberedLKI$CardCounters.ALL
SVar:Picture:http://www.wizards.com/global/images/magic/general/dismantle.jpg
Oracle:Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control. Oracle:Destroy target artifact. If that artifact had counters on it, put that many +1/+1 counters or charge counters on an artifact you control.

View File

@@ -10,9 +10,7 @@ ALTERNATE
Name:Finality Name:Finality
ManaCost:4 B G ManaCost:4 B G
Types:Sorcery Types:Sorcery
A:SP$ ChooseCard | Cost$ 4 B G | Defined$ You | Amount$ 1 | MinAmount$ 0 | Choices$ Creature.YouCtrl | SubAbility$ DBPutCounter | SpellDescription$ You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn. A:SP$ PutCounter | Cost$ 4 B G | Choices$ Creature.YouCtrl | ChoiceOptional$ True | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPumpAll | StackDescription$ SpellDescription | SpellDescription$ You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn.
SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBPumpAll SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature | NumAtt$ -4 | NumDef$ -4 | IsCurse$ True | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn. Oracle:You may put two +1/+1 counters on a creature you control. Then all creatures get -4/-4 until end of turn.

View File

@@ -1,12 +1,10 @@
Name:Haphazard Bombardment Name:Haphazard Bombardment
ManaCost:5 R ManaCost:5 R
Types:Enchantment Types:Enchantment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, choose four nonenchantment permanents you don't control and put an aim counter on each of them. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ DBPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, choose four nonenchantment permanents you don't control and put an aim counter on each of them.
SVar:TrigChoose:DB$ ChooseCard | Defined$ You | Amount$ 4 | Choices$ Permanent.YouDontCtrl+nonEnchantment | SubAbility$ DBPutCounter | AILogic$ AtLeast1 | Mandatory$ True SVar:DBPutCounter:DB$ PutCounter | Choices$ Permanent.YouDontCtrl+nonEnchantment | ChoiceAmount§ 4 | Defined$ ChosenCard | CounterType$ AIM | CounterNum$ 1
SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ AIM | CounterNum$ 1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.YouDontCtrl+counters_GE1_AIM | PresentCompare$ GE2 | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your end step, if two or more permanents you don't control have an aim counter on them, destroy one of those permanents at random. T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Permanent.YouDontCtrl+counters_GE1_AIM | PresentCompare$ GE2 | Execute$ TrigDestroy | TriggerDescription$ At the beginning of your end step, if two or more permanents you don't control have an aim counter on them, destroy one of those permanents at random.
SVar:TrigDestroy:DB$ ChooseCard | Amount$ 1 | AtRandom$ True | Choices$ Permanent.YouDontCtrl+counters_GE1_AIM | SubAbility$ DBDestroy SVar:TrigDestroy:DB$ ChooseCard | Amount$ 1 | AtRandom$ True | Choices$ Permanent.YouDontCtrl+counters_GE1_AIM | SubAbility$ DBDestroy
SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | SubAbility$ DBCleanup SVar:DBDestroy:DB$ Destroy | Defined$ ChosenCard | SubAbility$ DBCleanup
SVar:Picture:http://www.wizards.com/global/images/magic/general/haphazard_bombardment.jpg SVar:DBCleanup:DB$ Cleanup | ClearChosenCard$ True
Oracle:When Haphazard Bombardment enters the battlefield, choose four nonenchantment permanents you don't control and put an aim counter on each of them.\nAt the beginning of your end step, if two or more permanents you don't control have an aim counter on them, destroy one of those permanents at random. Oracle:When Haphazard Bombardment enters the battlefield, choose four nonenchantment permanents you don't control and put an aim counter on each of them.\nAt the beginning of your end step, if two or more permanents you don't control have an aim counter on them, destroy one of those permanents at random.

View File

@@ -1,7 +1,6 @@
Name:Settle the Score Name:Settle the Score
ManaCost:2 B B ManaCost:2 B B
Types:Sorcery Types:Sorcery
A:SP$ ChangeZone | Cost$ 2 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBChoice | SpellDescription$ Exile target creature. Put two loyalty counters on a planeswalker you control. A:SP$ ChangeZone | Cost$ 2 B B | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBPutLoyalty | SpellDescription$ Exile target creature. Put two loyalty counters on a planeswalker you control.
SVar:DBChoice:DB$ ChooseCard | Choices$ Planeswalker.YouCtrl | Amount$ 1 | Mandatory$ True | SubAbility$ DBPutLoyalty SVar:DBPutLoyalty:DB$ PutCounter | Choices$ Planeswalker.YouCtrl | CounterType$ LOYALTY | CounterNum$ 2
SVar:DBPutLoyalty:DB$ PutCounter | Defined$ ChosenCard | CounterType$ LOYALTY | CounterNum$ 2
Oracle:Exile target creature. Put two loyalty counters on a planeswalker you control. Oracle:Exile target creature. Put two loyalty counters on a planeswalker you control.

View File

@@ -1,9 +1,8 @@
Name:The Elderspell Name:The Elderspell
ManaCost:B B ManaCost:B B
Types:Sorcery 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. A:SP$ Destroy | Cost$ B B | ValidTgts$ Planeswalker | TgtPrompt$ Select target planeswalker | TargetMin$ 0 | TargetMax$ MaxTargets | References$ MaxTargets | SubAbility$ DBPutLoyalty | 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 | Choices$ Planeswalker.YouCtrl | CounterType$ LOYALTY | CounterNum$ X | References$ X | SubAbility$ DBCleanup
SVar:DBPutLoyalty:DB$ PutCounter | Defined$ ChosenCard | CounterType$ LOYALTY | CounterNum$ X | References$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:MaxTargets:Count$Valid Planeswalker SVar:MaxTargets:Count$Valid Planeswalker
SVar:X:Count$RememberedSize/Twice SVar:X:Count$RememberedSize/Twice

View File

@@ -0,0 +1,11 @@
Name:Jirina Kudro
ManaCost:1 R W B
Types:Legendary Creature Human Soldier
PT:3/3
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create a 1/1 white Human Soldier creature token for each time you've cast a commander from the command zone this game.
SVar:TrigToken:DB$ Token | TokenAmount$ X | TokenScript$ w_1_1_human | TokenOwner$ You | LegacyImage$ w 1 1 human c20 | References$ X
SVar:X:Count$TotalCommanderCastFromCommandZone
S:Mode$ Continuous | Affected$ Human.Other+YouCtrl | AddPower$ 2 | Description$ Other Humans you control get +2/+0.
SVar:PlayMain1:TRUE
DeckHints:Type$Human
Oracle:When Jirina Kudro enters the battlefield, create a 1/1 white Human Soldier creature token for each time you've cast a commander from the command zone this game.\nOther Humans you control get +2/+0.

View File

@@ -0,0 +1,10 @@
Name:Kalamax, the Stormsire
ManaCost:1 G U R
Types:Legendary Creature Elemental Dinosaur
PT:4/4
T:Mode$ SpellCast | ValidCard$ Instant | ValidActivatingPlayer$ You | ActivatorThisTurnCast$ EQ1 | NoResolvingCheck$ True | Execute$ TrigCopy | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast your first instant spell each turn, if CARDNAME is tapped, copy that spell. You may choose new targets for the copy.
SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | IsPresent$ Card.Self+tapped | AILogic$ Always
SVar:BuffedBy:Instant
T:Mode$ SpellCopy | ValidCard$ Instant | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you copy an instant spell, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
Oracle:Whenever you cast your first instant spell each turn, if Kalamax, the Stormsire is tapped, copy that spell. You may choose new targets for the copy.\nWhenever you copy an instant spell, put a +1/+1 counter on Kalamax.

View File

@@ -0,0 +1,6 @@
Name:Back for More
ManaCost:4 B G
Types:Instant
A:SP$ ChangeZone | Cost$ 4 B G | Origin$ Graveyard | Destination$ Battlefield | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | SubAbility$ DBFight | StackDescription$ SpellDescription | SpellDescription$ Return target creature card from your graveyard to the battlefield. When you do, it fights up to one target creature you don't control.
SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Choose target creature you don't control | SubAbility$ DBCleanup | StackDescription$ None
Oracle:Return target creature card from your graveyard to the battlefield. When you do, it fights up to one target creature you don't control. (Each deals damage equal to its power to the other.)

View File

@@ -0,0 +1,6 @@
Name:Boon of the Wish-Giver
ManaCost:4 U U
Types:Sorcery
A:SP$ Draw | Cost$ 4 U U | NumCards$ 4 | SpellDescription$ Draw four cards.
K:Cycling:1
Oracle:Draw four cards.\nCycling {1} ({1}, Discard this card: Draw a card.)

View File

@@ -0,0 +1,7 @@
Name:Channeled Force
ManaCost:2 U R
Types:Instant
A:SP$ Draw | Cost$ 2 U R Discard<X/Card/card> | CostDesc$ As an additional cost to cast this spell, discard X cards. | NumCards$ ChosenX | ValidTgts$ Player | TgtPrompt$ Choose a player | References$ X | SubAbility$ DBDamage | SpellDescription$ Target player draws X cards. CARDNAME deals X damage to up to one target creature or planeswalker.
SVar:DBDamage:DB$ DealDamage | ValidTgts$ Creature,Planeswalker | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature or planeswalker. | NumDmg$ ChosenX | References$ X
SVar:X:XChoice
Oracle:As an additional cost to cast this spell, discard X cards.\nTarget player draws X cards. Channeled Force deals X damage to up to one target creature or planeswalker.

View File

@@ -0,0 +1,13 @@
Name:Chevill, Bane of Monsters
ManaCost:B G
Types:Legendary Creature Human Rogue
PT:1/3
K:Deathtouch
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | IsPresent$ Permanent.OppCtrl+counters_GE1_BOUNTY | PresentCompare$ EQ0 | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, if your opponents control no permanents with bounty counters on them, put a bounty counter on target creature or planeswalker an opponent controls.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature.OppCtrl,Planeswalker.OppCtrl | TgtPrompt$ Select target creature or planeswalker an opponent controls | CounterType$ BOUNTY | CounterNum$ 1 | IsCurse$ True
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Permanent.OppCtrl+counters_GE1_BOUNTY | TriggerZones$ Battlefield | Execute$ TrigGainLife | TriggerDescription$ Whenever a permanent an opponent controls with a bounty counter on it dies, you gain 3 life and draw a card.
SVar:TrigGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 3 | SubAbility$ DBDraw
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
SVar:PlayMain1:TRUE
DeckHints:Ability$Counters
Oracle:Deathtouch\nAt the beginning of your upkeep, if your opponents control no permanents with bounty counters on them, put a bounty counter on target creature or planeswalker an opponent controls.\nWhenever a permanent an opponent controls with a bounty counter on it dies, you gain 3 life and draw card.

View File

@@ -0,0 +1,10 @@
Name:Death's Oasis
ManaCost:W B G
Types:Enchantment
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.YouCtrl+nonToken | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever a nontoken creature you control dies, put the top two cards of your library into your graveyard. Then return a creature card with lesser converted mana cost than the creature that died from the graveyard to your hand.
SVar:TrigMill:DB$ Mill | NumCards$ 2 | Defined$ You | SubAbility$ DBReturn
SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeType$ Creature.YouOwn+cmcLTY | References$ Y | Hidden$ True | ChangeNum$ 1
SVar:Y:TriggeredCard$CardManaCost
A:AB$ GainLife | Cost$ 1 Sac<1/CARDNAME> | LifeAmount$ X | References$ X | SpellDescription$ You gain life equal to the greatest converted mana cost among creatures you control.
SVar:X:Count$HighestCMC_Creature.YouCtrl+inZoneBattlefield
Oracle:Whenever a nontoken creature you control dies, put the top two cards of your library into your graveyard. Then return a creature card with lesser converted mana cost than the creature that died from the graveyard to your hand.\n{1}, Sacrifice Death's Oasis: You gain life equal to the greatest converted mana cost among creatures you control.

View File

@@ -0,0 +1,7 @@
Name:Dire Tactics
ManaCost:W B
Types:Instant
A:SP$ ChangeZone | Cost$ W B | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBLoseLife | StackDescription$ SpellDescription | SpellDescription$ Exile target creature. If you don't control a Human, you lose life equal to that creature's toughness.
SVar:DBLoseLife:DB$ LoseLife | ConditionPresent$ Human.YouCtrl | ConditionCompare$ EQ0 | Defined$ You | LifeAmount$ X | References$ X | StackDescription$ None
SVar:X:Targeted$CardToughness
Oracle:Exile target creature. If you don't control a Human, you lose life equal to that creature's toughness.

View File

@@ -0,0 +1,6 @@
Name:Drannith Magistrate
ManaCost:1 W
Types:Creature Human Wizard
PT:1/3
S:Mode$ CantBeCast | ValidCard$ Card | Caster$ Opponent | Origin$ Library,Graveyard,Exile | Description$ Your opponents can't cast spells from anywhere other than their hands.
Oracle:Your opponents can't cast spells from anywhere other than their hands.

View File

@@ -0,0 +1,11 @@
Name:Fiend Artisan
ManaCost:B/G B/G
Types:Creature Nightmare
PT:1/1
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ Y | AddToughness$ Y | Description$ CARDNAME gets +1/+1 for each creature card in your graveyard.
A:AB$ ChangeZone | Cost$ X BG T Sac<1/Creature.Other/another creature> | Origin$ Library | Destination$ Battlefield | ChangeType$ Creature.cmcLEX | ChangeNum$ 1 | References$ X | ChangeNum$ 1 | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Search your library for a creature card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery.
SVar:Y:Count$TypeInYourYard.Creature
SVar:X:Count$xPaid
AI:RemoveDeck:All
DeckHints:Ability$Graveyard
Oracle:Fiend Artisan gets +1/+1 for each creature card in your graveyard.\n{X}{B/G}, {T}, Sacrifice another creature: Search your library for a creature card with converted mana cost X or less, put it onto the battlefield, then shuffle your library. Activate this ability only any time you could cast a sorcery.

View File

@@ -0,0 +1,8 @@
Name:Flourishing Fox
ManaCost:W
Types:Creature Fox
PT:1/1
T:Mode$ Cycled | ValidCard$ Card.Other | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever you cycle another card, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
K:Cycling:1
Oracle:Whenever you cycle another card, put a +1/+1 counter on Flourishing Fox.\nCycling {1} ({1}, Discard this card: Draw a card.)

View File

@@ -0,0 +1,6 @@
Name:Fully Grown
ManaCost:2 G
Types:Instant
A:SP$ Pump | Cost$ 2 G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +3 | NumDef$ +3 | SubAbility$ PutCounter | SpellDescription$ Target creature gets +3/+3 until end of turn. Put a trample counter on it.
SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ TRAMPLE | CounterNum$ 1
Oracle:Target creature gets +3/+3 until end of turn. Put a trample counter on it.

View File

@@ -0,0 +1,11 @@
Name:General Kudro of Drannith
ManaCost:1 W B
Types:Legendary Creature Human Soldier
PT:3/3
S:Mode$ Continuous | Affected$ Human.Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | Description$ Other Humans you control get +1/+1.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ Whenever CARDNAME or another Human enters the battlefield under your control, exile target card from an opponent's graveyard.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Other+Human+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigExile | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another Human enters the battlefield under your control, exile target card from an opponent's graveyard.
SVar:TrigExile:DB$ ChangeZone | Origin$ Graveyard | Destination$ Exile | TgtPrompt$ Choose target card in an opponent's graveyard | ValidTgts$ Card.OppOwn
A:AB$ Destroy | Cost$ 2 Sac<2/Human> | ValidTgts$ Creature.powerGE4 | TgtPrompt$ Select target creature with power 4 or greater | SpellDescription$ Destroy target creature with power 4 or greater.
DeckHints:Type$Human
Oracle:Other Humans you control get +1/+1.\nWhenever General Kudro of Drannith or another Human enters the battlefield under your control, exile target card from an opponent's graveyard.\n{2}, Sacrifice two Humans: Destroy target creature with power 4 or greater.