diff --git a/forge-ai/src/main/java/forge/ai/ComputerUtil.java b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
index 91bf2bb9334..64307ba3754 100644
--- a/forge-ai/src/main/java/forge/ai/ComputerUtil.java
+++ b/forge-ai/src/main/java/forge/ai/ComputerUtil.java
@@ -1074,6 +1074,15 @@ public class ComputerUtil {
}
}
+ // cast Backup creatures in main 1 to pump attackers
+ if (cardState.hasKeyword(Keyword.BACKUP)) {
+ for (Card potentialAtkr: ai.getCreaturesInPlay()) {
+ if (ComputerUtilCard.doesCreatureAttackAI(ai, potentialAtkr)) {
+ return true;
+ }
+ }
+ }
+
// try not to cast Raid creatures in main 1 if an attack is likely
if ("Count$AttackersDeclared".equals(card.getSVar("RaidTest")) && !cardState.hasKeyword(Keyword.HASTE)) {
for (Card potentialAtkr: ai.getCreaturesInPlay()) {
diff --git a/forge-game/src/main/java/forge/game/CardTraitBase.java b/forge-game/src/main/java/forge/game/CardTraitBase.java
index 761710e9781..38864c7cfa3 100644
--- a/forge-game/src/main/java/forge/game/CardTraitBase.java
+++ b/forge-game/src/main/java/forge/game/CardTraitBase.java
@@ -144,11 +144,10 @@ public abstract class CardTraitBase extends GameObject implements IHasCardView,
public KeywordInterface getKeyword() {
return this.keyword;
}
-
public void setKeyword(final KeywordInterface kw) {
this.keyword = kw;
}
-
+
/**
*
* isSecondary.
diff --git a/forge-game/src/main/java/forge/game/ForgeScript.java b/forge-game/src/main/java/forge/game/ForgeScript.java
index c80b659dc4f..2ecb44a56e8 100644
--- a/forge-game/src/main/java/forge/game/ForgeScript.java
+++ b/forge-game/src/main/java/forge/game/ForgeScript.java
@@ -193,6 +193,8 @@ public class ForgeScript {
} else if (property.equals("hasTapCost")) {
Cost cost = sa.getPayCosts();
return cost != null && cost.hasTapCost();
+ } else if (property.equals("Backup")) {
+ return sa.isBackup();
} else if (property.equals("Blitz")) {
return sa.isBlitz();
} else if (property.equals("Buyback")) {
diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java
index 88c35aff18d..9afed2cad46 100644
--- a/forge-game/src/main/java/forge/game/GameAction.java
+++ b/forge-game/src/main/java/forge/game/GameAction.java
@@ -478,12 +478,17 @@ public class GameAction {
}
}
- // 400.7a Effects from static abilities that give a permanent spell on the stack an ability
- // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes.
- if (zoneFrom.is(ZoneType.Stack) && toBattlefield && c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) {
- KeywordInterface ki = c.getCastSA().getKeyword();
- ki.setHostCard(copied);
- copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true);
+ if (zoneFrom.is(ZoneType.Stack) && toBattlefield) {
+ // 400.7a Effects from static abilities that give a permanent spell on the stack an ability
+ // that allows it to be cast for an alternative cost continue to apply to the permanent that spell becomes.
+ if (c.getCastSA() != null && !c.getCastSA().isIntrinsic() && c.getCastSA().getKeyword() != null) {
+ KeywordInterface ki = c.getCastSA().getKeyword();
+ ki.setHostCard(copied);
+ copied.addChangedCardKeywordsInternal(ImmutableList.of(ki), null, false, copied.getTimestamp(), 0, true);
+ }
+
+ // 607.2q linked ability can find cards exiled as cost while it was a spell
+ copied.addExiledCards(c.getExiledCards());
}
}
@@ -580,12 +585,10 @@ public class GameAction {
// 400.7g try adding keyword back into card if it doesn't already have it
if (zoneTo.is(ZoneType.Stack) && cause != null && cause.isSpell() && !cause.isIntrinsic() && c.equals(cause.getHostCard())) {
- if (cause.getKeyword() != null) {
- if (!copied.getKeywords().contains(cause.getKeyword())) {
- copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false);
- // update Keyword Cache
- copied.updateKeywords();
- }
+ if (cause.getKeyword() != null && !copied.getKeywords().contains(cause.getKeyword())) {
+ copied.addChangedCardKeywordsInternal(ImmutableList.of(cause.getKeyword()), null, false, game.getNextTimestamp(), 0, false);
+ // update Keyword Cache
+ copied.updateKeywords();
}
}
diff --git a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
index 5fce377cdf4..e5c27f2041e 100644
--- a/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
+++ b/forge-game/src/main/java/forge/game/ability/AbilityUtils.java
@@ -568,7 +568,9 @@ public class AbilityUtils {
val = c == null ? 0 : xCount(c, calcX[1], ability);
} else if (calcX[0].startsWith("ExiledWith")) {
val = handlePaid(card.getExiledCards(), calcX[1], card, ability);
- }
+ } else if (calcX[0].startsWith("Convoked")) {
+ val = handlePaid(card.getConvoked(), calcX[1], card, ability);
+ }
else if (calcX[0].startsWith("Remembered")) {
// Add whole Remembered list to handlePaid
final CardCollection list = new CardCollection();
diff --git a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
index 354ed3b8835..dc80ac97a5c 100644
--- a/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
+++ b/forge-game/src/main/java/forge/game/ability/SpellAbilityEffect.java
@@ -911,8 +911,8 @@ public abstract class SpellAbilityEffect {
if (cause.isReplacementAbility() && exilingSource.isLKI()) {
exilingSource = exilingSource.getGame().getCardState(exilingSource);
}
- // only want this on permanents
- if (exilingSource.isImmutable() || exilingSource.isInPlay()) {
+ // avoid storing this on "inactive" cards
+ if (exilingSource.isImmutable() || exilingSource.isInPlay() || exilingSource.isInZone(ZoneType.Stack)) {
// make sure it gets updated
exilingSource.removeExiledCard(movedCard);
exilingSource.addExiledCard(movedCard);
diff --git a/forge-game/src/main/java/forge/game/card/Card.java b/forge-game/src/main/java/forge/game/card/Card.java
index d31a52ff2f6..8088c700d5b 100644
--- a/forge-game/src/main/java/forge/game/card/Card.java
+++ b/forge-game/src/main/java/forge/game/card/Card.java
@@ -2303,10 +2303,18 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
|| keyword.startsWith("Specialize") || keyword.equals("Ravenous")
|| keyword.equals("For Mirrodin")) {
// keyword parsing takes care of adding a proper description
- } else if(keyword.startsWith("Read ahead")) {
+ } else if (keyword.startsWith("Read ahead")) {
sb.append(Localizer.getInstance().getMessage("lblReadAhead")).append(" (").append(Localizer.getInstance().getMessage("lblReadAheadDesc"));
sb.append(" ").append(Localizer.getInstance().getMessage("lblSagaFooter")).append(" ").append(TextUtil.toRoman(getFinalChapterNr())).append(".");
sb.append(")").append("\r\n\r\n");
+ } else if (keyword.startsWith("Backup")) {
+ final String[] k = keyword.split(":");
+ sb.append(k[0]).append(" ").append(k[1]).append(" (");
+ String remStr = inst.getReminderText();
+ if (k[2].endsWith("s")) {
+ remStr = remStr.replace("ability", "abilities");
+ }
+ sb.append(remStr).append(")");
} else if (keyword.startsWith("MayEffectFromOpening")) {
final String[] k = keyword.split(":");
// need to get SpellDescription from Svar
@@ -2325,7 +2333,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars {
sbLong.append("\r\n");
}
- if (keyword.equals("Flash")) {
+ if (keyword.equals("Flash") || keyword.startsWith("Backup")) {
sb.append("\r\n\r\n");
i = 0;
} else {
diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
index de058f5f264..605577a85ab 100644
--- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
+++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java
@@ -839,6 +839,31 @@ public class CardFactoryUtil {
sa.setBlessing(true);
}
}
+ } else if (keyword.startsWith("Backup")) {
+ final String[] k = keyword.split(":");
+ final String magnitude = k[1];
+ final String backupVar = card.getSVar(k[2]);
+
+ String descStr = "Backup " + magnitude;
+
+ final String trigStr = "Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self | " +
+ "Secondary$ True | TriggerDescription$ " + descStr;
+
+ final String putCounter = "DB$ PutCounter | ValidTgts$ Creature | CounterNum$ " + magnitude
+ + " | CounterType$ P1P1 | Backup$ True";
+
+ final String addAbility = backupVar + " | ConditionDefined$ Targeted | " +
+ "ConditionPresent$ Card.Other | Defined$ Targeted";
+
+ SpellAbility sa = AbilityFactory.getAbility(putCounter, card);
+ AbilitySub backupSub = (AbilitySub) AbilityFactory.getAbility(addAbility, card);
+ sa.setSubAbility(backupSub);
+
+ final Trigger trigger = TriggerHandler.parseTrigger(trigStr, card, intrinsic);
+ sa.setIntrinsic(intrinsic);
+ trigger.setOverridingAbility(sa);
+
+ inst.addTrigger(trigger);
} else if (keyword.equals("Battle cry")) {
final String trig = "Mode$ Attacks | ValidCard$ Card.Self | TriggerZones$ Battlefield | Secondary$ True "
+ " | TriggerDescription$ " + keyword + " (" + inst.getReminderText() + ")";
@@ -1151,7 +1176,7 @@ public class CardFactoryUtil {
} else if (keyword.equals("Extort")) {
final String extortTrigger = "Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | "
+ "TriggerZones$ Battlefield | Secondary$ True"
- + " | TriggerDescription$ Extort ("+ inst.getReminderText() +")";
+ + " | TriggerDescription$ Extort (" + inst.getReminderText() + ")";
final String loseLifeStr = "AB$ LoseLife | Cost$ WB | Defined$ Player.Opponent | LifeAmount$ 1";
final String gainLifeStr = "DB$ GainLife | Defined$ You | LifeAmount$ AFLifeLost";
@@ -2687,7 +2712,7 @@ public class CardFactoryUtil {
if (keyword.startsWith("Alternative Cost") && !host.isLand()) {
final String[] kw = keyword.split(":");
String costStr = kw[1];
- for (SpellAbility sa: host.getBasicSpells()) {
+ for (SpellAbility sa : host.getBasicSpells()) {
if (costStr.equals("ConvertedManaCost")) {
costStr = Integer.toString(host.getCMC());
}
diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java
index 22073210873..ca735fef027 100644
--- a/forge-game/src/main/java/forge/game/keyword/Keyword.java
+++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java
@@ -28,6 +28,7 @@ public enum Keyword {
ASSIST("Assist", SimpleKeyword.class, true, "Another player can pay up to %s of this spell's cost."),
AURA_SWAP("Aura swap", KeywordWithCost.class, false, "%s: You may exchange this Aura with an Aura card in your hand."),
AWAKEN("Awaken", KeywordWithCostAndAmount.class, false, "If you cast this spell for %s, also put {%d:+1/+1 counter} on target land you control and it becomes a 0/0 Elemental creature with haste. It's still a land."),
+ BACKUP("Backup", KeywordWithAmount.class, false, "When this creature enters the battlefield, put {%1$d:+1/+1 counter} on target creature. If that's another creature, it gains the following ability until end of turn."),
BANDING("Banding", SimpleKeyword.class, true, "Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking."),
BATTLE_CRY("Battle cry", SimpleKeyword.class, false, "Whenever this creature attacks, each other attacking creature gets +1/+0 until end of turn."),
BESTOW("Bestow", KeywordWithCost.class, false, "If you cast this card for its bestow cost, it's an Aura spell with enchant creature. It becomes a creature again if it's not attached to a creature."),
diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java
index dea434cbd2e..d39f3f93e7f 100644
--- a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java
+++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java
@@ -17,8 +17,8 @@ public class KeywordWithAmount extends KeywordInstance {
if (details.contains(":")) {
extra = details.split(":")[1];
}
- } else {
- amount = Integer.parseInt(details);
+ } else {
+ amount = details.contains(":") ? Integer.parseInt(details.split(":")[0]) : Integer.parseInt(details);
}
}
diff --git a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java
index 1a4563b0a76..34649e4207c 100644
--- a/forge-game/src/main/java/forge/game/spellability/SpellAbility.java
+++ b/forge-game/src/main/java/forge/game/spellability/SpellAbility.java
@@ -508,6 +508,10 @@ public abstract class SpellAbility extends CardTraitBase implements ISpellAbilit
return isAlternativeCost(AlternativeCost.Cycling);
}
+ public boolean isBackup() {
+ return this.hasParam("Backup");
+ }
+
public boolean isBoast() {
return this.hasParam("Boast");
}
diff --git a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx
index ec32f373d84..9e57d36d521 100644
--- a/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx
+++ b/forge-gui/res/adventure/Shandalar/maps/map/main_story/templeofchandra.tmx
@@ -1514,7 +1514,7 @@
{
- "startBattleWithCardInCommandZone": [ "Chandra, Supreme Pyromancer" ]
+ "startBattleWithCardInCommandZone": [ "Chandra, Bold Pyromancer" ]
}
diff --git a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt
index c171afd4ef9..c426a2f855e 100644
--- a/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt
+++ b/forge-gui/res/cardsfolder/r/rundvelt_hordemaster.txt
@@ -9,6 +9,7 @@ SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ Pl
SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ If it's a Goblin creature card, you may cast that card until the end of your next turn.
SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
SVar:Z:Remembered$Valid Creature.Goblin
+SVar:PlayMain1:TRUE
DeckNeeds:Type$Goblin
DeckHints:Type$Goblin
Oracle:Other Goblins you control get +1/+1.\nWhenever Rundvelt Hordemaster or another Goblin you control dies, exile the top card of your library. If it's a Goblin creature card, you may cast that card until the end of your next turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt
new file mode 100644
index 00000000000..797a306646f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ancient_imperiosaur.txt
@@ -0,0 +1,11 @@
+Name:Ancient Imperiosaur
+ManaCost:5 G G
+Types:Creature Dinosaur
+PT:6/6
+K:Convoke
+K:Trample
+K:Ward:2
+K:etbCounter:P1P1:X
+SVar:X:Convoked$Amount/Twice
+DeckHas:Ability$Counters
+Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nTrample, ward {2}\nAncient Imperiosaur enters the battlefield with two +1/+1 counters on it for each creature that convoked it.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt
new file mode 100644
index 00000000000..ccb063ad085
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/archpriest_of_shadows.txt
@@ -0,0 +1,13 @@
+Name:Archpriest of Shadows
+ManaCost:3 B B
+Types:Creature Human Warlock
+PT:4/4
+K:Backup:1:BackupAbilities
+SVar:BackupAbilities:DB$ Animate | Keywords$ Deathtouch | Triggers$ DamageTrig
+SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield.
+K:Deathtouch
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigReturn | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield.
+SVar:TrigReturn:DB$ ChangeZone | ValidTgts$ Creature.YouOwn | TgtPrompt$ Select target creature from your graveyard | Origin$ Graveyard | Destination$ Battlefield
+DeckHas:Ability$Counters|Graveyard
+DeckHints:Ability$Discard|Sacrifice
+Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following abilities until end of turn.)\nDeathtouch\nWhenever this creature deals combat damage to a player or battle, return target creature card from your graveyard to the battlefield.
diff --git a/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt
new file mode 100644
index 00000000000..d4513ce9674
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/astral_wingspan.txt
@@ -0,0 +1,10 @@
+Name:Astral Wingspan
+ManaCost:4 U
+Types:Enchantment Aura
+K:Convoke
+K:Enchant creature
+A:SP$ Attach | ValidTgts$ Creature | AILogic$ Pump
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDraw | TriggerDescription$ When CARDNAME enters the battlefield, draw a card.
+SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1
+S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 2 | AddToughness$ 2 | AddKeyword$ Flying | Description$ Enchanted creature gets +2/+2 and has flying.
+Oracle:Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for {1} or one mana of that creature's color.)\nEnchant creature\nWhen Astral Wingspan enters the battlefield, draw a card.\nEnchanted creature gets +2/+2 and has flying.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt
new file mode 100644
index 00000000000..fb242d359aa
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/ayara_widow_of_the_realm_ayara_furnace_queen.txt
@@ -0,0 +1,24 @@
+Name:Ayara, Widow of the Realm
+ManaCost:1 B B
+Types:Legendary Creature Elf Noble
+PT:3/3
+A:AB$ DealDamage | Cost$ T Sac<1/Creature.Other;Artifact.Other/another creature or artifact> | ValidTgts$ Opponent,Battle | TgtPrompt$ Select target opponent or battle | SubAbility$ DBGainLife | NumDmg$ X | SpellDescription$ CARDNAME deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value.
+SVar:DBGainLife:DB$ GainLife | LifeAmount$ X
+SVar:X:Sacrificed$CardManaCost
+A:AB$ SetState | Cost$ 5 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform NICKNAME. Activate only as a sorcery.
+AlternateMode:DoubleFaced
+DeckHas:Ability$Sacrifice|LifeGain
+Oracle:{T}, Sacrifice another creature or artifact: Ayara, Widow of the Realm deals X damage to target opponent or battle and you gain X life, where X is the sacrificed permanent's mana value.\n{5}{R/P}: Transform Ayara. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.)
+
+ALTERNATE
+
+Name:Ayara, Furnace Queen
+ManaCost:no cost
+Colors:black,red
+Types:Legendary Creature Phyrexian Elf Noble
+PT:4/4
+T:Mode$ Phase | Phase$ BeginCombat | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
+SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Artifact.YouOwn,Creature.YouOwn | TgtPrompt$ Select up to one target artifact or creature from your graveyard | TargetMin$ 0 | TargetMax$ 1 | Origin$ Graveyard | Destination$ Battlefield | SubAbility$ DBAnimate
+SVar:DBAnimate:DB$ Animate | Keywords$ Haste | Defined$ Targeted | Duration$ Permanent | AtEOT$ Exile
+DeckHas:Ability$Sacrifice|Graveyard
+Oracle:At the beginning of combat on your turn, return up to one target artifact or creature card from your graveyard to the battlefield. It gains haste. Exile it at the beginning of the next end step.
diff --git a/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt
new file mode 100644
index 00000000000..ed4e7889ca5
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/boon_bringer_valkyrie.txt
@@ -0,0 +1,11 @@
+Name:Boon-Bringer Valkyrie
+ManaCost:3 W W
+Types:Creature Angel Warrior
+PT:4/4
+K:Backup:1:BackupAbilities
+SVar:BackupAbilities:DB$ Pump | KW$ Flying & First Strike & Lifelink
+K:Flying
+K:First Strike
+K:Lifelink
+DeckHas:Ability$Counters|LifeGain
+Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that’s another creature, it gains the following abilities until end of turn.)\nFlying, first strike, lifelink
diff --git a/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt
new file mode 100644
index 00000000000..522fe9406b7
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/captive_weird_completed_conjurer.txt
@@ -0,0 +1,22 @@
+Name:Captive Weird
+ManaCost:U
+Types:Creature Weird
+PT:1/3
+K:Defender
+A:AB$ SetState | Cost$ 3 RP | Defined$ Self | Mode$ Transform | SorcerySpeed$ True | AILogic$ Always | SpellDescription$ Transform CARDNAME. Activate only as a sorcery.
+AlternateMode:DoubleFaced
+Oracle:Defender\n{3}{R/P}: Transform Captive Weird. Activate only as a sorcery. ({R/P} can be paid with {R} or 2 life.)
+
+ALTERNATE
+
+Name:Compleated Conjurer
+ManaCost:no cost
+Colors:blue,red
+Types:Creature Phyrexian Weird
+PT:3/3
+T:Mode$ Transformed | ValidCard$ Card.Self | Execute$ TrigExile | TriggerDescription$ When this creature transforms into CARDNAME, exile the top card of your library. Until the end of your next turn, you may play that card.
+SVar:TrigExile:DB$ Dig | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect
+SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | Duration$ UntilTheEndOfYourNextTurn | StaticAbilities$ Play | SubAbility$ DBCleanup | ForgetOnMoved$ Exile
+SVar:Play:Mode$ Continuous | MayPlay$ True | EffectZone$ Command | Affected$ Card.IsRemembered | AffectedZone$ Exile | Description$ You may play remembered card.
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+Oracle:When this creature transforms into Compleated Conjurer, exile the top card of your library. Until the end of your next turn, you may play that card.
diff --git a/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt
new file mode 100644
index 00000000000..c32d55f8f3e
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/change_the_equation.txt
@@ -0,0 +1,7 @@
+Name:Change the Equation
+ManaCost:1 U
+Types:Instant
+A:SP$ Charm | Choices$ DBCounter,DBCounterBis
+SVar:DBCounter:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE2 | SpellDescription$ Counter target spell with mana value 2 or less.
+SVar:DBCounterBis:DB$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell with mana value 2 or less | ValidTgts$ Card.cmcLE6+Red,Card.cmcLE6+Green| SpellDescription$ Counter target red or green spell with mana value 6 or less.
+Oracle:Choose one —\n• Counter target spell with mana value 2 or less.\n• Counter target red or green spell with mana value 6 or less.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt
new file mode 100644
index 00000000000..a1b5febd10f
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/copper_host_crusher.txt
@@ -0,0 +1,7 @@
+Name:Copper Host Crusher
+ManaCost:6 G G
+Types:Creature Phyrexian Bear Rhino
+PT:8/8
+K:Trample
+K:Hexproof
+Oracle:Trample\nHexproof (This creature can’t be the target of spells or abilities your opponents control.)
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt
new file mode 100644
index 00000000000..cb531538fb9
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/cragsmasher_yeti.txt
@@ -0,0 +1,10 @@
+Name:Cragsmasher Yeti
+ManaCost:4 R R
+Types:Creature Yeti
+PT:4/2
+K:TypeCycling:Mountain:2
+K:Backup:2:BackupAbility
+SVar:BackupAbility:DB$ Pump | KW$ Trample
+K:Trample
+DeckHas:Ability$Counters
+Oracle:Mountaincycling {2} ({2}, Discard this card: Search your library for a Mountain card, reveal it, put it into your hand, then shuffle.)\nBackup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\nTrample
diff --git a/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt
new file mode 100644
index 00000000000..3f58448fcc8
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/doomskar_warrior.txt
@@ -0,0 +1,13 @@
+Name:Doomskar Warrior
+ManaCost:2 G G
+Types:Creature Human Warrior
+PT:4/3
+K:Backup:1:BackupAbilities
+SVar:BackupAbilities:DB$ Animate | Keywords$ Trample | Triggers$ DamageTrig
+SVar:DamageTrig:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Battle | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
+SVar:TrigDig:DB$ Dig | DigNum$ X | ChangeNum$ 1 | ChangeValid$ Creature,Land | Optional$ True | DestinationZone$ Hand | RestRandomOrder$ True
+K:Trample
+T:Mode$ DamageDone | ValidSource$ Card.Self | ValidTarget$ Player,Planeswalker | Execute$ TrigDig | CombatDamage$ True | TriggerDescription$ Whenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
+SVar:X:TriggerCount$DamageAmount
+DeckHas:Ability$Counters
+Oracle:Backup 1\nTrample\nWhenever this creature deals combat damage to a player or battle, look at that many cards from the top of your library. You may reveal a creature or land card from among them and put it into your hand. Put the rest on the bottom of your library in a random order.
diff --git a/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt
new file mode 100644
index 00000000000..07431895a95
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/fearless_skald.txt
@@ -0,0 +1,9 @@
+Name:Fearless Skald
+ManaCost:4 R
+Types:Creature Dwarf Berserker
+PT:3/2
+K:Backup:1:BackupAbility
+SVar:BackupAbility:DB$ Pump | KW$ Double Strike
+K:Double Strike
+DeckHas:Ability$Counters
+Oracle:Backup 1 (When this creature enters the battlefield, put a + 1/+ 1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nDouble strike
diff --git a/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt
new file mode 100644
index 00000000000..e08f0773fa6
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/knight_errant_of_eos.txt
@@ -0,0 +1,10 @@
+Name:Knight-Errant of Eos
+ManaCost:4 W
+Types:Creature Human Knight
+PT:4/4
+K:Convoke
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigDig | TriggerDescription$ When CARDNAME enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked CARDNAME. Put the revealed cards into your hand, then shuffle.
+SVar:TrigDig:DB$ Dig | DigNum$ 6 | ChangeNum$ 2 | Optional$ True | ChangeValid$ Creature.cmcLEX | SkipReorder$ True | SubAbility$ DBShuffle | ForceRevealToController$ True
+SVar:DBShuffle:DB$ Shuffle | Defined$ You
+SVar:X:Convoked$Amount
+Oracle:Convoke\nWhen Knight-Errant of Eos enters the battlefield, look at the top six cards of your library. You may reveal up to two creature cards with mana value X or less from among them, where X is the number of creatures that convoked Knight-Errant of Eos. Put the revealed cards into your hand, then shuffle.
\ No newline at end of file
diff --git a/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt
new file mode 100644
index 00000000000..d07273f28db
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/mirror_shield_hoplite.txt
@@ -0,0 +1,9 @@
+Name:Mirror-Shield Hoplite
+ManaCost:R W
+Types:Creature Human Soldier
+PT:2/2
+K:Vigilance
+T:Mode$ BecomesTarget | ValidTarget$ Creature.inZoneBattlefield+YouCtrl | ValidSource$ Ability.Backup | TriggerZones$ Battlefield | Execute$ TrigCopy | ActivationLimit$ 1 | TriggerDescription$ Whenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn.
+SVar:TrigCopy:DB$ CopySpellAbility | Defined$ TriggeredStackInstance | MayChooseTarget$ True
+DeckNeeds:Keyword$Backup
+Oracle:Vigilance\nWhenever a creature you control becomes the target of a backup ability, copy that ability. You may choose new targets for the copy. This ability triggers only once each turn.
diff --git a/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt
new file mode 100644
index 00000000000..faae830750d
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/streetwise_negotiatior.txt
@@ -0,0 +1,10 @@
+Name:Streetwise Negotiator
+ManaCost:1 G
+Types:Creature Cat Citizen
+PT:0/2
+K:Backup:1:BackupAbility
+SVar:BackupAbility:DB$ Animate | staticAbilities$ CDT
+SVar:CDT:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power.
+S:Mode$ CombatDamageToughness | ValidCard$ Card.Self | Description$ This creature assigns combat damage equal to its toughness rather than its power.
+DeckHas:Ability$Counters
+Oracle:Backup 1 (When this creature enters the battlefield, put a +1/+1 counter on target creature. If that's another creature, it gains the following ability until end of turn.)\nThis creature assigns combat damage equal to its toughness rather than its power.
diff --git a/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt
new file mode 100644
index 00000000000..534cd599a15
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/voldaren_thrilseeker.txt
@@ -0,0 +1,11 @@
+Name:Voldaren Thrillseeker
+ManaCost:2 R
+Types:Creature Vampire Warrior
+PT:1/1
+K:Backup:2:BackupAbility
+SVar:BackupAbility:DB$ Animate | Abilities$ ABDealDamage
+SVar:ABDealDamage:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target.
+A:AB$ DealDamage | Cost$ 1 Sac<1/CARDNAME/this creature> | ValidTgts$ Player,Creature,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SpellDescription$ It deals damage equal to its power to any target.
+SVar:X:Sacrificed$CardPower
+DeckHas:Ability$Counters|Sacrifice
+Oracle:Backup 2 (When this creature enters the battlefield, put two +1/+1 counters on target creature. If that's another creature, it gains the following ability until end of turn.)\n{1}, Sacrifice this creature: It deals damage equal to its power to any target.
diff --git a/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt
new file mode 100644
index 00000000000..8e9662e6ee4
--- /dev/null
+++ b/forge-gui/res/cardsfolder/upcoming/vorinclex_the_grand_evolution.txt
@@ -0,0 +1,33 @@
+Name:Vorinclex
+ManaCost:3 G G
+Types:Legendary Creature Phyrexian Praetor
+K:Trample
+K:Reach
+PT:6/6
+K:Trample
+K:Reach
+T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle.
+SVar:TrigChange:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest | ChangeNum$ 2
+A:AB$ ChangeZone | Cost$ 6 G G | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SorcerySpeed$ True | StackDescription$ SpellDescription | SpellDescription$ Exile CARDNAME, then return it to the battlefield transformed under its owner’s control. Activate only as a sorcery.
+SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | ForgetOtherRemembered$ True | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+AlternateMode:DoubleFaced
+Oracle:Trample, reach\nWhen Vorinclex enters the battlefield, search your library for up to two Forest cards, reveal them, put them into your hand, then shuffle.\n{6}{G}{G}: Exile Vorinclex, then return it to the battlefield transformed under its owner's control. Activate only as a sorcery.
+
+ALTERNATE
+
+Name:The Grand Evolution
+ManaCost:no cost
+Colors:green
+Types:Enchantment Saga
+K:Saga:3:DBMill,DBPutCounter,DBFight
+SVar:DBMill:DB$ Mill | NumCards$ 10 | RememberMilled$ True | SubAbility$ DBChangeZone | SpellDescription$ Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.
+SVar:DBChangeZone:DB$ ChangeZone | Origin$ Graveyard | Hidden$ True | Destination$ Battlefield | ChangeType$ Creature.IsRemembered | ChangeTypeDesc$ creature cards milled this way | ChangeNum$ 2 | SelectPrompt$ Choose two creature cards milled this way | SubAbility$ DBCleanup
+SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True
+SVar:DBPutCounter:DB$ PutCounter | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select any number of creatures you control to distribute counters to | CounterType$ P1P1 | CounterNum$ 7 | TargetMin$ 1 | TargetMax$ 7 | DividedAsYouChoose$ 7 | SpellDescription$ Distribute seven +1/+1 counters among any number of target creatures you control.
+SVar:DBFight:DB$ AnimateAll | ValidCards$ Creature.YouCtrl | Abilities$ Fight | Duration$ UntilEndOfTurn | SubAbility$ DBExileSelf | SpellDescription$ Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile CARDNAME, then return it to the battlefield (front face up).
+SVar:Fight:AB$ Fight | Cost$ 1 | Defined$ Self | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | SpellDescription$ This creature fights target creature you don't control.
+SVar:DBExileSelf:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | SubAbility$ DBReturnSelf | RememberChanged$ True
+SVar:DBReturnSelf:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | SubAbility$ DBCleanup
+DeckHas:Ability$Mill|Counters|Graveyard
+Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Mill ten cards. Put up to two creature cards from among the milled cards onto the battlefield.\nII — Distribute seven +1/+1 counters among any number of target creatures you control.\nIII — Until end of turn, creatures you control gain "{1}: This creature fights target creature you don't control." Exile The Grand Evolution, then return it to the battlefield (front face up).
diff --git a/forge-gui/res/editions/March of the Machine Commander.txt b/forge-gui/res/editions/March of the Machine Commander.txt
index 349cae30668..63c13cb0a55 100644
--- a/forge-gui/res/editions/March of the Machine Commander.txt
+++ b/forge-gui/res/editions/March of the Machine Commander.txt
@@ -11,23 +11,409 @@ ScryfallCode=MOC
3 M Gimbal, Gremlin Prodigy @Fajareka Setiawan
4 M Kasla, the Broken Halo @Martina Fackova
5 M Sidar Jabari of Zhalfir @Simon Dominic
+6 M Elenda and Azor @Randy Vargas
+7 M Moira and Teshar @Josh Hass
+8 M Rashmi and Ragavan @Joshua Cairos
+9 M Saint Traft and Rem Karolus @Lucas Graciano
+10 M Shalai and Hallar @Mila Pesic
+11 R Chivalric Alliance @Jim Pavelec
+12 R Conjurer's Mantle @Fiona Hsieh
+13 R Darksteel Splicer @Steven Belledin
+14 R Excise the Imperfect @Denis Zhbankov
+15 R Filigree Vector
+16 R Guardian Scalelord @Victor Adame Minguez
+17 R Nesting Dovehawk @Alessandra Pisano
+18 R Path of the Ghosthunter @Eli Minaya
+19 R Vulpine Harvester @Brent Hollowell
+20 R Wand of the Worldsoul @Alessandra Pisano
+21 R Deluxe Dragster @Gabor Szikszai
+22 R Herald of Hoofbeats @Randy Vargas
+23 R Path of the Enigma @Jeremy Wilson
+24 R Schema Thief @Artur Treffner
+25 R Blight Titan @Martin de Diego Sádaba
+26 R Exsanguinator Cavalry @Quintin Gleim
+27 R Locthwain Lancer @Lars Grant-West
+28 R Path of the Schemer @Josu Hernaiz
+29 R Dance with Calamity @Fajareka Setiawan
+30 R Death-Greeter's Champion @Jason Rainville
+31 R Hedron Detonator @Caroline Gariba
+32 R Mirror-Style Master @Chris Rallis
+33 R Pain Distributor @Olivier Bernard
+34 R Path of the Pyromancer @Dominik Mayer
+35 R Uncivil Unrest @Lorenzo Mastroianni
+36 R Conclave Sledge-Captain @Ilse Gort
+37 R Emergent Woodwurm @Mathias Kollros
+38 R Path of the Animist @Liiga Smilshkalne
+39 R Sandsteppe War Riders @Kekai Kotaki
+40 R Cutthroat Negotiator @Lucas Graciano
+41 R Flockchaser Phantom @Lorenzo Mastroianni
+42 R Mistmeadow Vanisher @Iris Compiet
+43 R Vodalian Wave-Knight @Olivier Bernard
+44 R Wildfire Awakener @Andrew Mar
+45 R Bitterthorn, Nissa's Animus @Titus Lunter
+46 R Ichor Elixir @Warren Mahy
49 C Esper @Bruce Brenneise
+55 C Ketria @Piotr Dura
+57 C Megaflora Jungle
+58 C Naktamun @Robin Olausson
61 C Nyx @Piotr Dura
+63 C The Pit @Dave Kendall
67 C Towashi @Kamila Szutenberg
+72 R Elspeth's Talent @Jeremy Wilson
+73 R Firemane Commando @Andrew Mar
+74 R Teferi's Talent @Dominik Mayer
+75 M Infernal Sovereign @Chris Rallis
+76 R Liliana's Talent @A. M. Sartor
+77 R Rowan's Talent @Pauline Voss
+78 R Vivien's Talent @Eli Minaya
+79 M Begin the Invasion @Campbell White
+80 R Elspeth's Talent @Jeremy Wilson
+81 R Firemane Commando @Andrew Mar
+82 R Teferi's Talent @Dominik Mayer
+83 M Infernal Sovereign @Chris Rallis
+84 R Liliana's Talent @A. M. Sartor
+85 R Rowan's Talent @Pauline Voss
+86 R Vivien's Talent @Eli Minaya
+87 M Begin the Invasion @Campbell White
88 M Bright-Palm, Soul Awakener @Mila Pesic
89 M Brimaz, Blight of Oreskos @Uriah Voth
+90 M Elenda and Azor @Randy Vargas
91 M Gimbal, Gremlin Prodigy @Fajareka Setiawan
92 M Kasla, the Broken Halo @Martina Fackova
+93 M Moira and Teshar @Josh Hass
+94 M Rashmi and Ragavan @Joshua Cairos
+95 M Saint Traft and Rem Karolus @Lucas Graciano
+96 M Shalai and Hallar @Mila Pesic
97 M Sidar Jabari of Zhalfir @Simon Dominic
+98 R Chivalric Alliance @Jim Pavelec
+99 R Conjurer's Mantle @Fiona Hsieh
+100 R Darksteel Splicer @Steven Belledin
+101 R Excise the Imperfect @Denis Zhbankov
+102 R Filigree Vector
+103 R Guardian Scalelord @Victor Adame Minguez
+104 R Nesting Dovehawk @Alessandra Pisano
+105 R Path of the Ghosthunter @Eli Minaya
+106 R Vulpine Harvester @Brent Hollowell
+107 R Wand of the Worldsoul @Alessandra Pisano
+108 R Deluxe Dragster @Gabor Szikszai
+109 R Herald of Hoofbeats @Randy Vargas
+110 R Path of the Enigma @Jeremy Wilson
+111 R Schema Thief @Artur Treffner
+112 R Blight Titan @Martin de Diego Sádaba
+113 R Exsanguinator Cavalry @Quintin Gleim
+114 R Locthwain Lancer @Lars Grant-West
+115 R Path of the Schemer @Josu Hernaiz
+116 R Dance with Calamity @Fajareka Setiawan
+117 R Death-Greeter's Champion @Jason Rainville
+118 R Hedron Detonator @Caroline Gariba
+119 R Mirror-Style Master @Chris Rallis
+120 R Pain Distributor @Olivier Bernard
+121 R Path of the Pyromancer @Dominik Mayer
+122 R Uncivil Unrest @Lorenzo Mastroianni
+123 R Conclave Sledge-Captain @Ilse Gort
+124 R Emergent Woodwurm @Mathias Kollros
+125 R Path of the Animist @Liiga Smilshkalne
+126 R Sandsteppe War Riders @Kekai Kotaki
+127 R Cutthroat Negotiator @Lucas Graciano
+128 R Flockchaser Phantom @Lorenzo Mastroianni
+129 R Mistmeadow Vanisher @Iris Compiet
+130 R Vodalian Wave-Knight @Olivier Bernard
+131 R Wildfire Awakener @Andrew Mar
+132 R Bitterthorn, Nissa's Animus @Titus Lunter
+133 R Ichor Elixir @Warren Mahy
134 M Bright-Palm, Soul Awakener @Mila Pesic
135 M Brimaz, Blight of Oreskos @Uriah Voth
136 M Gimbal, Gremlin Prodigy @Fajareka Setiawan
137 M Kasla, the Broken Halo @Martina Fackova
138 M Sidar Jabari of Zhalfir @Simon Dominic
+139 C The Aether Flues @Jason A. Engle
+141 C Chaotic Aether @Dan Scott
+144 C The Great Forest @Howard Lyon
147 C Isle of Vesuva @Zoltan Boros & Gabor Szikszai
148 C Jund @Aleksi Briclot
153 C Panopticon @John Avon
158 C Spatial Merging @Gabor Szikszai
+163 C Undercity Reaches @Stephan Martiniere
+164 U Abzan Battle Priest @Chris Rahn
+165 U Abzan Falconer @Steven Belledin
+166 R Acclaimed Contender @David Gaillet
+167 R Adeline, Resplendent Cathar @Bryan Sola
+168 U Alharu, Solemn Ritualist @Chris Rallis
+169 R Angel of Finality @Howard Lyon
+170 R Angel of Salvation @D. Alexander Gregory
+171 R Angel of the Ruins @Viko Menezes
+172 R Austere Command @Anna Steinbauer
+173 U Banisher Priest @Willian Murai
+174 U Battle Screech @Anastasia Ovchinnikova
+175 R Blade Splicer @Greg Staples
+176 M Cataclysmic Gearhulk @Victor Adame Minguez
+177 U Chant of Vitu-Ghazi @Stephen Tappin
+178 U Conclave Tribunal @Seb McKinnon
+179 U Constable of the Realm @Alexander Mokhov
+180 U Devouring Light @Slawomir Maniak
+181 U Elite Scaleguard @Steve Prescott
+182 M Elspeth, Sun's Champion @Tyler Jacobson
+183 R Emeria Angel @Jim Murray
+184 C Ephemeral Shields @Yohann Schepacz
+185 R Fell the Mighty @Raymond Swanland
+186 U Flight of Equenauts @Zezhou Chen
+187 U Generous Gift @Kev Walker
+188 C Hero of Bladehold @Steven Belledin
+189 R High Sentinels of Arashin @James Ryman
+190 R Hour of Reckoning @Joseph Meehan
+191 R Keeper of the Accord @Denman Rooke
+192 R Knight Exemplar @Jason Chan
+193 R Knight of the White Orchid @Mark Zug
+194 U Master Splicer @Chippy
+196 U Mentor of the Meek @Jana Schirmer & Johannes Voss
+197 R Mikaeus, the Lunarch @Steven Belledin
+198 U Path to Exile @Todd Lockwood
+199 R Phyrexian Rebirth @Scott Chou
+200 R Promise of Loyalty @Sara Winters
+201 R Restoration Angel @Jake Murray
+202 U Return to Dust @Wayne Reynolds
+203 R Secure the Wastes @Scott Murphy
+204 R Semester's End @Alayna Danner
+205 U Seraph of the Masses @Zoltan Boros
+206 U Shattered Angel @Kev Walker
+207 R Silverwing Squadron @Johannes Voss
+208 C Spirited Companion @Ilse Gort
+209 R Sunscorch Regent @Matt Stewart
+210 C Suture Priest @Igor Kieryluk
+211 U Swords to Plowshares @Jesper Ejsing
+212 R Together Forever @Aaron Miller
+213 R Unbreakable Formation @Matt Stewart
+214 R Valiant Knight @Jakub Kasper
+215 R Venerated Loxodon @Zack Stella
+216 C Village Bell-Ringer @David Palumbo
+217 R Worthy Knight @Yongjae Choi
+218 R Chasm Skulker @Jack Wang
+219 C Cloud of Faeries @Iris Compiet
+220 C Distant Melody
+221 R Echo Storm @Mark Poole
+222 M Ethersworn Adjudicator @Dan Scott
+223 U Fallowsage @Paolo Parente
+224 R Imprisoned in the Moon @Ryan Alexander Lee
+225 U Junk Winder @Campbell White
+226 R Master of Etherium @Matt Cavotta
+227 R Masterful Replication @Victor Adame Minguez
+228 R Nadir Kraken @Dan Scott
+229 R Perplexing Test @Fariba Khamseh
+230 R Pull from Tomorrow @Sara Winters
+231 U Reality Shift @Howard Lyon
+232 U Reverse Engineer @Chase Stone
+233 R Rise and Shine @Franz Vohwinkel
+234 R Saheeli's Artistry @Kieran Yanner
+235 R Sharding Sphinx @Michael Bruinsma
+236 R Shimmer Dragon @Lie Setiawan
+237 R Spell Swindle @Victor Adame Minguez
+238 R Stroke of Genius @Rovina Cai
+239 U Syr Elenora, the Discerning @Mila Pesic
+240 U Tetsuko Umezawa, Fugitive @Randy Vargas
+241 R Thopter Spy Network @Jung Park
+242 C Thoughtcast @Greg Hildebrandt
+243 R Vedalken Humiliator @Jehan Choo
+244 U Whirler Rogue @Winona Nelson
+245 R Workshop Elders @Iain McCaig
+246 U Ambition's Cost @Zezhou Chen
+247 U Bone Shredder @Ron Spencer
+248 C First-Sphere Gargantua @Randy Vargas
+249 U Foulmire Knight @Alex Brock
+250 U Go for the Throat @Kristina Carroll
+251 U Graveshifter @Jakub Kasper
+252 R Haakon, Stromgald Scourge @Mark Zug
+253 R Josu Vess, Lich Knight @Tyler Jacobson
+254 U Keskit, the Flesh Sculptor @Yongjae Choi
+255 R Liliana's Standard Bearer @Josh Hass
+256 M Massacre Wurm @Jason Chan
+257 R Midnight Reaper @Sidharth Chaturvedi
+258 R Murderous Rider @Josh Hass
+259 C Night's Whisper @John Severin Brassell
+260 M Noxious Gearhulk @Lius Lasahido
+261 U Order of Midnight @Victor Adame Minguez
+262 R Painful Truths @Winona Nelson
+263 R Phyrexian Delver @Igor Kieryluk
+264 C Phyrexian Ghoul @Pete Venters
+265 C Phyrexian Rager @Brock Grossman
+266 M Phyrexian Scriptures @Joseph Meehan
+267 C Read the Bones @Lars Grant-West
+268 C Smitten Swordmaster @Taylor Ingvarsson
+269 U Syr Konrad, the Grim @Anna Steinbauer
+270 U Victimize @Craig J Spearing
+271 R Yawgmoth's Vile Offering @Chase Stone
+272 R Brass's Bounty @Grzegorz Rutkowski
+273 R Chaos Warp @Trevor Claxton
+274 U Curse of Opulence @Kieran Yanner
+275 R Everquill Phoenix @Lie Setiawan
+276 U Falkenrath Exterminator @Winona Nelson
+277 M Feldon of the Third Path @Chase Stone
+278 R Fiery Confluence @Kieran Yanner
+279 R Flamerush Rider @Min Yum
+280 R Flameshadow Conjuring @Seb McKinnon
+281 U Ghirapur Aether Grid @Cynthia Sheppard
+282 C Goblin Instigator @Filip Burburan
+283 C Goblin Medics @Caio Monteiro
+284 R Hellkite Igniter @Jason Chan
+285 C Impact Tremors @Lake Hurwitz
+286 R Ion Storm @Michael Sutfin
+287 R Krenko, Tin Street Kingpin @Viko Menezes
+288 R Pia and Kiran Nalaar @Eric Deschamps
+289 U Vampires' Vengeance @Chris Cold
+290 R Aid from the Cowl @Viktor Titov
+291 U Armorcraft Judge @David Palumbo
+292 U Brawn @Matt Cavotta
+293 R Champion of Lambholt @Christopher Moeller
+294 C Crack Open @Yeong-Hao Han
+295 C Cultivate @Anthony Palumbo
+296 C Fertilid @Wayne Reynolds
+297 R Forgotten Ancient @Mark Tedin
+298 R Genesis Hydra @Donato Giancola
+299 R Gilded Goose @Lindsey Look
+300 R Gyre Sage @Tyler Jacobson
+301 U Hindervines @Svetlin Velinov
+302 R Incubation Druid @Daniel Ljunggren
+303 R Inscription of Abundance @Zoltan Boros
+304 U Inspiring Call @Dan Scott
+305 M Kalonian Hydra @Chris Rahn
+306 C Kodama's Reach @John Avon
+307 R Managorger Hydra @Lucas Graciano
+308 C Pridemalkin @Karl Kopinski
+309 C Return to Nature @Mark Poole
+310 R Rishkar, Peema Renegade @Todd Lockwood
+311 C Root Out @Daniel Ljunggren
+312 U Slurrk, All-Ingesting @Jehan Choo
+313 U Tireless Provisioner @Josu Hernaiz
+314 R Tireless Tracker @Eric Deschamps
+315 U Weirding Wood @Jung Park
+316 C Wood Elves @Josh Hass
+317 U Arvad the Cursed @Lius Lasahido
+318 R Aryel, Knight of Windgrace @Grzegorz Rutkowski
+319 U Combine Chrysalis @Hector Ortiz
+320 U Conclave Mentor @Raoul Vitale
+321 U Corpse Knight @Karl Kopinski
+322 U Despark @Slawomir Maniak
+323 R Dromoka's Command @James Ryman
+324 U Duergar Hedge-Mage @Dave Allsop
+325 U Enduring Scalelord @Clint Cearley
+326 U Good-Fortune Unicorn @Kee Lo
+327 U Hamza, Guardian of Arashin @Wisnu Tan
+328 R Heaven // Earth @Jonas De Ro
+329 U Improbable Alliance @Zoltan Boros
+330 U Juniper Order Ranger @Greg Hildebrandt
+331 U Knight of the Last Breath @Milivoj Ćeran
+332 U Knights of the Black Rose @Mark Zug
+333 R Knights' Charge @Paul Scott Canavan
+334 M Kykar, Wind's Fury @G-host Lee
+335 M The Locust God @Lius Lasahido
+336 U Migratory Route @Winona Nelson
+337 U Mortify @Anthony Palumbo
+338 U Saheeli, Sublime Artificer @Wesley Burt
+339 U Struggle // Survive @Eric Deschamps
+340 R Time Wipe @Svetlin Velinov
+341 R Utter End @Mark Winters
+342 M Vona, Butcher of Magan @Volkan Baǵa
+343 U Wear // Tear @Ryan Pancoast
+344 R Whirlwind of Thought @Bram Sels
+345 U Wintermoor Commander @Tyler Jacobson
+346 R Academy Manufactor @Campbell White
+347 R Ancient Stone Idol @Josh Hass
+348 C Arcane Signet @Dan Scott
+349 R Bloodforged Battle-Axe @Alayna Danner
+350 U Bloodline Pretender @Slawomir Maniak
+351 U Burnished Hart @Yeong-Hao Han
+352 C Commander's Sphere @Ryan Alexander Lee
+353 R Coveted Jewel @Jason A. Engle
+354 R Cultivator's Caravan @Mark Zug
+355 R Duplicant @Thomas M. Baxa
+356 U Fellwar Stone @John Avon
+357 C Fractured Powerstone @Rob Alexander
+358 C Gruul Signet @Efrem Palacios
+359 U Hedron Archive @Craig J Spearing
+360 U Herald's Horn @Jason Felix
+361 R Inspiring Statuary @Kirsten Zirngibl
+362 C Izzet Signet @Raoul Vitale
+363 U Meteor Golem @Lake Hurwitz
+364 U Mind Stone @Adam Rex
+365 U Mindless Automaton @Chris Seaman
+366 R Myr Battlesphere @Franz Vohwinkel
+367 R Nettlecyst @Vincent Proce
+368 C Orzhov Locket @Volkan Baǵa
+369 C Orzhov Signet @Martina Pilcerova
+370 M Phyrexian Triniform @Adam Paquette
+371 R Psychosis Crawler @Stephan Martiniere
+372 U Replicating Ring @Olena Richards
+373 R Scrap Trawler @Daarken
+374 R Sculpting Steel @Heather Hudson
+375 R Scytheclaw @James Paick
+376 U Shimmer Myr @Jana Schirmer & Johannes Voss
+377 R Sigiled Sword of Valeron @John Stanko
+378 C Simic Signet @Mike Sass
+379 U Skullclamp @Luca Zontini
+380 R Skyclave Relic @Daniel Ljunggren
+381 U Sol Ring @Mike Bierek
+382 M Soul of New Phyrexia @Daarken
+383 R Spine of Ish Sah @Daniel Ljunggren
+384 R Strionic Resonator @Sam White
+385 U Talisman of Hierarchy @Lindsey Look
+386 R Thopter Assembly @Svetlin Velinov
+387 R Triskelion @Christopher Moeller
+388 R Vanquisher's Banner @Milivoj Ćeran
+389 C Wayfarer's Bauble @Tomas Duchek
+390 U Arcane Sanctum @Anthony Francisco
+391 C Bojuka Bog @Howard Lyon
+392 U Bretagard Stronghold @Jung Park
+393 R Canopy Vista @Adam Paquette
+394 R Choked Estuary @Vincent Proce
+395 R Cinder Glade @Adam Paquette
+396 C Command Tower @Evan Shipard
+397 C Evolving Wilds @Cliff Childs
+398 R Exotic Orchard @Steven Belledin
+399 R Fetid Heath @Daarken
+400 U Field of Ruin @Chris Ostrowski
+401 R Fortified Village @Cliff Childs
+402 U Frontier Bivouac @Titus Lunter
+403 R Frostboil Snarl @Sam Burley
+404 R Furycalm Snarl @Sam Burley
+405 R Game Trail @Adam Paquette
+406 R Gavony Township @Julian Kok Joon Wen
+407 C Goldmire Bridge @Aaron Miller
+408 U Jungle Shrine @Wayne Reynolds
+409 R Karn's Bastion @Adam Paquette
+410 R Kessig Wolf Run @Eytan Zana
+411 R Kher Keep @Paolo Parente
+412 U Krosan Verge @Ruxing Gao
+413 U Llanowar Reborn @Philip Straub
+414 R Mossfire Valley @Yeong-Hao Han
+415 R Mosswort Bridge @Jeremy Jarvis
+416 U Myriad Landscape @Jonas De Ro
+417 U Mystic Monastery @Florian de Gesincourt
+418 C Path of Ancestry @Alayna Danner
+419 R Port Town @Kamila Szutenberg
+420 R Prairie Stream @Adam Paquette
+421 U Rogue's Passage @Christine Choi
+422 R Shineshadow Snarl @Sam Burley
+423 C Silverquill Campus @Titus Lunter
+424 U Simic Growth Chamber @John Avon
+425 R Skycloud Expanse @Sam Burley
+426 R Spire of Industry @John Avon
+427 R Sungrass Prairie @Ron Spencer
+428 R Sunken Hollow @Adam Paquette
+429 U Tainted Field @Don Hazeltine
+430 R Temple of Abandon @Adam Paquette
+431 R Temple of Deceit @Jonas De Ro
+432 R Temple of Enlightenment @Piotr Dura
+433 R Temple of Epiphany @Adam Paquette
+434 R Temple of Mystery @Piotr Dura
+435 R Temple of Plenty @Chris Ostrowski
+436 R Temple of Silence @Adam Paquette
+437 R Temple of the False God @Brian Snõddy
+438 R Temple of Triumph @Piotr Dura
+439 C Terramorphic Expanse @Dan Scott
+440 C Thriving Heath @Alayna Danner
+441 C Thriving Isle @Jonas De Ro
+442 C Thriving Moor @Titus Lunter
+443 R Vault of the Archangel @John Avon
+444 R Vineglimmer Snarl @Sam Burley
445 M Goro-Goro and Satoru @Johannes Voss
446 M Katilda and Lier @Justyna Dura
447 M Slimefoot and Squee @Victor Adame Minguez
diff --git a/forge-gui/res/editions/March of the Machine The Aftermath.txt b/forge-gui/res/editions/March of the Machine The Aftermath.txt
index c837fe9f989..b68a33ebaf9 100644
--- a/forge-gui/res/editions/March of the Machine The Aftermath.txt
+++ b/forge-gui/res/editions/March of the Machine The Aftermath.txt
@@ -7,3 +7,4 @@ ScryfallCode=MAT
[cards]
34 R The Kenriths' Royal Funeral @Manuel Castañón
+230 Jolrael, Voice of Zhalfir @Ernanda Souza
diff --git a/forge-gui/res/editions/March of the Machine.txt b/forge-gui/res/editions/March of the Machine.txt
index 0f3b05a55d2..9bbbea0752e 100644
--- a/forge-gui/res/editions/March of the Machine.txt
+++ b/forge-gui/res/editions/March of the Machine.txt
@@ -7,120 +7,221 @@ ScryfallCode=MOM
[cards]
1 M Invasion of Ravnica @Leon Tukker
+2 C Aerial Boost @Artur Nakhodkin
+3 C Alabaster Host Intercessor @Konstantin Porubov
4 C Alabaster Host Sanctifier @Konstantin Porubov
+5 C Angelic Intervention @Awanqi (Angela Wang)
6 M Archangel Elspeth @Cynthia Sheppard
+7 C Attentive Skywarden @Jodie Muir
+8 C Bola Slinger @Hendry Iwanaga
9 R Boon-Bringer Valkyrie @Heonhwa Choe
+10 C Cut Short @Tran Nguyen
11 R Dusk Legion Duelist @Ryan Valle
12 M Elesh Norn @Magali Villeneuve
13 U Elspeth's Smite @Livia Prima
+14 C Enduring Bondwarden @Kim Sokol
+15 C Golden-Scale Aeronaut @Javier Charro
16 R Guardian of Ghirapur @Cynthia Sheppard
17 R Heliod, the Radiant Dawn @Victor Adame Minguez
+18 C Infected Defector @Nino Vecia
+19 C Inspired Charge @Vladimir Krisetskiy
20 U Invasion of Belenon @Antonio José Manzanedo
21 U Invasion of Dominaria @Denys Tsiperko
22 R Invasion of Gobakhan @Andreas Zafiratos
23 R Invasion of Theros @Johan Grenier
+24 C Kithkin Billyrider @Zara Alfonso
+25 C Knight of the New Coalition @Jake Murray
26 R Knight-Errant of Eos @Kevin Sidharta
+27 C Kor Halberd @Bastien L. Deharme
28 M Monastery Mentor @Brian Valeza
29 U Norn's Inquisitor @Denis Zhbankov
30 U Phyrexian Awakening @Artur Nakhodkin
31 U Phyrexian Censor @Alexey Kruglov
+32 R Progenitor Exarch @Marie Magny
+33 C Realmbreaker's Grasp @Artur Nakhodkin
+34 C Scrollshift @Bram Sels
35 U Seal from Existence @Anato Finnstark
36 U Seraph of New Capenna @Aaron J. Riley
+37 C Sigiled Sentinel @Volkan Baǵa
38 U Sun-Blessed Guardian @Brian Valeza
+39 C Sunder the Gateway @Titus Lunter
40 R Sunfall @Kasia 'Kafis' Zielińska
41 U Surge of Salvation @Dominik Mayer
+42 C Swordsworn Cavalier @Stella Spente
+43 C Tarkir Duneshaper @Denys Tsiperko
44 U Tiller of Flesh @Nino Vecia
45 U Zhalfirin Lancer @Nino Vecia
46 U Artistic Refusal @Olivier Bernard
+47 C Assimilate Essence @Konstantin Porubov
48 U Astral Wingspan @Joseph Weston
49 U Captive Weird @Manuel Castañón
50 U Change the Equation @Alix Branwyn
51 R Chrome Host Seedshark @Donato Giancola
52 R Complete the Circuit @Eelis Kyttanen
53 U Corruption of Towashi @Artur Nakhodkin
+54 C Disturbing Conversion @Anna Mitura-Laskowska
+55 C Ephara's Dispersal @Awanqi (Angela Wang)
+56 C Expedition Lookout @Johan Grenier
+57 C Eyes of Gitaxias @Cristi Balanescu
58 R Faerie Mastermind @Joshua Raphael
+59 C Furtive Analyst @Marcela Bolívar
+60 C Halo-Charged Skaab @Igor Kieryluk
61 R Invasion of Arcavios @Dmitry Burmak
62 U Invasion of Kamigawa @Kekai Kotaki
63 R Invasion of Segovia @Edgar Sánchez Hidalgo
64 U Invasion of Vryn @Leon Tukker
65 M Jin-Gitaxias @Ekaterina Burmak
+66 C Meeting of Minds @Milivoj Ćeran
67 C Moment of Truth @Rovina Cai
68 C Negate @Viko Menezes
+69 C Oculus Whelp @Donato Giancola
70 U Omen Hawker @Josh Hass
71 U Oracle of Tragedy @Pavel Kolomeyets
+72 C Order of the Mirror @Andrew Mar
+73 C Preening Champion @Alix Branwyn
+74 C Protocol Knight @Volkan Baǵa
75 R Rona, Herald of Invasion @Victor Adame Minguez
+76 C Saiba Cryptomancer @Aaron J. Riley
77 R See Double @Marc Simonetti
78 U Skyclave Aerialist @Michal Ivan
+79 C Stasis Field @Jinho Bae
+80 C Temporal Cleansing @Dominik Mayer
+81 C Thunderhead Squadron @PINDURSKI
+82 C Tidal Terror @Nicholas Gregory
83 R Transcendent Message @Liiga Smilshkalne
+84 U Wicked Slumber @Anato Finnstark
85 U Xerex Strobe-Knight @Pavel Kolomeyets
86 R Zephyr Singer @Lie Setiawan
+87 C Zhalfirin Shapecraft @Aldo Domínguez
+88 C Aetherblade Agent @Alexander Mokhov
89 R Archpriest of Shadows @Fariba Khamseh
90 R Ayara, Widow of the Realm @Anna Podedworna
+91 C Bladed Battle-Fan @Colin Boyer
92 U Blightreaper Thallid @Marta Nael
93 R Bloated Processor @Brock Grossman
94 R Breach the Multiverse @Liiga Smilshkalne
95 U Collective Nightmare @Rovina Cai
+96 U Compleated Huntmaster @Alex Brock
+97 C Consuming Aetherborn @Aldo Domínguez
+98 C Corrupted Conviction @Joseph Weston
99 C Deadly Derision @Gaboleps
+100 C Dreg Recycler @Campbell White
+101 C Etched Familiar @Colin Boyer
+102 C Etched Host Doombringer @Helge C. Balzer
+103 C Failed Conversion @Jodie Muir
+104 C Final Flourish @Raluca Marinescu
+105 C Flitting Guerilla @Francisco Miyara
106 U Gift of Compleation @Artur Nakhodkin
107 U Glistening Deluge @Anastasia Balakchina
+108 C Gloomfang Mauler @Denis Zhbankov
109 R Grafted Butcher @Zack Stella
110 R Hoarding Broodlord @Filip Burburan
+111 C Ichor Drinker @Aurore Folny
+112 C Ichor Shade @Nicholas Gregory
113 U Invasion of Eldraine @Cristi Balanescu
114 R Invasion of Fiora @Joshua Raphael
115 M Invasion of Innistrad @Alexey Kruglov
116 U Invasion of Ulgrotha @Viko Menezes
117 U Merciless Repurposing @Artur Nakhodkin
118 C Mirrodin Avenged @Scott Murphy
+119 U Nezumi Freewheeler @Artur Nakhodkin
+120 C Nezumi Informant @Steve Prescott
121 U Phyrexian Gargantua @Kevin Sidharta
122 R Pile On @Javier Charro
123 U Render Inert @Yigit Koroglu
+124 U Scorn-Blade Berserker @Tuan Duong Chu
125 M Sheoldred @Ryan Pancoast
+126 C Tenured Oilcaster @Francisco Miyara
127 C Traumatic Revelation @Cristi Balanescu
+128 C Unseal the Necropolis @Isis
+129 C Vanquish the Weak @Gaboleps
+130 C Akki Scrapchomper @Wisnu Tan
131 C Beamtown Beatstick @Konstantin Porubov
132 R Bloodfeather Phoenix @Rudy Siswanto
+133 C Burning Sun's Fury @Slawomir Maniak
134 M Chandra, Hope's Beacon @Kieran Yanner
135 R City on Fire @Jake Murray
+136 C Coming In Hot @Cristi Balanescu
137 R Etali, Primal Conqueror @Ryan Pancoast
138 U Fearless Skald @Slawomir Maniak
139 U Furnace Gremlin @Tuan Duong Chu
+140 C Furnace Host Charger @Andreas Zafiratos
141 U Furnace Reins @Brian Valeza
+142 C Hangar Scrounger @Borja Pindado
143 U Harried Artisan @Caio Monteiro
144 R Into the Fire @Grzegorz Rutkowski
145 R Invasion of Kaldheim @Bryan Sola
146 R Invasion of Karsus @Zoltan Boros
147 U Invasion of Mercadia @Cristi Balanescu
148 U Invasion of Regatha @Daarken
-149 M Invasion of Tarkir @Darren Tan
+149 M Invasion of Tarkir @Darren Tan
+150 C Karsus Depthguard @Tyler Jacobson
151 U Khenra Spellspear @Artur Nakhodkin
152 U Lithomantic Barrage @Viko Menezes
+153 C Marauding Dreadship @Tiffany Turrill
+154 C Mirran Banesplitter @Chris Seaman
+155 R Nahiri's Warcrafting @Zara Alfonso
+156 C Onakke Javelineer @Joseph Weston
+157 C Pyretic Prankster @Francis Tneh
+158 C Ral's Reinforcements @Nils Hamm
159 U Ramosian Greatsword @Jason A. Engle
160 R Rampaging Raptor @Denys Tsiperko
+161 C Redcap Heelslasher @Alexey Kruglov
162 U Scrappy Bruiser @David Auden Nash
+163 C Searing Barb @Tiffany Turrill
+164 C Shatter the Source @Artur Nakhodkin
165 U Shivan Branch-Burner @Aaron Miller
166 U Stoke the Flames @Liiga Smilshkalne
+167 C Thrashing Frontliner @Pavel Kolomeyets
+168 C Trailblazing Historian @Jason A. Engle
169 M Urabrask @Campbell White
+170 C Volcanic Spite @Kevin Sidharta
171 R Voldaren Thrillseeker @Viko Menezes
+172 C War-Trained Slasher @Francis Tneh
+173 C Wrenn's Resolve
174 R Ancient Imperiosaur @Piotr Foksowicz
+175 C Arachnoid Adaptation @Isis
+176 C Atraxa's Fall @Xavier Ribeiro
+177 C Blighted Burgeoning @Piotr Foksowicz
+178 C Bonded Herdbeast @Jokubas Uogintas
+179 C Chomping Kavu @John Tedrick
+180 C Converter Beast @Uriah Voth
181 U Copper Host Crusher @Nicholas Gregory
+182 C Cosmic Hunger @Konstantin Porubov
+183 C Crystal Carapace @Sam Burley
184 R Deeproot Wayfinder @Anna Pavleeva
185 R Doomskar Warrior @Chris Rallis
+186 C Fertilid's Favor @Kevin Sidharta
187 R Glistening Dawn @Chris Ostrowski
188 U Gnottvold Hermit @Artur Nakhodkin
+189 U Herbology Instructor @Sergey Glushakov
190 R Invasion of Ikoria @Antonio José Manzanedo
191 R Invasion of Ixalan @Viktor Titov
192 U Invasion of Muraganda @Adam Paquette
193 M Invasion of Shandalar @Adam Paquette
194 U Invasion of Zendikar @Diego Gisbert
+195 C Iridescent Blademaster @Livia Prima
196 U Kami of Whispered Hopes @Filipe Pagliuso
+197 C Overgrown Pest @Eelis Kyttanen
198 R Ozolith, the Shattered Spire @Daarken
+199 C Placid Rottentail @Filip Burburan
200 R Polukranos Reborn @David Auden Nash
+201 C Portent Tracker @Caroline Gariba
202 U Ravenous Sailback @Andrew Mar
203 U Sandstalker Moloch @Donato Giancola
+204 C Seed of Hope @Gaboleps
+205 C Serpent-Blade Assailant @Durion
206 U Storm the Seedcore @Jason Rainville
207 U Streetwise Negotiator @Brent Hollowell
208 U Tandem Takedown @Yigit Koroglu
+209 U Tangled Skyline @Martin de Diego Sádaba
+210 C Timberland Ancient @Pavel Kolomeyets
211 R Tribute to the World Tree @Kristina Carroll
+212 C Vengeant Earth @Jonas De Ro
213 M Vorinclex @Daarken
+214 C War Historian @Ryan Valle
+215 C Wary Thespian @Billy Christian
+216 C Wildwood Escort @Taras Susak
217 M Wrenn and Realmbreaker @Cristi Balanescu
218 R Baral and Kari Zev @Fariba Khamseh
219 M Borborygmos and Fblthp @Rudy Siswanto
@@ -150,6 +251,7 @@ ScryfallCode=MOM
243 U Joyful Stormsculptor @Christina Kraus
244 R Kogla and Yidaro @Chris Rahn
245 M Kroxa and Kunoros @Ignatius Budi
+246 U Marshal of Zhalfir @Darren Tan
247 U Mirror-Shield Hoplite @Alex Brock
248 U Mutagen Connoisseur @Alex Brock
249 R Omnath, Locus of All @Bryan Sola
@@ -157,12 +259,19 @@ ScryfallCode=MOM
251 U Rampaging Geoderm @Randy Vargas
252 R Rankle and Torbran @Viko Menezes
253 U Sculpted Perfection @Chris Seaman
+254 U Stormclaw Rager @Nicholas Elias
255 M Thalia and The Gitrog Monster @Howard Lyon
256 R Yargle and Multani @Slawomir Maniak
257 M Zimone and Dina @Lie Setiawan
258 M Zurgo and Ojutai @Daarken
+259 C Flywheel Racer @Joshua Cairos
+260 C Halo Hopper @Daniel Ljunggren
+261 C Kitesail @Ben Hill
+262 C Phyrexian Archivist @Daniel Romanovsky
263 R Realmbreaker, the Invasion Tree @Kekai Kotaki
+264 C Skittering Surveyor @Igor Kieryluk
265 M Sword of Once and Future @Joshua Cairos
+266 C Urn of Godfire @Ovidio Cartagena
267 C Bloodfell Caves @Jorge Jacinto
268 C Blossoming Sands @Robin Olausson
269 C Dismal Backwater @Chris Ostrowski
@@ -191,8 +300,11 @@ ScryfallCode=MOM
292 M Elesh Norn @Kekai Kotaki
293 R Heliod, the Radiant Dawn @Jason A. Engle
294 M Jin-Gitaxias @Dominik Mayer
+295 R Rona, Herald of Invasion @Daniel Lieske
296 R Ayara, Widow of the Realm @Josu Hernaiz
+297 M Sheoldred @Dominik Mayer
298 R Etali, Primal Conqueror @Yeong-Hao Han
+299 M Urabrask @Kekai Kotaki
300 R Polukranos Reborn @Jason A. Engle
301 M Vorinclex @Flavio Girón
302 R Baral and Kari Zev @Magali Villeneuve
@@ -237,6 +349,7 @@ ScryfallCode=MOM
345 R Guardian of Ghirapur @Cynthia Sheppard
346 R Knight-Errant of Eos @Kevin Sidharta
347 M Monastery Mentor @Brian Valeza
+348 R Progenitor Exarch @Marie Magny
349 R Sunfall @Kasia 'Kafis' Zielińska
350 R Chrome Host Seedshark @Donato Giancola
351 R Complete the Circuit @Eelis Kyttanen
@@ -250,8 +363,10 @@ ScryfallCode=MOM
359 R Grafted Butcher @Zack Stella
360 R Hoarding Broodlord @Filip Burburan
361 R Pile On @Javier Charro
+362 R Bloodfeather Phoenix @Rudy Siswanto
363 R City on Fire @Jake Murray
364 R Into the Fire @Grzegorz Rutkowski
+365 R Nahiri's Warcrafting @Zara Alfonso
366 R Rampaging Raptor @Denys Tsiperko
367 R Voldaren Thrillseeker @Viko Menezes
368 R Ancient Imperiosaur @Piotr Foksowicz
diff --git a/forge-gui/res/editions/Multiverse Legends.txt b/forge-gui/res/editions/Multiverse Legends.txt
index 6b455f6ca21..144dbeedaf6 100644
--- a/forge-gui/res/editions/Multiverse Legends.txt
+++ b/forge-gui/res/editions/Multiverse Legends.txt
@@ -6,28 +6,74 @@ Type=Collector_Edition
ScryfallCode=MUL
[cards]
+2 U Daxos, Blessed by the Sun @Jason A. Engle
3 M Elesh Norn, Grand Cenobite @Flavio Girón
+4 M Kenrith, the Returned King @Aaron Miller
+5 U Kwende, Pride of Femeref
+6 R Sram, Senior Edificer @Adam Paquette
7 R Thalia, Guardian of Thraben @Joshua Alvarado
+8 R Baral, Chief of Compliance @Yeong-Hao Han
9 R Emry, Lurker of the Loch @Wylie Beckert
10 U Inga Rune-Eyes @rishxxv
11 M Jin-Gitaxias, Core Augur @Kekai Kotaki
+12 U Tetsuko Umezawa, Fugitive @Serena Malyon
+13 R Ayara, First of Locthwain @Omar Rayyan
14 R Horobi, Death's Wail @Rorubei
+15 R Seizan, Perverter of Truth @Maji
16 M Sheoldred, Whispering One @Flavio Girón
17 M Skithiryx, the Blight Dragon @Kekai Kotaki
+18 U Tymaret, Chosen from Death @Jason A. Engle
19 U Yargle, Glutton of Urborg @Serena Malyon
20 R Captain Lannery Storm @Jody Clark
21 M Ragavan, Nimble Pilferer @Magali Villeneuve
+22 R Squee, the Immortal @Eshpur
23 M Urabrask the Hidden @Flavio Girón
+24 U Valduk, Keeper of the Flame @Tyler Crook
25 U Zada, Hedron Grinder @Dominik Mayer
+26 U Fynn, the Fangbearer @GodMachine
+27 R Goreclaw, Terror of Qal Sisma @Domenico Cava
+28 U Renata, Called to the Hunt @Jason A. Engle
29 M Vorinclex, Voice of Hunger @JungShan
30 R Yedora, Grave Gardener @Matthew G. Lewis
+31 U Aegar, the Freezing Flame @Richard Luong
+32 R Arixmethes, Slumbering Isle @Jason A. Engle
33 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez
+34 R Atris, Oracle of Half-Truths @Jason A. Engle
+35 M Aurelia, the Warleader @Alex Dos Diaz
+36 R Brudiclad, Telchor Engineer @JungShan
+37 U Dina, Soul Steeper @Benjamin Ee
+38 M Ezuri, Claw of Progress @JungShan
+39 R Firesong and Sunspeaker @Daniel Lieske
+40 U Firja, Judge of Valor @WolfSkullJack
+41 M Grimgrin, Corpse-Born @Cabrol
+42 R Gyruda, Doom of Depths @Steve Ellis
43 U Imoti, Celebrant of Bounty @Bastien L. Deharme
44 R Jegantha, the Wellspring @Steve Ellis
+45 R Judith, the Scourge Diva @Benjamin Ee
+46 U Juri, Master of the Revue @Julie Dillon
+47 R Kaheera, the Orphanguard @Denis Medri
+48 R Keruga, the Macrosage @Denis Medri
49 M Kroxa, Titan of Death's Hunger @Jason A. Engle
+50 R Lathiel, the Bounteous Dawn @Shawn Wood
+51 R Lurrus of the Dream-Den @Steve Ellis
+52 R Lutri, the Spellchaser @Justine Mara Andersen
53 M Niv-Mizzet Reborn @Illustranesia
+54 R Obosh, the Preypiercer @Denis Medri
+55 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez
+56 U Raff, Weatherlight Stalwart @Nino Vecia
+57 U Reyav, Master Smith @Warren Mahy
+58 U Rona, Sheoldred's Faithful @Serena Malyon
+59 U Shanna, Sisay's Legacy @Rhonda Libbey
60 R Taigam, Ojutai Master @Domenico Cava
+61 R Teysa Karlov @Barbara Rosiak
+62 R Umori, the Collector @Daniel Warren Johnson
+63 M Yarok, the Desecrated
+64 R Yorion, Sky Nomad @Justine Mara Andersen
+65 R Zirda, the Dawnwaker @Justine Mara Andersen
68 M Elesh Norn, Grand Cenobite @Igor Kieryluk
+69 M Kenrith, the Returned King @Kieran Yanner
+71 R Sram, Senior Edificer @Chris Rahn
+73 R Baral, Chief of Compliance @Wesley Burt
76 M Jin-Gitaxias, Core Augur @Eric Deschamps
81 M Sheoldred, Whispering One @Jana Schirmer & Johannes Voss
82 M Skithiryx, the Blight Dragon @Chippy
@@ -35,5 +81,86 @@ ScryfallCode=MUL
88 M Urabrask the Hidden @Brad Rigney
90 U Zada, Hedron Grinder @Chris Rallis
94 M Vorinclex, Voice of Hunger @Karl Kopinski
+97 R Arixmethes, Slumbering Isle @Dimitar Marinski
+101 R Brudiclad, Telchor Engineer @Daarken
+102 U Dina, Soul Steeper @Chris Rahn
+105 U Firja, Judge of Valor @Livia Prima
+107 R Gyruda, Doom of Depths @Tyler Jacobson
+112 R Kaheera, the Orphanguard @Ryan Pancoast
+113 R Keruga, the Macrosage @Dan Scott
114 M Kroxa, Titan of Death's Hunger @Vincent Proce
+115 R Lathiel, the Bounteous Dawn @Lucas Graciano
+116 R Lurrus of the Dream-Den @Slawomir Maniak
+117 R Lutri, the Spellchaser @Lie Setiawan
118 M Niv-Mizzet Reborn @Raymond Swanland
+119 R Obosh, the Preypiercer @Daarken
+121 U Raff, Weatherlight Stalwart @Eelis Kyttanen
+127 R Umori, the Collector @Jehan Choo
+128 M Yarok, the Desecrated @Daarken
+129 R Yorion, Sky Nomad @Steven Belledin
+130 R Zirda, the Dawnwaker @Jesper Ejsing
+131 R Anafenza, Kin-Tree Spirit @Domenico Cava
+132 U Daxos, Blessed by the Sun @Jason A. Engle
+133 M Elesh Norn, Grand Cenobite @Flavio Girón
+134 M Kenrith, the Returned King @Aaron Miller
+135 U Kwende, Pride of Femeref @Jody Clark
+136 R Sram, Senior Edificer @Adam Paquette
+137 R Thalia, Guardian of Thraben @Joshua Alvarado
+138 R Baral, Chief of Compliance @Yeong-Hao Han
+139 R Emry, Lurker of the Loch @Wylie Beckert
+140 U Inga Rune-Eyes @rishxxv
+141 M Jin-Gitaxias, Core Augur @Kekai Kotaki
+142 U Tetsuko Umezawa, Fugitive @Serena Malyon
+143 R Ayara, First of Locthwain @Omar Rayyan
+144 R Horobi, Death's Wail @Rorubei
+145 R Seizan, Perverter of Truth @Maji
+146 M Sheoldred, Whispering One @Flavio Girón
+147 M Skithiryx, the Blight Dragon @Kekai Kotaki
+148 U Tymaret, Chosen from Death @Jason A. Engle
+149 U Yargle, Glutton of Urborg @Serena Malyon
+150 R Captain Lannery Storm @Jody Clark
+151 M Ragavan, Nimble Pilferer @Magali Villeneuve
+152 R Squee, the Immortal @Eshpur
+153 M Urabrask the Hidden @Flavio Girón
+154 U Valduk, Keeper of the Flame @Tyler Crook
+155 U Zada, Hedron Grinder @Dominik Mayer
+156 U Fynn, the Fangbearer @GodMachine
+157 R Goreclaw, Terror of Qal Sisma @Domenico Cava
+158 U Renata, Called to the Hunt @Jason A. Engle
+159 M Vorinclex, Voice of Hunger @JungShan
+160 R Yedora, Grave Gardener @Matthew G. Lewis
+161 U Aegar, the Freezing Flame @Richard Luong
+162 R Arixmethes, Slumbering Isle @Jason A. Engle
+163 M Atraxa, Praetors' Voice @Justin Hernandez & Alexis Hernandez
+164 R Atris, Oracle of Half-Truths @Jason A. Engle
+165 M Aurelia, the Warleader @Alex Dos Diaz
+166 R Brudiclad, Telchor Engineer @JungShan
+167 U Dina, Soul Steeper @Benjamin Ee
+168 M Ezuri, Claw of Progress @JungShan
+169 R Firesong and Sunspeaker @Daniel Lieske
+170 U Firja, Judge of Valor @WolfSkullJack
+171 M Grimgrin, Corpse-Born @Cabrol
+172 R Gyruda, Doom of Depths @Steve Ellis
+173 U Imoti, Celebrant of Bounty @Bastien L. Deharme
+174 R Jegantha, the Wellspring @Steve Ellis
+175 R Judith, the Scourge Diva @Benjamin Ee
+176 U Juri, Master of the Revue @Julie Dillon
+177 R Kaheera, the Orphanguard @Denis Medri
+178 R Keruga, the Macrosage @Denis Medri
+179 M Kroxa, Titan of Death's Hunger @Jason A. Engle
+180 R Lathiel, the Bounteous Dawn @Shawn Wood
+181 R Lurrus of the Dream-Den @Steve Ellis
+182 R Lutri, the Spellchaser @Justine Mara Andersen
+183 M Niv-Mizzet Reborn @Illustranesia
+184 R Obosh, the Preypiercer @Denis Medri
+185 U Radha, Coalition Warlord @Justin Hernandez & Alexis Hernandez
+186 U Raff, Weatherlight Stalwart @Nino Vecia
+187 U Reyav, Master Smith @Warren Mahy
+188 U Rona, Sheoldred's Faithful @Serena Malyon
+189 U Shanna, Sisay's Legacy @Rhonda Libbey
+190 R Taigam, Ojutai Master @Domenico Cava
+191 R Teysa Karlov @Barbara Rosiak
+192 R Umori, the Collector @Daniel Warren Johnson
+193 M Yarok, the Desecrated
+194 R Yorion, Sky Nomad @Justine Mara Andersen
+195 R Zirda, the Dawnwaker @Justine Mara Andersen
diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt
index 8f3a7a2df9d..9daf0b5947a 100644
--- a/forge-gui/res/editions/Secret Lair Drop Series.txt
+++ b/forge-gui/res/editions/Secret Lair Drop Series.txt
@@ -684,6 +684,7 @@ ScryfallCode=SLD
724 R Lightning Strike @Frank Frazetta
726 R Zur the Enchanter @Chase Stone
727 R Fabled Passage @Warren Mahy
+278 R Themberchaud @Yang Luo
900 R The Scarab God @Barely Human
1001 M Elspeth, Knight-Errant @Volkan Baǵa
1002 R Patron Wizard @Volkan Baǵa