diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 091c9bf5b94..f0742812e9f 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -18,15 +18,11 @@ package forge.game; import java.util.List; +import java.util.Map; +import com.google.common.collect.*; import org.apache.commons.lang3.StringUtils; -import com.google.common.collect.Iterables; -import com.google.common.collect.Lists; -import com.google.common.collect.Sets; -import com.google.common.collect.Table; -import com.google.common.collect.TreeBasedTable; - import forge.card.MagicColor; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; @@ -233,21 +229,23 @@ public final class GameActionUtil { if (keyword.contains(":")) { final String[] k = keyword.split(":"); flashback.setPayCosts(new Cost(k[1], false)); - String extra = k.length > 2 ? k[2] : ""; - if (!extra.isEmpty()) { - String[] parts = extra.split("\\$"); - String key = parts[0]; - String value = parts[1]; - flashback.putParam(key, value); + String extraParams = k.length > 2 ? k[2] : ""; + if (!extraParams.isEmpty()) { + Map extraParamMap = + Maps.newHashMap(AbilityFactory.getMapParams(extraParams)); + for (Map.Entry param : extraParamMap.entrySet()) { + flashback.putParam(param.getKey(), param.getValue()); + } } } alternatives.add(flashback); } else if (keyword.startsWith("Foretell")) { // Foretell cast only from Exile - if (!source.isInZone(ZoneType.Exile) || !source.isForetold() || source.isForetoldThisTurn() || !activator.equals(source.getOwner())) { + if (!source.isInZone(ZoneType.Exile) || !source.isForetold() || source.isForetoldThisTurn() || + !activator.equals(source.getOwner())) { continue; } - // skip this part for fortell by external source + // skip this part for foretell by external source if (keyword.equals("Foretell")) { continue; } 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 20800d449ab..4db52c941bc 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2531,7 +2531,7 @@ public class Card extends GameEntity implements Comparable, IHasSVars { sbx.append(" (").append(inst.getReminderText()).append(")"); sbBefore.append(sbx).append("\r\n"); } - }else if (keyword.startsWith("AlternateAdditionalCost")) { + } else if (keyword.startsWith("AlternateAdditionalCost")) { final String[] k = keyword.split(":"); final Cost cost1 = new Cost(k[1], false); final Cost cost2 = new Cost(k[2], false); 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 6ee77425263..4b805cbd9be 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2169,8 +2169,10 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append("Event$ Moved | ValidCard$ Card.Self | Origin$ Stack | ExcludeDestination$ Exile "); sb.append("| ValidStackSa$ Spell.Flashback | Description$ Flashback"); + String reminderInsert = ""; - if (keyword.contains(":")) { // K:Flashback:Cost:ExtraParam(Key$Value):ExtraDescription:Cost(for formatting) + // K:Flashback:Cost:ExtraParams:ExtraDescription:cost for display:reminder text insert + if (keyword.contains(":")) { final String[] k = keyword.split(":"); final Cost cost = new Cost(k[1], false); sb.append(cost.isOnlyManaCost() ? " " : "—"); @@ -2193,10 +2195,17 @@ public class CardFactoryUtil { sb.append(". ").append(extraDesc); } } + reminderInsert = k.length > 5 ? k[5] : ""; } sb.append(" ("); - sb.append(inst.getReminderText()); + if (!reminderInsert.isEmpty()) { + String reminder = inst.getReminderText(); + sb.append(reminder, 0, 65).append(" "); + sb.append(reminderInsert).append(reminder, 65, 81); + } else { + sb.append(inst.getReminderText()); + } sb.append(")"); String repeffstr = sb.toString(); diff --git a/forge-game/src/main/java/forge/game/card/CardView.java b/forge-game/src/main/java/forge/game/card/CardView.java index 86121a87cc3..2bcac6fb428 100644 --- a/forge-game/src/main/java/forge/game/card/CardView.java +++ b/forge-game/src/main/java/forge/game/card/CardView.java @@ -1492,6 +1492,11 @@ public class CardView extends GameEntityView { public boolean isArtifact() { return getType().isArtifact(); } + public boolean isNyx() { + if (!getType().isEnchantment() || getType().getCoreTypes() == null) + return false; + return Iterables.size(getType().getCoreTypes()) > 1; + } } //special methods for updating card and player properties as needed and returning the new collection diff --git a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java index 293d2cfdfaf..602e304e814 100644 --- a/forge-game/src/main/java/forge/game/cost/CostSacrifice.java +++ b/forge-game/src/main/java/forge/game/cost/CostSacrifice.java @@ -74,10 +74,17 @@ public class CostSacrifice extends CostPartWithList { @Override public final String toString() { final StringBuilder sb = new StringBuilder(); - sb.append("Sacrifice "); + if (getAmount().equals("X")) { + sb.append("You may sacrifice "); + } else { + sb.append("Sacrifice "); + } if (payCostFromSource()) { sb.append(getType()); + } else if (getAmount().equals("X")) { + String typeDesc = getType().toLowerCase().replace(";","s and/or "); + sb.append("any number of ").append(typeDesc).append("s"); } else { final String desc = ObjectUtils.firstNonNull(getTypeDescription(), getType()); sb.append(Cost.convertAmountTypeToWords(convertAmount(), getAmount(), desc)); diff --git a/forge-gui-mobile/src/forge/assets/FSkinImage.java b/forge-gui-mobile/src/forge/assets/FSkinImage.java index e70cbd8bf5f..cbc5ef4e426 100644 --- a/forge-gui-mobile/src/forge/assets/FSkinImage.java +++ b/forge-gui-mobile/src/forge/assets/FSkinImage.java @@ -136,6 +136,31 @@ public enum FSkinImage implements FImage { CARDBG_WG (FSkinProp.IMG_CARDBG_WG, SourceFile.CARDBG), CARDBG_WR (FSkinProp.IMG_CARDBG_WR, SourceFile.CARDBG), CARDBG_WU (FSkinProp.IMG_CARDBG_WU, SourceFile.CARDBG), + //PWBG + PWBG_B (FSkinProp.IMG_PWBG_B, SourceFile.CARDBG), + PWBG_BG (FSkinProp.IMG_PWBG_BG, SourceFile.CARDBG), + PWBG_BR (FSkinProp.IMG_PWBG_BR, SourceFile.CARDBG), + PWBG_C (FSkinProp.IMG_PWBG_C, SourceFile.CARDBG), + PWBG_G (FSkinProp.IMG_PWBG_G, SourceFile.CARDBG), + PWBG_M (FSkinProp.IMG_PWBG_M, SourceFile.CARDBG), + PWBG_R (FSkinProp.IMG_PWBG_R, SourceFile.CARDBG), + PWBG_RG (FSkinProp.IMG_PWBG_RG, SourceFile.CARDBG), + PWBG_U (FSkinProp.IMG_PWBG_U, SourceFile.CARDBG), + PWBG_UB (FSkinProp.IMG_PWBG_UB, SourceFile.CARDBG), + PWBG_UG (FSkinProp.IMG_PWBG_UG, SourceFile.CARDBG), + PWBG_UR (FSkinProp.IMG_PWBG_UR, SourceFile.CARDBG), + PWBG_W (FSkinProp.IMG_PWBG_W, SourceFile.CARDBG), + PWBG_WB (FSkinProp.IMG_PWBG_WB, SourceFile.CARDBG), + PWBG_WG (FSkinProp.IMG_PWBG_WG, SourceFile.CARDBG), + PWBG_WR (FSkinProp.IMG_PWBG_WR, SourceFile.CARDBG), + PWBG_WU (FSkinProp.IMG_PWBG_WU, SourceFile.CARDBG), + //NYX OVERLAY + NYX_B (FSkinProp.IMG_NYX_B, SourceFile.CARDBG), + NYX_G (FSkinProp.IMG_NYX_G, SourceFile.CARDBG), + NYX_M (FSkinProp.IMG_NYX_M, SourceFile.CARDBG), + NYX_R (FSkinProp.IMG_NYX_R, SourceFile.CARDBG), + NYX_U (FSkinProp.IMG_NYX_U, SourceFile.CARDBG), + NYX_W (FSkinProp.IMG_NYX_W, SourceFile.CARDBG), //Gameplay TAP (FSkinProp.IMG_TAP, SourceFile.MANAICONS), diff --git a/forge-gui-mobile/src/forge/card/CardImageRenderer.java b/forge-gui-mobile/src/forge/card/CardImageRenderer.java index fcd3f8ba82a..a7b267366f5 100644 --- a/forge-gui-mobile/src/forge/card/CardImageRenderer.java +++ b/forge-gui-mobile/src/forge/card/CardImageRenderer.java @@ -815,6 +815,8 @@ public class CardImageRenderer { } public static Color[] drawCardBackgroundTexture(CardStateView state, Graphics g, List backColors, float x, float y, float w, float h) { boolean isHybrid = state.getManaCost().hasHybrid(); + boolean isPW = state.isPlaneswalker(); + boolean isNyx = state.isNyx(); Color[] colors = new Color[backColors.size()]; for (int i = 0; i < colors.length; i++) { DetailColors dc = backColors.get(i); @@ -825,58 +827,77 @@ public class CardImageRenderer { if (backColors.get(0) == DetailColors.FACE_DOWN) { g.drawImage(FSkinImage.CARDBG_C, x, y, w,h); } else if (backColors.get(0) == DetailColors.LAND) { - g.drawImage(FSkinImage.CARDBG_L, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_C : FSkinImage.CARDBG_L, x, y, w,h); }else if (backColors.get(0) == DetailColors.MULTICOLOR) { - g.drawImage(FSkinImage.CARDBG_M, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_M : FSkinImage.CARDBG_M, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_M, x, y, w, (h/2)+(h/5)); } else if (backColors.get(0) == DetailColors.COLORLESS) { - if (state.isVehicle()) + if (isPW) + g.drawImage(FSkinImage.PWBG_C, x, y, w,h); + else if (state.isVehicle()) g.drawImage(FSkinImage.CARDBG_V, x, y, w,h); else if (state.isArtifact()) g.drawImage(FSkinImage.CARDBG_A, x, y, w,h); else g.drawImage(FSkinImage.CARDBG_C, x, y, w,h); + //todo add NYX for colorless? } else if (backColors.get(0) == DetailColors.GREEN) { - g.drawImage(FSkinImage.CARDBG_G, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_G : FSkinImage.CARDBG_G, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_G, x, y, w, (h/2)+(h/5)); } else if (backColors.get(0) == DetailColors.RED) { - g.drawImage(FSkinImage.CARDBG_R, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_R : FSkinImage.CARDBG_R, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_R, x, y, w, (h/2)+(h/5)); } else if (backColors.get(0) == DetailColors.BLACK) { - g.drawImage(FSkinImage.CARDBG_B, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_B : FSkinImage.CARDBG_B, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_B, x, y, w, (h/2)+(h/5)); } else if (backColors.get(0) == DetailColors.BLUE) { - g.drawImage(FSkinImage.CARDBG_U, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_U : FSkinImage.CARDBG_U, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_U, x, y, w, (h/2)+(h/5)); } else if (backColors.get(0) == DetailColors.WHITE) { - g.drawImage(FSkinImage.CARDBG_W, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_W : FSkinImage.CARDBG_W, x, y, w,h); + if (isNyx) + g.drawImage(FSkinImage.NYX_W, x, y, w, (h/2)+(h/5)); } break; case 2: if (!isHybrid) { - g.drawImage(FSkinImage.CARDBG_M, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_M : FSkinImage.CARDBG_M, x, y, w, h); } else if (backColors.contains(DetailColors.WHITE) && backColors.contains(DetailColors.BLUE)) { - g.drawImage(FSkinImage.CARDBG_WU, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_WU : FSkinImage.CARDBG_WU, x, y, w, h); } else if (backColors.contains(DetailColors.WHITE) && backColors.contains(DetailColors.BLACK)) { - g.drawImage(FSkinImage.CARDBG_WB, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_WB : FSkinImage.CARDBG_WB, x, y, w, h); } else if (backColors.contains(DetailColors.WHITE) && backColors.contains(DetailColors.RED)) { - g.drawImage(FSkinImage.CARDBG_WR, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_WR : FSkinImage.CARDBG_WR, x, y, w, h); } else if (backColors.contains(DetailColors.WHITE) && backColors.contains(DetailColors.GREEN)) { - g.drawImage(FSkinImage.CARDBG_WG, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_WG : FSkinImage.CARDBG_WG, x, y, w, h); } else if (backColors.contains(DetailColors.BLUE) && backColors.contains(DetailColors.BLACK)) { - g.drawImage(FSkinImage.CARDBG_UB, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_UB : FSkinImage.CARDBG_UB, x, y, w, h); } else if (backColors.contains(DetailColors.BLUE) && backColors.contains(DetailColors.RED)) { - g.drawImage(FSkinImage.CARDBG_UR, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_UR : FSkinImage.CARDBG_UR, x, y, w, h); } else if (backColors.contains(DetailColors.BLUE) && backColors.contains(DetailColors.GREEN)) { - g.drawImage(FSkinImage.CARDBG_UG, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_UG : FSkinImage.CARDBG_UG, x, y, w, h); } else if (backColors.contains(DetailColors.BLACK) && backColors.contains(DetailColors.RED)) { - g.drawImage(FSkinImage.CARDBG_BR, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_BR : FSkinImage.CARDBG_BR, x, y, w, h); } else if (backColors.contains(DetailColors.BLACK) && backColors.contains(DetailColors.GREEN)) { - g.drawImage(FSkinImage.CARDBG_BG, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_BG : FSkinImage.CARDBG_BG, x, y, w, h); } else if (backColors.contains(DetailColors.RED) && backColors.contains(DetailColors.GREEN)) { - g.drawImage(FSkinImage.CARDBG_RG, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_RG : FSkinImage.CARDBG_RG, x, y, w, h); } + if (isNyx) + g.drawImage(FSkinImage.NYX_M, x, y, w, (h/2)+(h/5)); break; case 3: - g.drawImage(FSkinImage.CARDBG_M, x, y, w, h); + g.drawImage(isPW ? FSkinImage.PWBG_M : FSkinImage.CARDBG_M, x, y, w, h); + if (isNyx) + g.drawImage(FSkinImage.NYX_M, x, y, w, (h/2)+(h/5)); break; default: - g.drawImage(FSkinImage.CARDBG_C, x, y, w,h); + g.drawImage(isPW ? FSkinImage.PWBG_C : FSkinImage.CARDBG_C, x, y, w,h); break; } return colors; diff --git a/forge-gui/res/cardsfolder/d/dargo_the_shipwrecker.txt b/forge-gui/res/cardsfolder/d/dargo_the_shipwrecker.txt index 00ad16407d4..9b79eb0b686 100755 --- a/forge-gui/res/cardsfolder/d/dargo_the_shipwrecker.txt +++ b/forge-gui/res/cardsfolder/d/dargo_the_shipwrecker.txt @@ -2,7 +2,7 @@ Name:Dargo, the Shipwrecker ManaCost:6 R Types:Legendary Creature Giant Pirate PT:7/5 -A:SP$ PermanentCreature | Cost$ 6 R Sac | AILogic$ SacToReduceCost | CostDesc$ As an additional cost to cast this spell, you may sacrifice any number of artifacts and/or creatures. | SpellDescription$ +A:SP$ PermanentCreature | Cost$ 6 R Sac | AILogic$ SacToReduceCost | CostDesc$ As an additional cost to cast this spell, you may sacrifice any number of artifacts and/or creatures. | SpellDescription$ S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Y | EffectZone$ All | Relative$ True | Description$ This spell costs {2} less to cast for each permanent sacrificed this way and {2} less to cast for each other artifact or creature you've sacrificed this turn. S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Secondary$ True | Description$ This spell costs {2} less to cast for each permanent sacrificed this way and {2} less to cast for each other artifact or creature you've sacrificed this turn. SVar:X:Count$xPaid diff --git a/forge-gui/res/cardsfolder/m/murktide_regent.txt b/forge-gui/res/cardsfolder/m/murktide_regent.txt index d5628f94fc1..9de9c031358 100644 --- a/forge-gui/res/cardsfolder/m/murktide_regent.txt +++ b/forge-gui/res/cardsfolder/m/murktide_regent.txt @@ -6,7 +6,7 @@ K:Delve K:Flying K:etbCounter:P1P1:X:no Condition:CARDNAME enters the battlefield with a +1/+1 counter on it for each instant and sorcery card exiled with it. SVar:X:Count$ValidExile Instant.ExiledWithSource,Sorcery.ExiledWithSource -T:Mode$ ChangesZone | ValidCard$ Instant,Sorcery | Origin$ Graveyard | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an instant or sorcery card leaves your graveyard, put a +1/+1 counter on CARDNAME. +T:Mode$ ChangesZone | ValidCard$ Instant.YouOwn,Sorcery.YouOwn | Origin$ Graveyard | Destination$ Any | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever an instant or sorcery card leaves your graveyard, put a +1/+1 counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | CounterType$ P1P1 | CounterNum$ 1 DeckNeeds:Type$Instant|Sorcery DeckHas:Ability$Counters diff --git a/forge-gui/res/cardsfolder/upcoming/arrogant_outlaw.txt b/forge-gui/res/cardsfolder/upcoming/arrogant_outlaw.txt new file mode 100644 index 00000000000..083e64201ec --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arrogant_outlaw.txt @@ -0,0 +1,10 @@ +Name:Arrogant Outlaw +ManaCost:2 B +Types:Creature Vampire Noble +PT:3/2 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigDrain | TriggerDescription$ When CARDNAME enters the battlefield, if an opponent lost life this turn, each opponent loses 2 life and you gain 2 life. +SVar:TrigDrain:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +DeckHas:Ability$LifeGain +SVar:X:Count$LifeOppsLostThisTurn +Oracle:When Arrogant Outlaw enters the battlefield, if an opponent lost life this turn, each opponent loses 2 life and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/bladestitched_skaab.txt b/forge-gui/res/cardsfolder/upcoming/bladestitched_skaab.txt new file mode 100644 index 00000000000..ba992ded9e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/bladestitched_skaab.txt @@ -0,0 +1,8 @@ +Name:Bladestitched Skaab +ManaCost:U B +Types:Creature Zombie Soldier +PT:2/3 +S:Mode$ Continuous | Affected$ Zombie.Other+YouCtrl | AddPower$ 1 | Description$ Other Zombies you control get +1/+0. +SVar:PlayMain1:TRUE +DeckHints:Type$Zombie +Oracle:Other Zombies you control get +1/+0. diff --git a/forge-gui/res/cardsfolder/upcoming/cant_stay_away.txt b/forge-gui/res/cardsfolder/upcoming/cant_stay_away.txt new file mode 100644 index 00000000000..e563a951c83 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cant_stay_away.txt @@ -0,0 +1,10 @@ +Name:Can't Stay Away +ManaCost:W B +Types:Sorcery +A:SP$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | ValidTgts$ Creature.YouOwn+cmcLE3 | TgtPrompt$ Select target creature card in your graveyard with mana value 3 or less | SubAbility$ DBAnimate | StackDescription$ Return {c:Targeted} from your graveyard to the battlefield. | SpellDescription$ Return target creature card with mana value 3 or less from your graveyard to the battlefield. It gains "If this creature would die, exile it instead." +SVar:DBAnimate:DB$ Animate | Replacements$ ReplaceDies | Defined$ ParentTarget | Duration$ Permanent | StackDescription$ It gains "If this creature would die, exile it instead." +SVar:ReplaceDies:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | ReplaceWith$ Exile | Description$ If this creature would die, exile it instead. +SVar:Exile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ ReplacedCard +K:Flashback:3 W B +DeckHas:Ability$Graveyard +Oracle:Return target creature card with mana value 3 or less from your graveyard to the battlefield. It gains "If this creature would die, exile it instead."\nFlashback {3}{W}{B} diff --git a/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt b/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt new file mode 100644 index 00000000000..163aa1bf9e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/corpse_cobble.txt @@ -0,0 +1,11 @@ +Name:Corpse Cobble +ManaCost:U B +Types:Instant +#Text:As an additional cost to cast this spell, sacrifice any number of creatures. +A:SP$ Token | Cost$ U B Sac | RememberCostCards$ True | TokenScript$ ub_x_x_zombie_menace | TokenPower$ Y | TokenToughness$ Y | SubAbility$ DBCleanup | SpellDescription$ Create an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +K:Flashback:3 U B Sac:::{3}{U}{B}:and any additional costs +SVar:X:Count$xPaid +SVar:Y:RememberedLKI$CardPower +DeckHas:Ability$Sacrifice & Ability$Token +Oracle:As an additional cost to cast this spell, sacrifice any number of creatures.\nCreate an X/X blue and black Zombie creature token with menace, where X is the total power of the sacrificed creatures.\nFlashback {3}{U}{B} (You may cast this card from your graveyard for its flashback cost and any additional costs. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/curse_of_shaken_faith.txt b/forge-gui/res/cardsfolder/upcoming/curse_of_shaken_faith.txt new file mode 100644 index 00000000000..e120f6312c5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/curse_of_shaken_faith.txt @@ -0,0 +1,9 @@ +Name:Curse of Shaken Faith +ManaCost:1 R +Types:Enchantment Aura Curse +K:Enchant player +A:SP$ Attach | Cost$ 1 R | ValidTgts$ Player | AILogic$ Curse +T:Mode$ SpellCast | ValidActivatingPlayer$ Player.EnchantedBy | ActivatorThisTurnCast$ GT1 | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigDamage | TriggerDescription$ Whenever enchanted player casts a spell other than the first spell they cast each turn or copies a spell, CARDNAME deals 2 damage to them. +T:Mode$ SpellCopy | ValidActivatingPlayer$ Player.EnchantedBy | NoResolvingCheck$ True | TriggerZones$ Battlefield | Execute$ TrigDamage | Secondary$ True | TriggerDescription$ Whenever enchanted player casts a spell other than the first spell they cast each turn or copies a spell, CARDNAME deals 2 damage to them. +SVar:TrigDamage:DB$ DealDamage | Defined$ TriggeredPlayer | NumDmg$ 2 +Oracle:Enchant player\nWhenever enchanted player casts a spell other than the first spell they cast each turn or copies a spell, Curse of Shaken Faith deals 2 damage to them. diff --git a/forge-gui/res/cardsfolder/upcoming/dawnhart_rejuvenator.txt b/forge-gui/res/cardsfolder/upcoming/dawnhart_rejuvenator.txt new file mode 100644 index 00000000000..775a8c6afc8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dawnhart_rejuvenator.txt @@ -0,0 +1,9 @@ +Name:Dawnhart Rejuvenator +ManaCost:3 G +Types:Creature Human Warlock +PT:2/4 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigGainLife | TriggerDescription$ When CARDNAME enters the battlefield, you gain 3 life. +SVar:TrigGainLife:DB$ GainLife | LifeAmount$ 3 +A:AB$ Mana | Cost$ T | Produced$ Any | SpellDescription$ Add one mana of any color. +DeckHas:Ability$LifeGain +Oracle:When Dawnhart Rejuvenator enters the battlefield, you gain 3 life.\n{T}: Add one mana of any color. diff --git a/forge-gui/res/cardsfolder/upcoming/famished_foragers.txt b/forge-gui/res/cardsfolder/upcoming/famished_foragers.txt new file mode 100644 index 00000000000..ffb21e42a67 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/famished_foragers.txt @@ -0,0 +1,10 @@ +Name:Famished Foragers +ManaCost:3 R +Types:Creature Vampire +PT:4/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | CheckSVar$ X | SVarCompare$ GE1 | Execute$ TrigMana | TriggerDescription$ When CARDNAME enters the battlefield, if an opponent lost life this turn, add {R}{R}{R}. +SVar:TrigMana:DB$ Mana | Produced$ R | Amount$ 3 +A:AB$ Draw | Cost$ 2 R Discard<1/Card> | NumCards$ 1 | SpellDescription$ Draw a card. +SVar:X:Count$LifeOppsLostThisTurn +DeckHas:Ability$Discard +Oracle:When Famished Foragers enters the battlefield, if an opponent lost life this turn, add {R}{R}{R}.\n{2}{R}, Discard a card: Draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/flame_channeler_embodiment_of_flame.txt b/forge-gui/res/cardsfolder/upcoming/flame_channeler_embodiment_of_flame.txt new file mode 100644 index 00000000000..7316c44bd99 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/flame_channeler_embodiment_of_flame.txt @@ -0,0 +1,24 @@ +Name:Flame Channeler +ManaCost:1 R +Types:Creature Human Wizard +PT:2/2 +T:Mode$ DamageDoneOnce | ValidSource$ Spell.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTransform | TriggerDescription$ When a spell you control deals damage, transform CARDNAME. +SVar:TrigTransform:DB$ SetState | Defined$ Self | Mode$ Transform +AlternateMode:DoubleFaced +Oracle:When a spell you control deals damage, transform Flame Channeler. + +ALTERNATE + +Name:Embodiment of Flame +ManaCost:no cost +Colors:red +Types:Creature Elemental Wizard +PT:3/3 +T:Mode$ DamageDoneOnce | ValidSource$ Spell.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigPutCounter | TriggerDescription$ Whenever a spell you control deals damage, put a flame counter on CARDNAME. +SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ FLAME | CounterNum$ 1 +A:AB$ Dig | Cost$ 1 SubCounter<1/FLAME> | DigNum$ 1 | ChangeNum$ All | DestinationZone$ Exile | Defined$ You | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top card of your library. You may play that card this turn. +SVar:DBEffect:DB$ Effect | StaticAbilities$ EffSModeContinuous | ExileOnMoved$ Exile | RememberObjects$ Remembered | SubAbility$ DBCleanup +SVar:EffSModeContinuous:Mode$ Continuous | EffectZone$ Command | Affected$ Card.IsRemembered | MayPlay$ True | AffectedZone$ Exile | Description$ You may play that card this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +DeckHas:Ability$Counters +Oracle:Whenever a spell you control deals damage, put a flame counter on Embodiment of Flame.\n{1}, Remove a flame counter from Embodiment of Flame: Exile the top card of your library. You may play that card this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/foul_play.txt b/forge-gui/res/cardsfolder/upcoming/foul_play.txt new file mode 100644 index 00000000000..45fb0ab6eb9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/foul_play.txt @@ -0,0 +1,7 @@ +Name:Foul Play +ManaCost:1 B +Types:Sorcery +A:SP$ Destroy | ValidTgts$ Creature.powerLE2 | TgtPrompt$ Select target creature with power 2 or less | SubAbility$ DBInvestigate | SpellDescription$ Destroy target creature with power 2 or less. Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") +SVar:DBInvestigate:DB$ Investigate +DeckHas:Ability$Token & Ability$Sacrifice +Oracle:Destroy target creature with power 2 or less. Investigate. (Create a colorless Clue artifact token with "{2}, Sacrifice this artifact: Draw a card.") diff --git a/forge-gui/res/cardsfolder/upcoming/gisa_glorious_resurrector.txt b/forge-gui/res/cardsfolder/upcoming/gisa_glorious_resurrector.txt index 0ad42785d43..7cbfd04b480 100644 --- a/forge-gui/res/cardsfolder/upcoming/gisa_glorious_resurrector.txt +++ b/forge-gui/res/cardsfolder/upcoming/gisa_glorious_resurrector.txt @@ -2,7 +2,7 @@ Name:Gisa, Glorious Resurrector ManaCost:2 B B Types:Legendary Creature Human Wizard PT:4/4 -R:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | ReplaceWith$ Exile | Description$ If a creature an opponent controls would die, exile it instead. +R:Event$ Moved | ActiveZones$ Battlefield | CheckSelfLKIZone$ True | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Creature.OppCtrl | ReplaceWith$ Exile | Description$ If a creature an opponent controls would die, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | IsPresent$ Card.ExiledWithSource | PresentZone$ Exile | Execute$ TrigChange | TriggerDescription$ At the beginning of your upkeep, put all creature cards exiled with CARDNAME onto the battlefield under your control. They gain decayed. (A creature with decayed can't block. When it attacks, sacrifice it at end of combat.) SVar:TrigChange:DB$ ChangeZoneAll | ChangeType$ Card.ExiledWithSource | Origin$ Exile | Destination$ Battlefield | GainControl$ True | RememberChanged$ True | SubAbility$ DBPump diff --git a/forge-gui/res/cardsfolder/upcoming/liesa_forgotten_archangel.txt b/forge-gui/res/cardsfolder/upcoming/liesa_forgotten_archangel.txt new file mode 100644 index 00000000000..afced2169c9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/liesa_forgotten_archangel.txt @@ -0,0 +1,13 @@ +Name:Liesa, Forgotten Archangel +ManaCost:2 W W B +Types:Legendary Creature Angel +PT:4/5 +K:Flying +K:Lifelink +T:Mode$ ChangesZone | ValidCard$ Creature.Other+nonToken+YouCtrl | Origin$ Battlefield | Destination$ Graveyard | Execute$ DelTrigReturn | TriggerZones$ Battlefield | TriggerDescription$ Whenever another nontoken creature you control dies, return that card to its owner's hand at the beginning of the next end step. +SVar:DelTrigReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End Of Turn | Execute$ DBReturn | RememberObjects$ TriggeredNewCardLKICopy +SVar:DBReturn:DB$ ChangeZone | Defined$ DelayTriggerRememberedLKI | Origin$ Graveyard | Destination$ Hand +R:Event$ Moved | ActiveZones$ Battlefield | Origin$ Battlefield | Destination$ Graveyard | ValidLKI$ Creature.OppCtrl | ReplaceWith$ Exile | CheckSelfLKIZone$ True | Description$ If a creature an opponent controls would die, exile it instead. +SVar:Exile:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | Defined$ ReplacedCard +DeckHas:Ability$LifeGain +Oracle:Flying, lifelink\nWhenever another nontoken creature you control dies, return that card to its owner's hand at the beginning of the next end step.\nIf a creature an opponent controls would die, exile it instead. diff --git a/forge-gui/res/cardsfolder/upcoming/lunar_frenzy.txt b/forge-gui/res/cardsfolder/upcoming/lunar_frenzy.txt new file mode 100644 index 00000000000..59fd2c0539c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/lunar_frenzy.txt @@ -0,0 +1,6 @@ +Name:Lunar Frenzy +ManaCost:X R +Types:Instant +A:SP$ Pump | Cost$ X R | ValidTgts$ Creature.YouCtrl | TgtPrompt$ Select target creature | NumAtt$ +X | KW$ First Strike & Trample | StackDescription$ {c:Targeted} gets +X/+0 and gains first strike and trample until end of turn. | SpellDescription$ Target creature you control gets +X/+0 and gains first strike and trample until end of turn. +SVar:X:Count$xPaid +Oracle:Target creature you control gets +X/+0 and gains first strike and trample until end of turn. diff --git a/forge-gui/res/cardsfolder/upcoming/ominous_roost.txt b/forge-gui/res/cardsfolder/upcoming/ominous_roost.txt new file mode 100644 index 00000000000..57bf9117227 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ominous_roost.txt @@ -0,0 +1,9 @@ +Name:Ominous Roost +ManaCost:2 U +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigToken | TriggerDescription$ When CARDNAME enters the battlefield or whenever you cast a spell from your graveyard, create a 1/1 blue Bird creature token with flying and "This creature can block only creatures with flying." +T:Mode$ SpellCast | ValidCard$ Card.wasCastFromGraveyard | ValidActivatingPlayer$ You | Execute$ TrigToken | TriggerZones$ Battlefield | Secondary$ True | TriggerDescription$ When CARDNAME enters the battlefield or whenever you cast a spell from your graveyard, create a 1/1 blue Bird creature token with flying and "This creature can block only creatures with flying." +SVar:TrigToken:DB$ Token | TokenOwner$ You | TokenAmount$ 1 | TokenScript$ u_1_1_bird_flying_blockflying +DeckHas:Ability$Token +DeckHints:Ability$Graveyard +Oracle:When Ominous Roost enters the battlefield or whenever you cast a spell from your graveyard, create a 1/1 blue Bird creature token with flying and "This creature can block only creatures with flying." diff --git a/forge-gui/res/cardsfolder/upcoming/stormrider_spirit.txt b/forge-gui/res/cardsfolder/upcoming/stormrider_spirit.txt new file mode 100644 index 00000000000..ab426453cfb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/stormrider_spirit.txt @@ -0,0 +1,7 @@ +Name:Stormrider Spirit +ManaCost:4 U +Types:Creature Spirit +PT:3/3 +K:Flash +K:Flying +Oracle:Flash (You may cast this spell any time you could cast an instant.)\nFlying diff --git a/forge-gui/res/cardsfolder/upcoming/visions_of_dominance.txt b/forge-gui/res/cardsfolder/upcoming/visions_of_dominance.txt index a12c291705f..f59748ea464 100644 --- a/forge-gui/res/cardsfolder/upcoming/visions_of_dominance.txt +++ b/forge-gui/res/cardsfolder/upcoming/visions_of_dominance.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Sorcery A:SP$ PutCounter | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | SubAbility$ DBPump | StackDescription$ Put a +1/+1 counter on {c:Targeted}, then double the number of +1/+1 counters on it. | SpellDescription$ Put a +1/+1 counter on target creature, then double the number of +1/+1 counters on it. SVar:DBPump:DB$ MultiplyCounter | Defined$ Targeted | CounterType$ P1P1 | StackDescription$ None -K:Flashback:8 G G:ReduceCost$X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. +K:Flashback:8 G G:ReduceCost$ X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand DeckHas:Ability$Counters Oracle:Put a +1/+1 counter on target creature, then double the number of +1/+1 counters on it.\nFlashback {8}{G}{G}. This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/visions_of_dread.txt b/forge-gui/res/cardsfolder/upcoming/visions_of_dread.txt index 9993a928797..6c64795e102 100644 --- a/forge-gui/res/cardsfolder/upcoming/visions_of_dread.txt +++ b/forge-gui/res/cardsfolder/upcoming/visions_of_dread.txt @@ -3,7 +3,7 @@ ManaCost:2 B Types:Sorcery A:SP$ ChooseCard | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | Choices$ Creature.TargetedPlayerOwn | ChoiceZone$ Graveyard | AILogic$ WorstCard | Amount$ 1 | SubAbility$ DBChangeZone | Mandatory$ True | StackDescription$ SpellDescription | SpellDescription$ Target opponent puts a creature card of their choice from their graveyard onto the battlefield under your control. SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | GainControl$ True | Destination$ Battlefield | StackDescription$ None -K:Flashback:8 B B:ReduceCost$X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. +K:Flashback:8 B B:ReduceCost$ X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand DeckHas:Ability$Graveyard Oracle:Target opponent puts a creature card of their choice from their graveyard onto the battlefield under your control.\nFlashback {8}{B}{B}. This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/visions_of_duplicity.txt b/forge-gui/res/cardsfolder/upcoming/visions_of_duplicity.txt index eed1d63f2c8..7804952a54f 100644 --- a/forge-gui/res/cardsfolder/upcoming/visions_of_duplicity.txt +++ b/forge-gui/res/cardsfolder/upcoming/visions_of_duplicity.txt @@ -3,7 +3,7 @@ ManaCost:2 U Types:Sorcery A:SP$ ExchangeControl | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control | TargetMin$ 2 | TargetMax$ 2 | TargetUnique$ True | StackDescription$ SpellDescription | SpellDescription$ Exchange control of two target creatures you don't control. SVar:DBChangeZone:DB$ ChangeZone | Defined$ ChosenCard | Origin$ Graveyard | GainControl$ True | Destination$ Battlefield -K:Flashback:8 U U:ReduceCost$X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. +K:Flashback:8 U U:ReduceCost$ X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand AI:RemoveDeck:All Oracle:Exchange control of two target creatures you don't control.\nFlashback {8}{U}{U}. This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/visions_of_glory.txt b/forge-gui/res/cardsfolder/upcoming/visions_of_glory.txt index d40d6e1ef6c..c1ff9a65f6a 100644 --- a/forge-gui/res/cardsfolder/upcoming/visions_of_glory.txt +++ b/forge-gui/res/cardsfolder/upcoming/visions_of_glory.txt @@ -3,7 +3,7 @@ ManaCost:4 W Types:Sorcery A:SP$ Token | TokenScript$ w_1_1_human | TokenAmount$ Y | SpellDescription$ Create a 1/1 white Human creature token for each creature you control. SVar:Y:Count$TypeYouCtrl.Creature -K:Flashback:8 W W:ReduceCost$X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. +K:Flashback:8 W W:ReduceCost$ X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand DeckHas:Ability$Token Oracle:Create a 1/1 white Human creature token for each creature you control.\nFlashback {8}{W}{W}. This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. (You may cast this card from your graveyard for its flashback cost. Then exile it.) diff --git a/forge-gui/res/cardsfolder/upcoming/visions_of_ruin.txt b/forge-gui/res/cardsfolder/upcoming/visions_of_ruin.txt index 180dbf4f43d..9d06a3c5718 100644 --- a/forge-gui/res/cardsfolder/upcoming/visions_of_ruin.txt +++ b/forge-gui/res/cardsfolder/upcoming/visions_of_ruin.txt @@ -5,7 +5,7 @@ A:SP$ Sacrifice | Defined$ Player.Opponent | SacValid$ Artifact | SacMessage$ ar SVar:DBToken:DB$ Token | TokenAmount$ Y | TokenScript$ c_a_treasure_sac | SubAbility$ DBCleanup | SpellDescription$ For each artifact sacrificed this way, you create a Treasure token. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:Y:Count$RememberedSize -K:Flashback:8 R R:ReduceCost$X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. +K:Flashback:8 R R:ReduceCost$ X:This spell costs {X} less to cast this way, where X is the greatest mana value of a commander you own on the battlefield or in the command zone. SVar:X:Count$HighestCMC_Card.IsCommander+YouOwn+inZoneBattlefield,Card.IsCommander+YouOwn+inZoneCommand DeckHas:Ability$Token & Ability$Sacrifice AI:RemoveDeck:Random diff --git a/forge-gui/res/editions/Innistrad Midnight Hunt Commander.txt b/forge-gui/res/editions/Innistrad Midnight Hunt Commander.txt index 1fe00e32f80..a278d392969 100644 --- a/forge-gui/res/editions/Innistrad Midnight Hunt Commander.txt +++ b/forge-gui/res/editions/Innistrad Midnight Hunt Commander.txt @@ -15,4 +15,12 @@ ScryfallCode=MIC 35 R Curse of Obsession @Irvin Rodriguez 36 R Visions of Ruin @Andrew Mar 37 R Visions of Dominance @Andrew Mar +39 M Leinore, Autumn Sovereign @Fariba Khamseh 40 R Wilhelt, the Rotcleaver @Chris Rallis +69 M Avacyn's Memorial @Kasia 'Kafis' Zielińska +70 R Visions of Glory @Alexander Mokhov +71 R Visions of Duplicity @Alexander Mokhov +72 R Visions of Dread @Andrew Mar +73 R Curse of Obsession @Irvin Rodriguez +74 R Visions of Ruin @Andrew Mar +75 R Visions of Dominance @Andrew Mar diff --git a/forge-gui/res/editions/Innistrad Midnight Hunt.txt b/forge-gui/res/editions/Innistrad Midnight Hunt.txt index c9caba9f062..e55a568fb39 100644 --- a/forge-gui/res/editions/Innistrad Midnight Hunt.txt +++ b/forge-gui/res/editions/Innistrad Midnight Hunt.txt @@ -12,43 +12,81 @@ Prerelease=6 Boosters, 1 RareMythic+ [cards] 3 U Beloved Beggar @Francisco Miyara 7 R Brutal Cathar @Karl Kopinski +8 C Candlegrove Witch @Anna Christenson 9 C Candletrap @Manuel Castañón +12 C Celestus Sanctifier @Irina Nordsol 17 M Enduring Angel @Irina Nordsol +20 U Gavony Dawnguard @Micah Epstein +23 C Hedgewitch's Mask @Ovidio Cartagena +30 C Ritual Guardian @Denman Rooke +36 C Sungold Barrage @Leanna Crossan 40 C Unruly Mob @Ryan Pancoast 42 C Baithook Angler @Uriah Voth 44 C Consider @Zezhou Chen +49 U Dissipate @David Palumbo 65 U Ominous Roost @Josu Hernaiz +71 M Poppet Stitcher @Simon Dominic 73 C Secrets of the Key @Alix Branwyn +76 R Sludge Monster @Svetlin Velinov 79 C Stormrider Spirit @Lake Hurwitz 81 R Triskaidekaphile @Slawomir Maniak 84 C Arrogant Outlaw @Aurore Folny 91 R Champion of the Perished @Kekai Kotaki +94 R Curse of Leeches @Uriah Voth 95 C Defenestrate @Darek Zabrocki 101 U Foul Play @Campbell White +103 R Gisa, Glorious Resurrector @Yongjae Choi +104 R Graveyard Trespasser @Chris Rallis +106 C Hobbling Zombie @Josh Hass 107 U Infernal Grasp @Naomi Baker 108 R Jadar, Ghoulcaller of Nephalia @Yongjae Choi 130 C Brimstone Vandal @Andreas Zafiratos -134 R Curse of Shaken Faith +134 R Curse of Shaken Faith @Campbell White 138 C Famished Foragers @Lorenzo Mastroianni 140 C Festival Crasher @Milivoj Ćeran -142 R Giestflame Reservoir @Anna Christenson +141 U Flame Channeler @Véronique Meignaud +142 R Geistflame Reservoir @Anna Christenson +144 C Immolation @Olena Richards 146 R Light Up the Night @Wei Wei +147 U Lunar Frenzy @Alix Branwyn 154 U Play with Fire @Svetlin Velinov 163 C Tavern Ruffian @Zoltan Boros -164 C Thermo-Alchemist @Raymond Swanland +164 U Thermo-Alchemist @Raymond Swanland 165 U Village Watch @Nestor Ossandon Leal +166 U Voldaren Ambusher @Evyn Fong +168 R Augur of Autumn @Billy Christian 175 C Candlelit Cavalry @Viko Menezes +176 U Clear Shot @Craig J Spearing +178 U Contortionist Troupe @Jesper Ejsing 180 C Dawnhart Rejuvenator @Darren Tan +182 U Defend the Celestus @Andrey Kuzinskiy 188 C Howl of the Hunt @Josu Hernaiz 189 C Might of the Old Ways @Zezhou Chen 192 C Pestilent Wolf @Oriana Menendez +197 R Saryth, the Viper's Fang @Igor Kieryluk 199 C Snarling Wolf @Ilse Gort +205 U Turn the Earth @Alayna Danner +206 R Unnatural Growth @Svetlin Velinov 208 M Wrenn and Seven @Heonhwa Choe 211 M Arlinn, the Pack's Hope @Anna Steinbauer +212 U Bladestitched Skaab @Dave Kendall +214 U Corpse Cobble @Ravenna Tran +215 R Croaking Counterpart @Yeong-Hao Han +218 U Devoted Grafkeeper @Raoul Vitale +220 U Diregraf Rebirth @Irina Nordsol +221 U Faithful Mending @Caroline Gariba +222 U Fleshtaker @Kev Walker 224 R Galvanic Iteration @Johann Bodin +225 R Ghoulcaller's Harvest @Anna Steinbauer 229 U Join the Dance @Raoul Vitale +231 U Kessig Naturalist @Johan Grenier +232 R Liesa, Forgotten Archangel @Dmitry Burmak +236 R Rite of Harmony @Rovina Cai 240 M Sigarda, Champion of Light @Howard Lyon 246 R Tovolar, Dire Overlord @Chris Rahn +249 U Vampire Socialite @Suzanne Helmigh +252 R The Celestus @Jonas De Ro +257 R Pithing Needle @Ovidio Cartagena 260 R Deserted Beach @Jonas De Ro 263 R Haunted Ridge @Jonas De Ro 265 R Overgrown Farmland @Jonas De Ro @@ -71,18 +109,34 @@ Prerelease=6 Boosters, 1 RareMythic+ 283 R Overgrown Farmland @Donato Giancola 284 R Rockfall Vale @Piotr Dura 285 R Shipwreck Marsh @Steven Belledin +286 R Brutal Cathar @Steve Ellis +287 C Candlegrove Witch @Brigitte Roka +290 R Graveyard Trespasser @Tyler Crook 296 C Tavern Ruffian @Michael Walsh 297 U Village Watch @Andrea De Dominicis -304 R Saryth, the Viper's Fang +301 C Dawnhart Rejuvenator @Cabrol +304 R Saryth, the Viper's Fang @Tyler Crook 307 M Arlinn, the Pack's Hope @Emma Rios +310 U Kessig Naturalist @Rafael Albuquerque 311 R Tovolar, Dire Overlord @Michael Walsh +314 R Gisa, Glorious Resurrector @Cabrol 315 R Jadar, Ghoulcaller of Nephalia @DZO +319 R Liesa, Forgotten Archangel @Evan Cagle 323 M Sigarda, Champion of Light @N.C. Winters -355 R Giestflame Reservoir @Anna Christenson +326 R Curse of Silence @Irina Nordsol +327 M Enduring Angel @Irina Nordsol +344 R Champion of the Perished @Kekai Kotaki +345 R Curse of Leeches @Uriah Voth +355 R Geistflame Reservoir @Anna Christenson 356 R Light Up the Night @Wei Wei +365 R Unnatural Growth @Svetlin Velinov 368 R Can't Stay Away @Milivoj Ćeran +369 R Croaking Counterpart @Yeong-Hao Han 371 R Galvanic Iteration @Johann Bodin -374 R Rite of Harmony +372 R Ghoulcaller's Harvest @Anna Steinbauer +374 R Rite of Harmony @Rovina Cai +377 R The Celestus @Jonas De Ro +378 R Pithing Needle @Ovidio Cartagena 380 L Plains @Andreas Rocha 381 L Island @Andreas Rocha 382 L Swamp @Kasia 'Kafis' Zielińska @@ -90,6 +144,7 @@ Prerelease=6 Boosters, 1 RareMythic+ 384 L Forest @Andreas Rocha 385 R Champion of the Perished @Daarken 386 R Triskaidekaphile @Mathias Kollros +387 U Gavony Dawnguard @Micah Epstein 388 C Consider @Zezhou Chen 389 U Infernal Grasp @Naomi Baker 390 U Play with Fire @Svetlin Velinov diff --git a/forge-gui/res/languages/en-US.properties b/forge-gui/res/languages/en-US.properties index 37aab2eaba8..154b153e3ed 100644 --- a/forge-gui/res/languages/en-US.properties +++ b/forge-gui/res/languages/en-US.properties @@ -2328,7 +2328,7 @@ lblRemoveAllCountersConfirm=Remove all counters? lblRemoveNTargetCounterFromCardPayCostConfirm=Pay Cost: Remove {0} {1} counter from {2}? lblRemoveCountersFromAInZoneCard=Remove counter(s) from a card in {0} lblSacrificeCardConfirm=Sacrifice {0}? -lblSelectATargetToSacrifice=Select a {0} to sacrifice ({1} left) +lblSelectATargetToSacrifice=Select {0} to sacrifice ({1} left) lblSelectOneOfCardsToTapAlreadyChosen=Select one of the cards to tap. Already chosen: lblSelectACreatureToTap=Select a creature to tap. lblEnoughValidCardNotToPayTheCost=Not enough valid cards left to tap to pay the cost. diff --git a/forge-gui/res/skins/default/sprite_cardbg.png b/forge-gui/res/skins/default/sprite_cardbg.png index 344a531202b..1eea41c2b03 100644 Binary files a/forge-gui/res/skins/default/sprite_cardbg.png and b/forge-gui/res/skins/default/sprite_cardbg.png differ diff --git a/forge-gui/res/tokenscripts/u_1_1_bird_flying_blockflying.txt b/forge-gui/res/tokenscripts/u_1_1_bird_flying_blockflying.txt new file mode 100644 index 00000000000..abfebbbacb6 --- /dev/null +++ b/forge-gui/res/tokenscripts/u_1_1_bird_flying_blockflying.txt @@ -0,0 +1,8 @@ +Name:Bird +ManaCost:no cost +Types:Creature Bird +Colors:blue +PT:1/1 +K:Flying +S:Mode$ CantBlockBy | ValidAttacker$ Creature.withoutFlying | ValidBlocker$ Creature.Self | Description$ This creature can block only creatures with flying. +Oracle:Flying\nThis creature can block only creatures with flying. diff --git a/forge-gui/res/tokenscripts/ub_x_x_zombie_menace.txt b/forge-gui/res/tokenscripts/ub_x_x_zombie_menace.txt new file mode 100644 index 00000000000..54ef7eb410f --- /dev/null +++ b/forge-gui/res/tokenscripts/ub_x_x_zombie_menace.txt @@ -0,0 +1,7 @@ +Name:Zombie +ManaCost:no cost +Types:Creature Zombie +Colors:blue,black +PT:*/* +K:Menace +Oracle:Menace diff --git a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java index 779eb4c2a42..743bbdc9ab4 100644 --- a/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java +++ b/forge-gui/src/main/java/forge/localinstance/skin/FSkinProp.java @@ -431,6 +431,31 @@ public enum FSkinProp { IMG_CARDBG_WG (new int[] {684, 1496, 339, 496}, PropType.CARDBG), IMG_CARDBG_WR (new int[] {1025, 1496, 339, 496}, PropType.CARDBG), IMG_CARDBG_WU (new int[] {1366, 1496, 339, 496}, PropType.CARDBG), + //FOR PW BG + IMG_PWBG_B (new int[] {2, 1994, 339, 496}, PropType.CARDBG), + IMG_PWBG_BG (new int[] {343, 1994, 339, 496}, PropType.CARDBG), + IMG_PWBG_BR (new int[] {684, 1994, 339, 496}, PropType.CARDBG), + IMG_PWBG_C (new int[] {1025, 1994, 339, 496}, PropType.CARDBG), + IMG_PWBG_G (new int[] {1366, 1994, 339, 496}, PropType.CARDBG), + IMG_PWBG_M (new int[] {2, 2492, 339, 496}, PropType.CARDBG), + IMG_PWBG_R (new int[] {343, 2492, 339, 496}, PropType.CARDBG), + IMG_PWBG_RG (new int[] {684, 2492, 339, 496}, PropType.CARDBG), + IMG_PWBG_U (new int[] {1025, 2492, 339, 496}, PropType.CARDBG), + IMG_PWBG_UB (new int[] {1366, 2492, 339, 496}, PropType.CARDBG), + IMG_PWBG_UG (new int[] {2, 2990, 339, 496}, PropType.CARDBG), + IMG_PWBG_UR (new int[] {343, 2990, 339, 496}, PropType.CARDBG), + IMG_PWBG_W (new int[] {684, 2990, 339, 496}, PropType.CARDBG), + IMG_PWBG_WB (new int[] {1025, 2990, 339, 496}, PropType.CARDBG), + IMG_PWBG_WG (new int[] {1366, 2990, 339, 496}, PropType.CARDBG), + IMG_PWBG_WR (new int[] {2, 3488, 339, 496}, PropType.CARDBG), + IMG_PWBG_WU (new int[] {343, 3488, 339, 496}, PropType.CARDBG), + //NYX OVERLAY + IMG_NYX_B (new int[] {684, 3488, 339, 248}, PropType.CARDBG), + IMG_NYX_G (new int[] {1025, 3488, 339, 248}, PropType.CARDBG), + IMG_NYX_M (new int[] {1366, 3488, 339, 248}, PropType.CARDBG), + IMG_NYX_R (new int[] {684, 3736, 339, 248}, PropType.CARDBG), + IMG_NYX_U (new int[] {1025, 3736, 339, 248}, PropType.CARDBG), + IMG_NYX_W (new int[] {1366, 3736, 339, 248}, PropType.CARDBG), IMG_FAV1 (new int[] {0, 0, 100, 100}, PropType.FAVICON), IMG_FAV2 (new int[] {100, 0, 100, 100}, PropType.FAVICON),