Merge branch 'master' of git.cardforge.org:core-developers/forge into push_down_toStringMap_part_3

This commit is contained in:
Ryan1729
2019-09-20 21:06:00 -06:00
41 changed files with 412 additions and 62 deletions

View File

@@ -8,7 +8,8 @@ public enum CardSplitType
Transform(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Transformed),
Meld(FaceSelectionMethod.USE_ACTIVE_FACE, CardStateName.Meld),
Split(FaceSelectionMethod.COMBINE, CardStateName.RightSplit),
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped);
Flip(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Flipped),
Adventure(FaceSelectionMethod.USE_PRIMARY_FACE, CardStateName.Adventure);
CardSplitType(FaceSelectionMethod calcMode, CardStateName stateName) {
method = calcMode;

View File

@@ -9,6 +9,7 @@ public enum CardStateName {
Meld,
LeftSplit,
RightSplit,
Adventure,
;

View File

@@ -146,6 +146,10 @@ public class GameAction {
}
}
// if an adventureCard is put from Stack somewhere else, need to reset to Original State
if (c.isAdventureCard() && (zoneFrom.is(ZoneType.Stack) || !zoneTo.is(ZoneType.Stack))) {
c.setState(CardStateName.Original, true);
}
// Clean up the temporary Dash SVar when the Dashed card leaves the battlefield
// Clean up the temporary AtEOT SVar

View File

@@ -22,6 +22,7 @@ import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.google.common.collect.Sets;
import forge.card.CardStateName;
import forge.card.mana.ManaCost;
import forge.card.mana.ManaCostParser;
import forge.game.ability.AbilityUtils;
@@ -101,6 +102,45 @@ public final class GameActionUtil {
}
source.turnFaceDownNoUpdate();
lkicheck = true;
} else if (sa.isAdventure() && !source.isInZone(ZoneType.Battlefield)) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
source.setState(CardStateName.Adventure, false);
// need to reset CMC
source.setLKICMC(-1);
source.setLKICMC(source.getCMC());
lkicheck = true;
} else if (source.isSplitCard() && (sa.isLeftSplit() || sa.isRightSplit())) {
if (!source.isLKI()) {
source = CardUtil.getLKICopy(source);
}
if (sa.isLeftSplit()) {
if (!source.hasState(CardStateName.LeftSplit)) {
source.addAlternateState(CardStateName.LeftSplit, false);
source.getState(CardStateName.LeftSplit).copyFrom(
sa.getHostCard().getState(CardStateName.LeftSplit), true);
}
source.setState(CardStateName.LeftSplit, false);
}
if (sa.isRightSplit()) {
if (!source.hasState(CardStateName.RightSplit)) {
source.addAlternateState(CardStateName.RightSplit, false);
source.getState(CardStateName.RightSplit).copyFrom(
sa.getHostCard().getState(CardStateName.RightSplit), true);
}
source.setState(CardStateName.RightSplit, false);
}
// need to reset CMC
source.setLKICMC(-1);
source.setLKICMC(source.getCMC());
lkicheck = true;
}
if (lkicheck) {
@@ -132,20 +172,6 @@ public final class GameActionUtil {
newSA = sa.copyWithManaCostReplaced(activator, o.getAltManaCost());
newSA.setBasicSpell(false);
changedManaCost = true;
if (host.hasSVar("AsForetoldSplitCMCHack")) {
// TODO: This is a temporary workaround for As Foretold interaction with split cards, better solution needed.
if (sa.isLeftSplit()) {
int leftCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.LeftSplitCMC);
if (leftCMC > host.getCounters(CounterType.TIME)) {
continue;
}
} else if (sa.isRightSplit()) {
int rightCMC = sa.getHostCard().getCMC(Card.SplitCMCMode.RightSplitCMC);
if (rightCMC > host.getCounters(CounterType.TIME)) {
continue;
}
}
}
} else {
newSA = sa.copy(activator);
}

View File

@@ -27,6 +27,7 @@ public enum GlobalRuleChange {
manapoolsDontEmpty ("Mana pools don't empty as steps and phases end."),
noCycling ("Players can't cycle cards."),
noCreatureETBTriggers ("Creatures entering the battlefield don't cause abilities to trigger."),
noCreatureDyingTriggers ("Creatures dying don't cause abilities to trigger."),
noLegendRule ("The legend rule doesn't apply."),
noPrevention ("Damage can't be prevented."),
/* onlyOneAttackerATurn ("No more than one creature can attack each turn."), */

View File

@@ -351,9 +351,12 @@ public class Card extends GameEntity implements Comparable<Card> {
else if (isDoubleFaced() && currentStateName != CardStateName.Transformed) {
return CardStateName.Transformed;
}
else if (this.isMeldable() && currentStateName != CardStateName.Meld) {
else if (isMeldable() && currentStateName != CardStateName.Meld) {
return CardStateName.Meld;
}
else if (this.isAdventureCard() && currentStateName != CardStateName.Adventure) {
return CardStateName.Adventure;
}
else {
return CardStateName.Original;
}
@@ -803,6 +806,10 @@ public class Card extends GameEntity implements Comparable<Card> {
return getRules() != null && getRules().getSplitType() == CardSplitType.Split;
}
public final boolean isAdventureCard() {
return hasState(CardStateName.Adventure);
}
public final boolean isBackSide() {
return backside;
}
@@ -1989,7 +1996,19 @@ public class Card extends GameEntity implements Comparable<Card> {
continue;
}
final String sAbility = formatSpellAbility(sa);
String sAbility = formatSpellAbility(sa);
// add Adventure to AbilityText
if (sa.isAdventure() && state.getView().getState().equals(CardStateName.Original)) {
StringBuilder sbSA = new StringBuilder();
sbSA.append("Adventure — ").append(getState(CardStateName.Adventure).getName());
if (sa.getPayCosts() != null) {
sbSA.append(" ").append(sa.getPayCosts().toSimpleString());
}
sbSA.append(": ");
sbSA.append(sAbility);
sAbility = sbSA.toString();
}
if (sa.getManaPart() != null) {
if (addedManaStrings.contains(sAbility)) {
@@ -2397,10 +2416,21 @@ public class Card extends GameEntity implements Comparable<Card> {
// add Facedown abilities from Original state but only if this state is face down
// need CardStateView#getState or might crash in StackOverflow
if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) {
for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) {
if (sa.isManifestUp() || sa.isMorphUp()) {
list.add(sa);
if (isInZone(ZoneType.Battlefield)) {
if ((mana == null || mana == false) && isFaceDown() && state.getView().getState() == CardStateName.FaceDown) {
for (SpellAbility sa : getState(CardStateName.Original).getNonManaAbilities()) {
if (sa.isManifestUp() || sa.isMorphUp()) {
list.add(sa);
}
}
}
} else {
// Adenture may only be cast not from Battlefield
if (isAdventureCard() && state.getView().getState() == CardStateName.Original) {
for (SpellAbility sa : getState(CardStateName.Adventure).getSpellAbilities()) {
if (mana == null || mana == sa.isManaAbility()) {
list.add(sa);
}
}
}
}
@@ -5731,6 +5761,12 @@ public class Card extends GameEntity implements Comparable<Card> {
}
public void setSplitStateToPlayAbility(final SpellAbility sa) {
if (isAdventureCard()) {
if (sa.isAdventure()) {
setState(CardStateName.Adventure, true);
}
return;
}
if (!isSplitCard()) {
return; // just in case
}

View File

@@ -305,6 +305,11 @@ public class CardFactory {
} else if (c.isMeldable() && cp instanceof PaperCard) {
c.setState(CardStateName.Meld, false);
c.setImageKey(cp.getImageKey(true));
} else if (c.isAdventureCard()) {
c.setState(CardStateName.Adventure, false);
c.setImageKey(originalPicture);
c.setSetCode(cp.getEdition());
c.setRarity(cp.getRarity());
}
c.setSetCode(cp.getEdition());
@@ -325,7 +330,6 @@ public class CardFactory {
// ******************************************************************
// ************** Link to different CardFactories *******************
if (state == CardStateName.LeftSplit || state == CardStateName.RightSplit) {
for (final SpellAbility sa : card.getSpellAbilities()) {
if (state == CardStateName.LeftSplit) {
@@ -342,6 +346,9 @@ public class CardFactory {
} else if (state != CardStateName.Original){
CardFactoryUtil.setupKeywordedAbilities(card);
}
if (state == CardStateName.Adventure) {
CardFactoryUtil.setupAdventureAbility(card);
}
}
card.setState(CardStateName.Original, false);
@@ -728,6 +735,14 @@ public class CardFactory {
final CardState ret2 = new CardState(out, CardStateName.Flipped);
ret2.copyFrom(in.getState(CardStateName.Flipped, true), false);
result.put(CardStateName.Flipped, ret2);
} else if (in.isAdventureCard()) {
final CardState ret1 = new CardState(out, CardStateName.Original);
ret1.copyFrom(in.getState(CardStateName.Original, true), false);
result.put(CardStateName.Original, ret1);
final CardState ret2 = new CardState(out, CardStateName.Adventure);
ret2.copyFrom(in.getState(CardStateName.Adventure, true), false);
result.put(CardStateName.Adventure, ret2);
} else {
// in all other cases just copy the current state to original
final CardState ret = new CardState(out, CardStateName.Original);

View File

@@ -4738,4 +4738,30 @@ public class CardFactoryUtil {
}
return byClause + StringUtils.join(orClauses, " or ") + ".";
}
public static void setupAdventureAbility(Card card) {
if (card.getCurrentStateName() != CardStateName.Adventure) {
return;
}
SpellAbility sa = card.getFirstSpellAbility();
if (sa == null) {
return;
}
sa.setAdventure(true);
String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile | StackDescription$ None";
AbilitySub saExile = (AbilitySub)AbilityFactory.getAbility(abExile, card);
String abEffect = "DB$ Effect | RememberObjects$ Self | StaticAbilities$ Play | ExileOnMoved$ Exile | Duration$ Permanent | ConditionDefined$ Self | ConditionPresent$ Card.nonCopiedSpell";
AbilitySub saEffect = (AbilitySub)AbilityFactory.getAbility(abEffect, card);
StringBuilder sb = new StringBuilder();
sb.append("Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered+nonAdventure");
sb.append(" | AffectedZone$ Exile | Description$ You may cast the card.");
saEffect.setSVar("Play", sb.toString());
saExile.setSubAbility(saEffect);
sa.appendSubAbility(saExile);
}
}

View File

@@ -107,26 +107,8 @@ public class CardProperty {
if (card.isSplitCard()) {
return false;
}
} else if (property.startsWith("leftcmc") || property.startsWith("rightcmc")) {
int x;
int y = 0;
String rhs = "";
if (property.startsWith("leftcmc")) {
rhs = property.substring(9);
y = card.getCMC(Card.SplitCMCMode.LeftSplitCMC);
} else if (property.startsWith("rightcmc")) {
rhs = property.substring(10);
y = card.getCMC(Card.SplitCMCMode.RightSplitCMC);
}
try {
x = Integer.parseInt(rhs);
} catch (final NumberFormatException e) {
x = AbilityUtils.calculateAmount(source, rhs, spellAbility);
}
if (!Expressions.compare(y, property, x)) {
} else if (property.equals("AdventureCard")) {
if (!card.isAdventureCard()) {
return false;
}
} else if (property.startsWith("YouCtrl")) {
@@ -1358,6 +1340,14 @@ public class CardProperty {
if (card.isToken()) {
return false;
}
} else if (property.startsWith("copiedSpell")) {
if (!card.isCopiedSpell()) {
return false;
}
} else if (property.startsWith("nonCopiedSpell")) {
if (card.isCopiedSpell()) {
return false;
}
} else if (property.startsWith("hasXCost")) {
SpellAbility sa1 = card.getFirstSpellAbility();
if (sa1 != null && !sa1.isXCost()) {

View File

@@ -225,6 +225,11 @@ public final class CardUtil {
newCopy.turnFaceDownNoUpdate();
}
if (in.isAdventureCard() && in.getFaceupCardStateName().equals(CardStateName.Original)) {
newCopy.addAlternateState(CardStateName.Adventure, false);
newCopy.getState(CardStateName.Adventure).copyFrom(in.getState(CardStateName.Adventure), true);
}
/*
if (in.isCloned()) {
newCopy.addAlternateState(CardStateName.Cloner, false);

View File

@@ -100,6 +100,10 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
if (card.isSplitCard()) {
CardStateName name = isLeftSplit() ? CardStateName.LeftSplit : CardStateName.RightSplit;
isInstant = card.getState(name).getType().isInstant();
} else if (isAdventure()) {
if (card.hasState(CardStateName.Adventure)) {
isInstant = card.getState(CardStateName.Adventure).getType().isInstant();
}
}
boolean lkicheck = false;
@@ -130,6 +134,13 @@ public abstract class Spell extends SpellAbility implements java.io.Serializable
}
card.turnFaceDownNoUpdate();
lkicheck = true;
} else if (isAdventure()) {
if (!card.isLKI()) {
card = CardUtil.getLKICopy(card);
}
card.setState(CardStateName.Adventure, false);
lkicheck = true;
}

View File

@@ -118,6 +118,7 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
private boolean basicLandAbility = false;
private boolean adventure = false;
private SplitSide splitSide = null;
enum SplitSide { LEFT, RIGHT }
@@ -861,6 +862,12 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
public void setRightSplit() {
splitSide = SplitSide.RIGHT;
}
public boolean isAdventure() {
return this.adventure;
}
public void setAdventure(boolean adventure) {
this.adventure = adventure;
}
public SpellAbility copy() {
return copy(hostCard, false);

View File

@@ -538,6 +538,20 @@ public class TriggerHandler {
}
}
} // Torpor Orb check
if (game.getStaticEffects().getGlobalRuleChange(GlobalRuleChange.noCreatureDyingTriggers)
&& !regtrig.isStatic() && mode.equals(TriggerType.ChangesZone)) {
if (runParams.get(AbilityKey.Destination) instanceof String && runParams.get(AbilityKey.Origin) instanceof String) {
final String dest = (String) runParams.get(AbilityKey.Destination);
final String origin = (String) runParams.get(AbilityKey.Origin);
if (dest.equals("Graveyard") && origin.equals("Battlefield") && runParams.get(AbilityKey.Card) instanceof Card) {
final Card card = (Card) runParams.get(AbilityKey.Card);
if (card.isCreature()) {
return false;
}
}
}
}
return true;
}

View File

@@ -3,9 +3,7 @@ ManaCost:2 U
Types:Enchantment
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ At the beginning of your upkeep, put a time counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ TIME | CounterNum$ 1
S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+NotSplit+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME.
S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+Split+nonLand+leftcmcLEX,Card.YouCtrl+Split+nonLand+rightcmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Secondary$ True
S:Mode$ Continuous | MayPlay$ True | MayPlayAltManaCost$ 0 | MayPlayLimit$ 1 | MayPlayDontGrantZonePermissions$ True | Affected$ Card.YouCtrl+nonLand+cmcLEX | AffectedZone$ Hand,Graveyard,Library,Exile,Command | Description$ Once each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on CARDNAME.
SVar:X:Count$CardCounters.TIME
SVar:AsForetoldSplitCMCHack:TRUE
SVar:Picture:http://www.wizards.com/global/images/magic/general/as_foretold.jpg
Oracle:At the beginning of your upkeep, put a time counter on As Foretold.\nOnce each turn, you may pay {0} rather than pay the mana cost for a spell you cast with converted mana cost X or less, where X is the number of time counters on As Foretold.

View File

@@ -0,0 +1,16 @@
Name:Animating Faerie
ManaCost:2 U
Types:Creature Faerie
PT:2/2
K:Flying
Oracle:Flying
AlternateMode:Adventure
ALTERNATE
Name:Bring to Life
ManaCost:2 U
Types:Sorcery Adventure
A:SP$ Animate | Cost$ 2 U | ValidTgts$ Artifact.nonCreature+YouCtrl | TgtPrompt$ Select noncreature artifact | Power$ 0 | Toughness$ 0 | Types$ Artifact,Creature | RemoveCardTypes$ True | Permanent$ True | SubAbility$ DBPutCounter | SpellDescription$ Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it.
SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 4
Oracle:Target noncreature artifact you control becomes a 0/0 artifact creature. Put four +1/+1 counters on it.

View File

@@ -0,0 +1,7 @@
Name:Bloodhaze Wolverine
ManaCost:1 R
Types:Creature Wolverine
PT:2/1
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME gets +1/+1 and gains first strike until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 | KW$ First Strike
Oracle:Whenever you draw your second card each turn, Bloodhaze Wolverine gets +1/+1 and gains first strike until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Edgewall Innkeeper
ManaCost:G
Types:Creature Human Peasant
PT:1/1
T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, draw a card.
SVar:TrigDraw:DB$Draw | Defined$ You | NumCards$ 1
Oracle:Whenever you cast a creature spell that has an Adventure, draw a card.

View File

@@ -0,0 +1,7 @@
Name:Fabled Passage
ManaCost:no cost
Types:Land
A:AB$ ChangeZone | Cost$ T Sac<1/CARDNAME> | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 1 | RememerChanged$ True | SubAbility$ DBUntap | SpellDescription$ Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land.
SVar:DBUntap:DB$ Untap | Defined$ Remembered | ConditionPresent$ Land.YouCtrl | ConditionCompare$ GE4 | ConditionDescription$ If you control four or more lands, untap that land. | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:{T}, Sacrifice Fabled Passage: Search your library for a basic land card, put it onto the battlefield tapped, then shuffle your library. Then if you control four or more lands, untap that land.

View File

@@ -0,0 +1,6 @@
Name:Festive Funeral
ManaCost:4 B
Types:Instant
A:SP$ Pump | Cost$ 4 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ -X | NumDef$ -X | IsCurse$ True | References$ X | SpellDescription$ Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard.
SVar:X:Count$InYourYard
Oracle:Target creature gets -X/-X until end of turn, where X is the number of cards in your graveyard.

View File

@@ -0,0 +1,8 @@
Name:Foreboding Fruit
ManaCost:2 B
Types:Sorcery
A:SP$ Draw | Cost$ 2 B | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Choose a player | SubAbility$ DBLoseLife | SpellDescription$ Target player draws two cards and loses 2 life. Adamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.")
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ Targeted | SubAbility$ DBToken
SVar:DBToken:DB$ Token | TokenAmount$ X | TokenScript$ c_a_food_sac | TokenOwner$ You | LegacyImage$ c a food sac eld | References$ X
SVar:X:Count$Adamant.Black.1.0
Oracle:Target player draws two cards and loses 2 life.\nAdamant — If at least three black mana was spent to cast this spell, create a Food token. (It's an artifact with "{2}, {T}, Sacrifice this artifact: You gain 2 life.")

View File

@@ -0,0 +1,16 @@
Name:Foulmire Knight
ManaCost:B
Types:Creature Zombie Knight
PT:1/1
K:Deathtouch
Oracle:Deathtouch
AlternateMode:Adventure
ALTERNATE
Name:Profane Insight
ManaCost:2 B
Types:Instant Adventure
A:SP$ Draw | Cost$ 2 B | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife | SpellDescription$ You draw a card and you lose 1 life.
SVar:DBLoseLife:DB$LoseLife | Defined$ You | LifeAmount$ 1
Oracle:You draw a card and you lose 1 life.

View File

@@ -0,0 +1,10 @@
Name:Hushbringer
ManaCost:1 W
Types:Creature Faerie
PT:1/2
K:Flying
K:Lifelink
S:Mode$ Continuous | GlobalRule$ Creatures entering the battlefield don't cause abilities to trigger. | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
S:Mode$ Continuous | GlobalRule$ Creatures dying don't cause abilities to trigger. | Secondary$ True | Description$ Creatures entering the battlefield or dying don't cause abilities to trigger.
AI:RemoveDeck:Random
Oracle:Flying, lifelink\nCreatures entering the battlefield or dying don't cause abilities to trigger.

View File

@@ -2,9 +2,8 @@ Name:Idyllic Grange
ManaCost:no cost
Types:Land Plains
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Plains.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Plains.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay
SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield
SVar:ETBCheckSVar:Count$Valid Plains.YouCtrl+Other
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield untapped, 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
Oracle:({T}: Add {W}.)\nIdyllic Grange enters the battlefield tapped unless you control three or more other Plains.\nWhen Idyllic Grange enters the battlefield untapped, put a +1/+1 counter on target creature you control.

View File

@@ -0,0 +1,9 @@
Name:Improbable Alliance
ManaCost:U R
Types:Enchantment
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_1_1_faerie_flying | TokenOwner$ You | LegacyImage$ u 1 1 faerie flying eld
A:AB$ Draw | Cost$ 4 U R | NumCards$ 1 | SpellDescription$ Draw a card, then discard a card. | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ You | NumCards$ 1 | Mode$ TgtChoose
AI:RemoveDeck:All
Oracle:Whenever you draw your second card each turn, create a 1/1 blue Faerie creature token with flying.\n{4}{U}{R}: Draw a card, then discard a card.

View File

@@ -0,0 +1,8 @@
Name:Irencrag Pyromancer
ManaCost:2 R
Types:Creature Human Wizard
PT:0/4
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever you draw your second card each turn, CARDNAME deals 3 damage to any target.
SVar:TrigDmg:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3
AI:RemoveDeck:Random
Oracle:Whenever you draw your second card each turn, Irencrag Pyromancer deals 3 damage to any target.

View File

@@ -0,0 +1,7 @@
Name:Locthwain Paladin
ManaCost:3 B
Types:Creature Human Knight
PT:3/2
K:Menace
K:etbCounter:P1P1:1:Adamant$ Black:Adamant — If at least three black mana was spent to cast this spell, CARDNAME enters the battlefield with a +1/+1 counter on it.
Oracle:Menace (This creature can't be blocked except by two or more creatures.)\nAdamant — If at least three black mana was spent to cast this spell, Locthwain Paladin enters the battlefield with a +1/+1 counter on it.

View File

@@ -0,0 +1,8 @@
Name:Mad Ratter
ManaCost:3 R
Types:Creature Goblin
PT:1/2
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens.
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ b_1_1_rat | TokenOwner$ You | LegacyImage$ b 1 1 rat eld
SVar:PlayMain1:TRUE
Oracle:Whenever you draw your second card each turn, create two 1/1 black Rat creature tokens.

View File

@@ -0,0 +1,9 @@
Name:Mantle of Tides
ManaCost:U
Types:Artifact Equipment
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 1 | AddToughness$ 2 | Description$ Equipped creature gets +1/+2.
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigAttach | TriggerDescription$ Whenever you draw your second card each turn, attach CARDNAME to target creature you control.
SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature you control
SVar:PlayMain1:TRUE
K:Equip:3
Oracle:Equipped creature gets +1/+2.\nWhenever you draw your second card each turn, attach Mantle of Tides to target creature you control.\nEquip {3} ({3}: Attach to target creature you control. Equip only as a sorcery.)

View File

@@ -0,0 +1,17 @@
Name:Merchant of the Vale
ManaCost:2 R
Types:Creature Human Peasant
PT:2/3
A:AB$ Draw | Cost$ 2 R Discard<1/Card> | NumCards$ 1 | Defined$ You | SpellDescription$ Draw a card.
Oracle:{2}{R}, Discard a card: Draw a card.
AlternateMode:Adventure
ALTERNATE
Name:Haggle
ManaCost:R
Types:Instant Adventure
A:SP$ Discard | Cost$ R | NumCards$ 1 | Optional$ True | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBDraw | SpellDescription$ You may discard a card. If you do, draw a card.
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1 | ConditionDefined$ Remembered | ConditionPresent$ Card | ConditionCompare$ GE1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
Oracle:You may discard a card. If you do, draw a card. (Then exile this card. You may cast the creature later from exile.)

View File

@@ -0,0 +1,8 @@
Name:Mysterious Pathlighter
ManaCost:2 W
Types:Creature Faerie
PT:2/2
K:Flying
K:ETBReplacement:Other:AddExtraCounter:Mandatory:Battlefield:Creature.YouCtrl+AdventureCard
SVar:AddExtraCounter:DB$ PutCounter | ETB$ True | Defined$ ReplacedCard | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Each creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it.
Oracle:Flying\nEach creature you control that has an Adventure enters the battlefield with an additional +1/+1 counter on it.

View File

@@ -0,0 +1,9 @@
Name:Mystic Sanctuary
ManaCost:no cost
Types:Land Island
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Islands.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Island.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay
SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield, you may put target instant or sorcery card from your graveyard on top of your library.
SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target instant or sorcery card in your graveyard | ValidTgts$ Instant.YouOwn,Sorcery.YouOwn | Origin$ Graveyard | Destination$ Library
Oracle:({T}: Add {U}.)\nMystic Sanctuary enters the battlefield tapped unless you control three or more other Islands.\nWhen Mystic Sanctuary enters the battlefield untapped, you may put target instant or sorcery card from your graveyard on top of your library.

View File

@@ -0,0 +1,8 @@
Name:Return of the Wildspeaker
ManaCost:4 G
Types:Instant
A:SP$ Charm | Cost$ 4 G | Choices$ DBDraw,DBPumpAll
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ X | References$ X | SpellDescription$ Draw cards equal to the greatest power among non-Human creatures you control.
SVar:X:Count$GreatestPower_Creature.YouCtrl+nonHuman
SVar:DBPumpAll:DB$ PumpAll | ValidCards$ Creature.YouCtrl+nonHuman | NumAtt$ 3 | NumDef$ 3 | SpellDescription$ Non-Human creatures you control get +3/+3 until end of turn.
Oracle:Choose one —\n• Draw cards equal to the greatest power among non-Human creatures you control.\n• Non-Human creatures you control get +3/+3 until end of turn.

View File

@@ -0,0 +1,8 @@
Name:Rosethorn Halberd
ManaCost:G
Types:Artifact Equipment
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigAttach | TriggerDescription$ When CARDNAME enters the battlefield, attach it to target non-Human creature you control.
SVar:TrigAttach:DB$ Attach | ValidTgts$ Creature.nonHuman+YouCtrl | TgtPrompt$ Select target non-Human creature you control
S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddToughness$ 1 | Description$ Equipped creature gets +2/+1.
K:Equip:5
Oracle:When Rosethorn Halberd enters the battlefield, attach it to target non-Human creature you control.\nEquipped creature gets +2/+1.\nEquip {5} ({5}: Attach to target creature you control. Equip only as a sorcery.)

View File

@@ -0,0 +1,9 @@
Name:Sage of the Falls
ManaCost:4 U
Types:Creature Merfolk Wizard
PT:2/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigLoot | OptionalDecider$ You | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonHuman+Other+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoot | OptionalDecider$ You | Secondary$ True | TriggerDescription$ Whenever CARDNAME or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card.
SVar:TrigLoot:DB$ Draw | NumCards$ 1 | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ You | Mode$ TgtChoose | NumCards$ 1
Oracle:Whenever Sage of the Falls or another non-Human creature enters the battlefield under you control, you may draw a card. If you do, discard a card.

View File

@@ -0,0 +1,10 @@
Name:So Tiny
ManaCost:U
Types:Enchantment Aura
K:Flash
K:Enchant creature
A:SP$ Attach | Cost$ U | ValidTgts$ Creature | AILogic$ Curse
S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ -X | References$ X,Y | Description$ Enchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard.
SVar:X:Count$Compare Y GE7.6.2
SVar:Y:Count$ValidGraveyard Card.EnchantedControllerCtrl
Oracle:Flash\nEnchant creature\nEnchanted creature gets -2/-0. It gets -6/-0 instead as long as its controller has seven or more cards in their graveyard.

View File

@@ -0,0 +1,9 @@
Name:Steelgaze Griffin
ManaCost:4 U
Types:Creature Griffin
PT:2/4
K:Flying
T:Mode$ Drawn | ValidCard$ Card.YouCtrl | Number$ 2 | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ When you draw your second card each turn, CARDNAME gets +2/+0 until end of turn.
SVar:TrigPump:DB$ Pump | NumAtt$ +2 | NumDef$ +0 | Defined$ Self
SVar:PlayMain1:TRUE
Oracle:Flying\nWhen you draw your second card each turn, Steelgaze Griffin gets +2/+0 until end of turn.

View File

@@ -0,0 +1,7 @@
Name:Thrill of Possibility
ManaCost:1 R
Types:Instant
A:SP$ Draw | Cost$ 1 R Discard<1/Card> | Defined$ You | NumCards$ 2 | SpellDescription$ Draw two cards.
DeckHas:Ability$Discard
DeckHints:Keyword$Madness & Ability$Delirium
Oracle:As an additional cost to cast this spell, discard a card.\nDraw two cards.

View File

@@ -0,0 +1,8 @@
Name:Wandermare
ManaCost:1 G W
Types:Creature Horse
PT:3/3
T:Mode$ SpellCast | ValidCard$ Creature.AdventureCard | ValidActivatingPlayer$ You | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
DeckHas:Ability$Counters
Oracle:Whenever you cast a creature spell that has an Adventure, put a +1/+1 counter on Wandermare. (It doesnt need to have gone on the adventure first.)

View File

@@ -2,9 +2,8 @@ Name:Witch's Cottage
ManaCost:no cost
Types:Land Swamp
R:Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplaceWith$ LandTapped | Description$ CARDNAME enters the battlefield tapped unless you control three or more other Swamps.
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionCheckSVar$ ETBCheckSVar | ConditionSVarCompare$ LT3 | References$ ETBCheckSVar | SubAbility$ MoveToPlay
SVar:LandTapped:DB$ Tap | Defined$ Self | ETB$ True | ConditionPresent$ Swamp.YouCtrl+Other | ConditionCompare$ LT3 | SubAbility$ MoveToPlay
SVar:MoveToPlay:DB$ ChangeZone | Defined$ Self | Origin$ All | Destination$ Battlefield
SVar:ETBCheckSVar:Count$Valid Swamp.YouCtrl+Other
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self+untapped | Execute$ TrigChange | OptionalDecider$ You | TriggerDescription$ When CARDNAME enters the battlefield untapped, you may put target creature card from your graveyard on top of your library.
SVar:TrigChange:DB$ ChangeZone | TgtPrompt$ Choose target creature card in your graveyard | ValidTgts$ Creature.YouOwn | Origin$ Graveyard | Destination$ Library
Oracle:({T}: Add {B}.)\nWitch's Cottage enters the battlefield tapped unless you control three or more other Swamps.\nWhen Witch's Cottage enters the battlefield untapped, you may put target creature card from your graveyard on top of your library.

View File

@@ -179,8 +179,8 @@ KeyboardShortcuts=Tastenkombinationen
lblAchievements=Errungenschaften
# VSubmenuDownloaders.java
btnDownloadSetPics=Bilder(LQ) Sets herunterladen
btnDownloadPicsHQ=Bilder(HQ Karten herunterladen (Sehr langsam!)
btnDownloadPics=Bilder(LQ) Karten herunterladen
btnDownloadPicsHQ=Bilder(HQ) Karten herunterladen (Sehr langsam!)
btnDownloadQuestImages=Bilder für Quests herunterladen
btnDownloadAchievementImages=Bilder für Erfolge herunterladen
btnReportBug=Einen Fehler melden
@@ -389,7 +389,7 @@ lblVanguardDesc=Jeder Spieler hat eine eigene spielbeeinflussende \"Avatar\"-Kar
lblCommander=Commander
lblCommanderDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt.
lblOathbreaker=Eidbrecher
lblOathbreakerDesc=Jeder Spieler hat eine Plainswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werdeb kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einnen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist.
lblOathbreakerDesc=Jeder Spieler hat eine Planeswalker-Karte als seinen "Eidbrecher", welche jederzeit gespielt werden kann und die Farben des Decks festlegt. Jeder Spieler hat außerdem noch einen "Signatur"-Spruch, welcher gespielt werden kann, solange der Eidbrecher im Spiel ist.
lblTinyLeaders=Kleine Anführer
lblTinyLeadersDesc=Jeder Spieler hat eine legendäre \"General\"-Karte, welche (fast) jederzeit gespielt werden kann und die Farben des Decks bestimmt. Alle Karten haben umgewandelte Manakosten von max. 3.
lblBrawl=Brawl
@@ -528,7 +528,7 @@ lblConstructedDecks=Konstruierte Decks
lblCommanderDecks=Commander Decks
lblRandomCommanderDecks=Zufälliges Commander Deck
lblRandomCommanderCard-basedDecks=Zufälliges Commander Deck (kartenbasiert)
lblOathbreakerDecks=Oathbreaker-Decks
lblOathbreakerDecks=Eidbrecher-Decks
lblTinyLeadersDecks=Kleine-Anführer-Decks
lblBrawlDecks=Brawl Decks
lblSchemeDecks=Komplott-Decks
@@ -796,7 +796,7 @@ lbltoplanardeck=zum Weltendeck
lbltoconspiracydeck=zum Verschwörungsdeck
lblMove=Verschieben
#VDock.java
lblDock=Anhängen
lblDock=Symbolleiste
lblViewDeckList=Zeige Deckliste
lblRevertLayout=Layout zurücksetzen
lblOpenLayout=Lade Layout
@@ -849,8 +849,8 @@ ttbtnRandDeck5=Erzeugt konstuiertes Deck in fünf Farben
lblCurrentDeck2=aktuelles Deck
lblUntitled=Unbenannt
#VPrompt.java
lblPrompt=Abfrage
lblGameSetup=Spielaufbau
lblPrompt=Meldungen
lblGameSetup=Spielvorbereitung
#ColumnDef.java
lblAIStatus=KI-Status
lblCMC=UMK
@@ -891,13 +891,13 @@ lblSettings=Einstellungen
#SettingsPage.java
lblAutomaticBugReports=Automatischer Fehlerbericht
lblBattlefieldTextureFiltering=Texturenfilter Spielfeld
lblCompactListItems=kompakte Liste
lblCompactTabs=kompakte Tabs
lblCompactListItems=Kompakte Liste
lblCompactTabs=Kompakte Tabs
lblCardOverlays=Karten-Overlays
lblDisableCardEffect=Karten-"Effekt"-Anzeige abschalten
lblDynamicBackgroundPlanechase=Weltenjagd dynamischer Hintergrund
lblGameplayOptions=Spiel-Optionen
lblGeneralSettings=allgem. Einstellungen
lblGeneralSettings=Allgem. Einstellungen
lblHotSeatMode=Hot-Seat-Modus
lblLandscapeMode=Querformat
lblLater=Später
@@ -912,7 +912,7 @@ lblShowCardManaCostOverlays=Blende die Manakosten der Karten ein
lblShowCardNameOverlays=Blende den Namen der Karten ein
lblShowCardOverlays=Zeige Karten-Einblendungen an
lblShowCardPTOverlays=Blende Stärke und Widerstand ein
lblShowMatchBackground=Zeige Duell hintergund an
lblShowMatchBackground=Zeige Duell-Hintergund an
lblVibrateAfterLongPress=Vibieren nach langem Tastendruck
lblVibrateWhenLosingLife=Vibrieren nach Lebenspunktverlust
lblVibrationOptions=Vibrationsoptionen
@@ -971,6 +971,6 @@ lblCatalog=Katalog
lblCommanders=Komandeure
lblOathbreakers=Eidbrecher
#Forge.java
lblLoadingFonts=Loading fonts...
lblLoadingCardTranslations=Loading card translations...
lblFinishingStartup=Finishing startup...
lblLoadingFonts=Lade Schriften...
lblLoadingCardTranslations=Lade Kartenübersetzungen...
lblFinishingStartup=Abschliessen...

View File

@@ -0,0 +1,6 @@
Name:Dwarf
ManaCost:no cost
Types:Creature Dwarf
Colors:red
PT:1/1
Oracle: