Merge branch 'master' into master2

This commit is contained in:
Anthony Calosa
2024-10-09 16:44:29 +08:00
41 changed files with 342 additions and 120 deletions

View File

@@ -106,6 +106,14 @@ public final class MagicColor {
} }
} }
public static String toSymbol(final byte color) {
return MagicColor.Color.fromByte(color).getSymbol();
}
public static String toSymbol(final String color) {
return toSymbol(fromName(color));
}
/** /**
* The Interface Color. * The Interface Color.
*/ */
@@ -165,6 +173,17 @@ public final class MagicColor {
symbol = symbol0; symbol = symbol0;
} }
public static Color fromByte(final byte color) {
switch (color) {
case MagicColor.WHITE: return WHITE;
case MagicColor.BLUE: return BLUE;
case MagicColor.BLACK: return BLACK;
case MagicColor.RED: return RED;
case MagicColor.GREEN: return GREEN;
default: return COLORLESS;
}
}
public String getName() { public String getName() {
return name; return name;
} }

View File

@@ -3,7 +3,6 @@ package forge.game.ability;
import com.google.common.base.Functions; import com.google.common.base.Functions;
import com.google.common.collect.*; import com.google.common.collect.*;
import com.google.common.math.IntMath; import com.google.common.math.IntMath;
import forge.card.CardStateName; import forge.card.CardStateName;
import forge.card.CardType; import forge.card.CardType;
import forge.card.ColorSet; import forge.card.ColorSet;
@@ -2510,6 +2509,19 @@ public class AbilityUtils {
return doXMath(CardLists.getValidCardCount(game.getLeftGraveyardThisTurn(), validFilter, player, c, ctb), expr, c, ctb); return doXMath(CardLists.getValidCardCount(game.getLeftGraveyardThisTurn(), validFilter, player, c, ctb), expr, c, ctb);
} }
// Count$UnlockedDoors <Valid>
if (sq[0].startsWith("UnlockedDoors")) {
final String[] workingCopy = l[0].split(" ", 2);
final String validFilter = workingCopy[1];
int unlocked = 0;
for (Card doorCard : CardLists.getValidCards(player.getCardsIn(ZoneType.Battlefield), validFilter, player, c, ctb)) {
unlocked += doorCard.getUnlockedRooms().size();
}
return doXMath(unlocked, expr, c, ctb);
}
// Manapool // Manapool
if (sq[0].startsWith("ManaPool")) { if (sq[0].startsWith("ManaPool")) {
final String color = l[0].split(":")[1]; final String color = l[0].split(":")[1];

View File

@@ -55,11 +55,14 @@ public class ManaEffect extends SpellAbilityEffect {
if (abMana.isComboMana()) { if (abMana.isComboMana()) {
int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1; int amount = sa.hasParam("Amount") ? AbilityUtils.calculateAmount(card, sa.getParam("Amount"), sa) : 1;
if(amount <= 0)
continue;
String express = abMana.getExpressChoice(); String express = abMana.getExpressChoice();
String[] colorsProduced = abMana.getComboColors(sa).split(" "); String[] colorsProduced = abMana.getComboColors(sa).split(" ");
final StringBuilder choiceString = new StringBuilder(); final StringBuilder choiceString = new StringBuilder();
final StringBuilder choiceSymbols = new StringBuilder();
ColorSet colorOptions = ColorSet.fromNames(colorsProduced); ColorSet colorOptions = ColorSet.fromNames(colorsProduced);
String[] colorsNeeded = express.isEmpty() ? null : express.split(" "); String[] colorsNeeded = express.isEmpty() ? null : express.split(" ");
boolean differentChoice = abMana.getOrigProduced().contains("Different"); boolean differentChoice = abMana.getOrigProduced().contains("Different");
@@ -70,12 +73,14 @@ public class ManaEffect extends SpellAbilityEffect {
for (Map.Entry<Byte, Integer> e : choices.entrySet()) { for (Map.Entry<Byte, Integer> e : choices.entrySet()) {
Byte chosenColor = e.getKey(); Byte chosenColor = e.getKey();
String choice = MagicColor.toShortString(chosenColor); String choice = MagicColor.toShortString(chosenColor);
String symbol = MagicColor.toSymbol(chosenColor);
Integer count = e.getValue(); Integer count = e.getValue();
while (count > 0) { while (count > 0) {
if (choiceString.length() > 0) { if (choiceString.length() > 0) {
choiceString.append(" "); choiceString.append(" ");
} }
choiceString.append(choice); choiceString.append(choice);
choiceSymbols.append(symbol);
--count; --count;
} }
} }
@@ -106,25 +111,26 @@ public class ManaEffect extends SpellAbilityEffect {
choiceString.append(" "); choiceString.append(" ");
} }
choiceString.append(choice); choiceString.append(choice);
choiceSymbols.append(MagicColor.toSymbol(choice));
if (sa.hasParam("TwoEach")) { if (sa.hasParam("TwoEach")) {
choiceString.append(" ").append(choice); choiceString.append(" ").append(choice);
choiceSymbols.append(MagicColor.toSymbol(choice));
} }
} }
} }
if (choiceString.toString().isEmpty() && "Combo ColorIdentity".equals(abMana.getOrigProduced())) { if (choiceString.toString().isEmpty() && "Combo ColorIdentity".equals(abMana.getOrigProduced())) {
// No mana could be produced here (non-EDH match?), so cut short // No mana could be produced here (non-EDH match?), so cut short
return; continue;
} }
game.getAction().notifyOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), choiceString), p); game.getAction().notifyOfValue(sa, p, choiceSymbols.toString(), p);
abMana.setExpressChoice(choiceString.toString()); abMana.setExpressChoice(choiceString.toString());
} }
else if (abMana.isAnyMana()) { else if (abMana.isAnyMana()) {
// AI color choice is set in ComputerUtils so only human players need to make a choice // AI color choice is set in ComputerUtils so only human players need to make a choice
String colorsNeeded = abMana.getExpressChoice(); String colorsNeeded = abMana.getExpressChoice();
String choice = "";
ColorSet colorMenu = null; ColorSet colorMenu = null;
byte mask = 0; byte mask = 0;
@@ -137,10 +143,9 @@ public class ManaEffect extends SpellAbilityEffect {
if (0 == val) { if (0 == val) {
throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName()); throw new RuntimeException("ManaEffect::resolve() /*any mana*/ - " + p + " color mana choice is empty for " + card.getName());
} }
choice = MagicColor.toShortString(val);
game.getAction().notifyOfValue(sa, card, Localizer.getInstance().getMessage("lblPlayerPickedChosen", p.getName(), choice), p); game.getAction().notifyOfValue(sa, card, MagicColor.toSymbol(val), p);
abMana.setExpressChoice(choice); abMana.setExpressChoice(MagicColor.toShortString(val));
} }
else if (abMana.isSpecialMana()) { else if (abMana.isSpecialMana()) {
String type = abMana.getOrigProduced().split("Special ")[1]; String type = abMana.getOrigProduced().split("Special ")[1];
@@ -183,7 +188,7 @@ public class ManaEffect extends SpellAbilityEffect {
int nMana = 0; int nMana = 0;
for (Object o : card.getRemembered()) { for (Object o : card.getRemembered()) {
if (o instanceof String) { if (o instanceof String) {
sb.append(o.toString()); sb.append(o);
nMana++; nMana++;
} }
} }

View File

@@ -33,6 +33,7 @@ import forge.game.cost.Cost;
import forge.game.keyword.Keyword; import forge.game.keyword.Keyword;
import forge.game.keyword.KeywordInterface; import forge.game.keyword.KeywordInterface;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.replacement.ReplacementEffect;
import forge.game.replacement.ReplacementHandler; import forge.game.replacement.ReplacementHandler;
import forge.game.spellability.*; import forge.game.spellability.*;
import forge.game.staticability.StaticAbility; import forge.game.staticability.StaticAbility;
@@ -268,6 +269,11 @@ public class CardFactory {
original.addStaticAbility(st.copy(card, false)); original.addStaticAbility(st.copy(card, false));
} }
} }
for (ReplacementEffect re : card.getCurrentState().getReplacementEffects()) {
if (re.isIntrinsic()) {
original.addReplacementEffect(re.copy(card, false));
}
}
original.getSVars().putAll(card.getCurrentState().getSVars()); // Unfortunately need to copy these to (Effect looks for sVars on execute) original.getSVars().putAll(card.getCurrentState().getSVars()); // Unfortunately need to copy these to (Effect looks for sVars on execute)
} else if (state != CardStateName.Original) { } else if (state != CardStateName.Original) {
CardFactoryUtil.setupKeywordedAbilities(card); CardFactoryUtil.setupKeywordedAbilities(card);

View File

@@ -41,6 +41,7 @@ public class MessageUtil {
case Seek: case Seek:
return value; return value;
case ChooseColor: case ChooseColor:
case Mana:
return sa.hasParam("Random") return sa.hasParam("Random")
? Localizer.getInstance().getMessage("lblRandomColorChosen", value) ? Localizer.getInstance().getMessage("lblRandomColorChosen", value)
: Localizer.getInstance().getMessage("lblPlayerPickedChosen", choser, value); : Localizer.getInstance().getMessage("lblPlayerPickedChosen", choser, value);

View File

@@ -6,15 +6,15 @@ import java.awt.FontMetrics;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent; import java.awt.event.KeyEvent;
import java.util.List; import java.util.List;
import java.util.concurrent.Callable;
import java.util.concurrent.FutureTask;
import javax.swing.JComponent; import javax.swing.*;
import javax.swing.JOptionPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import javax.swing.text.StyleConstants; import javax.swing.text.StyleConstants;
import com.google.common.collect.ImmutableList; import com.google.common.collect.ImmutableList;
import forge.gui.FThreads;
import forge.localinstance.skin.FSkinProp; import forge.localinstance.skin.FSkinProp;
import forge.toolbox.FSkin.SkinImage; import forge.toolbox.FSkin.SkinImage;
import forge.util.Localizer; import forge.util.Localizer;
@@ -87,20 +87,25 @@ public class FOptionPane extends FDialog {
if (FView.SINGLETON_INSTANCE.getSplash() != null) { if (FView.SINGLETON_INSTANCE.getSplash() != null) {
return 0; return 0;
} }
return showOptionDialog(message, title, icon, null, options, defaultOption);
final FOptionPane optionPane = new FOptionPane(message, title, icon, null, options, defaultOption);
optionPane.setVisible(true);
final int dialogResult = optionPane.result;
optionPane.dispose();
return dialogResult;
} }
public static int showOptionDialog(final String message, final String title, final SkinImage icon, final Component comp, final List<String> options, final int defaultOption) { public static int showOptionDialog(final String message, final String title, final SkinImage icon, final Component comp, final List<String> options, final int defaultOption) {
final Callable<Integer> showChoice = () -> {
final FOptionPane optionPane = new FOptionPane(message, title, icon, comp, options, defaultOption); final FOptionPane optionPane = new FOptionPane(message, title, icon, comp, options, defaultOption);
optionPane.setVisible(true); optionPane.setVisible(true);
final int dialogResult = optionPane.result; final int dialogResult = optionPane.result;
optionPane.dispose(); optionPane.dispose();
return dialogResult; return dialogResult;
};
final FutureTask<Integer> future = new FutureTask<>(showChoice);
FThreads.invokeInEdtAndWait(future);
try {
return future.get();
} catch (final Exception e) { // should be no exception here
e.printStackTrace();
throw new RuntimeException(e);
}
} }
public static String showInputDialog(final String message, final String title) { public static String showInputDialog(final String message, final String title) {
@@ -117,6 +122,7 @@ public class FOptionPane extends FDialog {
@SuppressWarnings("unchecked") @SuppressWarnings("unchecked")
public static <T> T showInputDialog(final String message, final String title, final SkinImage icon, final String initialInput, final List<T> inputOptions) { public static <T> T showInputDialog(final String message, final String title, final SkinImage icon, final String initialInput, final List<T> inputOptions) {
final Callable<T> showChoice = () -> {
final JComponent inputField; final JComponent inputField;
FTextField txtInput = null; FTextField txtInput = null;
FComboBox<T> cbInput = null; FComboBox<T> cbInput = null;
@@ -150,12 +156,22 @@ public class FOptionPane extends FDialog {
} }
} }
return null; return null;
};
final FutureTask<T> future = new FutureTask<>(showChoice);
FThreads.invokeInEdtAndWait(future);
try {
return future.get();
} catch (final Exception e) { // should be no exception here
e.printStackTrace();
throw new RuntimeException(e);
}
} }
private int result = -1; //default result to -1, indicating dialog closed without choosing option private int result = -1; //default result to -1, indicating dialog closed without choosing option
private final FButton[] buttons; private final FButton[] buttons;
public FOptionPane(final String message, final String title, final SkinImage icon, final Component comp, final List<String> options, final int defaultOption) { public FOptionPane(final String message, final String title, final SkinImage icon, final Component comp, final List<String> options, final int defaultOption) {
FThreads.assertExecutedByEdt(true);
this.setTitle(title); this.setTitle(title);
final int padding = 10; final int padding = 10;
@@ -163,7 +179,7 @@ public class FOptionPane extends FDialog {
final int gapAboveButtons = padding * 3 / 2; final int gapAboveButtons = padding * 3 / 2;
final int gapBottom = comp == null ? gapAboveButtons : padding; final int gapBottom = comp == null ? gapAboveButtons : padding;
FLabel centeredLabel = null; FLabel centeredLabel = null;
FTextPane centeredPrompt = null; FTextPane prompt = null;
if (icon != null) { if (icon != null) {
if (icon.getWidth() < 100) { if (icon.getWidth() < 100) {
@@ -179,23 +195,16 @@ public class FOptionPane extends FDialog {
} }
} }
if (message != null) { if (message != null) {
if (centeredLabel == null) { prompt = new FTextPane();
final FTextArea prompt = new FTextArea(message); prompt.setContentType("text/html");
prompt.setFont(FSkin.getFont(14)); prompt.putClientProperty(JEditorPane.HONOR_DISPLAY_PROPERTIES, Boolean.TRUE);
prompt.setAutoSize(true); prompt.setText(FSkin.encodeSymbols(message, false));
final Dimension parentSize = JOptionPane.getRootFrame().getSize();
prompt.setMaximumSize(new Dimension(parentSize.width / 2, parentSize.height - 100));
this.add(prompt, "x " + x + ", ay top, wrap, gaptop " + (icon == null ? 0 : 7) + ", gapbottom " + gapBottom);
}
else {
final FTextPane prompt = new FTextPane(message);
prompt.setFont(FSkin.getFont(14)); prompt.setFont(FSkin.getFont(14));
if(centeredLabel != null)
prompt.setTextAlignment(StyleConstants.ALIGN_CENTER); prompt.setTextAlignment(StyleConstants.ALIGN_CENTER);
final Dimension parentSize = JOptionPane.getRootFrame().getSize(); final Dimension parentSize = JOptionPane.getRootFrame().getSize();
prompt.setMaximumSize(new Dimension(parentSize.width / 2, parentSize.height - 100)); prompt.setMaximumSize(new Dimension(parentSize.width / 2, parentSize.height - 100));
this.add(prompt, "x " + x + ", ay top, wrap, gapbottom " + gapBottom); this.add(prompt, "x " + x + ", ay top, wrap, gaptop " + (icon == null ? 0 : 7) + ", gapbottom " + gapBottom);
centeredPrompt = prompt;
}
x = padding; x = padding;
} }
if (comp != null) { if (comp != null) {
@@ -277,7 +286,8 @@ public class FOptionPane extends FDialog {
if (centeredLabel != null) { if (centeredLabel != null) {
centeredLabel.setPreferredSize(new Dimension(width - 2 * padding, centeredLabel.getMinimumSize().height)); centeredLabel.setPreferredSize(new Dimension(width - 2 * padding, centeredLabel.getMinimumSize().height));
centeredPrompt.setPreferredSize(new Dimension(width - 2 * padding, centeredPrompt.getPreferredSize().height)); if(prompt != null)
prompt.setPreferredSize(new Dimension(width - 2 * padding, prompt.getPreferredSize().height));
} }
this.setSize(width, this.getHeight() + buttonHeight); //resize dialog again to account for buttons this.setSize(width, this.getHeight() + buttonHeight); //resize dialog again to account for buttons

View File

@@ -39,7 +39,7 @@ public class SpellSmithScene extends UIScene {
private List<PaperCard> cardPool = new ArrayList<>(); private List<PaperCard> cardPool = new ArrayList<>();
private TextraLabel playerGold, playerShards, poolSize; private TextraLabel playerGold, playerShards, poolSize;
private final TextraButton pullUsingGold, pullUsingShards; private final TextraButton pullUsingGold, pullUsingShards, acceptReward, declineReward, exitSmith;
private final ScrollPane rewardDummy; private final ScrollPane rewardDummy;
private RewardActor rewardActor; private RewardActor rewardActor;
SelectBox<CardEdition> editionList; SelectBox<CardEdition> editionList;
@@ -47,6 +47,7 @@ public class SpellSmithScene extends UIScene {
final private HashMap<String, TextraButton> rarityButtons = new HashMap<>(); final private HashMap<String, TextraButton> rarityButtons = new HashMap<>();
final private HashMap<String, TextraButton> costButtons = new HashMap<>(); final private HashMap<String, TextraButton> costButtons = new HashMap<>();
final private HashMap<String, TextraButton> colorButtons = new HashMap<>(); final private HashMap<String, TextraButton> colorButtons = new HashMap<>();
//Filter variables. //Filter variables.
private String edition = ""; private String edition = "";
private String rarity = ""; private String rarity = "";
@@ -57,20 +58,28 @@ public class SpellSmithScene extends UIScene {
private int currentPrice = 0; private int currentPrice = 0;
private int currentShardPrice = 0; private int currentShardPrice = 0;
private List<CardEdition> editions = null; private List<CardEdition> editions = null;
private Reward currentReward = null;
private boolean paidInShards = false;
private SpellSmithScene() { private SpellSmithScene() {
super(Forge.isLandscapeMode() ? "ui/spellsmith.json" : "ui/spellsmith_portrait.json"); super(Forge.isLandscapeMode() ? "ui/spellsmith.json" : "ui/spellsmith_portrait.json");
editionList = ui.findActor("BSelectPlane"); editionList = ui.findActor("BSelectPlane");
rewardDummy = ui.findActor("RewardDummy"); rewardDummy = ui.findActor("RewardDummy");
rewardDummy.setVisible(false); rewardDummy.setVisible(false);
pullUsingGold = ui.findActor("pullUsingGold"); pullUsingGold = ui.findActor("pullUsingGold");
pullUsingGold.setDisabled(true); pullUsingGold.setDisabled(true);
pullUsingShards = ui.findActor("pullUsingShards"); pullUsingShards = ui.findActor("pullUsingShards");
pullUsingShards.setDisabled(true); pullUsingShards.setDisabled(true);
exitSmith = ui.findActor("done");
acceptReward = ui.findActor("accept");
acceptReward.setVisible(false);
declineReward = ui.findActor("decline");
declineReward.setVisible(false);
playerGold = Controls.newAccountingLabel(ui.findActor("playerGold"), false); playerGold = Controls.newAccountingLabel(ui.findActor("playerGold"), false);
playerShards = Controls.newAccountingLabel(ui.findActor("playerShards"), true); playerShards = Controls.newAccountingLabel(ui.findActor("playerShards"), true);
poolSize = ui.findActor("poolSize"); poolSize = ui.findActor("poolSize");
@@ -114,6 +123,8 @@ public class SpellSmithScene extends UIScene {
} }
} }
ui.onButtonPress("accept", SpellSmithScene.this::acceptSmithing);
ui.onButtonPress("decline", SpellSmithScene.this::declineSmithing);
ui.onButtonPress("done", SpellSmithScene.this::done); ui.onButtonPress("done", SpellSmithScene.this::done);
ui.onButtonPress("pullUsingGold", () -> SpellSmithScene.this.pullCard(false)); ui.onButtonPress("pullUsingGold", () -> SpellSmithScene.this.pullCard(false));
ui.onButtonPress("pullUsingShards", () -> SpellSmithScene.this.pullCard(true)); ui.onButtonPress("pullUsingShards", () -> SpellSmithScene.this.pullCard(true));
@@ -122,6 +133,7 @@ public class SpellSmithScene extends UIScene {
filterResults(); filterResults();
}); });
} }
private void reset() { private void reset() {
edition = ""; edition = "";
cost_low = -1; cost_low = -1;
@@ -160,6 +172,10 @@ public class SpellSmithScene extends UIScene {
} }
public boolean done() { public boolean done() {
if (currentReward != null) {
acceptSmithing();
}
if (rewardActor != null) rewardActor.remove(); if (rewardActor != null) rewardActor.remove();
cardPool.clear(); //Get rid of cardPool, filtering is fast enough to justify keeping it cached. cardPool.clear(); //Get rid of cardPool, filtering is fast enough to justify keeping it cached.
Forge.switchToLast(); Forge.switchToLast();
@@ -380,29 +396,74 @@ public class SpellSmithScene extends UIScene {
} }
public void pullCard(boolean usingShards) { public void pullCard(boolean usingShards) {
paidInShards = usingShards;
PaperCard P = cardPool.get(MyRandom.getRandom().nextInt(cardPool.size())); //Don't use the standard RNG. PaperCard P = cardPool.get(MyRandom.getRandom().nextInt(cardPool.size())); //Don't use the standard RNG.
Reward R = null; currentReward = null;
if (Config.instance().getSettingData().useAllCardVariants) { if (Config.instance().getSettingData().useAllCardVariants) {
if (!edition.isEmpty()) { if (!edition.isEmpty()) {
R = new Reward(CardUtil.getCardByNameAndEdition(P.getCardName(), edition)); currentReward = new Reward(CardUtil.getCardByNameAndEdition(P.getCardName(), edition));
} else { } else {
R = new Reward(CardUtil.getCardByName(P.getCardName())); // grab any random variant if no set preference is specified currentReward = new Reward(CardUtil.getCardByName(P.getCardName())); // grab any random variant if no set preference is specified
} }
} else { } else {
R = new Reward(P); currentReward = new Reward(P);
} }
Current.player().addReward(R); if (rewardActor != null) rewardActor.remove();
if (usingShards) { rewardActor = new RewardActor(currentReward, true, null, true);
rewardActor.flip(); //Make it flip so it draws visual attention, why not.
rewardActor.setBounds(rewardDummy.getX(), rewardDummy.getY(), rewardDummy.getWidth(), rewardDummy.getHeight());
stage.addActor(rewardActor);
acceptReward.setVisible(true);
declineReward.setVisible(true);
exitSmith.setDisabled(true);
disablePullButtons();
}
private void acceptSmithing() {
if (paidInShards) {
Current.player().takeShards(currentShardPrice); Current.player().takeShards(currentShardPrice);
} else { } else {
Current.player().takeGold(currentPrice); Current.player().takeGold(currentPrice);
} }
if (Current.player().getGold() < currentPrice) pullUsingGold.setDisabled(true);
if (Current.player().getShards() < currentShardPrice) pullUsingShards.setDisabled(true); Current.player().addReward(currentReward);
clearReward();
updatePullButtons();
}
private void declineSmithing() {
// Decline the smith reward for 10% of original price
float priceAdjustment = .10f;
if (paidInShards) {
Current.player().takeShards((int)(currentShardPrice * priceAdjustment));
} else {
Current.player().takeGold((int)(currentPrice * priceAdjustment));
}
clearReward();
updatePullButtons();
}
private void clearReward() {
if (rewardActor != null) rewardActor.remove(); if (rewardActor != null) rewardActor.remove();
rewardActor = new RewardActor(R, true, null, true); currentReward = null;
rewardActor.flip(); //Make it flip so it draws visual attention, why not. }
rewardActor.setBounds(rewardDummy.getX(), rewardDummy.getY(), rewardDummy.getWidth(), rewardDummy.getHeight());
stage.addActor(rewardActor);
private void updatePullButtons() {
pullUsingGold.setDisabled(Current.player().getGold() < currentPrice);
pullUsingShards.setDisabled(Current.player().getShards() < currentShardPrice);
acceptReward.setVisible(false);
declineReward.setVisible(false);
exitSmith.setDisabled(false);
}
private void disablePullButtons() {
pullUsingGold.setDisabled(true);
pullUsingShards.setDisabled(true);
} }
} }

View File

@@ -67,7 +67,7 @@
&quot;options&quot;: [ &quot;options&quot;: [
{ {
&quot;name&quot;: &quot;Am I allowed to enter the aerie ?&quot;, &quot;name&quot;: &quot;Am I allowed to enter the aerie ?&quot;,
&quot;text&quot;: &quot;I'm afraid to say to you that you are not allowed to do that. Our guild is very protective of it's breeding practices, which have been developed over a span of more than thousands of years. Because of that, we don't want our competitors peeking into our business. If anyone without permission enters the aerie, that person will be repremanded by the various guards and even the birds, who have been trained to attack unwanted intruders.'&quot;, &quot;text&quot;: &quot;I'm afraid to say to you that you are not allowed to do that. Our guild is very protective of it's breeding practices, which have been developed over a span of more than thousands of years. Because of that, we don't want our competitors peeking into our business. If anyone without permission enters the aerie, that person will be reprimanded by the various guards and even the birds, who have been trained to attack unwanted intruders.'&quot;,
&quot;options&quot;: [ &quot;options&quot;: [
{ {
&quot;name&quot;: &quot;Thanks for the information, goodbye&quot;, &quot;name&quot;: &quot;Thanks for the information, goodbye&quot;,

View File

@@ -169,12 +169,34 @@
"y": 5, "y": 5,
"width": 90, "width": 90,
"height": 20 "height": 20
},
{
"type": "TextButton",
"selectable": true,
"name": "accept",
"text": "tr(lblTake)",
"binding": "Use",
"x": 343,
"y": 173,
"width": 60,
"height": 20
},
{
"type": "TextButton",
"selectable": true,
"name": "decline",
"text": "tr(lblRefund)",
"binding": "Back",
"x": 405,
"y": 173,
"width": 60,
"height": 20
}, },
{ {
"type": "Label", "type": "Label",
"name": "poolSize", "name": "poolSize",
"x": 360, "x": 360,
"y": 180, "y": 192,
"width": 90, "width": 90,
"height": 20 "height": 20
}, },

View File

@@ -174,12 +174,34 @@
"y": 75, "y": 75,
"width": 90, "width": 90,
"height": 20 "height": 20
},
{
"type": "TextButton",
"selectable": true,
"name": "accept",
"text": "tr(lblTake)",
"binding": "Use",
"x": 2,
"y": 142,
"width": 60,
"height": 20
},
{
"type": "TextButton",
"selectable": true,
"name": "decline",
"text": "tr(lblRefund)",
"binding": "Back",
"x": 70,
"y": 142,
"width": 60,
"height": 20
}, },
{ {
"type": "Label", "type": "Label",
"name": "poolSize", "name": "poolSize",
"x": 16, "x": 16,
"y": 150, "y": 163,
"width": 97, "width": 97,
"height": 20 "height": 20
}, },

View File

@@ -4,7 +4,7 @@ Types:Enchantment Creature Demon
PT:6/6 PT:6/6
K:Flying K:Flying
K:Trample K:Trample
S:Mode$ Continuous | Affected$ Card.Enchantment+YouCtrl+nonLand | MayPlayLimit$ 1 | MayPlay$ True | MayPlayAltManaCost$ PayLife<ConvertedManaCost> | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Once during each of your turns, you may cast an enchantment spell by paying life equal to its mana value rather than paying its mana cost. S:Mode$ Continuous | Condition$ PlayerTurn | Affected$ Card.Enchantment+YouCtrl+nonLand | MayPlayLimit$ 1 | MayPlay$ True | MayPlayAltManaCost$ PayLife<ConvertedManaCost> | MayPlayDontGrantZonePermissions$ True | AffectedZone$ Hand,Graveyard,Exile,Library,Command | Description$ Once during each of your turns, you may cast an enchantment spell by paying life equal to its mana value rather than paying its mana cost.
A:AB$ Pump | Cost$ 2 B Sac<1/Enchantment.Other> | NumAtt$ X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the sacrificed enchantment's mana value. A:AB$ Pump | Cost$ 2 B Sac<1/Enchantment.Other> | NumAtt$ X | SpellDescription$ CARDNAME gets +X/+0 until end of turn, where X is the sacrificed enchantment's mana value.
SVar:X:Sacrificed$CardManaCost SVar:X:Sacrificed$CardManaCost
DeckHints:Type$Enchantment DeckHints:Type$Enchantment

View File

@@ -1,7 +1,7 @@
Name:Snakeskin Veil Name:Snakeskin Veil
ManaCost:G ManaCost:G
Types:Instant Types:Instant
A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature you control. A:SP$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn.
SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Hexproof SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ Hexproof
DeckHas:Ability$Counters DeckHas:Ability$Counters
Oracle:Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn. Oracle:Put a +1/+1 counter on target creature you control. It gains hexproof until end of turn.

View File

@@ -3,7 +3,7 @@ ManaCost:1 B
Types:Creature Leech Types:Creature Leech
PT:2/2 PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigLoseLife | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigLoseLife| TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigLoseLife| TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life.
SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 SVar:TrigLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life. Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, each opponent loses 1 life.

View File

@@ -3,7 +3,7 @@ ManaCost:2 W
Types:Creature Human Doctor Types:Creature Human Doctor
PT:3/3 PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gains lifelink until end of turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gains lifelink until end of turn.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gains lifelink until end of turn. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gains lifelink until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Lifelink SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Lifelink
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Cult Healer gains lifelink until end of turn. Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Cult Healer gains lifelink until end of turn.

View File

@@ -3,7 +3,7 @@ ManaCost:3 B
Types:Creature Vampire Warrior Types:Creature Vampire Warrior
PT:2/5 PT:2/5
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 and gains lifelink until end of turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 and gains lifelink until end of turn.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerDescription$ $ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 and gains lifelink until end of turn. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ $ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 and gains lifelink until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | KW$ Lifelink SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 | KW$ Lifelink
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Dashing Bloodsucker gets +2/+0 and gains lifelink until end of turn. Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Dashing Bloodsucker gets +2/+0 and gains lifelink until end of turn.

View File

@@ -0,0 +1,14 @@
Name:Disorienting Choice
ManaCost:3 G
Types:Sorcery
A:SP$ Pump | ValidTgts$ Artifact.OppCtrl,Enchantment.OppCtrl | TgtPrompt$ Choose up to one target artifact or enchantment each opponent controls | TargetMin$ 0 | TargetMax$ OneEach | TargetsForEachPlayer$ True | SubAbility$ DBRepeat | SpellDescription$ For each opponent, choose up to one target artifact or enchantment that player controls. For each permanent chosen this way, its controller may exile it. Then if one or more of the chosen permanents are still on the battlefield, you search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle.
SVar:DBRepeat:DB$ RepeatEach | RepeatPlayers$ TargetedController | RepeatSubAbility$ DBChoice | SubAbility$ DBExile
SVar:DBChoice:DB$ GenericChoice | Choices$ DBDoNotKeep,DBIncrease | Defined$ Remembered | AILogic$ Random | ShowChoice$ ExceptSelf
SVar:DBDoNotKeep:DB$ Pump | Defined$ Targeted.RememberedPlayerCtrl | RememberPumped$ True | SpellDescription$ Exile targeted card
SVar:DBIncrease:DB$ StoreSVar | SVar$ X | Type$ CountSVar | Expression$ X/Plus.1 | SpellDescription$ Keep targeted card
SVar:DBExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsRemembered | SubAbility$ DBSearchLibrary
SVar:DBSearchLibrary:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Land | Tapped$ True | ChangeNum$ X | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Number$0
SVar:OneEach:PlayerCountOpponents$Amount
Oracle:For each opponent, choose up to one target artifact or enchantment that player controls. For each permanent chosen this way, its controller may exile it. Then if one or more of the chosen permanents are still on the battlefield, you search your library for up to that many land cards, put them onto the battlefield tapped, then shuffle.

View File

@@ -5,7 +5,7 @@ PT:1/3
K:Flying K:Flying
K:Vigilance K:Vigilance
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +1/+1 until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1 SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 1 | NumDef$ 1
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Flying, vigilance\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Erratic Apparition gets +1/+1 until end of turn. Oracle:Flying, vigilance\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, Erratic Apparition gets +1/+1 until end of turn.

View File

@@ -0,0 +1,9 @@
Name:Fear My Authority
ManaCost:no cost
Types:Ongoing Scheme
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.YouCtrl | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Fear | Description$ Creatures you control get +2/+2 and have fear.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Command | Execute$ DBAbandonCheck | TriggerDescription$ At the beginning of your upkeep, abandon this scheme unless you discard a card or pay 3 life.
SVar:DBAbandonCheck:DB$ GenericChoice | Choices$ DBPayLife,DBDiscard
SVar:DBPayLife:DB$ Abandon | UnlessCost$ PayLife<3> | UnlessPayer$ You | SpellDescription$ Pay 3 life or abandon this scheme
SVar:DBDiscard:DB$ Abandon | UnlessCost$ Discard<1/Card> | UnlessPayer$ You | SpellDescription$ Discard a card or abandon this scheme
Oracle:(An ongoing scheme remains face up until it's abandoned.)\nCreatures you control get +2/+2 and have fear. (They can't be blocked except by artifact creatures and/or black creatures.)\nAt the beginning of your upkeep, abandon this scheme unless you discard a card or pay 3 life.

View File

@@ -6,6 +6,6 @@ K:Flying
K:Lifelink K:Lifelink
K:CARDNAME can't block. K:CARDNAME can't block.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return CARDNAME from your graveyard to your hand. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return CARDNAME from your graveyard to your hand.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return CARDNAME from your graveyard to your hand. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | OptionalDecider$ You | TriggerZones$ Graveyard | Execute$ TrigChange | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return CARDNAME from your graveyard to your hand.
SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand
Oracle:Flying, lifelink\nFear of Infinity can't block.\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return Fear of Infinity from your graveyard to your hand. Oracle:Flying, lifelink\nFear of Infinity can't block.\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, you may return Fear of Infinity from your graveyard to your hand.

View File

@@ -3,7 +3,7 @@ ManaCost:W U
Types:Creature Human Scout Types:Creature Human Scout
PT:2/2 PT:2/2
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 1/1 red Gremlin creature token. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigToken | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 1/1 red Gremlin creature token.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigToken | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 1/1 red Gremlin creature token. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigToken | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, create a 1/1 red Gremlin creature token.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_gremlin | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_gremlin | TokenOwner$ You
DeckHas:Ability$Token DeckHas:Ability$Token
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment

View File

@@ -0,0 +1,6 @@
Name:I Am Never Alone
ManaCost:no cost
Types:Scheme
T:Mode$ SetInMotion | ValidCard$ Card.Self | Execute$ DBCopyCommander | TriggerZones$ Command | TriggerDescription$ When you set this scheme in motion, create a token that's a copy of your commander, except it's not legendary.
SVar:DBCopyCommander:DB$ CopyPermanent | Choices$ Card.IsCommander+YouOwn | Defined$ ValidAll Card.IsCommander+YouOwn | ChoiceTitle$ Choose a commander you own | NonLegendary$ True
Oracle:When you set this scheme in motion, create a token that's a copy of your commander, except it's not legendary.\n"This is but a pale shadow of my true form. Cower before it, and despair."

View File

@@ -3,7 +3,7 @@ ManaCost:3 R
Types:Creature Spirit Types:Creature Spirit
PT:2/3 PT:2/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 until end of turn. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 until end of turn.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 until end of turn. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPump | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME gets +2/+0 until end of turn.
SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2 SVar:TrigPump:DB$ Pump | Defined$ Self | NumAtt$ 2
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME dies, it deals damage equal to its power to any target. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDamage | TriggerDescription$ When CARDNAME dies, it deals damage equal to its power to any target.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Any | NumDmg$ X

View File

@@ -3,7 +3,7 @@ ManaCost:W
Types:Creature Human Scout Types:Creature Human Scout
PT:1/1 PT:1/1
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a +1/+1 counter on target creature.
SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1
DeckHas:Ability$Counters DeckHas:Ability$Counters
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment

View File

@@ -0,0 +1,7 @@
Name:Rampaging Soulrager
ManaCost:2 R
Types:Creature Spirit
PT:1/4
S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 3 | CheckSVar$ X | SVarCompare$ GE2 | Description$ CARDNAME gets +3/+0 as long as there are two or more unlocked doors among Rooms you control.
SVar:X:Count$UnlockedDoors Card.Room+YouCtrl
Oracle:Rampaging Soulrager gets +3/+0 as long as there are two or more unlocked doors among Rooms you control.

View File

@@ -3,7 +3,7 @@ ManaCost:U
Types:Creature Crab Skeleton Types:Creature Crab Skeleton
PT:0/3 PT:0/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.) T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.)
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigMill | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.) T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigMill | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.)
SVar:TrigMill:DB$ Mill | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Select target player SVar:TrigMill:DB$ Mill | NumCards$ 2 | ValidTgts$ Player | TgtPrompt$ Select target player
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.) Oracle:Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, target player mills two cards. (They put the top two cards of their library into their graveyard.)

View File

@@ -4,7 +4,7 @@ Types:Creature Insect Skeleton
PT:1/4 PT:1/4
K:Flying K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.)
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.). T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigSurveil | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.).
SVar:TrigSurveil:DB$ Surveil | Amount$ 1 SVar:TrigSurveil:DB$ Surveil | Amount$ 1
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment
Oracle:Flying\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.) Oracle:Flying\nEerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 1. (Look at the top card of your library. You may put it into your graveyard.)

View File

@@ -4,7 +4,7 @@ Types:Creature Human Wizard
PT:3/3 PT:3/3
K:Defender K:Defender
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME can attack this turn as though it didn't have defender. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigEffect | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME can attack this turn as though it didn't have defender.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigEffect | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME can attack this turn as though it didn't have defender. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigEffect | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, CARDNAME can attack this turn as though it didn't have defender.
SVar:TrigEffect:DB$ Effect | StaticAbilities$ CanAttack | ForgetOnMoved$ Battlefield SVar:TrigEffect:DB$ Effect | StaticAbilities$ CanAttack | ForgetOnMoved$ Battlefield
SVar:CanAttack:Mode$ CanAttackDefender | ValidCard$ Card.EffectSource | Description$ EFFECTSOURCE can attack this turn as though it didn't have defender. SVar:CanAttack:Mode$ CanAttackDefender | ValidCard$ Card.EffectSource | Description$ EFFECTSOURCE can attack this turn as though it didn't have defender.
DeckNeeds:Type$Enchantment DeckNeeds:Type$Enchantment

View File

@@ -4,7 +4,7 @@ Types:Creature Human Wizard
PT:3/2 PT:3/2
K:Vigilance K:Vigilance
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on CARDNAME. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on CARDNAME.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPutCounter | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on CARDNAME. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigPutCounter | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, put a possession counter on CARDNAME.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ POSSESSION | CounterNum$ 1 SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ POSSESSION | CounterNum$ 1
T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create an X/X blue Spirit creature token with flying, where X is the number of counters on CARDNAME. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME dies, create an X/X blue Spirit creature token with flying, where X is the number of counters on CARDNAME.
SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_x_x_spirit_flying | TokenPower$ X | TokenToughness$ X | TokenOwner$ You SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ u_x_x_spirit_flying | TokenPower$ X | TokenToughness$ X | TokenOwner$ You

View File

@@ -3,7 +3,7 @@ ManaCost:1 W B
Types:Legendary Creature Human Warlock Types:Legendary Creature Human Warlock
PT:3/3 PT:3/3
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control. T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Enchantment.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control.
T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigSurveil | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control. T:Mode$ FullyUnlock | ValidCard$ Card.Room | ValidPlayer$ You | Secondary$ True | Execute$ TrigSurveil | TriggerZones$ Battlefield | TriggerDescription$ Eerie — Whenever an enchantment you control enters and whenever you fully unlock a Room, surveil 2 if this is the first time this ability has resolved this turn. If it's the second time, each opponent discards a card. If it's the third time, put a creature card from a graveyard onto the battlefield under your control.
SVar:TrigSurveil:DB$ Surveil | Amount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBDiscard SVar:TrigSurveil:DB$ Surveil | Amount$ 2 | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ1 | SubAbility$ DBDiscard
SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | Mode$ TgtChoose | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ2 | SubAbility$ DBChangeZone SVar:DBDiscard:DB$ Discard | Defined$ Player.Opponent | Mode$ TgtChoose | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ2 | SubAbility$ DBChangeZone
SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | Mandatory$ True | GainControl$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ3 | SelectPrompt$ Select a creature card to return to the battlefield | Hidden$ True | SubAbility$ DBLog SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ChangeType$ Creature | ChangeNum$ 1 | Mandatory$ True | GainControl$ True | ConditionCheckSVar$ X | ConditionSVarCompare$ EQ3 | SelectPrompt$ Select a creature card to return to the battlefield | Hidden$ True | SubAbility$ DBLog

View File

@@ -3,7 +3,7 @@ ManaCost:1 G U
Types:Legendary Creature Human Wizard Types:Legendary Creature Human Wizard
PT:1/1 PT:1/1
T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigToken | CheckSVar$ X | TriggerDescription$ At the beginning of your end step, if a land entered the battlefield under your control this turn and you control a prime number of lands, create Primo, the Indivisible, a legendary 0/0 green and blue Fractal creature token, then put that many +1/+1 counters on it. (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, and 31 are prime numbers.) T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigToken | CheckSVar$ X | TriggerDescription$ At the beginning of your end step, if a land entered the battlefield under your control this turn and you control a prime number of lands, create Primo, the Indivisible, a legendary 0/0 green and blue Fractal creature token, then put that many +1/+1 counters on it. (2, 3, 5, 7, 11, 13, 17, 19, 23, 29, and 31 are prime numbers.)
SVar:TrigToken:DB$ Token | TokenScript$ primo_the_invisible | RememberTokens$ True | SubAbility$ DBCounters SVar:TrigToken:DB$ Token | TokenScript$ primo_the_indivisible | RememberTokens$ True | SubAbility$ DBCounters
SVar:DBCounters:DB$ PutCounter | Defined$ Remembered | CounterNum$ Y | CounterType$ P1P1 | SubAbility$ DBCleanup SVar:DBCounters:DB$ PutCounter | Defined$ Remembered | CounterNum$ Y | CounterType$ P1P1 | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$IsPrime Y.Z.0 SVar:X:Count$IsPrime Y.Z.0

View File

@@ -0,0 +1,9 @@
[metadata]
Code=YDSK
Date=2024-10-15
Name=Alchemy: Duskmourn
Type=Online
ScryfallCode=YDSK
[cards]
0 R Solitary Study // Endless Corridor @Leon Tukker

View File

@@ -796,6 +796,8 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi
827 R Norin the Wary @Jarel Threat 827 R Norin the Wary @Jarel Threat
827b R Norin the Wary @Jarel Threat 827b R Norin the Wary @Jarel Threat
828 R Keen Duelist @Thanh Tuấn 828 R Keen Duelist @Thanh Tuấn
871 R Soul-Guide Lantern @
872 R Yargle and Multani @Warren Mahy
873 R Dark Deal @Tyler Jacobson 873 R Dark Deal @Tyler Jacobson
874 R Archivist of Oghma @Cory Trego-Erdner 874 R Archivist of Oghma @Cory Trego-Erdner
875 M Battle Angels of Tyr @Raymond Swanland 875 M Battle Angels of Tyr @Raymond Swanland
@@ -803,6 +805,7 @@ F798 M Discord, Lord of Disharmony @Narendra Bintara Adi
877 R Druid of Purification @Alexander Mokhov 877 R Druid of Purification @Alexander Mokhov
878 R Prosperous Innkeeper @Tyler Jacobson 878 R Prosperous Innkeeper @Tyler Jacobson
879 M Minsc & Boo, Timeless Heroes @Justin Gerard 879 M Minsc & Boo, Timeless Heroes @Justin Gerard
880 R Stuffy Doll @Robin Olausson
900 M The Scarab God @Barely Human 900 M The Scarab God @Barely Human
901 R Lightning Bolt @Christopher Rush 901 R Lightning Bolt @Christopher Rush
903 M The Locust God @See Machine 903 M The Locust God @See Machine

View File

@@ -3435,3 +3435,5 @@ lblShowAll=Alle Anzeigen
lblHideCollection=Sammlung Ausblenden lblHideCollection=Sammlung Ausblenden
lblShowCollection=Sammlung Anzeigen lblShowCollection=Sammlung Anzeigen
lblCracked=Geknackt! lblCracked=Geknackt!
lblTake=Nehmen
lblRefund=Erstattung

View File

@@ -3168,3 +3168,5 @@ lblShowAll=Show All
lblHideCollection=Hide Collection lblHideCollection=Hide Collection
lblShowCollection=Show Collection lblShowCollection=Show Collection
lblCracked=Cracked! lblCracked=Cracked!
lblTake=Take
lblRefund=Refund

View File

@@ -3449,3 +3449,5 @@ lblShowAll=Mostrar Todo
lblHideCollection=Ocultar Colección lblHideCollection=Ocultar Colección
lblShowCollection=Mostrar Colección lblShowCollection=Mostrar Colección
lblCracked=¡Agrietado! lblCracked=¡Agrietado!
lblTake=Llevar
lblRefund=Reembolso

View File

@@ -3443,3 +3443,5 @@ lblShowAll=Afficher Tout
lblHideCollection=Masquer la Collection lblHideCollection=Masquer la Collection
lblShowCollection=Afficher la Collection lblShowCollection=Afficher la Collection
lblCracked=Fissuré! lblCracked=Fissuré!
lblTake=Prendre
lblRefund=Remboursement

View File

@@ -3441,3 +3441,5 @@ lblShowAll=Mostra Tutto
lblHideCollection=Nascondi Collezione lblHideCollection=Nascondi Collezione
lblShowCollection=Mostra Collezione lblShowCollection=Mostra Collezione
lblCracked=Incrinato! lblCracked=Incrinato!
lblTake=Prendere
lblRefund=Rimborso

View File

@@ -3437,3 +3437,5 @@ lblShowAll=すべて表示
lblHideCollection=コレクションを非表示にする lblHideCollection=コレクションを非表示にする
lblShowCollection=ショーコレクション lblShowCollection=ショーコレクション
lblCracked=ひび割れた! lblCracked=ひび割れた!
lblTake=取る
lblRefund=返金

View File

@@ -3527,3 +3527,5 @@ lblShowAll=Mostrar Tudo
lblHideCollection=Ocultar Coleção lblHideCollection=Ocultar Coleção
lblShowCollection=Mostrar Coleção lblShowCollection=Mostrar Coleção
lblCracked=Rachado! lblCracked=Rachado!
lblTake=Pegar
lblRefund=Reembolso

View File

@@ -3428,3 +3428,5 @@ lblShowAll=显示全部
lblHideCollection=隐藏收藏 lblHideCollection=隐藏收藏
lblShowCollection=展会系列 lblShowCollection=展会系列
lblCracked=破裂了! lblCracked=破裂了!
lblTake=
lblRefund=退款

View File

@@ -1,4 +1,4 @@
Name:Primo, the Invisible Name:Primo, the Indivisible
ManaCost:no cost ManaCost:no cost
Colors:green, blue Colors:green, blue
Types:Legendary Creature Fractal Types:Legendary Creature Fractal