Merge remote-tracking branch 'upstream/master'

This commit is contained in:
CCTV-1
2020-04-02 21:32:41 +08:00
56 changed files with 258 additions and 68 deletions

View File

@@ -54,11 +54,11 @@ public class StaticData {
private static StaticData lastInstance = null;
public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder) {
this(cardReader, null, editionFolder, blockDataFolder);
public StaticData(CardStorageReader cardReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards) {
this(cardReader, null, editionFolder, blockDataFolder, enableUnknownCards);
}
public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, String editionFolder, String blockDataFolder) {
public StaticData(CardStorageReader cardReader, CardStorageReader tokenReader, String editionFolder, String blockDataFolder, boolean enableUnknownCards) {
this.cardReader = cardReader;
this.tokenReader = tokenReader;
this.editions = new CardEdition.Collection(new CardEdition.Reader(new File(editionFolder)));
@@ -84,8 +84,8 @@ public class StaticData {
variantCards = new CardDb(variantsCards, editions);
//must initialize after establish field values for the sake of card image logic
commonCards.initialize(false, false);
variantCards.initialize(false, false);
commonCards.initialize(false, false, enableUnknownCards);
variantCards.initialize(false, false, enableUnknownCards);
}
{

View File

@@ -165,7 +165,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
reIndex();
}
public void initialize(boolean logMissingPerEdition, boolean logMissingSummary) {
public void initialize(boolean logMissingPerEdition, boolean logMissingSummary, boolean enableUnknownCards) {
Set<String> allMissingCards = new LinkedHashSet<>();
List<String> missingCards = new ArrayList<>();
CardEdition upcomingSet = null;
@@ -218,7 +218,7 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
if (!contains(cr.getName())) {
if (upcomingSet != null) {
addCard(new PaperCard(cr, upcomingSet.getCode(), CardRarity.Unknown, 1));
} else {
} else if(enableUnknownCards) {
System.err.println("The card " + cr.getName() + " was not assigned to any set. Adding it to UNKNOWN set... to fix see res/editions/ folder. ");
addCard(new PaperCard(cr, CardEdition.UNKNOWN.getCode(), CardRarity.Special, 1));
}

View File

@@ -47,7 +47,7 @@ import java.util.Map.Entry;
public class GameFormat implements Comparable<GameFormat> {
private final String name;
public enum FormatType {Sanctioned, Casual, Historic, Digital, Custom}
public enum FormatSubType {Block, Standard, Extended, Pioneer, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Custom}
public enum FormatSubType {Block, Standard, Extended, Pioneer, Modern, Legacy, Vintage, Commander, Planechase, Videogame, MTGO, Arena, Custom}
// contains allowed sets, when empty allows all sets
private FormatType formatType;

View File

@@ -28,9 +28,9 @@ public class CountersNoteEffect extends SpellAbilityEffect {
GameEntityCounterTable table = new GameEntityCounterTable();
for (Card c : getDefinedCardsOrTargeted(sa)) {
if (mode.equals(MODE_STORE)) {
noteCounters(c, source);
noteCounters(c, c);
} else if (mode.equals(MODE_LOAD)) {
loadCounters(c, source, p, table);
loadCounters(c, c, p, table);
}
}
table.triggerCountersPutAll(game);

View File

@@ -78,7 +78,9 @@ public class CountersPutEffect extends SpellAbilityEffect {
final List<Card> targetCards = SpellAbilityEffect.getTargetCards(spellAbility);
for(int i = 0; i < targetCards.size(); i++) {
Card targetCard = targetCards.get(i);
stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)");
stringBuilder.append(targetCard);
if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) // fix null counter stack description
stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" counter)");
if(i == targetCards.size() - 2) {
stringBuilder.append(" and ");
@@ -104,7 +106,6 @@ public class CountersPutEffect extends SpellAbilityEffect {
}
}
stringBuilder.append(".");
return stringBuilder.toString();
}

View File

@@ -30,7 +30,12 @@ public class DamageDealEffect extends DamageBaseEffect {
// when damageStackDescription is called, just build exactly what is happening
final StringBuilder stringBuilder = new StringBuilder();
final String damage = spellAbility.getParam("NumDmg");
final int dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility);
int dmg;
try { // try-catch to fix Volcano Hellion Crash
dmg = AbilityUtils.calculateAmount(spellAbility.getHostCard(), damage, spellAbility);
} catch (NullPointerException e) {
dmg = 0;
}
List<GameObject> targets = SpellAbilityEffect.getTargets(spellAbility);
if (targets.isEmpty()) {
@@ -53,7 +58,8 @@ public class DamageDealEffect extends DamageBaseEffect {
stringBuilder.append("divided evenly (rounded down) to\n");
} else if (spellAbility.hasParam("DividedAsYouChoose")) {
stringBuilder.append("divided to\n");
}
} else
stringBuilder.append("to ");
final List<Card> targetCards = SpellAbilityEffect.getTargetCards(spellAbility);
final List<Player> players = SpellAbilityEffect.getTargetPlayers(spellAbility);
@@ -63,7 +69,9 @@ public class DamageDealEffect extends DamageBaseEffect {
// target cards
for (int i = 0; i < targetCards.size(); i++) {
Card targetCard = targetCards.get(i);
stringBuilder.append(targetCard).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)");
stringBuilder.append(targetCard);
if (spellAbility.getTargetRestrictions().getDividedMap().get(targetCard) != null) //fix null damage stack description
stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetCard)).append(" damage)");
if (i == targetCount - 2) {
stringBuilder.append(" and ");
@@ -74,9 +82,10 @@ public class DamageDealEffect extends DamageBaseEffect {
// target players
for (int i = 0; i < players.size(); i++) {
Player targetPlayer = players.get(i);
stringBuilder.append(targetPlayer).append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)");
stringBuilder.append(targetPlayer);
if (spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer) != null) //fix null damage stack description
stringBuilder.append(" (").append(spellAbility.getTargetRestrictions().getDividedMap().get(targetPlayer)).append(" damage)");
if (i == players.size() - 2) {
stringBuilder.append(" and ");

View File

@@ -127,7 +127,7 @@ public enum Keyword {
SHROUD("Shroud", SimpleKeyword.class, true, "This can't be the target of spells or abilities."),
SKULK("Skulk", SimpleKeyword.class, true, "This creature can't be blocked by creatures with greater power."),
SCAVENGE("Scavenge", KeywordWithCost.class, false, "%s, Exile this card from your graveyard: Put a number of +1/+1 counters equal to this card's power on target creature. Scavenge only as a sorcery."),
SOULBOND("Souldbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them"),
SOULBOND("Soulbond", SimpleKeyword.class, true, "You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them."),
SOULSHIFT("Soulshift", KeywordWithAmount.class, false, "When this creature dies, you may return target Spirit card with converted mana cost %d or less from your graveyard to your hand."),
SPECTACLE("Spectacle", KeywordWithCost.class, false, "You may cast this spell for its spectacle cost rather than its mana cost if an opponent lost life this turn."),
SPLICE("Splice", KeywordWithCostAndType.class, false, "As you cast an %2$s spell, you may reveal this card from your hand and pay its splice cost. If you do, add this card's effects to that spell."),

View File

@@ -2525,6 +2525,10 @@ public class Player extends GameEntity implements Comparable<Player> {
}
public boolean isSkippingCombat() {
if (hasLost()) {
return true;
}
if (hasKeyword("Skip your next combat phase.")) {
return true;
}

View File

@@ -6,7 +6,7 @@
<packaging.type>jar</packaging.type>
<build.min.memory>-Xms1024m</build.min.memory>
<build.max.memory>-Xmx1536m</build.max.memory>
<alpha-version>1.6.32.001</alpha-version>
<alpha-version>1.6.33.001</alpha-version>
<sign.keystore>keystore</sign.keystore>
<sign.alias>alias</sign.alias>
<sign.storepass>storepass</sign.storepass>

View File

@@ -114,6 +114,7 @@ public enum CSubmenuPreferences implements ICDoc {
lstControls.add(Pair.of(view.getCbRemoveArtifacts(), FPref.DECKGEN_ARTIFACTS));
lstControls.add(Pair.of(view.getCbSingletons(), FPref.DECKGEN_SINGLETONS));
lstControls.add(Pair.of(view.getCbEnableAICheats(), FPref.UI_ENABLE_AI_CHEATS));
lstControls.add(Pair.of(view.getCbEnableUnknownCards(), FPref.UI_LOAD_UNKNOWN_CARDS));
lstControls.add(Pair.of(view.getCbImageFetcher(), FPref.UI_ENABLE_ONLINE_IMAGE_FETCHER));
lstControls.add(Pair.of(view.getCbDisplayFoil(), FPref.UI_OVERLAY_FOIL_EFFECT));
lstControls.add(Pair.of(view.getCbRandomFoil(), FPref.UI_RANDOM_FOIL));

View File

@@ -107,6 +107,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final JCheckBox cbShowStormCount = new OptionsCheckBox(localizer.getMessage("cbShowStormCount"));
private final JCheckBox cbRemindOnPriority = new OptionsCheckBox(localizer.getMessage("cbRemindOnPriority"));
private final JCheckBox cbUseSentry = new OptionsCheckBox(localizer.getMessage("cbUseSentry"));
private final JCheckBox cbEnableUnknownCards = new OptionsCheckBox("Enable Unknown Cards");
private final Map<FPref, KeyboardShortcutField> shortcutFields = new HashMap<>();
@@ -287,6 +288,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
pnlPrefs.add(cbLoadHistoricFormats, titleConstraints);
pnlPrefs.add(new NoteLabel(localizer.getMessage("nlLoadHistoricFormats")), descriptionConstraints);
pnlPrefs.add(cbEnableUnknownCards, titleConstraints);
pnlPrefs.add(new NoteLabel("Enable Unknown Cards to be loaded to Unknown Set. (Requires restart)"), descriptionConstraints);
// Graphic Options
pnlPrefs.add(new SectionLabel(localizer.getMessage("GraphicOptions")), sectionConstraints + ", gaptop 2%");
@@ -580,6 +584,11 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
return cbEnableAICheats;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbEnableUnknownCards() {
return cbEnableUnknownCards;
}
/** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbImageFetcher() {
return cbImageFetcher;

View File

@@ -29,7 +29,7 @@ public class CardDatabaseHelper {
private static void initialize() {
final CardStorageReader reader = new CardStorageReader(ForgeConstants.CARD_DATA_DIR, null, FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY));
staticData = new StaticData(reader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR);
staticData = new StaticData(reader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS));
}
private static boolean hasBeenInitialized() {

View File

@@ -6,7 +6,7 @@
<packaging.type>jar</packaging.type>
<build.min.memory>-Xms128m</build.min.memory>
<build.max.memory>-Xmx2048m</build.max.memory>
<alpha-version>1.6.32.001</alpha-version>
<alpha-version>1.6.33.001</alpha-version>
</properties>
<parent>

View File

@@ -42,7 +42,7 @@ import java.util.List;
import java.util.Stack;
public class Forge implements ApplicationListener {
public static final String CURRENT_VERSION = "1.6.32.001";
public static final String CURRENT_VERSION = "1.6.33.001";
private static final ApplicationListener app = new Forge();
private static Clipboard clipboard;

View File

@@ -386,6 +386,7 @@ public class VStack extends FDropDown {
if (index == -1) {
newtext = TextUtil.fastReplace(TextUtil.fastReplace(text.trim(),"--","-"),"- -","-");
newtext = TextUtil.fastReplace(newtext, "- - ", "- ");
textRenderer.drawText(g, name + " " + (name.length() > 1 ? cId : "") + "\n" + (newtext.length() > 1 ? newtext : ""),
FONT, foreColor, x, y, w, h, y, h, true, Align.left, true);
@@ -399,6 +400,7 @@ public class VStack extends FDropDown {
else {
newtext = TextUtil.fastReplace(TextUtil.fastReplace(newtext,name+" -","-"), "\n ", "\n");
newtext = "\n"+ TextUtil.fastReplace(newtext.trim(),"--","-");
newtext = TextUtil.fastReplace(newtext, "- - ", "- ");
textRenderer.drawText(g, name+" "+cId+newtext, FONT, foreColor, x, y, w, h, y, h, true, Align.left, true);
}
}

View File

@@ -331,6 +331,10 @@ public class SettingsPage extends TabPage<SettingsScreen> {
Forge.showFPS = FModel.getPreferences().getPrefBoolean(FPref.UI_SHOW_FPS);
}
},4);
lstSettings.addItem(new BooleanSetting(FPref.UI_LOAD_UNKNOWN_CARDS,
"Enable Unknown Cards",
"Enable Unknown Cards to be loaded to Unknown Set. (Requires restart)"),
4);
lstSettings.addItem(new CustomSelectSetting(FPref.UI_CARD_COUNTER_DISPLAY_TYPE,
localizer.getMessage("cbpCounterDisplayType"),
localizer.getMessage("nlCounterDisplayType"),

View File

@@ -1020,11 +1020,11 @@ Wasteland|EXP
[CN2 Draft Matters]
Adriana's Valor
#Assemble the Rank and Vile
Assemble the Rank and Vile
Echoing Boon
#Emissary's Ploy
Hired Heist
#Hold the Permiter
Hold the Perimeter
Hymn of the Wilds
Incendiary Dissent
Natural Unity
@@ -3414,7 +3414,7 @@ Eldrazi Monument
Eldritch Evolution
Elesh Norn, Grand Cenobite
Evra, Halcyon Witness
#Expropriate
Expropriate
Fblthp, the Lost
Felidar Sovereign
Gideon Jura
@@ -3617,11 +3617,11 @@ Stalking Stones+|FMB1
[CN2 Not In Normal Slots]
Adriana's Valor
#Assemble the Rank and Vile
Assemble the Rank and Vile
Echoing Boon
#Emissary's Ploy
Hired Heist
#Hold the Permiter
Hold the Perimeter
Hymn of the Wilds
Incendiary Dissent
Natural Unity

View File

@@ -6,5 +6,5 @@ K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, CARDNAME deals 1 damage to any target. If that land was a mountain, CARDNAME deals 2 damage to that permanent or player instead.
SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | TgtPrompt$ Select any target | NumDmg$ X | References$ X
SVar:X:TriggeredCard$Valid Mountain/Plus.1
SVar:Picture:http://www.wizards.com/global/images/magic/general/akoum_hellkite.jpg
SVar:BuffedBy:Land
Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, Akoum Hellkite deals 1 damage to any target. If that land is a Mountain, Akoum Hellkite deals 2 damage to that permanent or player instead.

View File

@@ -1,7 +1,7 @@
Name:Aretopolis
ManaCost:no cost
Types:Plane Kephalai
T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | TriggerZones$ Command | Execute$ AcquireScrolls | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it.
T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | Execute$ AcquireScrolls | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ AcquireScrolls | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, put a scroll counter on CARDNAME, then you gain life equal to the number of scroll counters on it.
SVar:AcquireScrolls:DB$ PutCounter | Defined$ Self | CounterType$ SCROLL | CounterNum$ 1 | SubAbility$ ScrollsOfLife
SVar:ScrollsOfLife:DB$ GainLife | Defined$ You | LifeAmount$ NumScrolls | References$ NumScrolls

View File

@@ -1,7 +1,7 @@
Name:Chaotic Aether
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Aether | TriggerDescription$ When you encounter CARDNAME, each blank roll of the planar dice is a {CHAOS} roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Aether | TriggerDescription$ When you encounter CARDNAME, each blank roll of the planar dice is a {CHAOS} roll until a player planeswalks away from a plane. (Then planeswalk away from this phenomenon)
SVar:Aether:DB$ Effect | Name$ Chaotic Aether Effect | StaticAbilities$ STBlankIsChaos | Triggers$ TPWAway | SVars$ ExileSelf | SubAbility$ PWAway
SVar:PWAway:DB$ Planeswalk | Cost$ 0
SVar:STBlankIsChaos:Mode$ Continuous | EffectZone$ Command | GlobalRule$ Each blank roll of the planar dice is a {CHAOS} roll.

View File

@@ -3,11 +3,8 @@ ManaCost:5 W W
Types:Creature Angel
PT:4/4
K:Flying
T:Mode$ ChangesZone | TriggerZones$ Battlefield | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasSubtype Plains | Execute$ DBChoose | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead.
T:Mode$ ChangesZone | TriggerZones$ Battlefield | Secondary$ True | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasNoSubtype Plains | Execute$ TrigChangeHand | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield, you may return target nonland permanent card from your graveyard to your hand.
SVar:DBChoose:DB$ ChooseCard | Defined$ You | Choices$ Permanent.YouCtrl+nonLand | ChoiceZone$ Graveyard | SubAbility$ TrigChangeHand2
SVar:TrigChangeHand:DB$ChangeZone | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Permanent.YouCtrl+nonLand | Defined$ ChosenCard
SVar:TrigChangeHand2:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | DestinationAlternative$ Hand | AlternativeDestinationMessage$ Would you like to return this permanent to the battlefield (and not to the hand)? | Defined$ ChosenCard | ConditionCheckSVar$ NumTargets | ConditionSVarCompare$ GE1 | References$ NumTargets
SVar:NumTargets:Count$ValidGraveyard Permanent.YouCtrl+nonLand
SVar:Picture:http://www.wizards.com/global/images/magic/general/emeria_shepherd.jpg
T:Mode$ ChangesZone | TriggerZones$ Battlefield | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | Execute$ TrigChangeHand | OptionalDecider$ You | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead.
SVar:TrigChangeHand:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target nonland permanent | ValidTgts$ Permanent.YouCtrl+nonLand | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Plains | ConditionCompare$ EQ0 | SubAbility$ TrigChangeBattlefield
SVar:TrigChangeBattlefield:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | DestinationAlternative$ Hand | AlternativeDestinationMessage$ Would you like to return this permanent to the battlefield (and not to your hand)? | Defined$ Targeted | ConditionDefined$ TriggeredCard | ConditionPresent$ Card.Plains | ConditionCompare$ EQ1
SVar:BuffedBy:Land
Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, you may return target nonland permanent card from your graveyard to your hand. If that land is a Plains, you may return that nonland permanent card to the battlefield instead.

View File

@@ -3,10 +3,9 @@ ManaCost:3 U
Types:Creature Faerie Artificer
PT:2/2
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigImprint | TriggerDescription$Whenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with Faerie Artisans.
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.nonToken+OppCtrl | TriggerZones$ Battlefield | Execute$ TrigImprint | TriggerDescription$ Whenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with CARDNAME.
SVar:TrigImprint:DB$ Pump | ImprintCards$ Remembered | SubAbility$ DBCopy
SVar:DBCopy:DB$ CopyPermanent | Defined$ TriggeredCard | Controller$ You | AddTypes$ Artifact | RememberCopied$ True | SubAbility$ DBChangeZoneAll
SVar:DBChangeZoneAll:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsImprinted
DeckHas:Ability$Token
SVar:Picture:http://www.wizards.com/global/images/magic/general/faerie_artisans.jpg
Oracle:Flying\nWhenever a nontoken creature enters the battlefield under an opponent's control, create a token that's a copy of that creature except that it's an artifact in addition to its other types. Then exile all other tokens created with Faerie Artisans.

View File

@@ -1,7 +1,7 @@
Name:Furnace Layer
ManaCost:no cost
Types:Plane New Phyrexia
T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | TriggerZones$ Command | Execute$ FurnaceDiscard | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life.
T:Mode$ PlaneswalkedTo | ValidCard$ Plane.Self | Execute$ FurnaceDiscard | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FurnaceDiscard | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, select target player at random. That player discards a card. If that player discards a land card this way, they lose 3 life.
SVar:FurnaceDiscard:DB$ Discard | ValidTgts$ Player | TargetsAtRandom$ True | NumCards$ 1 | Mode$ TgtChoose | RememberDiscarded$ True | SubAbility$ DBLoseLife
SVar:DBLoseLife:DB$ LoseLife | Defined$ Targeted | LifeAmount$ 3 | ConditionDefined$ Remembered | ConditionPresent$ Land | ConditionCompare$ GE1 | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Grove of the Dreampods
ManaCost:no cost
Types:Plane Fabacin
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ DreampodsDig | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ DreampodsDig | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ DreampodsDig | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, reveal cards from the top of your library until you reveal a creature card. Put that card onto the battlefield and the rest on the bottom of your library in a random order.
SVar:DreampodsDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, return target creature card from your graveyard to the battlefield.

View File

@@ -3,9 +3,8 @@ ManaCost:4 B B
Types:Creature Vampire
PT:3/4
K:Flying
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasSubtype Swamp | TriggerZones$ Battlefield | Execute$ TrigPumpAll2 | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead.
T:Mode$ ChangesZone | Secondary$ True | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl+HasNoSubtype Swamp | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Landfall — Whenever a land enters the battlefield, other creatures you control get +1/+0 until end of turn.
SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ 1
SVar:TrigPumpAll2:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ 2
SVar:Picture:http://www.wizards.com/global/images/magic/general/guul_draz_overseer.jpg
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPumpAll | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead.
SVar:TrigPumpAll:DB$PumpAll | ValidCards$ Creature.Other+YouCtrl | NumAtt$ X | References$ X
SVar:X:TriggeredCard$Valid Swamp/Plus.1
SVar:BuffedBy:Land
Oracle:Flying\nLandfall — Whenever a land enters the battlefield under your control, other creatures you control get +1/+0 until end of turn. If that land is a Swamp, those creatures get +2/+0 until end of turn instead.

View File

@@ -0,0 +1,11 @@
Name:Hold the Perimeter
ManaCost:no cost
Types:Conspiracy
Text:(Start the game with this conspiracy face up in the command zone.)
T:Mode$ Phase | Phase$ Upkeep | CheckSVar$ X | SVarCompare$ EQ1 | References$ X | ValidPlayer$ You | Execute$ TrigToken1 | EffectZone$ Command | TriggerDescription$ At the beginning of your first upkeep, create a 1/2 white Soldier creature token with defender.
SVar:X:Count$YourTurns
SVar:TrigToken1:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_2_soldier_defender | TokenOwner$ You | LegacyImage$ w 1 2 soldier defender cn2
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ Player.Other+IsNotRemembered | Execute$ TrigToken2 | EffectZone$ Command | TriggerDescription$ At the beginning of each other players first upkeep, that player creates a 1/1 red Goblin creature token with “This creature cant block.”
SVar:TrigToken2:DB$ Token | TokenAmount$ 1 | TokenScript$ r_1_1_goblin_noblock | TokenOwner$ TriggeredPlayer | LegacyImage$ r 1 1 goblin noblock cn2 | SubAbility$ RememberPlayer
SVar:RememberPlayer:DB$ Pump | RememberObjects$ TriggeredPlayer
Oracle:(Start the game with this conspiracy face up in the command zone.)\nAt the beginning of your first upkeep, create a 1/2 white Soldier creature token with defender.\nAt the beginning of each other players first upkeep, that player creates a 1/1 red Goblin creature token with “This creature cant block.”

View File

@@ -1,7 +1,7 @@
Name:Interplanar Tunnel
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.)
SVar:TrigDig:DB$ Dig | DigNum$ 5 | ChangeNum$ 1 | SourceZone$ PlanarDeck | DestinationZone$ PlanarDeck | DestinationZone2$ PlanarDeck | LibraryPosition$ 0 | ChangeValid$ Plane | RestRandomOrder$ True | SubAbility$ Replaneswalk
SVar:Replaneswalk:DB$ Planeswalk | Cost$ 0
Oracle:When you encounter Interplanar Tunnel, reveal cards from the top of your planar deck until you reveal five plane cards. Put a plane card from among them on top of your planar deck, then put the rest of the revealed cards on the bottom in a random order. (Then planeswalk away from this phenomenon.)

View File

@@ -1,7 +1,7 @@
Name:Kilnspire District
ManaCost:no cost
Types:Plane Ravnica
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ PutCounter | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it.
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ PutCounter | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it.
T:Mode$ Phase | PreCombatMain$ True | ValidPlayer$ You | TriggerZones$ Command | Execute$ PutCounter | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your precombat main phase, put a charge counter on CARDNAME, then add {R} for each charge counter on it.
SVar:PutCounter:DB$PutCounter | Defined$ Self | CounterType$ CHARGE | CounterNum$ 1 | SubAbility$ DBMana
SVar:DBMana:DB$ Mana | Produced$ R | Amount$ Y | References$ Y

View File

@@ -1,7 +1,7 @@
Name:Morphic Tide
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigPut | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigPut | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.)
SVar:TrigPut:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBShuffle | SubAbility$ ChangePermanent
SVar:DBShuffle:DB$ ChangeZoneAll | ChangeType$ Permanent.RememberedPlayerOwn | Imprint$ True | Origin$ Battlefield | Destination$ Library | Shuffle$ True | SubAbility$ DBDig
SVar:DBDig:DB$ Dig | Defined$ Remembered | NoMove$ True | DigNum$ WarpX | References$ WarpX | RememberRevealed$ True | Reveal$ True | SubAbility$ DBCleanImprint

View File

@@ -1,7 +1,7 @@
Name:Mutual Epiphany
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Epiphany | TriggerDescription$ When you encounter CARDNAME, each player draws four cards. (Then planeswalk away from this phenomenon)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Epiphany | TriggerDescription$ When you encounter CARDNAME, each player draws four cards. (Then planeswalk away from this phenomenon)
SVar:Epiphany:DB$ Draw | Defined$ Player | NumCards$ 4 | SubAbility$ PWAway | SpellDescription$ Each player draws four cards.
SVar:PWAway:DB$ Planeswalk | Cost$ 0
SVar:Picture:http://www.wizards.com/global/images/magic/general/mutual_epiphany.jpg

View File

@@ -4,6 +4,5 @@ Types:Creature Illusion
PT:1/1
K:Flying
T:Mode$ ChangesZone | Origin$ Library | Destination$ Graveyard | ValidCard$ Card.Self | OptionalDecider$ You | Execute$ TrigChange | TriggerDescription$ When CARDNAME is put into your graveyard from your library, you may put it onto the battlefield.
SVar:TrigChange:DB$ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ Self
SVar:Picture:http://www.wizards.com/global/images/magic/general/narcomoeba.jpg
SVar:TrigChange:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Defined$ TriggeredCard
Oracle:Flying\nWhen Narcomoeba is put into your graveyard from your library, you may put it onto the battlefield.

View File

@@ -2,7 +2,7 @@ Name:Natural Unity
ManaCost:no cost
Types:Conspiracy
K:Hidden agenda
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.NamedCard+YouCtrl | EffectZone$ Battlefield | AddTrigger$ NUCombat | AddSVar$ NUCounter | Description$ Creatures you control with the chosen name have "At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature."
S:Mode$ Continuous | EffectZone$ Command | Affected$ Creature.NamedCard+YouCtrl | AffectedZone$ Battlefield | AddTrigger$ NUCombat | AddSVar$ NUCounter | Description$ Creatures you control with the chosen name have "At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature."
SVar:NUCombat:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | Execute$ NUCounter | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of combat on your turn, you may pay {G}. If you do, put a +1/+1 counter on this creature.
SVar:NUCounter:AB$ PutCounter | Cost$ G | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1
SVar:AgendaLogic:BestCreatureInComputerDeck

View File

@@ -2,7 +2,7 @@ Name:Nissa's Pilgrimage
ManaCost:2 G
Types:Sorcery
A:SP$ ChangeZone | Cost$ 2 G | Origin$ Library | Destination$ Library | ChangeType$ Land.Basic+Forest | ChangeNum$ X | References$ X,Y | RememberChanged$ True | SubAbility$ DBBattlefield | Shuffle$ False | StackDescription$ SpellDescription | SpellDescription$ Search your library for up to two basic Forest cards, reveal those cards, and put one onto the battlefield tapped and the rest into your hand. Then shuffle your library. Spell mastery — If there are two or more instant or sorcery cards in your graveyard, search your library for up to three basic Forest cards instead of two.
SVar:DBBattlefield:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | SubAbility$ DBHand | ChangeType$ Card.IsRemembered | ChangeNum$ 1 | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card to go to the battlefield | Shuffle$ False | StackDescription$ None
SVar:DBBattlefield:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | Tapped$ True | SubAbility$ DBHand | ChangeType$ Card.IsRemembered | ChangeNum$ 1 | ForgetChanged$ True | Mandatory$ True | NoLooking$ True | SelectPrompt$ Select a card to go to the battlefield | Shuffle$ False | StackDescription$ None
SVar:DBHand:DB$ ChangeZone | Origin$ Library | Destination$ Hand | Defined$ Remembered | NoLooking$ True | StackDescription$ None | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:X:Count$Compare Y GE2.3.2

View File

@@ -6,5 +6,5 @@ K:Trample
T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Land.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Landfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on CARDNAME. If that land is a Forest, put two +1/+1 counters on CARDNAME instead.
SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ X | References$ X
SVar:X:TriggeredCard$Valid Forest/Plus.1
SVar:Picture:http://www.wizards.com/global/images/magic/general/oran_rief_hydra.jpg
SVar:BuffedBy:Land
Oracle:Trample\nLandfall — Whenever a land enters the battlefield under your control, put a +1/+1 counter on Oran-Rief Hydra. If that land is a Forest, put two +1/+1 counters on Oran-Rief Hydra instead.

View File

@@ -1,7 +1,7 @@
Name:Panopticon
ManaCost:no cost
Types:Plane Mirrodin
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ When you planeswalk to CARDNAME, draw a card.
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ PanopticonDraw | TriggerDescription$ When you planeswalk to CARDNAME, draw a card.
T:Mode$ Phase | Phase$ Draw | ValidPlayer$ You | Execute$ PanopticonDraw | TriggerZones$ Command | TriggerDescription$ At the beginning of your draw step, draw an additional card.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ PanopticonDraw | TriggerDescription$ Whenever you roll {CHAOS}, draw a card.
SVar:PanopticonDraw:DB$ Draw | Defined$ You | NumCards$ 1

View File

@@ -1,7 +1,7 @@
Name:Planewide Disaster
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ Disaster | TriggerDescription$ When you encounter CARDNAME, destroy all creatures. (Then planeswalk away from this phenomenon)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ Disaster | TriggerDescription$ When you encounter CARDNAME, destroy all creatures. (Then planeswalk away from this phenomenon)
SVar:Disaster:DB$ DestroyAll | ValidCards$ Creature | SubAbility$ PWAway
SVar:PWAway:DB$ Planeswalk | Cost$ 0
SVar:Picture:http://www.wizards.com/global/images/magic/general/planewide_disaster.jpg

View File

@@ -0,0 +1,10 @@
Name:Pyramids
ManaCost:6
Types:Artifact
A:AB$ Charm | Cost$ 2 | Choices$ DBDestroy,DBProtect | Defined$ You
SVar:DBDestroy:DB$ Destroy | ValidTgts$ Aura.AttachedTo Land | TgtPrompt$ Select target Aura attached to a land | SpellDescription$ Destroy target Aura attached to a land.
SVar:DBProtect:DB$ Effect | ValidTgts$ Land | TgtPrompt$ Select target land | ReplacementEffects$ DBRemove | SVars$ ExileEffect,RemoveDamage | ForgetOnMoved$ Battlefield | RememberObjects$ Targeted | SpellDescription$ The next time target land would be destroyed this turn, remove all damage marked on it instead.
SVar:DBRemove:Event$ Destroy | ValidCard$ Land.IsRemembered | ReplaceWith$ RemoveDamage | Description$ The next time target land would be destroyed this turn, remove all damage marked on it instead.
SVar:RemoveDamage:DB$ DealDamage | Defined$ ReplacedCard | Remove$ All | SubAbility$ ExileEffect
SVar:ExileEffect:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile
Oracle:{2}: Choose one —\n• Destroy target Aura attached to a land.\n• The next time target land would be destroyed this turn, remove all damage marked on it instead.

View File

@@ -1,7 +1,7 @@
Name:Quicksilver Sea
ManaCost:no cost
Types:Plane Mirrodin
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ QuicksilverScry | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ QuicksilverScry | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ QuicksilverScry | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, scry 4. (Look at the top four cards of your library, then put any number of them on the bottom of your library and the rest on top in any order.)
SVar:QuicksilverScry:DB$ Scry | ScryNum$ 4
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, reveal the top card of your library. You may play it without paying its mana cost.

View File

@@ -1,7 +1,7 @@
Name:Reality Shaping
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigPutFromHand | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigPutFromHand | TriggerDescription$ When you encounter CARDNAME, starting with you, each player may put a permanent card from their hand onto the battlefield. (Then planeswalk away from this phenomenon.)
SVar:TrigPutFromHand:DB$ RepeatEach | StartingWithActivator$ True | RepeatPlayers$ Player | RepeatSubAbility$ DBChangeZone | SubAbility$ PWAway
SVar:DBChangeZone:DB$ ChangeZone | DefinedPlayer$ Player.IsRemembered | Choser$ Player.IsRemembered | ChangeType$ Permanent | ChangeNum$ 1 | Origin$ Hand | Destination$ Battlefield
SVar:PWAway:DB$ Planeswalk | Cost$ 0

View File

@@ -3,6 +3,6 @@ ManaCost:1 W W
Types:Creature Human Knight
PT:2/2
K:Soulbond
S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddKeyword$ Double Strike | Description$ As long as CARDNAME is paired with another creature, both creature have double strike.
S:Mode$ Continuous | Affected$ Creature.PairedWith,Creature.Self+Paired | AddKeyword$ Double Strike | Description$ As long as CARDNAME is paired with another creature, both creatures have double strike.
SVar:Picture:http://www.wizards.com/global/images/magic/general/silverblade_paladin.jpg
Oracle:Soulbond (You may pair this creature with another unpaired creature when either enters the battlefield. They remain paired for as long as you control both of them.)\nAs long as Silverblade Paladin is paired with another creature, both creatures have double strike.

View File

@@ -1,7 +1,7 @@
Name:Skybreen
ManaCost:no cost
Types:Plane Kaldheim
S:Mode$ Continuous | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed.
S:Mode$ Continuous | EffectZone$ Command | Affected$ Card.TopLibrary | AffectedZone$ Library | MayLookAt$ Player | Description$ Players play with the top card of their libraries revealed.
S:Mode$ CantBeCast | EffectZone$ Command | ValidCard$ Card.sharesCardTypeWith EachTopLibrary | Description$ Spells that share a card type with the top card of a library can't be cast.
T:Mode$ PlanarDice | Result$ Chaos | TriggerZones$ Command | Execute$ RolledChaos | TriggerDescription$ Whenever you roll {CHAOS}, target player loses life equal to the number of cards in their hand.
SVar:RolledChaos:DB$ LoseLife | ValidTgts$ Player | LifeAmount$ Y | References$ Y

View File

@@ -1,7 +1,7 @@
Name:Spatial Merging
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal two plane cards. Simultaneously planeswalk to both of them. Put all other cards revealed this way on the bottom of your planar deck in any order.
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When you encounter CARDNAME, reveal cards from the top of your planar deck until you reveal two plane cards. Simultaneously planeswalk to both of them. Put all other cards revealed this way on the bottom of your planar deck in any order.
SVar:TrigDig:DB$ DigUntil | Amount$ 2 | Valid$ Plane | DigZone$ PlanarDeck | RememberFound$ True | FoundDestination$ PlanarDeck | RevealedDestination$ PlanarDeck | RevealedLibraryPosition$ -1 | SubAbility$ DBPWTo
SVar:DBPWTo:DB$ Planeswalk | Defined$ Remembered | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True

View File

@@ -0,0 +1,18 @@
Name:Tawnos's Coffin
ManaCost:4
Types:Artifact
K:You may choose not to untap CARDNAME during your untap step.
A:AB$ Pump | Cost$ 3 T | ValidTgts$ Creature | ImprintCards$ Targeted | SubAbility$ RecordCounters | StackDescription$ SpellDescription | SpellDescription$ Exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. When CARDNAME leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owners control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owners control attached to that permanent.
SVar:RecordCounters:DB$ NoteCounters | Mode$ Store | Defined$ Imprinted | SubAbility$ DBRememberAura
SVar:DBRememberAura:DB$ PumpAll | ValidCards$ Aura.AttachedTo Creature.IsImprinted | RememberAllPumped$ True | StackDescription$ None | SubAbility$ DBEffect
SVar:DBEffect:DB$ Effect | Triggers$ LeavesPlay,Untap | SVars$ RestoreCounters,TrigReturn,TrigAuraReturn,ExileSelf | References$ LeavesPlay,Untap | ImprintCards$ ParentTarget | RememberObjects$ Remembered | SubAbility$ DBExile
SVar:DBExile:DB$ ChangeZoneAll | Origin$ Battlefield | Destination$ Exile | ChangeType$ Card.IsRemembered,Card.IsImprinted | SubAbility$ DBCleanup
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearImprinted$ True
SVar:LeavesPlay:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.EffectSource | Execute$ RestoreCounters | TriggerController$ TriggeredCardController | TriggerDescription$ When EFFECTSOURCE leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owners control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owners control attached to that permanent.
SVar:Untap:Mode$ Untaps | ValidCard$ Card.EffectSource | Execute$ RestoreCounters | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When EFFECTSOURCE leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owners control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owners control attached to that permanent.
SVar:RestoreCounters:DB$ NoteCounters | Mode$ Load | Defined$ Imprinted | SubAbility$ TrigReturn
SVar:TrigReturn:DB$ ChangeZone | Defined$ Imprinted | Origin$ Exile | Destination$ Battlefield | Tapped$ True | SubAbility$ TrigAuraReturn
SVar:TrigAuraReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | AttachedTo$ Valid Creature.IsImprinted | SubAbility$ ExileSelf
SVar:ExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self
AI:RemoveDeck:All
Oracle:You may choose not to untap Tawnoss Coffin during your untap step.\n{3},{T}: Exile target creature and all Auras attached to it. Note the number and kind of counters that were on that creature. When Tawnoss Coffin leaves the battlefield or becomes untapped, return that exiled card to the battlefield under its owners control tapped with the noted number and kind of counters on it. If you do, return the other exiled cards to the battlefield under their owners control attached to that permanent.

View File

@@ -1,7 +1,7 @@
Name:The Aether Flues
ManaCost:no cost
Types:Plane Iquatana
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ FluesSacrifice | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library.
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ FluesSacrifice | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library.
T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | Execute$ FluesSacrifice | TriggerZones$ Command | Secondary$ True | TriggerDescription$ When you planeswalk to CARDNAME or at the beginning of your upkeep, you may sacrifice a creature. If you do, reveal cards from the top of your library until you reveal a creature card, put that card onto the battlefield, then shuffle all other cards revealed this way into your library.
SVar:FluesSacrifice:DB$ Sacrifice | Optional$ True | SacValid$ Creature | Amount$ 1 | RememberSacrificed$ True | SubAbility$ FluesDig
SVar:FluesDig:DB$ DigUntil | Valid$ Creature | ValidDescription$ creature | FoundDestination$ Battlefield | RevealedDestination$ Library | Shuffle$ True | ConditionDefined$ Remembered | ConditionPresent$ Creature | ConditionCompare$ EQ1 | SubAbility$ DBCleanup

View File

@@ -1,7 +1,7 @@
Name:Time Distortion
ManaCost:no cost
Types:Phenomenon
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | TriggerZones$ Command | Execute$ TrigReverse | TriggerDescription$ When you encounter CARDNAME, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.)
T:Mode$ PlaneswalkedTo | ValidCard$ Card.Self | Execute$ TrigReverse | TriggerDescription$ When you encounter CARDNAME, reverse the game's turn order. (For example, if play had proceeded clockwise around the table, it now goes counterclockwise. Then planeswalk away from this phenomenon.)
SVar:TrigReverse:DB$ ReverseTurnOrder | SubAbility$ PWAway
SVar:PWAway:DB$ Planeswalk | Cost$ 0
SVar:Picture:http://www.wizards.com/global/images/magic/general/time_distortion.jpg

View File

@@ -0,0 +1,27 @@
[metadata]
Code=HA1
Date=2019-11-21
Name=Historic Anthology 1
Type=Other
[cards]
1 R Serra Ascendant
2 C Soul Warden
3 R Kinsbaile Cavalier
4 C Treasure Hunt
5 C Distant Melody
6 R Cryptbreaker
7 R Hypnotic Specter
8 R Phyrexian Arena
9 C Tendrils of Corruption
10 C Kiln Fiend
11 U Goblin Matron
12 R Hidetsugu's Second Rite
13 C Elvish Visionary
14 R Fauna Shaman
15 U Imperious Perfect
16 U Burning-Tree Emissary
17 R Captain Sisay
18 U Ornithopter
19 C Mind Stone
20 R Darksteel Reactor

View File

@@ -0,0 +1,32 @@
[metadata]
Code=HA2
Date=2020-03-12
Name=Historic Anthology 2
Type=Other
[cards]
1 U Nyx-Fleece Ram
2 R Ranger of Eos
3 R Sigil of the Empty Throne
4 R Thalia, Guardian of Thraben
5 U Merrow Reejerey
6 R Inexorable Tide
7 U Brain Maggot
8 R Pack Rat
9 U Virulent Plague
10 R Waste Not
11 M Dragonmaster Outcast
12 U Goblin Ruinblaster
13 C Ancestral Mask
14 R Terravore
15 R Knight of the Reliquary
16 R Maelstrom Pulse
17 R Meddling Mage
18 M Platinum Angel
19 C Barren Moor
20 C Bojuka Bog
21 C Forgotten Cave
22 U Ghost Quarter
23 C Lonely Sandbar
24 C Secluded Steppe
25 C Tranquil Thicket

View File

@@ -44,7 +44,7 @@ Type=Other
52 M Meren of Clan Nel Toth
53 M Narset, Enlightened Master
54 M Oona, Queen of the Fae
55 M Saskia, the Unyielding
55 M Saskia the Unyielding
68 M Heliod, God of the Sun
69 M Karametra, God of Harvests
70 M Iroas, God of Victory

View File

@@ -0,0 +1,12 @@
[metadata]
Code=SLU
Date=2020-05-29
Name=Secret Lair: Ultimate Edition
Type=Reprint
[cards]
1 R Marsh Flats
2 R Scalding Tarn
3 R Verdant Catacombs
4 R Arid Mesa
5 R Misty Rainforest

View File

@@ -0,0 +1,9 @@
[metadata]
Code=SS3
Date=2020-06-26
Name=Signature Spellbook: Chandra
Type=Reprint
[cards]
1 M Chandra, Torch of Defiance
4 M Past in Flames

View File

@@ -0,0 +1,8 @@
[format]
Name:Historic
Type:Digital
Subtype:Arena
Effective:2019-11-21
Order:142
Sets:XLN, RIX, DOM, M19, GRN, G18, RNA, WAR, M20, ELD, HA1, THB, HA2
Banned:Oko, Thief of Crowns; Once Upon a Time; Veil of Summer

View File

@@ -0,0 +1,16 @@
[metadata]
Name:Possibility Storm - Theros Beyond Death #08
URL:https://i2.wp.com/www.possibilitystorm.com/wp-content/uploads/2020/03/151.-THB8-scaled.jpg
Goal:Win
Turns:1
Difficulty:Uncommon
Description:Win this turn.
[state]
humanlife=20
ailife=23
turn=1
activeplayer=human
activephase=MAIN1
humanhand=Bone Splinters;Gray Merchant of Asphodel;Mogis's Favor;Kaya's Ghostform;Massacre Girl
humanbattlefield=Nightmare Shepherd;Nightmare Shepherd;Nyx Lotus;Swamp;Swamp;Swamp;Swamp;Swamp;Swamp
aibattlefield=Bishop of Wings;Angelic Guardian;Sunblade Angel

View File

@@ -0,0 +1,19 @@
[metadata]
Name:Possibility Storm - Theros Beyond Death #09
URL:https://i0.wp.com/www.possibilitystorm.com/wp-content/uploads/2020/03/152.-THB9-scaled.jpg
Goal:Win
Turns:1
Difficulty:Mythic
Description:Win this turn. Assume your opponent has no mana available and no cards in hand. Assume both players have over 30 cards left in their library, and that any drawn are irrelevant to the puzzle.
[state]
humanlife=2
ailife=94
turn=1
activeplayer=human
activephase=MAIN1
humanhand=Terror of Mount Velus;Awaken the Erstwhile;Dragon Mage;Corpse Knight;Fling
humanlibrary=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt
humanbattlefield=The Royal Scions|Counters:LOYALTY=8;Purphoros, Bronze-Blooded;Smothering Tithe;Mace of the Valiant;Bag of Holding;Bag of Holding;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Malice|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs;Temple of Triumph|NoETBTrigs
ailibrary=Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt;Opt
aibattlefield=Knight of Autumn;Vindictive Vampire;Ajani's Pridemate|Counters:P1P1=15;Ajani, Strength of the Pride|Counters:LOYALTY=2;Sorin, Vengeful Bloodlord|Counters:LOYALTY=2
humanprecast=Smothering Tithe:TrigToken;Smothering Tithe:TrigToken;Smothering Tithe:TrigToken;Smothering Tithe:TrigToken

View File

@@ -152,7 +152,7 @@ public final class FModel {
FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY));
final CardStorageReader tokenReader = new CardStorageReader(ForgeConstants.TOKEN_DATA_DIR, progressBarBridge,
FModel.getPreferences().getPrefBoolean(FPref.LOAD_CARD_SCRIPTS_LAZILY));
magicDb = new StaticData(reader, tokenReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR);
magicDb = new StaticData(reader, tokenReader, ForgeConstants.EDITIONS_DIR, ForgeConstants.BLOCK_DATA_DIR, FModel.getPreferences().getPrefBoolean(FPref.UI_LOAD_UNKNOWN_CARDS));
CardTranslation.preloadTranslation(preferences.getPref(FPref.UI_LANGUAGE), ForgeConstants.LANG_DIR);
//create profile dirs if they don't already exist

View File

@@ -139,6 +139,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
UI_ENABLE_PRELOAD_EXTENDED_ART("false"),
UI_ENABLE_BORDER_MASKING("false"),
UI_SHOW_FPS("false"),
UI_LOAD_UNKNOWN_CARDS("true"),
UI_ALLOW_ORDER_GRAVEYARD_WHEN_NEEDED ("Never"),
UI_DEFAULT_FONT_SIZE("12"),
UI_SELECT_FROM_CARD_DISPLAYS("true"),

View File

@@ -46,8 +46,11 @@ def initializeEditions():
metadata = True
continue
if line.startswith("#"):
continue
if line:
hasSetNumbers = line.split(" ", 1)[0].isdigit()
hasSetNumbers = line[0].isdigit()
card = line.split(" ", 2 if hasSetNumbers else 1)[-1].rstrip()
if card not in mtgDataCards: