mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-19 12:18:00 +00:00
Merge remote-tracking branch 'upstream/master'
This commit is contained in:
@@ -28,10 +28,9 @@ public class CountersProliferateAi extends SpellAbilityAi {
|
|||||||
@Override
|
@Override
|
||||||
protected boolean checkApiLogic(Player ai, SpellAbility sa) {
|
protected boolean checkApiLogic(Player ai, SpellAbility sa) {
|
||||||
final List<Card> cperms = Lists.newArrayList();
|
final List<Card> cperms = Lists.newArrayList();
|
||||||
final List<Player> allies = ai.getYourTeam();
|
|
||||||
boolean allyExpOrEnergy = false;
|
boolean allyExpOrEnergy = false;
|
||||||
|
|
||||||
for (final Player p : allies) {
|
for (final Player p : ai.getYourTeam()) {
|
||||||
// player has experience or energy counter
|
// player has experience or energy counter
|
||||||
if (p.getCounters(CounterEnumType.EXPERIENCE) + p.getCounters(CounterEnumType.ENERGY) >= 1) {
|
if (p.getCounters(CounterEnumType.EXPERIENCE) + p.getCounters(CounterEnumType.ENERGY) >= 1) {
|
||||||
allyExpOrEnergy = true;
|
allyExpOrEnergy = true;
|
||||||
@@ -140,9 +139,16 @@ public class CountersProliferateAi extends SpellAbilityAi {
|
|||||||
if (c.isPlaneswalker()) {
|
if (c.isPlaneswalker()) {
|
||||||
if (c.getController().isOpponentOf(ai)) {
|
if (c.getController().isOpponentOf(ai)) {
|
||||||
continue;
|
continue;
|
||||||
} else {
|
|
||||||
return (T)c;
|
|
||||||
}
|
}
|
||||||
|
return (T)c;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c.isBattle()) {
|
||||||
|
if (c.getProtectingPlayer().isOpponentOf(ai)) {
|
||||||
|
// TODO in multiplayer we might sometimes want to do it anyway?
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
return (T)c;
|
||||||
}
|
}
|
||||||
|
|
||||||
final Card lki = CardUtil.getLKICopy(c);
|
final Card lki = CardUtil.getLKICopy(c);
|
||||||
|
|||||||
@@ -254,18 +254,26 @@ public class ForgeScript {
|
|||||||
int y = AbilityUtils.calculateAmount(source, k[1].substring(2), spellAbility);
|
int y = AbilityUtils.calculateAmount(source, k[1].substring(2), spellAbility);
|
||||||
return Expressions.compare(sa.getTotalManaSpent(), comparator, y);
|
return Expressions.compare(sa.getTotalManaSpent(), comparator, y);
|
||||||
} else if (property.startsWith("ManaFrom")) {
|
} else if (property.startsWith("ManaFrom")) {
|
||||||
final String fromWhat = property.substring(8);
|
String fromWhat = property.substring(8);
|
||||||
boolean found = false;
|
String[] parts = null;
|
||||||
|
if (fromWhat.contains("_")) {
|
||||||
|
parts = fromWhat.split("_");
|
||||||
|
fromWhat = parts[0];
|
||||||
|
}
|
||||||
|
int toFind = parts != null ? AbilityUtils.calculateAmount(source, parts[1], spellAbility) : 1;
|
||||||
|
int found = 0;
|
||||||
for (Mana m : sa.getPayingMana()) {
|
for (Mana m : sa.getPayingMana()) {
|
||||||
final Card manaSource = m.getSourceCard();
|
final Card manaSource = m.getSourceCard();
|
||||||
if (manaSource != null) {
|
if (manaSource != null) {
|
||||||
if (manaSource.isValid(fromWhat, sourceController, source, spellAbility)) {
|
if (manaSource.isValid(fromWhat, sourceController, source, spellAbility)) {
|
||||||
found = true;
|
found++;
|
||||||
break;
|
if (found == toFind) {
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return found;
|
return (found == toFind);
|
||||||
} else if (property.equals("MayPlaySource")) {
|
} else if (property.equals("MayPlaySource")) {
|
||||||
StaticAbility m = sa.getMayPlay();
|
StaticAbility m = sa.getMayPlay();
|
||||||
if (m == null) {
|
if (m == null) {
|
||||||
|
|||||||
@@ -2939,6 +2939,12 @@ public class AbilityUtils {
|
|||||||
la.setCardState(original);
|
la.setCardState(original);
|
||||||
list.add(la);
|
list.add(la);
|
||||||
}
|
}
|
||||||
|
if (state == CardStateName.Transformed && tgtCard.isPermanent() && !tgtCard.isAura()) {
|
||||||
|
// casting defeated battle
|
||||||
|
Spell sp = new SpellPermanent(tgtCard, original);
|
||||||
|
sp.setCardState(original);
|
||||||
|
list.add(sp);
|
||||||
|
}
|
||||||
if (tgtCard.isModal()) {
|
if (tgtCard.isModal()) {
|
||||||
CardState modal = tgtCard.getState(CardStateName.Modal);
|
CardState modal = tgtCard.getState(CardStateName.Modal);
|
||||||
Iterables.addAll(list, tgtCard.getBasicSpells(modal));
|
Iterables.addAll(list, tgtCard.getBasicSpells(modal));
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ import forge.game.player.PlayerController;
|
|||||||
import forge.game.player.PlayerController.BinaryChoiceType;
|
import forge.game.player.PlayerController.BinaryChoiceType;
|
||||||
import forge.game.spellability.SpellAbility;
|
import forge.game.spellability.SpellAbility;
|
||||||
import forge.util.CardTranslation;
|
import forge.util.CardTranslation;
|
||||||
|
import forge.util.Expressions;
|
||||||
import forge.util.Lang;
|
import forge.util.Lang;
|
||||||
import forge.util.Localizer;
|
import forge.util.Localizer;
|
||||||
|
|
||||||
@@ -27,6 +28,9 @@ import forge.util.Localizer;
|
|||||||
public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
||||||
@Override
|
@Override
|
||||||
protected String getStackDescription(SpellAbility sa) {
|
protected String getStackDescription(SpellAbility sa) {
|
||||||
|
if (sa.hasParam("AddConditionSVar")) {
|
||||||
|
return "Add StackDescription for AddOrRemoveCounter line with condition!";
|
||||||
|
}
|
||||||
final StringBuilder sb = new StringBuilder();
|
final StringBuilder sb = new StringBuilder();
|
||||||
final Player pl = sa.hasParam("DefinedPlayer") ?
|
final Player pl = sa.hasParam("DefinedPlayer") ?
|
||||||
AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst()
|
AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("DefinedPlayer"), sa).getFirst()
|
||||||
@@ -50,7 +54,7 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
|||||||
public void resolve(SpellAbility sa) {
|
public void resolve(SpellAbility sa) {
|
||||||
final Card source = sa.getHostCard();
|
final Card source = sa.getHostCard();
|
||||||
final Game game = source.getGame();
|
final Game game = source.getGame();
|
||||||
final int counterAmount = AbilityUtils.calculateAmount(source, sa.getParam("CounterNum"), sa);
|
final int counterAmount = AbilityUtils.calculateAmount(source, sa.getParamOrDefault("CounterNum", "1"), sa);
|
||||||
|
|
||||||
if (counterAmount <= 0) {
|
if (counterAmount <= 0) {
|
||||||
return;
|
return;
|
||||||
@@ -112,7 +116,19 @@ public class CountersPutOrRemoveEffect extends SpellAbilityEffect {
|
|||||||
|
|
||||||
params.put("CounterType", chosenType);
|
params.put("CounterType", chosenType);
|
||||||
prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", chosenType.getName()) + " ";
|
prompt = Localizer.getInstance().getMessage("lblWhatToDoWithTargetCounter", chosenType.getName()) + " ";
|
||||||
boolean putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params);
|
boolean putCounter;
|
||||||
|
if (sa.hasParam("RemoveConditionSVar")) {
|
||||||
|
final Card host = sa.getHostCard();
|
||||||
|
final int value = AbilityUtils.calculateAmount(host, sa.getParam("RemoveConditionSVar"), sa);
|
||||||
|
final String compare = sa.getParamOrDefault("RemoveConditionSVarCompare", "GE1");
|
||||||
|
final String operator = compare.substring(0, 2);
|
||||||
|
final String operand = compare.substring(2);
|
||||||
|
final int operandValue = AbilityUtils.calculateAmount(host, operand, sa);
|
||||||
|
|
||||||
|
putCounter = !Expressions.compare(value, operator, operandValue);
|
||||||
|
} else {
|
||||||
|
putCounter = pc.chooseBinary(sa, prompt, BinaryChoiceType.AddOrRemove, params);
|
||||||
|
}
|
||||||
|
|
||||||
if (putCounter) {
|
if (putCounter) {
|
||||||
tgtCard.addCounter(chosenType, counterAmount, pl, table);
|
tgtCard.addCounter(chosenType, counterAmount, pl, table);
|
||||||
|
|||||||
@@ -290,6 +290,7 @@ public class PlayEffect extends SpellAbilityEffect {
|
|||||||
if (!tgtCard.changeToState(CardStateName.Transformed)) {
|
if (!tgtCard.changeToState(CardStateName.Transformed)) {
|
||||||
// Failed to transform. In the future, we might need to just remove this option and continue
|
// Failed to transform. In the future, we might need to just remove this option and continue
|
||||||
amount--;
|
amount--;
|
||||||
|
System.err.println("CastTransformed failed for '" + tgtCard + "'.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
state = CardStateName.Transformed;
|
state = CardStateName.Transformed;
|
||||||
|
|||||||
@@ -1738,6 +1738,7 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
protectingPlayer = p;
|
protectingPlayer = p;
|
||||||
view.updateProtectingPlayer(this);
|
view.updateProtectingPlayer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
public final void setSecretChosenPlayer(final Player p) {
|
public final void setSecretChosenPlayer(final Player p) {
|
||||||
chosenPlayer = p;
|
chosenPlayer = p;
|
||||||
}
|
}
|
||||||
@@ -7117,6 +7118,10 @@ public class Card extends GameEntity implements Comparable<Card>, IHasSVars {
|
|||||||
return getOwner().canDiscardBy(sa, effect);
|
return getOwner().canDiscardBy(sa, effect);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public boolean activatedThisTurn() {
|
||||||
|
return !numberTurnActivations.isEmpty();
|
||||||
|
}
|
||||||
|
|
||||||
public void addAbilityActivated(SpellAbility ability) {
|
public void addAbilityActivated(SpellAbility ability) {
|
||||||
numberTurnActivations.add(ability);
|
numberTurnActivations.add(ability);
|
||||||
numberGameActivations.add(ability);
|
numberGameActivations.add(ability);
|
||||||
|
|||||||
@@ -3932,7 +3932,7 @@ public class CardFactoryUtil {
|
|||||||
StringBuilder chooseSB = new StringBuilder();
|
StringBuilder chooseSB = new StringBuilder();
|
||||||
chooseSB.append("Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated");
|
chooseSB.append("Event$ Moved | ValidCard$ Card.Self | Destination$ Battlefield | ReplacementResult$ Updated");
|
||||||
chooseSB.append(" | Description$ (As a Siege enters the battlefield, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)");
|
chooseSB.append(" | Description$ (As a Siege enters the battlefield, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)");
|
||||||
String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Player.Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle | AILogic$ Curse";
|
String chooseProtector = "DB$ ChoosePlayer | Defined$ You | Choices$ Opponent | Protect$ True | ChoiceTitle$ Choose an opponent to protect this battle | AILogic$ Curse";
|
||||||
|
|
||||||
ReplacementEffect re = ReplacementHandler.parseReplacement(chooseSB.toString(), card, true);
|
ReplacementEffect re = ReplacementHandler.parseReplacement(chooseSB.toString(), card, true);
|
||||||
re.setOverridingAbility(AbilityFactory.getAbility(chooseProtector, card));
|
re.setOverridingAbility(AbilityFactory.getAbility(chooseProtector, card));
|
||||||
@@ -3944,7 +3944,11 @@ public class CardFactoryUtil {
|
|||||||
triggerDefeated.append(" TriggerDescription$ When CARDNAME is defeated, exile it, then cast it transformed.");
|
triggerDefeated.append(" TriggerDescription$ When CARDNAME is defeated, exile it, then cast it transformed.");
|
||||||
|
|
||||||
String castExileBattle = "DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True";
|
String castExileBattle = "DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True";
|
||||||
String castDefeatedBattle = "DB$ Play | Defined$ Remembered | WithoutManaCost$ True | CastTransformed$ True";
|
// note full rules text:
|
||||||
|
// When the last defense counter is removed from this permanent, exile it, then you may cast it transformed
|
||||||
|
// without paying its mana cost.
|
||||||
|
String castDefeatedBattle = "DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | " +
|
||||||
|
"CastTransformed$ True";
|
||||||
|
|
||||||
Trigger defeatedTrigger = TriggerHandler.parseTrigger(triggerDefeated.toString(), card, true);
|
Trigger defeatedTrigger = TriggerHandler.parseTrigger(triggerDefeated.toString(), card, true);
|
||||||
SpellAbility exileAbility = AbilityFactory.getAbility(castExileBattle, card);
|
SpellAbility exileAbility = AbilityFactory.getAbility(castExileBattle, card);
|
||||||
|
|||||||
@@ -213,6 +213,11 @@ public class CardProperty {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else if (property.startsWith("OppProtect")) {
|
||||||
|
if (card.getProtectingPlayer() == null
|
||||||
|
|| !sourceController.getOpponents().contains(card.getProtectingPlayer())) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if (property.startsWith("DefendingPlayer")) {
|
} else if (property.startsWith("DefendingPlayer")) {
|
||||||
Player p = property.endsWith("Ctrl") ? controller : card.getOwner();
|
Player p = property.endsWith("Ctrl") ? controller : card.getOwner();
|
||||||
if (!game.getPhaseHandler().inCombat()) {
|
if (!game.getPhaseHandler().inCombat()) {
|
||||||
@@ -1070,6 +1075,10 @@ public class CardProperty {
|
|||||||
if (!property.startsWith("without") && !card.hasStartOfUnHiddenKeyword(property.substring(4))) {
|
if (!property.startsWith("without") && !card.hasStartOfUnHiddenKeyword(property.substring(4))) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
} else if (property.startsWith("activated")) {
|
||||||
|
if (!card.activatedThisTurn()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
} else if (property.startsWith("tapped")) {
|
} else if (property.startsWith("tapped")) {
|
||||||
if (!card.isTapped()) {
|
if (!card.isTapped()) {
|
||||||
return false;
|
return false;
|
||||||
@@ -1549,6 +1558,15 @@ public class CardProperty {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if (property.equals("attackingBattle")) {
|
||||||
|
final GameEntity attacked = combat.getDefenderByAttacker(source);
|
||||||
|
if (!(attacked instanceof Card)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (!((Card) attacked).isBattle()) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
if (property.startsWith("attackingYouOrYourPW")) {
|
if (property.startsWith("attackingYouOrYourPW")) {
|
||||||
GameEntity defender = combat.getDefenderByAttacker(card);
|
GameEntity defender = combat.getDefenderByAttacker(card);
|
||||||
if (defender instanceof Card) {
|
if (defender instanceof Card) {
|
||||||
|
|||||||
@@ -135,7 +135,7 @@ public class MagicStack /* extends MyObservable */ implements Iterable<SpellAbil
|
|||||||
public final void addAndUnfreeze(final SpellAbility ability) {
|
public final void addAndUnfreeze(final SpellAbility ability) {
|
||||||
final Card source = ability.getHostCard();
|
final Card source = ability.getHostCard();
|
||||||
|
|
||||||
if (!ability.isCopied()) {
|
if (!ability.isCopied() && ability.isAbility()) {
|
||||||
// Copied abilities aren't activated, so they shouldn't change these values
|
// Copied abilities aren't activated, so they shouldn't change these values
|
||||||
source.addAbilityActivated(ability);
|
source.addAbilityActivated(ability);
|
||||||
ability.checkActivationResolveSubs();
|
ability.checkActivationResolveSubs();
|
||||||
|
|||||||
@@ -184,7 +184,7 @@ public class FCardImageRenderer {
|
|||||||
if (!card.isSplitCard() && !card.isFlipCard()) {
|
if (!card.isSplitCard() && !card.isFlipCard()) {
|
||||||
final CardStateView state = card.getState(card.isAdventureCard() ? false : altState);
|
final CardStateView state = card.getState(card.isAdventureCard() ? false : altState);
|
||||||
if ((state.isCreature() && !state.getKeywordKey().contains("Level up"))
|
if ((state.isCreature() && !state.getKeywordKey().contains("Level up"))
|
||||||
|| state.isPlaneswalker() || state.getType().hasSubtype("Vehicle"))
|
|| state.isPlaneswalker() || state.isVehicle())
|
||||||
hasPTBox = true;
|
hasPTBox = true;
|
||||||
}
|
}
|
||||||
if (hasPTBox) {
|
if (hasPTBox) {
|
||||||
@@ -294,7 +294,7 @@ public class FCardImageRenderer {
|
|||||||
int headerHeight = NAME_SIZE + 2 * HEADER_PADDING;
|
int headerHeight = NAME_SIZE + 2 * HEADER_PADDING;
|
||||||
int typeBoxHeight = TYPE_SIZE + 2 * TYPE_PADDING;
|
int typeBoxHeight = TYPE_SIZE + 2 * TYPE_PADDING;
|
||||||
int ptBoxHeight = 0;
|
int ptBoxHeight = 0;
|
||||||
if (state.isCreature() || state.isPlaneswalker() || state.getType().hasSubtype("Vehicle")) {
|
if (state.isCreature() || state.isPlaneswalker() || state.isVehicle()) {
|
||||||
//if P/T box needed, make room for it
|
//if P/T box needed, make room for it
|
||||||
ptBoxHeight = headerHeight;
|
ptBoxHeight = headerHeight;
|
||||||
}
|
}
|
||||||
@@ -839,7 +839,7 @@ public class FCardImageRenderer {
|
|||||||
TEXT_COLOR = Color.WHITE;
|
TEXT_COLOR = Color.WHITE;
|
||||||
pieces.add(String.valueOf(state.getLoyalty()));
|
pieces.add(String.valueOf(state.getLoyalty()));
|
||||||
}
|
}
|
||||||
else if (state.getType().hasSubtype("Vehicle")) {
|
else if (state.isVehicle()) {
|
||||||
Color [] vhColor = { new Color(128, 96, 64) };
|
Color [] vhColor = { new Color(128, 96, 64) };
|
||||||
colors = vhColor;
|
colors = vhColor;
|
||||||
TEXT_COLOR = Color.WHITE;
|
TEXT_COLOR = Color.WHITE;
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ public class NavArrowActor extends Actor {
|
|||||||
if (textureAtlas.isEmpty()) {
|
if (textureAtlas.isEmpty()) {
|
||||||
System.out.print("NavArrow sprite not found");
|
System.out.print("NavArrow sprite not found");
|
||||||
}
|
}
|
||||||
currentAnimation = new Animation<>(0.6f, textureAtlas);
|
currentAnimation = new Animation<>(0.4f, textureAtlas);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
@@ -4,15 +4,15 @@ size: 50,50
|
|||||||
format: RGBA8888
|
format: RGBA8888
|
||||||
filter: Nearest,Nearest
|
filter: Nearest,Nearest
|
||||||
repeat: none
|
repeat: none
|
||||||
|
right3
|
||||||
|
xy: 9,0
|
||||||
|
size: 50,50
|
||||||
|
right2
|
||||||
|
xy: 6,0
|
||||||
|
size: 50,50
|
||||||
|
right1
|
||||||
|
xy: 3,0
|
||||||
|
size: 50,50
|
||||||
right0
|
right0
|
||||||
xy: 0,0
|
xy: 0,0
|
||||||
size: 50,50
|
size: 50,50
|
||||||
right1
|
|
||||||
xy: 50,0
|
|
||||||
size: 50,50
|
|
||||||
right2
|
|
||||||
xy: 100,0
|
|
||||||
size: 50,50
|
|
||||||
right3
|
|
||||||
xy: 150,0
|
|
||||||
size: 50,50
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.0 KiB |
@@ -120,3 +120,4 @@ Phyrexia: All Will Be One, 3/6/ONE, ONE
|
|||||||
Phyrexia: All Will Be One Jumpstart, -/2/ONE, Meta-Choose(S(ONE Mite-y 1)Mite-y 1;S(ONE Mite-y 2)Mite-y 2;S(ONE Progress 1)Progress 1;S(ONE Progress 2)Progress 2;S(ONE Corruption 1)Corruption 1;S(ONE Corruption 2)Corruption 2;S(ONE Rebellious 1)Rebellious 1;S(ONE Rebellious 2)Rebellious 2;S(ONE Toxic 1)Toxic 1;S(ONE Toxic 2)Toxic 2)Themes
|
Phyrexia: All Will Be One Jumpstart, -/2/ONE, Meta-Choose(S(ONE Mite-y 1)Mite-y 1;S(ONE Mite-y 2)Mite-y 2;S(ONE Progress 1)Progress 1;S(ONE Progress 2)Progress 2;S(ONE Corruption 1)Corruption 1;S(ONE Corruption 2)Corruption 2;S(ONE Rebellious 1)Rebellious 1;S(ONE Rebellious 2)Rebellious 2;S(ONE Toxic 1)Toxic 1;S(ONE Toxic 2)Toxic 2)Themes
|
||||||
Alchemy: Phyrexia, 3/6/ONE, YONE
|
Alchemy: Phyrexia, 3/6/ONE, YONE
|
||||||
Shadows over Innistrad Remastered, 3/6/SIR, SIR
|
Shadows over Innistrad Remastered, 3/6/SIR, SIR
|
||||||
|
March of the Machine, 3/6/MOM, MOM
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Jaddi Lifestrider
|
|||||||
ManaCost:4 G
|
ManaCost:4 G
|
||||||
Types:Creature Elemental
|
Types:Creature Elemental
|
||||||
PT:2/8
|
PT:2/8
|
||||||
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ GuestList | TriggerDescription$ When CARDNAME enters the battlefield, you may tap any number of untapped creatures you control. You gain 2 life for each creature tapped this way.
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigJaddiLifestriderTap | TriggerDescription$ When CARDNAME enters the battlefield, you may tap any number of untapped creatures you control. You gain 2 life for each creature tapped this way.
|
||||||
SVar:TrigJaddiLifestriderTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBJaddiLifestriderGainLife
|
SVar:TrigJaddiLifestriderTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBJaddiLifestriderGainLife
|
||||||
SVar:DBJaddiLifestriderGainLife:DB$ GainLife | LifeAmount$ JaddiLifestriderZ | SubAbility$ DBJaddiLifestriderCleanup
|
SVar:DBJaddiLifestriderGainLife:DB$ GainLife | LifeAmount$ JaddiLifestriderZ | SubAbility$ DBJaddiLifestriderCleanup
|
||||||
SVar:DBJaddiLifestriderCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBJaddiLifestriderCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ Name:Kaya, Ghost Assassin
|
|||||||
ManaCost:2 W B
|
ManaCost:2 W B
|
||||||
Types:Legendary Planeswalker Kaya
|
Types:Legendary Planeswalker Kaya
|
||||||
Loyalty:5
|
Loyalty:5
|
||||||
A:AB$ Pump | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Creature | TargetMax$ 1 | TargetMin$ 0 | Planeswalker$ True | SubAbility$ DBChoose | StackDeSpellDescription$ SpellDescription | SpellDescription$ Exile CARDNAME or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.
|
A:AB$ Pump | Cost$ AddCounter<0/LOYALTY> | ValidTgts$ Creature | TargetMax$ 1 | TargetMin$ 0 | Planeswalker$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.
|
||||||
SVar:DBChoose:DB$ GenericChoice | Choices$ DBExileSelf,DBExileTarget | Defined$ You
|
SVar:DBChoose:DB$ GenericChoice | Choices$ DBExileSelf,DBExileTarget | Defined$ You
|
||||||
SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile CARDNAME
|
SVar:DBExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile CARDNAME
|
||||||
SVar:DBExileTarget:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile up to one target creature
|
SVar:DBExileTarget:DB$ ChangeZone | Defined$ Targeted | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBDelTrig | SpellDescription$ Exile up to one target creature
|
||||||
@@ -10,9 +10,10 @@ SVar:DBDelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Y
|
|||||||
SVar:DBReturn:DB$ ChangeZone | Origin$ Exile | Defined$ DelayTriggerRememberedLKI | Destination$ Battlefield
|
SVar:DBReturn:DB$ ChangeZone | Origin$ Exile | Defined$ DelayTriggerRememberedLKI | Destination$ Battlefield
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLoseLife
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | SubAbility$ DBLoseLife
|
||||||
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ You
|
SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 2 | Defined$ You
|
||||||
A:AB$ LoseLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life.
|
A:AB$ LoseLife | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | Defined$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life and you gain 2 life.
|
||||||
SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2
|
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2
|
||||||
A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Player.Opponent | NumCards$ 1 | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Each opponent discards a card and you draw a card.
|
A:AB$ Discard | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Ultimate$ True | Defined$ Opponent | Mode$ TgtChoose | SubAbility$ DBDraw | SpellDescription$ Each opponent discards a card and you draw a card.
|
||||||
SVar:DBDraw:DB$ Draw | Defined$ You | NumCards$ 1
|
SVar:DBDraw:DB$ Draw
|
||||||
AI:RemoveDeck:All
|
AI:RemoveDeck:All
|
||||||
|
DeckHas:Ability$LifeGain
|
||||||
Oracle:[0]: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.\n[-1]: Each opponent loses 2 life and you gain 2 life.\n[-2]: Each opponent discards a card and you draw a card.
|
Oracle:[0]: Exile Kaya, Ghost Assassin or up to one target creature. Return that card to the battlefield under its owner's control at the beginning of your next upkeep. You lose 2 life.\n[-1]: Each opponent loses 2 life and you gain 2 life.\n[-2]: Each opponent discards a card and you draw a card.
|
||||||
|
|||||||
@@ -2,11 +2,11 @@ Name:Shape of the Wiitigo
|
|||||||
ManaCost:3 G G G
|
ManaCost:3 G G G
|
||||||
Types:Enchantment Aura
|
Types:Enchantment Aura
|
||||||
K:Enchant creature
|
K:Enchant creature
|
||||||
A:SP$ Attach | Cost$ 3 G G G | ValidTgts$ Creature | AILogic$ Pump
|
A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put six +1/+1 counters on enchanted creature.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigPutCounter | TriggerDescription$ When CARDNAME enters the battlefield, put six +1/+1 counters on enchanted creature.
|
||||||
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 6
|
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 6
|
||||||
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter2 | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.
|
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigAddOrRemoveCounter | TriggerDescription$ At the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.
|
||||||
SVar:TrigPutCounter2:DB$ PutCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.EnchantedBy+attackedOrBlockedSinceYourLastUpkeep | SubAbility$ RemCounter
|
SVar:TrigAddOrRemoveCounter:DB$ AddOrRemoveCounter | CounterType$ P1P1 | Defined$ Enchanted | RemoveConditionSVar$ Count$Valid Card.EnchantedBy+!attackedOrBlockedSinceYourLastUpkeep
|
||||||
SVar:RemCounter:DB$ RemoveCounter | Defined$ Enchanted | CounterType$ P1P1 | CounterNum$ 1 | ConditionPresent$ Card.EnchantedBy+attackedOrBlockedSinceYourLastUpkeep | ConditionCompare$ EQ0
|
|
||||||
SVar:SacMe:1
|
SVar:SacMe:1
|
||||||
|
DeckHas:Ability$Counters
|
||||||
Oracle:Enchant creature\nWhen Shape of the Wiitigo enters the battlefield, put six +1/+1 counters on enchanted creature.\nAt the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.
|
Oracle:Enchant creature\nWhen Shape of the Wiitigo enters the battlefield, put six +1/+1 counters on enchanted creature.\nAt the beginning of your upkeep, put a +1/+1 counter on enchanted creature if it attacked or blocked since your last upkeep. Otherwise, remove a +1/+1 counter from it.
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ ManaCost:2 W
|
|||||||
Types:Creature Human Soldier
|
Types:Creature Human Soldier
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Double Strike
|
K:Double Strike
|
||||||
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigChoose | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may tap any number of untapped creatures you control. CARDNAME gets +1/+1 until end of turn for each creature tapped this way.
|
T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigTap | TriggerZones$ Battlefield | TriggerDescription$ Whenever CARDNAME attacks, you may tap any number of untapped creatures you control. CARDNAME gets +1/+1 until end of turn for each creature tapped this way.
|
||||||
SVar:TrigTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBPump
|
SVar:TrigTap:DB$ Tap | CardChoices$ Creature.YouCtrl+untapped | AnyNumber$ True | ChoiceAmount$ Count$Valid Creature.YouCtrl+untapped | RememberTapped$ True | SubAbility$ DBPump
|
||||||
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ Y | NumDef$ Y | SubAbility$ DBCleanup
|
SVar:DBPump:DB$ Pump | Defined$ Self | NumAtt$ Y | NumDef$ Y | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Types:Legendary Planeswalker Sorin
|
|||||||
Loyalty:3
|
Loyalty:3
|
||||||
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_1_1_vampire_lifelink | Planeswalker$ True | SpellDescription$ Create a 1/1 black Vampire creature token with lifelink.
|
A:AB$ Token | Cost$ AddCounter<1/LOYALTY> | TokenAmount$ 1 | TokenScript$ b_1_1_vampire_lifelink | Planeswalker$ True | SpellDescription$ Create a 1/1 black Vampire creature token with lifelink.
|
||||||
A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Name$ Emblem - Sorin, Lord of Innistrad | Image$ emblem_sorin_lord_of_innistrad | StaticAbilities$ STPump | Planeswalker$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +1/+0."
|
A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Name$ Emblem - Sorin, Lord of Innistrad | Image$ emblem_sorin_lord_of_innistrad | StaticAbilities$ STPump | Planeswalker$ True | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Creatures you control get +1/+0."
|
||||||
SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 1
|
SVar:STPump:Mode$ Continuous | EffectZone$ Command | AffectedZone$ Battlefield | Affected$ Creature.YouCtrl | AddPower$ 1 | Description$ Creatures you control get +1/+0.
|
||||||
A:AB$ Destroy | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker.Other | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target creatures or other planeswalkers | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBChangeZoneAll | SpellDescription$ Destroy up to three target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control.
|
A:AB$ Destroy | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Creature,Planeswalker.Other | TargetMin$ 0 | TargetMax$ 3 | TgtPrompt$ Select target creatures or other planeswalkers | RememberTargets$ True | ForgetOtherTargets$ True | SubAbility$ DBChangeZoneAll | SpellDescription$ Destroy up to three target creatures and/or other planeswalkers. Return each card put into a graveyard this way to the battlefield under your control.
|
||||||
SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup
|
SVar:DBChangeZoneAll:DB$ ChangeZoneAll | ChangeType$ Card.IsRemembered | Origin$ Graveyard | Destination$ Battlefield | GainControl$ True | SubAbility$ DBCleanup
|
||||||
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
|
||||||
|
|||||||
@@ -5,7 +5,7 @@ PT:6/6
|
|||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 2/2 green Wolf creature tokens.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 2/2 green Wolf creature tokens.
|
||||||
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_2_2_wolf
|
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ g_2_2_wolf
|
||||||
K:Daybound
|
K:Daybound
|
||||||
DeckHas:Ability$Token
|
DeckHas:Ability$Token & Type$Wolf
|
||||||
AlternateMode:DoubleFaced
|
AlternateMode:DoubleFaced
|
||||||
Oracle:When Tovolar's Huntmaster enters the battlefield, create two 2/2 green Wolf creature tokens.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
|
Oracle:When Tovolar's Huntmaster enters the battlefield, create two 2/2 green Wolf creature tokens.\nDaybound (If a player casts no spells during their own turn, it becomes night next turn.)
|
||||||
|
|
||||||
|
|||||||
6
forge-gui/res/cardsfolder/upcoming/cut_short.txt
Normal file
6
forge-gui/res/cardsfolder/upcoming/cut_short.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Name:Cut Short
|
||||||
|
ManaCost:2 W
|
||||||
|
Types:Instant
|
||||||
|
K:Convoke
|
||||||
|
A:SP$ Destroy | ValidTgts$ Planeswalker.activated,Creature.tapped | TgtPrompt$ Select target planeswalker that was activated this turn or tapped creature | SpellDescription$ Destroy target planeswalker that was activated this turn or tapped creature.
|
||||||
|
Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nDestroy target planeswalker that was activated this turn or tapped creature.
|
||||||
@@ -8,7 +8,7 @@ T:Mode$ Attacks | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$
|
|||||||
SVar:TrigDraw:AB$ Draw | Cost$ X W U U | NumCards$ X
|
SVar:TrigDraw:AB$ Draw | Cost$ X W U U | NumCards$ X
|
||||||
SVar:X:Count$xPaid
|
SVar:X:Count$xPaid
|
||||||
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each end step, you may pay 4 life. If you do, create a number of 1/1 black Vampire Knight creature tokens with lifelink equal to the number of cards you've drawn this turn.
|
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ At the beginning of each end step, you may pay 4 life. If you do, create a number of 1/1 black Vampire Knight creature tokens with lifelink equal to the number of cards you've drawn this turn.
|
||||||
SVar:TrigToken:AB$ Token | Cost$ PayLife<4> | TokenAmount$ Y | TokenScript$ w_1_1_vampire_lifelink | TokenOwner$ You
|
SVar:TrigToken:AB$ Token | Cost$ PayLife<4> | TokenAmount$ Y | TokenScript$ w_1_1_vampire_knight_lifelink | TokenOwner$ You
|
||||||
SVar:Y:Count$YouDrewThisTurn
|
SVar:Y:Count$YouDrewThisTurn
|
||||||
DeckHas:Ability$Token|LifeGain
|
DeckHas:Ability$Token|LifeGain
|
||||||
SVar:HasAttackEffect:TRUE
|
SVar:HasAttackEffect:TRUE
|
||||||
|
|||||||
@@ -0,0 +1,12 @@
|
|||||||
|
Name:Etched Host Doombringer
|
||||||
|
ManaCost:4 B
|
||||||
|
Types:Creature Phyrexian Demon
|
||||||
|
PT:3/5
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigCharm | TriggerDescription$ When CARDNAME enters the battlefield, ABILITY
|
||||||
|
SVar:TrigCharm:DB$ Charm | Choices$ Drain,Battle
|
||||||
|
SVar:Drain:DB$ LoseLife | ValidTgts$ Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife | SpellDescription$ Target opponent loses 2 life and you gain 2 life.
|
||||||
|
SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | StackDescription$ None
|
||||||
|
SVar:Battle:DB$ AddOrRemoveCounter | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | CounterNum$ 3 | StackDescription$ REP Choose target battle. _ & it_{c:Targeted} | SpellDescription$ Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it.
|
||||||
|
DeckHas:Ability$LifeGain
|
||||||
|
DeckHints:Type$Battle
|
||||||
|
Oracle:When Etched Host Doombringer enters the battlefield, choose one —\n• Target opponent loses 2 life and you gain 2 life.\n• Choose target battle. If an opponent protects it, remove three defense counters from it. Otherwise, put three defense counters on it.
|
||||||
9
forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt
Normal file
9
forge-gui/res/cardsfolder/upcoming/inga_and_esika.txt
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
Name:Inga and Esika
|
||||||
|
ManaCost:2 G U
|
||||||
|
Types:Legendary Creature Human God
|
||||||
|
PT:4/4
|
||||||
|
S:Mode$ Continuous | Affected$ Creature.YouCtrl | AddAbility$ Mana | AddKeyword$ Vigilance | Description$ Creatures you control have vigilance and "{T}: Add one mana of any color. Spend this mana only to cast a creature spell."
|
||||||
|
SVar:Mana:AB$ Mana | Cost$ T | Produced$ Any | Amount$ 1 | RestrictValid$ Spell.Creature | SpellDescription$ Add one mana of any color. Spend this mana only to cast a creature spell.
|
||||||
|
T:Mode$ SpellCast | ValidCard$ Creature | ValidSA$ Spell.ManaFromCreature_3 | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a creature spell, if three or more mana from creatures was spent to cast it, draw a card.
|
||||||
|
SVar:TrigDraw:DB$ Draw
|
||||||
|
Oracle:Creatures you control have vigilance and "{T}: Add one mana of any color. Spend this mana only to cast a creature spell."\nWhenever you cast a creature spell, if three or more mana from creatures was spent to cast it, draw a card.
|
||||||
@@ -0,0 +1,22 @@
|
|||||||
|
Name:Invasion of Amonkhet
|
||||||
|
ManaCost:1 U B
|
||||||
|
Types:Battle Siege
|
||||||
|
Defense:4
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigMill | TriggerDescription$ When CARDNAME enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card. (To mill three cards, a player puts the top three cards of their library into their graveyard.)
|
||||||
|
SVar:TrigMill:DB$ Mill | Defined$ Player | NumCards$ 3 | SubAbility$ DBDiscard
|
||||||
|
SVar:DBDiscard:DB$ Discard | Defined$ Opponent | Mode$ TgtChoose | SubAbility$ DBDraw
|
||||||
|
SVar:DBDraw:DB$ Draw
|
||||||
|
AlternateMode:DoubleFaced
|
||||||
|
DeckHas:Ability$Mill
|
||||||
|
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Amonkhet enters the battlefield, each player mills three cards, then each opponent discards a card and you draw a card. (To mill three cards, a player puts the top three cards of their library into their graveyard.)
|
||||||
|
|
||||||
|
ALTERNATE
|
||||||
|
|
||||||
|
Name:Lazotep Convert
|
||||||
|
ManaCost:no cost
|
||||||
|
Colors:blue,black
|
||||||
|
Types:Creature Zombie
|
||||||
|
PT:4/4
|
||||||
|
K:ETBReplacement:Copy:DBCopy:Optional
|
||||||
|
SVar:DBCopy:DB$ Clone | Choices$ Creature | ChoiceZone$ Graveyard | SetPower$ 4 | SetToughness$ 4 | AddColors$ Black | AddTypes$ Zombie | SpellDescription$ You may have CARDNAME enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types.
|
||||||
|
Oracle:You may have Lazotep Convert enter the battlefield as a copy of any creature card in a graveyard, except it's a 4/4 black Zombie in addition to its other types.
|
||||||
@@ -0,0 +1,21 @@
|
|||||||
|
Name:Invasion of Dominaria
|
||||||
|
ManaCost:2 W
|
||||||
|
Types:Battle Siege
|
||||||
|
Defense:5
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 4 life and draw a card.
|
||||||
|
SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 4 | SubAbility$ DBDraw
|
||||||
|
SVar:DBDraw:DB$ Draw
|
||||||
|
AlternateMode:DoubleFaced
|
||||||
|
DeckHas:Ability$LifeGain
|
||||||
|
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Dominaria enters the battlefield, you gain 4 life and draw a card.
|
||||||
|
|
||||||
|
ALTERNATE
|
||||||
|
|
||||||
|
Name:Serra Faithkeeper
|
||||||
|
ManaCost:no cost
|
||||||
|
Colors:white
|
||||||
|
Types:Creature Angel
|
||||||
|
PT:4/4
|
||||||
|
K:Flying
|
||||||
|
K:Vigilance
|
||||||
|
Oracle:Flying, vigilance
|
||||||
@@ -4,7 +4,7 @@ Types:Battle Siege
|
|||||||
Defense:5
|
Defense:5
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
||||||
SVar:TrigSearch:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | NumAtt$ 2 | KW$ Vigilance & Haste
|
SVar:TrigSearch:DB$ Pump | TargetMin$ 0 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select up to two target creatures | NumAtt$ 2 | KW$ Vigilance & Haste
|
||||||
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) When Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Kylem enters the battlefield, up to two target creatures each get +2/+0 and gain vigilance and haste until end of turn.
|
||||||
|
|
||||||
AlternateMode:DoubleFaced
|
AlternateMode:DoubleFaced
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@ ManaCost:no cost
|
|||||||
Colors:white,blue
|
Colors:white,blue
|
||||||
Types:Legendary Planeswalker Teferi
|
Types:Legendary Planeswalker Teferi
|
||||||
Loyalty:4
|
Loyalty:4
|
||||||
A:SP$ PermanentNoncreature
|
|
||||||
A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SubAbility$ DBDiscard | SpellDescription$ Draw two cards.
|
A:AB$ Draw | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | NumCards$ 2 | SubAbility$ DBDiscard | SpellDescription$ Draw two cards.
|
||||||
SVar:DBDiscard:DB$ Discard | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Creature | StackDescription$ SpellDescription | SpellDescription$ Then discard two cards unless you discard a creature card.
|
SVar:DBDiscard:DB$ Discard | NumCards$ 2 | Mode$ TgtChoose | UnlessType$ Creature | StackDescription$ SpellDescription | SpellDescription$ Then discard two cards unless you discard a creature card.
|
||||||
A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Name$ Emblem - Teferi Akosa of Zhalfir | Image$ emblem_teferi_akosa_of_zhalfir | StaticAbilities$ STPump | Duration$ Permanent | SpellDescription$ You get an emblem with "Knights you control get +1/+0 and have ward {1}."
|
A:AB$ Effect | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | Name$ Emblem - Teferi Akosa of Zhalfir | Image$ emblem_teferi_akosa_of_zhalfir | StaticAbilities$ STPump | Duration$ Permanent | SpellDescription$ You get an emblem with "Knights you control get +1/+0 and have ward {1}."
|
||||||
|
|||||||
@@ -4,9 +4,8 @@ Types:Battle Siege
|
|||||||
Defense:3
|
Defense:3
|
||||||
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigSearch | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
||||||
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 2 | Shuffle$ True
|
SVar:TrigSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | ChangeType$ Land.Basic | ChangeNum$ 2 | Shuffle$ True
|
||||||
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.) When Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
|
||||||
|
|
||||||
AlternateMode:DoubleFaced
|
AlternateMode:DoubleFaced
|
||||||
|
Oracle:(As a Siege enters, choose an opponent to protect it. You and others can attack it. When it's defeated, exile it, then cast it transformed.)\nWhen Invasion of Zendikar enters the battlefield, search your library for up to two basic land cards, put them onto the battlefield tapped, then shuffle.
|
||||||
|
|
||||||
ALTERNATE
|
ALTERNATE
|
||||||
|
|
||||||
@@ -15,9 +14,8 @@ ManaCost:no cost
|
|||||||
Colors:green
|
Colors:green
|
||||||
Types:Creature Elemental
|
Types:Creature Elemental
|
||||||
PT:4/4
|
PT:4/4
|
||||||
A:SP$ PermanentCreature
|
|
||||||
K:Vigilance
|
K:Vigilance
|
||||||
K:Haste
|
K:Haste
|
||||||
S:Mode$ Continuous | Affected$ Card.Self | AddType$ Land | Description$ As long as Awakened Skyclave is on the battlefield, it’s a land in addition to its other types.
|
S:Mode$ Continuous | Affected$ Card.Self | AddType$ Land | Description$ As long as CARDNAME is on the battlefield, it's a land in addition to its other types.
|
||||||
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
|
A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color.
|
||||||
Oracle:Vigilance, haste. \nAs long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.\n{T}: Add one mana of any color
|
Oracle:Vigilance, haste\nAs long as Awakened Skyclave is on the battlefield, it's a land in addition to its other types.\n{T}: Add one mana of any color.
|
||||||
11
forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt
Normal file
11
forge-gui/res/cardsfolder/upcoming/joyful_stormsculptor.txt
Normal file
@@ -0,0 +1,11 @@
|
|||||||
|
Name:Joyful Stormsculptor
|
||||||
|
ManaCost:3 U R
|
||||||
|
Types:Creature Human Shaman
|
||||||
|
PT:2/3
|
||||||
|
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield, create two 1/1 blue and red Elemental creature tokens.
|
||||||
|
SVar:TrigToken:DB$ Token | TokenAmount$ 2 | TokenScript$ ur_1_1_elemental
|
||||||
|
T:Mode$ SpellCast | ValidCard$ Card.withConvoke | ValidActivatingPlayer$ You | Execute$ TrigDamage | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a spell that has convoke, CARDNAME deals 1 damage to each opponent and each battle they protect.
|
||||||
|
SVar:TrigDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | ValidCards$ Battle.OppProtect | NumDmg$ 1
|
||||||
|
DeckHas:Ability$Token & Type$Elemental
|
||||||
|
DeckHints:Keyword$Convoke
|
||||||
|
Oracle:When Joyful Stormsculptor enters the battlefield, create two 1/1 blue and red Elemental creature tokens.\nWhenever you cast a spell that has convoke, Joyful Stormsculptor deals 1 damage to each opponent and each battle they protect.
|
||||||
8
forge-gui/res/cardsfolder/upcoming/portent_tracker.txt
Normal file
8
forge-gui/res/cardsfolder/upcoming/portent_tracker.txt
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
Name:Portent Tracker
|
||||||
|
ManaCost:1 G
|
||||||
|
Types:Creature Satyr Scout
|
||||||
|
PT:1/1
|
||||||
|
A:AB$ Untap | Cost$ T | ValidTgts$ Land | AILogic$ PoolExtraMana | SpellDescription$ Untap target land.
|
||||||
|
A:AB$ AddOrRemoveCounter | Cost$ T | ValidTgts$ Battle | RemoveConditionSVar$ Targeted$Valid Battle.OppProtect | CounterType$ DEFENSE | SorcerySpeed$ True | StackDescription$ REP Choose target battle. _ & it_{c:Targeted} & Activate only as a sorcery._ | SpellDescription$ Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery.
|
||||||
|
DeckHints:Type$Battle
|
||||||
|
Oracle:{T}: Untap target land.\n{T}: Choose target battle. If an opponent protects it, remove a defense counter from it. Otherwise, put a defense counter on it. Activate only as a sorcery.
|
||||||
@@ -3,8 +3,9 @@ ManaCost:X X W
|
|||||||
Types:Creature Phyrexian Cat Cleric
|
Types:Creature Phyrexian Cat Cleric
|
||||||
PT:1/2
|
PT:1/2
|
||||||
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigIncubate | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)
|
T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigIncubate | TriggerZones$ Battlefield | TriggerDescription$ When CARDNAME enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)
|
||||||
SVar:TrigIncubate:DB$ Incubate | Amount$ 3 | Times$ Count$xPaid
|
SVar:TrigIncubate:DB$ Incubate | Amount$ 3 | Times$ X
|
||||||
A:AB$ SetState | Cost$ T | TgtPrompt$ Select target Incubator token you control | ValidTgts$ Incubator.token+YouCtrl | Mode$ Transform | SpellDescription$ Transform target Incubator token you control.
|
A:AB$ SetState | Cost$ T | TgtPrompt$ Select target Incubator token you control | ValidTgts$ Incubator.token+YouCtrl | Mode$ Transform | SpellDescription$ Transform target Incubator token you control.
|
||||||
|
SVar:X:Count$xPaid
|
||||||
DeckHints:Type$Incubator
|
DeckHints:Type$Incubator
|
||||||
DeckHas:Ability$Token|Counters & Type$Artifact|Incubator
|
DeckHas:Ability$Token|Counters & Type$Artifact|Incubator
|
||||||
Oracle:When Progenitor Exarch enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)\n{T}: Transform target Incubator token you control.
|
Oracle:When Progenitor Exarch enters the battlefield, incubate 3 X times. (To incubate 3, create an Incubator token with three +1/+1 counters on it and "{2}: Transform this artifact." It transforms into a 0/0 Phyrexian artifact creature.)\n{T}: Transform target Incubator token you control.
|
||||||
|
|||||||
13
forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt
Normal file
13
forge-gui/res/cardsfolder/upcoming/rampaging_geoderm.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
Name:Rampaging Geoderm
|
||||||
|
ManaCost:2 R G
|
||||||
|
Types:Creature Dinosaur Beast
|
||||||
|
PT:3/3
|
||||||
|
K:Trample
|
||||||
|
K:Haste
|
||||||
|
T:Mode$ AttackersDeclared | AttackingPlayer$ You | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Whenever you attack, target attacking creature gets +1/+1 until end of turn. If it's attacking a battle, put a +1/+1 counter on it instead.
|
||||||
|
SVar:TrigPump:DB$ Branch | ValidTgts$ Creature.attacking | TgtPrompt$ Select target attacking creature | BranchConditionSVar$ X | TrueSubAbility$ PutCounter | FalseSubAbility$ Pump
|
||||||
|
SVar:PutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1
|
||||||
|
SVar:Pump:DB$ Pump | Defined$ Targeted | NumAtt$ +1 | NumDef$ +1
|
||||||
|
SVar:X:Targeted$Valid Card.attackingBattle
|
||||||
|
DeckHas:Ability$Counters
|
||||||
|
Oracle:Trample, haste\nWhenever you attack, target attacking creature gets +1/+1 until end of turn. If it's attacking a battle, put a +1/+1 counter on it instead.
|
||||||
File diff suppressed because it is too large
Load Diff
@@ -3,6 +3,10 @@ Code=MOM
|
|||||||
Date=2023-04-21
|
Date=2023-04-21
|
||||||
Name=March of the Machine
|
Name=March of the Machine
|
||||||
Type=Expansion
|
Type=Expansion
|
||||||
|
BoosterCovers=3
|
||||||
|
Booster=8 Common:!fromSheet("MOM lands"):fromsheet("MOM cards"), 2 Uncommon:fromSheet("MOM cards"), 1 dfc:!fromSheet("MOM battles"):fromSheet("MOM cards"), 1 UncommonRareMythic:!dfc:fromSheet("MOM cards"), 1 fromSheet("MOM battles"), 1 fromSheet("MUL cards"), 1 fromSheet("MOM lands")
|
||||||
|
Prerelease=6 Boosters, 1 RareMythic+
|
||||||
|
BoosterBox=36
|
||||||
ScryfallCode=MOM
|
ScryfallCode=MOM
|
||||||
|
|
||||||
[cards]
|
[cards]
|
||||||
@@ -406,6 +410,71 @@ ScryfallCode=MOM
|
|||||||
[buy a box]
|
[buy a box]
|
||||||
387 R Omnath, Locus of All @Helge C. Balzer
|
387 R Omnath, Locus of All @Helge C. Balzer
|
||||||
|
|
||||||
|
[lands]
|
||||||
|
4 Plains|MOM|1
|
||||||
|
3 Plains|MOM|2
|
||||||
|
3 Plains|MOM|3
|
||||||
|
4 Island|MOM|1
|
||||||
|
3 Island|MOM|2
|
||||||
|
3 Island|MOM|3
|
||||||
|
4 Swamp|MOM|1
|
||||||
|
3 Swamp|MOM|2
|
||||||
|
3 Swamp|MOM|3
|
||||||
|
4 Mountain|MOM|1
|
||||||
|
3 Mountain|MOM|2
|
||||||
|
3 Mountain|MOM|3
|
||||||
|
4 Forest|MOM|1
|
||||||
|
3 Forest|MOM|2
|
||||||
|
3 Forest|MOM|3
|
||||||
|
5 Bloodfell Caves|MOM
|
||||||
|
5 Blossoming Sands|MOM
|
||||||
|
5 Dismal Backwater|MOM
|
||||||
|
5 Jungle Hollow|MOM
|
||||||
|
5 Rugged Highlands|MOM
|
||||||
|
5 Scoured Barrens|MOM
|
||||||
|
5 Swiftwater Cliffs|MOM
|
||||||
|
5 Thornwood Falls|MOM
|
||||||
|
5 Tranquil Cove|MOM
|
||||||
|
5 Wind-Scarred Crag|MOM
|
||||||
|
|
||||||
|
[battles]
|
||||||
|
1 Invasion of Alara|MOM
|
||||||
|
1 Invasion of Amonkhet|MOM
|
||||||
|
1 Invasion of Arcavios|MOM
|
||||||
|
1 Invasion of Azgol|MOM
|
||||||
|
1 Invasion of Belenon|MOM
|
||||||
|
1 Invasion of Dominaria|MOM
|
||||||
|
1 Invasion of Eldraine|MOM
|
||||||
|
1 Invasion of Ergamon|MOM
|
||||||
|
1 Invasion of Fiora|MOM
|
||||||
|
1 Invasion of Gobakhan|MOM
|
||||||
|
1 Invasion of Ikoria|MOM
|
||||||
|
1 Invasion of Innistrad|MOM
|
||||||
|
1 Invasion of Ixalan|MOM
|
||||||
|
1 Invasion of Kaladesh|MOM
|
||||||
|
1 Invasion of Kaldheim|MOM
|
||||||
|
1 Invasion of Kamigawa|MOM
|
||||||
|
1 Invasion of Karsus|MOM
|
||||||
|
1 Invasion of Kylem|MOM
|
||||||
|
1 Invasion of Lorwyn|MOM
|
||||||
|
1 Invasion of Mercadia|MOM
|
||||||
|
1 Invasion of Moag|MOM
|
||||||
|
1 Invasion of Muraganda|MOM
|
||||||
|
1 Invasion of New Capenna|MOM
|
||||||
|
1 Invasion of New Phyrexia|MOM
|
||||||
|
1 Invasion of Pyrulea|MOM
|
||||||
|
1 Invasion of Ravnica|MOM
|
||||||
|
1 Invasion of Regatha|MOM
|
||||||
|
1 Invasion of Segovia|MOM
|
||||||
|
1 Invasion of Shandalar|MOM
|
||||||
|
1 Invasion of Tarkir|MOM
|
||||||
|
1 Invasion of Theros|MOM
|
||||||
|
1 Invasion of Tolvada|MOM
|
||||||
|
1 Invasion of Ulgrotha|MOM
|
||||||
|
1 Invasion of Vryn|MOM
|
||||||
|
1 Invasion of Xerex|MOM
|
||||||
|
1 Invasion of Zendikar|MOM
|
||||||
|
|
||||||
[tokens]
|
[tokens]
|
||||||
b_2_2_zombie
|
b_2_2_zombie
|
||||||
c_1_1_a_thopter_flying
|
c_1_1_a_thopter_flying
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Date=2023-03-21
|
|||||||
Name=Shadows over Innistrad Remastered
|
Name=Shadows over Innistrad Remastered
|
||||||
Type=Online
|
Type=Online
|
||||||
BoosterCovers=3
|
BoosterCovers=3
|
||||||
Booster=10 Common:fromsheet("SIR cards"), 3 Uncommon:fromSheet("SIR cards"), 1 RareMythic:fromSheet("SIR cards"), 1 BasicLand:fromSheet("SIR cards")
|
Booster=9 Common:fromsheet("SIR cards"), 3 Uncommon:fromSheet("SIR cards"), 1 RareMythic:fromSheet("SIR cards"), 1 BasicLand:fromSheet("SIR cards"), 1 Any:fromSheet("SIS cards")
|
||||||
Prerelease=6 Boosters, 1 RareMythic+
|
Prerelease=6 Boosters, 1 RareMythic+
|
||||||
BoosterBox=36
|
BoosterBox=36
|
||||||
ScryfallCode=SIR
|
ScryfallCode=SIR
|
||||||
|
|||||||
6
forge-gui/res/tokenscripts/ur_1_1_elemental.txt
Normal file
6
forge-gui/res/tokenscripts/ur_1_1_elemental.txt
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
Name:Elemental Token
|
||||||
|
ManaCost:no cost
|
||||||
|
Colors:blue,red
|
||||||
|
Types:Creature Elemental
|
||||||
|
PT:1/1
|
||||||
|
Oracle:
|
||||||
@@ -1,6 +1,6 @@
|
|||||||
Name:Vampire Token
|
Name:Vampire Knight Token
|
||||||
ManaCost:no cost
|
ManaCost:no cost
|
||||||
Types:Creature Vampire
|
Types:Creature Knight Vampire
|
||||||
Colors:white
|
Colors:white
|
||||||
PT:1/1
|
PT:1/1
|
||||||
K:Lifelink
|
K:Lifelink
|
||||||
Reference in New Issue
Block a user