From 63ebd462b9c14c30099f34a6e898aafa54b08fe1 Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 27 May 2021 08:48:11 +0000 Subject: [PATCH 01/40] Update CopySpellAbilityEffect.java --- .../game/ability/effects/CopySpellAbilityEffect.java | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java index 7a0af1f764f..ea4cf2586e5 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CopySpellAbilityEffect.java @@ -3,6 +3,7 @@ package forge.game.ability.effects; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.function.Predicate; import com.google.common.collect.ImmutableMap; import com.google.common.collect.Iterables; @@ -166,7 +167,12 @@ public class CopySpellAbilityEffect extends SpellAbilityEffect { if (sa.hasParam("RandomTarget")){ List candidates = copy.getTargetRestrictions().getAllCandidates(chosenSA, true); if (sa.hasParam("RandomTargetRestriction")) { - candidates.removeIf(c -> !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa)); + candidates.removeIf(new Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); } GameEntity choice = Aggregates.random(candidates); resetFirstTargetOnCopy(copy, choice, chosenSA); From c96aeb25e5253212c953ce12c65a85309a9baf6a Mon Sep 17 00:00:00 2001 From: Anthony Calosa Date: Thu, 27 May 2021 08:48:52 +0000 Subject: [PATCH 02/40] Update ChangeTargetsEffect.java --- .../forge/game/ability/effects/ChangeTargetsEffect.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java index 4b37c69f0b3..e625c7ab55b 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeTargetsEffect.java @@ -100,7 +100,12 @@ public class ChangeTargetsEffect extends SpellAbilityEffect { changingTgtSA.resetTargets(); List candidates = changingTgtSA.getTargetRestrictions().getAllCandidates(changingTgtSA, true); if (sa.hasParam("RandomTargetRestriction")) { - candidates.removeIf(c -> !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa)); + candidates.removeIf(new java.util.function.Predicate() { + @Override + public boolean test(GameEntity c) { + return !c.isValid(sa.getParam("RandomTargetRestriction").split(","), sa.getActivatingPlayer(), sa.getHostCard(), sa); + } + }); } GameEntity choice = Aggregates.random(candidates); changingTgtSA.getTargets().add(choice); From 39ed24d133213e8e0d48da6f2c5b54f1db1eefeb Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Thu, 27 May 2021 11:26:28 +0100 Subject: [PATCH 03/40] FIX annoying bug increasing display brightness on macOS when starting content downloader --- forge-gui/src/main/java/forge/util/OperatingSystem.java | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/util/OperatingSystem.java b/forge-gui/src/main/java/forge/util/OperatingSystem.java index 933f2a77886..ac20dcf62a6 100644 --- a/forge-gui/src/main/java/forge/util/OperatingSystem.java +++ b/forge-gui/src/main/java/forge/util/OperatingSystem.java @@ -2,6 +2,8 @@ package forge.util; import forge.gui.FThreads; +import java.awt.event.KeyEvent; + public class OperatingSystem { private static String os = System.getProperty("os.name").toLowerCase(); @@ -47,7 +49,10 @@ public class OperatingSystem { try { //use robot to simulate user action so system standby timer resets java.awt.Robot robot = new java.awt.Robot(); - robot.keyPress(0xF002); //simulate F15 key press since that won't do anything noticable + if (isMac()) + robot.keyPress(KeyEvent.VK_F2); // F15 increases Display Brightness by default. Switch to F2 + else + robot.keyPress(KeyEvent.VK_F15); //simulate F15 key press since that won't do anything noticeable delayedKeepAwakeTask = ThreadUtil.delay(30000, keepSystemAwake); //repeat every 30 seconds until flag cleared } From 8d2d633f6d66b97cfa6174f34c692699fe0c67f1 Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Thu, 27 May 2021 10:38:51 +0000 Subject: [PATCH 04/40] FIX and Impros to CardEdition, CardInSet and Reader - Reader has a new updated regexp to deal with non-numerical collectorNumbers - CardInSet have been now made sortable based on CollectorNumber. To do so, collectorNumbers are transformed accordingly to allow for natural ordering (as expected) instead of lexicographic order. - CardEdition now return cards (CardInSet) as sorted, to allow for correct artIndex matching when creating corresponding `PaperCard` instances. Moreover, `compareTo` of card edition has been improved to also take into account set name (in cases of same release date). --- .../src/main/java/forge/card/CardEdition.java | 58 +++++++++++++++++-- .../src/main/java/forge/item/PaperCard.java | 32 +++++++++- forge-gui/res/editions/Alliances.txt | 8 +-- .../java/forge/itemmanager/ColumnDef.java | 17 +----- 4 files changed, 91 insertions(+), 24 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardEdition.java b/forge-core/src/main/java/forge/card/CardEdition.java index 51f3fc55226..81329c740f9 100644 --- a/forge-core/src/main/java/forge/card/CardEdition.java +++ b/forge-core/src/main/java/forge/card/CardEdition.java @@ -147,7 +147,7 @@ public final class CardEdition implements Comparable { // immutable } } - public static class CardInSet { + public static class CardInSet implements Comparable { public final CardRarity rarity; public final String collectorNumber; public final String name; @@ -171,6 +171,51 @@ public final class CardEdition implements Comparable { // immutable sb.append(name); return sb.toString(); } + + /** + * This method implements the main strategy to allow for natural ordering of collectorNumber + * (i.e. "1" < "10"), overloading the default lexicographic order (i.e. "10" < "1"). + * Any non-numerical parts in the input collectorNumber will be also accounted for, and attached to the + * resulting sorting key, accordingly. + * + * @param collectorNumber: Input collectorNumber tro transform in a Sorting Key + * @return A 5-digits zero-padded collector number + any non-numerical parts attached. + */ + public static String getSortableCollectorNumber(final String collectorNumber){ + String sortableCollNr = collectorNumber; + if (sortableCollNr == null || sortableCollNr.length() == 0) + sortableCollNr = "50000"; // very big number of 5 digits to have them in last positions + + // Now, for proper sorting, let's zero-pad the collector number (if integer) + int collNr; + try { + collNr = Integer.parseInt(sortableCollNr); + sortableCollNr = String.format("%05d", collNr); + } catch (NumberFormatException ex) { + String nonNumeric = sortableCollNr.replaceAll("[0-9]", ""); + String onlyNumeric = sortableCollNr.replaceAll("[^0-9]", ""); + if (sortableCollNr.startsWith(onlyNumeric)) // e.g. 12a, 37+, 2018f, + sortableCollNr = String.format("%05d", Integer.parseInt(onlyNumeric)) + nonNumeric; + else // e.g. WS6, S1 + sortableCollNr = nonNumeric + String.format("%05d", Integer.parseInt(onlyNumeric)); + } + return sortableCollNr; + } + + @Override + public int compareTo(CardInSet o) { + final int nameCmp = name.compareToIgnoreCase(o.name); + if (0 != nameCmp) { + return nameCmp; + } + String thisCollNr = getSortableCollectorNumber(collectorNumber); + String othrCollNr = getSortableCollectorNumber(o.collectorNumber); + final int collNrCmp = thisCollNr.compareTo(othrCollNr); + if (0 != collNrCmp) { + return collNrCmp; + } + return rarity.compareTo(o.rarity); + } } private final static SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd"); @@ -286,7 +331,9 @@ public final class CardEdition implements Comparable { // immutable public List getCards() { return cardMap.get("cards"); } public List getAllCardsInSet() { - return Lists.newArrayList(cardMap.values()); + ArrayList cardsInSet = Lists.newArrayList(cardMap.values()); + Collections.sort(cardsInSet); + return cardsInSet; } public boolean isModern() { return getDate().after(parseDate("2003-07-27")); } //8ED and above are modern except some promo cards and others @@ -305,7 +352,10 @@ public final class CardEdition implements Comparable { // immutable if (o == null) { return 1; } - return date.compareTo(o.date); + int dateComp = date.compareTo(o.date); + if (0 != dateComp) + return dateComp; + return name.compareTo(o.name); } @Override @@ -413,7 +463,7 @@ public final class CardEdition implements Comparable { // immutable * rarity - grouping #4 * name - grouping #5 */ - "(^([0-9]+.?) )?(([SCURML]) )?(.*)$" + "(^([0-9A-Z]+.?) )?(([SCURML]) )?(.*)$" ); ListMultimap cardMap = ArrayListMultimap.create(); diff --git a/forge-core/src/main/java/forge/item/PaperCard.java b/forge-core/src/main/java/forge/item/PaperCard.java index 395882cee5a..16e5d0ea8cb 100644 --- a/forge-core/src/main/java/forge/item/PaperCard.java +++ b/forge-core/src/main/java/forge/item/PaperCard.java @@ -243,6 +243,34 @@ public final class PaperCard implements Comparable, InventoryItemFro // return String.format("%s|%s", name, cardSet); } + /* + * This (utility) method transform a collectorNumber String into a key string for sorting. + * This method proxies the same strategy implemented in CardEdition.CardInSet class from which the + * collectorNumber of PaperCard instances are originally retrieved. + * This is also to centralise the criterion, whilst avoiding code duplication. + * + * Note: The method has been made private as this is for internal API use **only**, to allow + * for generalised comparison with IPaperCard instances (see compareTo) + * + * The public API of PaperCard includes a method (i.e. getCollectorNumberSortingKey) which applies + * this method on instance's own collector number. + * + * @return a zero-padded 5-digits String + any non-numerical content in the input String, properly attached. + */ + private static String makeCollectorNumberSortingKey(final String collectorNumber0){ + String collectorNumber = collectorNumber0; + if (collectorNumber.equals(NO_COLLECTOR_NUMBER)) + collectorNumber = null; + return CardEdition.CardInSet.getSortableCollectorNumber(collectorNumber); + } + + public String getCollectorNumberSortingKey(){ + // Hardly the case, but just invoke getter rather than direct + // attribute to be sure that collectorNumber has been retrieved already! + return makeCollectorNumberSortingKey(getCollectorNumber()); + } + + @Override public int compareTo(final IPaperCard o) { final int nameCmp = name.compareToIgnoreCase(o.getName()); @@ -253,7 +281,9 @@ public final class PaperCard implements Comparable, InventoryItemFro int setDiff = edition.compareTo(o.getEdition()); if (0 != setDiff) return setDiff; - final int collNrCmp = getCollectorNumber().compareTo(o.getCollectorNumber()); + String thisCollNrKey = getCollectorNumberSortingKey(); + String othrCollNrKey = makeCollectorNumberSortingKey(o.getCollectorNumber()); + final int collNrCmp = thisCollNrKey.compareTo(othrCollNrKey); if (0 != collNrCmp) { return collNrCmp; } diff --git a/forge-gui/res/editions/Alliances.txt b/forge-gui/res/editions/Alliances.txt index 2196f28be42..73d2dbfb0aa 100644 --- a/forge-gui/res/editions/Alliances.txt +++ b/forge-gui/res/editions/Alliances.txt @@ -105,10 +105,10 @@ Foil=NotSupported 30a C Lat-Nam's Legacy 30b C Lat-Nam's Legacy 31 R Library of Lat-Nam -55a C Lim-Dûl's High Guard -55b C Lim-Dûl's High Guard -108 U Lim-Dûl's Paladin -107 U Lim-Dûl's Vault +55a C Lim-Dul's High Guard +55b C Lim-Dul's High Guard +108 U Lim-Dul's Paladin +107 U Lim-Dul's Vault 122 R Lodestone Bauble 112 R Lord of Tresserhorn 10a C Martyrdom diff --git a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java index 2c3864557e3..cd00ccc1b7c 100644 --- a/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java +++ b/forge-gui/src/main/java/forge/itemmanager/ColumnDef.java @@ -661,24 +661,11 @@ public enum ColumnDef { //make sure it's a card. if not, pointless to proceed. String collectorNumber; if (i instanceof PaperCard) { - collectorNumber = ((PaperCard) i).getCollectorNumber(); - // First off, make all NO_COLLECTOR_NUMBER the last in sortings - if (collectorNumber.equals(IPaperCard.NO_COLLECTOR_NUMBER)) - collectorNumber = "50000"; // very big number of 5 digits to have them in last positions - - // Now, for proper sorting, let's zero-pad the collector number (if integer) - try { - int collNr = Integer.parseInt(collectorNumber); - collectorNumber = String.format("%05d", collNr); - } catch (NumberFormatException ex) { - String nonNumeric = collectorNumber.replaceAll("[0-9]", ""); - String onlyNumeric = collectorNumber.replaceAll("[^0-9]", ""); - collectorNumber = String.format("%05d", Integer.parseInt(onlyNumeric)) + nonNumeric; - } + collectorNumber = ((PaperCard) i).getCollectorNumberSortingKey(); } else { collectorNumber = IPaperCard.NO_COLLECTOR_NUMBER; } - return collectorNumber + toSortableName(i.getName()); + return collectorNumber; } /** From 04ba6bdd7b5439f16ef2e7bbacf3ee0e320a4460 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 08:30:47 -0400 Subject: [PATCH 05/40] add Ultimate tag for PW achievements --- forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt | 2 +- .../r/rowan_scholar_of_sparks_will_scholar_of_frost.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt index 1b8959c4f54..17c60b9b9ec 100644 --- a/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt +++ b/forge-gui/res/cardsfolder/k/kasmina_enigma_sage.txt @@ -8,7 +8,7 @@ A:AB$ Token | Cost$ SubCounter | Planeswalker$ True | TokenScript$ gu SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterType$ P1P1 | CounterNum$ X | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid -A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. +A:AB$ ChangeZone | Cost$ SubCounter<8/LOYALTY> | Planeswalker$ True | Ultimate$ True | Origin$ Library | Destination$ Exile | ChangeType$ Instant.SharesColorWith Card.Self,Sorcery.SharesColorWith Card.Self | ChangeNum$ 1 | SubAbility$ DBPlay | RememberChanged$ True | SpellDescription$ Search your library for an instant or sorcery card that shares a color with this planeswalker, exile that card, then shuffle. You may cast that card without paying its mana cost. SVar:DBPlay:DB$ Play | Defined$ Remembered | WithoutManaCost$ True | Optional$ True | SubAbility$ DBCleanup DeckHints:Type$Instant|Sorcery DeckHas:Ability$Token & Ability$Counters diff --git a/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt index e946a419be1..db2e3c7a657 100644 --- a/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt +++ b/forge-gui/res/cardsfolder/r/rowan_scholar_of_sparks_will_scholar_of_frost.txt @@ -22,7 +22,7 @@ Loyalty:4 S:Mode$ ReduceCost | ValidCard$ Instant,Sorcery | Type$ Spell | Activator$ You | Amount$ 1 | Description$ Instant and sorcery spells you cast cost {1} less to cast. A:AB$ Animate | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature | TgtPrompt$ Select up to one target creature | TargetMin$ 0 | TargetMax$ 1 | Power$ 0 | Toughness$ 2 | Duration$ UntilYourNextTurn | SpellDescription$ Up to one target creature has base power and toughness 0/2 until your next turn. A:AB$ Draw | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | NumCards$ 3 | SpellDescription$ Draw three cards. -A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. +A:AB$ ChangeZone | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Permanent | TgtPrompt$ Select up to five target permanents | TargetMin$ 0 | TargetMax$ 5 | Origin$ Battlefield | Destination$ Exile | RememberLKI$ True | SubAbility$ DBRepeat | SpellDescription$ Exile up to five target permanents. For each permanent exiled this way, its controller creates a 4/4 blue and red Elemental creature token. SVar:DBRepeat:DB$ RepeatEach | DefinedCards$ DirectRemembered | UseImprinted$ True | RepeatSubAbility$ DBToken | SubAbility$ DBCleanup | ChangeZoneTables$ True SVar:DBToken:DB$ Token | TokenScript$ ur_4_4_elemental | TokenOwner$ ImprintedController SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True From 68781783c4e14cc603f37e1813b34593c350522c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 09:07:11 -0400 Subject: [PATCH 06/40] discerning_taste.txt --- .../res/cardsfolder/upcoming/discerning_taste.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/discerning_taste.txt diff --git a/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt new file mode 100644 index 00000000000..a3dabc0f9e7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/discerning_taste.txt @@ -0,0 +1,10 @@ +Name:Discerning Taste +ManaCost:2 B +Types:Sorcery +A:SP$ Dig | DigNum$ 4 | DestinationZone2$ Graveyard | RememberMovedToZone$ 2 | SubAbility$ DBLifeGain | StackDescription$ SpellDescription | SpellDescription$ Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. +SVar:DBLifeGain:DB$ GainLife | Defined$ You | LifeAmount$ X | SubAbility$ DBCleanup | StackDescription$ None +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$GreatestPowerGraveyard_Creature.IsRemembered +DeckHints:Ability$Graveyard +DeckHas:Ability$LifeGain +Oracle:Look at the top four cards of your library. Put one of them into your hand and the rest into your graveyard. You gain life equal to the greatest power among creature cards put into your graveyard this way. From bff5a13c253f82bcfae43b22c8ec64b7d66fd224 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 09:08:52 -0400 Subject: [PATCH 07/40] add support for "RememberMovedToZone" to DigEffect --- .../forge/game/ability/effects/DigEffect.java | 22 ++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java index 898d56af362..1932709764e 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DigEffect.java @@ -87,6 +87,20 @@ public class DigEffect extends SpellAbilityEffect { final boolean mayBeSkipped = sa.hasParam("PromptToSkipOptionalAbility"); final String optionalAbilityPrompt = sa.hasParam("OptionalAbilityPrompt") ? sa.getParam("OptionalAbilityPrompt") : ""; + boolean remZone1 = false; + boolean remZone2 = false; + if (sa.hasParam("RememberChanged")) { + remZone1 = true; + } + if (sa.hasParam("RememberMovedToZone")) { + if (sa.getParam("RememberMovedToZone").contains("1")) { + remZone1 = true; + } + if (sa.getParam("RememberMovedToZone").contains("2")) { + remZone2 = true; + } + } + boolean changeAll = false; boolean allButOne = false; @@ -341,7 +355,7 @@ public class DigEffect extends SpellAbilityEffect { if (sa.hasParam("ForgetOtherRemembered")) { host.clearRemembered(); } - if (sa.hasParam("RememberChanged")) { + if (remZone1) { host.addRemembered(c); } rest.remove(c); @@ -376,6 +390,9 @@ public class DigEffect extends SpellAbilityEffect { if (m != null && !origin.equals(m.getZone().getZoneType())) { table.put(origin, m.getZone().getZoneType(), m); } + if (remZone2) { + host.addRemembered(m); + } } } else { @@ -395,6 +412,9 @@ public class DigEffect extends SpellAbilityEffect { } c.setExiledWith(effectHost); c.setExiledBy(effectHost.getController()); + if (remZone2) { + host.addRemembered(c); + } } } } From c9c5ae0058d53e77ebfb2cef4207ebddea81c2e3 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Thu, 27 May 2021 14:43:39 +0100 Subject: [PATCH 08/40] MH2 & RMH1 edition updates --- .../editions/Modern Horizons 1 Timeshifts.txt | 3 + forge-gui/res/editions/Modern Horizons 2.txt | 98 ++++++++++++++++++- 2 files changed, 96 insertions(+), 5 deletions(-) diff --git a/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt index f4652a64568..54f40a8fe8f 100644 --- a/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt +++ b/forge-gui/res/editions/Modern Horizons 1 Timeshifts.txt @@ -13,6 +13,9 @@ Type=Other 18 U Shenanigans 19 R Ayula, Queen Among Bears 20 R Deep Forest Hermit +22 U Llanowar Tribe +23 U Scale Up +26 M The First Sliver 28 U Ingenious Infiltrator 30 U Soulherder 32 M Sword of Truth and Justice diff --git a/forge-gui/res/editions/Modern Horizons 2.txt b/forge-gui/res/editions/Modern Horizons 2.txt index 7429ed91797..d63f2cab102 100644 --- a/forge-gui/res/editions/Modern Horizons 2.txt +++ b/forge-gui/res/editions/Modern Horizons 2.txt @@ -7,34 +7,68 @@ MciCode=mh2 Type=Other [cards] +3 C Arcbound Mouser 8 C Break Ties +10 U Constable of the Realm +18 C Landscaper Colos 19 C Late to Dinner 25 U Prismatic Ending 30 M Serra's Emissary 35 R Timeless Dragon +39 R Disapprove +41 U "MacGuffin Collector" 44 R Fractured Sanity +45 U "Escaped Dorm Sheets" +48 U Junk Winder 50 U Lucid Dreams +51 C Mental Journey +53 U Mystic Redaction +55 C Phantasmal Dreadmaw 58 R Rise and Shine 59 R Rishadan Dockhand 63 C So Shiny +66 C Step Through 67 M Subtlety +68 C Suspend +69 M "Merfolk Siren" +70 U Sweep the Skies +73 U Vedalken Rogue +76 C Bone Shards +82 C Discerning Taste +85 U Flay Essence 87 M Grief 89 C Kitchen Imp 94 U Necromancer's Familiar +96 R Persist 97 R Profane Tutor 102 M Tourach, Dread Chanter 103 C Tourach's Canticle 105 U Underworld Hermit 106 R Unmarked Grave +109 C World-Weary 110 U Young Necromancer +113 U Arcbound Whelp +114 C Battle Plan +118 R Calibrated Blast 120 R Chef's Kiss +121 U Dragon's Rage Channeler 125 U Flametongue Yearling +127 C Glavanic Relay +129 R Glimpse of Tomorrow +132 R Harmonic Prodigy +137 R Obsidian Charmaw +140 C Skophos Reaver 142 U Spreading Insurrection 147 C Abundant Harvest 148 R Aeve, Progenitor Ooze 151 M Chatterfang, Squirrel General 152 C Chatterstorm +158 U Gifts of the Fae +162 R Gaea's Will +166 R Ignoble Hierarch 167 C "Bushitoad" +169 C Orchard Strider +170 C Rift Sower 172 U Scurry Oak 174 U Squirrel Sanctuary 175 U Squirrel Sovereign @@ -43,96 +77,150 @@ Type=Other 178 M Thrasta, Tempest's Roar 182 R Verdant Command 184 U Arcbound Shikari +186 R Asmoranomardicadaistinaculdacar 189 R Carth the Lion 192 M Dakkon, Shadow Slayer 194 C Drey Keeper 197 M Garth One-Eye +198 R General Ferrous Rokiric 202 M Grist, the Hunger Tide +201 U Graceful Restoration +204 R Lonis, Cryptozoologist 208 R Priest of Fell Rites 211 U Ravenous Squirrel +212 U Road // Ruin 218 R Yusri, Fortune's Flame +219 R Academy Manufacturer 222 C Bottle Golems 223 U Brainstone 225 R Diamond Lion 228 U Liquimetal Torque 229 U Monoskelion 234 M Scion of Draco -237 U Steel Camel +237 U Steel Dromedary 238 M Sword of Hearth and Home +239 C Tormod's Cryptkeeper +240 U The Underworld Cookbook +241 U Vectis Gloves 242 R Void Mirror 243 R Zabaz, the Glimmerwasp 244 R Arid Mesa +245 C Darkmoss Bridge +246 C Drossforge Bridge +247 C Goldmire Bridge 248 R Marsh Flats +249 C Mistvault Bridge 250 R Misty Rainforest +252 C Razortide Bridge +253 C Rustvale Bridge 254 R Scalding Tarn +255 C Silverbluff Bridge +256 C Slagwoods Bridge +257 C Tanglepool Bridge +258 C Thornglint Bridge 259 R Urza's Saga 260 R Verdant Catacombs +264 U Seal of Cleansing +266 U Soul Snare 267 U Counterspell 269 U Seal of Removal 271 R Wonder +274 U Greed 275 R Patriarch's Bidding 276 U Skirge Familiar 277 R Chance Encounter +278 U Flame Rift 279 R Goblin Bombardment +281 M Imperial Recruiter 282 U Mogg Salvage +285 U Quirion Ranger 286 R Squirrel Mob 296 U Extruder 300 U Zuran Orb 301 M Cabal Coffers +302 U Mishra's Factory 304 M Dakkon, Shadow Slayer -308 U Counterspell +306 M Grist, the Hunger Tide +308 R Counterspell 309 M Subtlety +310 M "Merfolk Siren" 311 M Grief 312 M Tourach, Dread Chanter +314 M Imperial Recruiter 316 M Chatterfang, Squirrel General 318 M Thrasta, Tempest's Roar 323 M Scion of Draco 324 M Sword of Hearth and Home 325 M Cabal Coffers +326 R Mishra's Factory 329 C Late to Dinner 333 M Serra's Emissary +334 R Disapprove 336 R Fractured Sanity +338 U Mystic Redaction 340 R Rise and Shine +343 C Kitchen Imp +345 R Persist 347 U Underworld Hermit 350 U Flametongue Yearling +352 R Harmonic Prodigy 354 C Abundant Harvest 357 R Sylvan Anthem 359 R Verdant Command 360 U Arcbound Shikari 363 M Dakkon, Shadow Slayer -364 U Prismatic Ending 365 M Garth One-Eye +366 R General Ferrous Rokiric +368 M Grist, the Hunger Tide 372 R Priest of Fell Rites 375 U Ravenous Squirrel +376 U Road // Ruin 380 R Urza's Saga -385 R Timeless Dragon +384 U Prismatic Ending +388 R Timeless Dragon 391 R Rishadan Dockhand +392 C Step Through +393 M "Merfolk Siren" +395 C Bone Shards +400 R Persist 401 R Profane Tutor +402 M Tourach, Dread Chanter +407 R Glimpse of Tomorrow 409 R Aeve, Progenitor Ooze 410 M Chatterfang, Squirrel General 411 C Chatterstorm 415 U Squirrel Sovereign +417 R Asmoranomardicadaistinaculdacar 418 R Carth the Lion 420 M Garth One-Eye 426 U Brainstone 427 R Diamond Lion +428 U Liquimetal Torque +429 U Monoskelion +431 M Scion of Draco 433 M Sword of Hearth and Home +434 U The Underworld Cookbook 435 R Void Mirror 436 R Arid Mesa 437 R Marsh Flats 438 R Misty Rainforest 439 R Scalding Tarn 440 R Verdant Catacombs -443 R Timeless Dragon +442 R Out of Time +445 R Timeless Dragon 447 R Rishadan Dockhand +448 R Suspend 452 R Profane Tutor 453 R Unmarked Grave 457 R Chef's Kiss +458 R Glimpse of Tomorrow 459 R Aeve, Progenitor Ooze +463 R Asmoranomardicadaistinaculdacar 464 R Carth the Lion 468 R Yusri, Fortune's Flame 470 R Diamond Lion 473 R Void Mirror +474 R Zabaz, the Glimmerwasp 475 R Arid Mesa 476 R Marsh Flats 477 R Misty Rainforest From 2f6aa3dc0fdff4d36351142d74c094fcdf4a5375 Mon Sep 17 00:00:00 2001 From: paul_snoops Date: Thu, 27 May 2021 14:49:29 +0100 Subject: [PATCH 09/40] MH2 & RMH1 edition updates --- forge-gui/res/editions/Modern Horizons 2.txt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/forge-gui/res/editions/Modern Horizons 2.txt b/forge-gui/res/editions/Modern Horizons 2.txt index d63f2cab102..7f828066d38 100644 --- a/forge-gui/res/editions/Modern Horizons 2.txt +++ b/forge-gui/res/editions/Modern Horizons 2.txt @@ -16,9 +16,7 @@ Type=Other 30 M Serra's Emissary 35 R Timeless Dragon 39 R Disapprove -41 U "MacGuffin Collector" 44 R Fractured Sanity -45 U "Escaped Dorm Sheets" 48 U Junk Winder 50 U Lucid Dreams 51 C Mental Journey @@ -30,7 +28,6 @@ Type=Other 66 C Step Through 67 M Subtlety 68 C Suspend -69 M "Merfolk Siren" 70 U Sweep the Skies 73 U Vedalken Rogue 76 C Bone Shards @@ -66,7 +63,6 @@ Type=Other 158 U Gifts of the Fae 162 R Gaea's Will 166 R Ignoble Hierarch -167 C "Bushitoad" 169 C Orchard Strider 170 C Rift Sower 172 U Scurry Oak @@ -143,7 +139,6 @@ Type=Other 306 M Grist, the Hunger Tide 308 R Counterspell 309 M Subtlety -310 M "Merfolk Siren" 311 M Grief 312 M Tourach, Dread Chanter 314 M Imperial Recruiter @@ -180,7 +175,6 @@ Type=Other 388 R Timeless Dragon 391 R Rishadan Dockhand 392 C Step Through -393 M "Merfolk Siren" 395 C Bone Shards 400 R Persist 401 R Profane Tutor From 331ae6ff44c4fe7075abd2852356706656b62ae2 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 11:12:27 -0400 Subject: [PATCH 10/40] vectis_gloves.txt --- forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt diff --git a/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt new file mode 100644 index 00000000000..bf5e490605d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/vectis_gloves.txt @@ -0,0 +1,6 @@ +Name:Vectis Gloves +ManaCost:2 +Types:Artifact Equipment +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | AddKeyword$ Artifact landwalk | Description$ Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.) +K:Equip:2 +Oracle:Equipped creature gets +2/+0 and has artifact landwalk. (It can’t be blocked as long as defending player controls an artifact land.)\nEquip {2} From f0f017713eacfd6dc14fb97bdfdf62be9ca2c14c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 11:13:01 -0400 Subject: [PATCH 11/40] add Artifact landwalk to CombatUtil --- forge-game/src/main/java/forge/game/combat/CombatUtil.java | 2 ++ 1 file changed, 2 insertions(+) diff --git a/forge-game/src/main/java/forge/game/combat/CombatUtil.java b/forge-game/src/main/java/forge/game/combat/CombatUtil.java index 898443abe87..f82a9bf8089 100644 --- a/forge-game/src/main/java/forge/game/combat/CombatUtil.java +++ b/forge-game/src/main/java/forge/game/combat/CombatUtil.java @@ -595,6 +595,8 @@ public class CombatUtil { walkTypes.add("Land.Legendary"); } else if (keyword.equals("Nonbasic landwalk")) { walkTypes.add("Land.nonBasic"); + } else if (keyword.equals("Artifact landwalk")) { + walkTypes.add("Land.Artifact"); } else if (keyword.equals("Snow landwalk")) { walkTypes.add("Land.Snow"); } else if (keyword.endsWith("walk")) { From 667bd138c80bb74793bb972aed5e4d1ccb061162 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 11:35:48 -0400 Subject: [PATCH 12/40] bridge cycle (Suthro) --- forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt | 8 ++++++++ forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt | 8 ++++++++ 10 files changed, 80 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt diff --git a/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt new file mode 100644 index 00000000000..032cd61081d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/darkmoss_bridge.txt @@ -0,0 +1,8 @@ +Name:Darkmoss Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Darkmoss Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt new file mode 100644 index 00000000000..3a35bfe6a8a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/drossforge_bridge.txt @@ -0,0 +1,8 @@ +Name:Drossforge Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Drossforge Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {B} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt new file mode 100644 index 00000000000..bdfabe1f328 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/goldmire_bridge.txt @@ -0,0 +1,8 @@ +Name:Goldmire Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Goldmire Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt new file mode 100644 index 00000000000..d541d050c8e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mistvault_bridge.txt @@ -0,0 +1,8 @@ +Name:Mistvault Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ B | SpellDescription$ Add {B}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Mistvault Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {B}. diff --git a/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt new file mode 100644 index 00000000000..a5fad386479 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/razortide_bridge.txt @@ -0,0 +1,8 @@ +Name:Razortide Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Razortide Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {W} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt new file mode 100644 index 00000000000..c5a0e5b9015 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rustvale_bridge.txt @@ -0,0 +1,8 @@ +Name:Rustvale Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Rustvale Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {W}. diff --git a/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt new file mode 100644 index 00000000000..2e7a7f50f34 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/silverbluff_bridge.txt @@ -0,0 +1,8 @@ +Name:Silverbluff Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Silverbluff Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {U} or {R}. diff --git a/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt new file mode 100644 index 00000000000..0e855ae30c2 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slagwoods_bridge.txt @@ -0,0 +1,8 @@ +Name:Slagwoods Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ R | SpellDescription$ Add {R}. +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Slagwoods Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {R} or {G}. diff --git a/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt new file mode 100644 index 00000000000..0c52eaad5ad --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/tanglepool_bridge.txt @@ -0,0 +1,8 @@ +Name:Tanglepool Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ U | SpellDescription$ Add {U}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Tanglepool Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {U}. diff --git a/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt new file mode 100644 index 00000000000..7a9b0684e68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/thornglint_bridge.txt @@ -0,0 +1,8 @@ +Name:Thornglint Bridge +ManaCost:no cost +Types:Artifact Land +A:AB$ Mana | Cost$ T | Produced$ G | SpellDescription$ Add {G}. +A:AB$ Mana | Cost$ T | Produced$ W | SpellDescription$ Add {W}. +K:CARDNAME enters the battlefield tapped. +K:Indestructible +Oracle:Thornglint Bridge enters the battlefield tapped.\nIndestructible\n{T}: Add {G} or {W}. From b032002c33567d423a90bcdb314a22089d9fed37 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:29:27 +0000 Subject: [PATCH 13/40] Add new file --- forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt new file mode 100644 index 00000000000..72f75540f07 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt @@ -0,0 +1,9 @@ +Name:Arcbound Mouser +ManaCost:W +Types:Artifact Creature Cat +PT:0/0 +K:Lifelink +K:Modular:1 +SVar:BuffedBy:Artifact +DeckHas:Ability$Counters +Oracle:Lifelink\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) From e25ce911ed4f7b3c4566206024ab5d405471aa41 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:31:46 +0000 Subject: [PATCH 14/40] Add new file --- .../cardsfolder/upcoming/constable_of_the_realm.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt diff --git a/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt new file mode 100644 index 00000000000..e3319aa3907 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/constable_of_the_realm.txt @@ -0,0 +1,10 @@ +Name:Constable of the Realm +ManaCost:4 W +Types:Creature Giant Soldier +PT:3/3 +K:Renown:2 +T:Mode$ CounterAddedOnce | ValidCard$ Card.Self | CounterType$ P1P1 | TriggerZones$ Battlefield | Execute$ TrigChangeZone | TriggerDescription$ Whenever one or more +1/+1 counters are put on CARDNAME, exile up to one other target nonland permanent until CARDNAME leaves the battlefield. +SVar:TrigChangeZone:DB$ ChangeZone | ValidTgts$ Permanent.Other+nonLand | TgtPrompt$ Select up to one other target nonland permanent | TargetMin$ 0 | TargetMax$ 1 | Origin$ Battlefield | Destination$ Exile | Duration$ UntilHostLeavesPlay +DeckHas:Ability$Counters +DeckHints:Ability$Counters & Ability$Proliferate +Oracle:Renown 2 (When this creature deals combat damage to a player, if it isn't renowned, put two +1/+1 counters on it and it becomes renowned.)\nWhenever one or more +1/+1 counters are put on Constable of the Realm, exile up to one other target nonland permanent until Constable of the Realm leaves the battlefield. From 5c0a03e24294fa9954adfed07289934488af7e07 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:32:12 +0000 Subject: [PATCH 15/40] Add new file --- forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt diff --git a/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt new file mode 100644 index 00000000000..5720eadfbb0 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/landscaper_colos.txt @@ -0,0 +1,8 @@ +Name:Landscaper Colos +ManaCost:5 W +Types:Creature Goat Beast +PT:4/6 +T:Mode$ ChangesZone | ValidCard$ Card.Self | Destination$ Battlefield | Execute$ TrigChange | TriggerDescription$ When CARDNAME enters the battlefield, put target card from an opponent's graveyard on the bottom of their library. +SVar:TrigChange:DB$ ChangeZone | ValidTgts$ Card.OppOwn | TgtPrompt$ Select target card in an opponent's graveyard | Origin$ Graveyard | Destination$ Library | LibraryPosition$ -1 +K:TypeCycling:Basic:1 W +Oracle:When Landscaper Colos enters the battlefield, put target card from an opponent's graveyard on the bottom of their library.\nBasic landcycling {1}{W} ({1}{W}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) From 82c3f32a5edd095e6e405c53452e71ce91c26bb3 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:33:41 +0000 Subject: [PATCH 16/40] Add new file --- forge-gui/res/cardsfolder/upcoming/serras_emissary.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/serras_emissary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt new file mode 100644 index 00000000000..0f5d4e890b8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serras_emissary.txt @@ -0,0 +1,10 @@ +Name:Serra's Emissary +ManaCost:4 W W W +Types:Creature Angel +PT:7/7 +K:Flying +K:ETBReplacement:Other:ChooseCT +SVar:ChooseCT:DB$ ChooseType | Defined$ You | Type$ Card | AILogic$ MostProminentOppControls | SpellDescription$ As CARDNAME enters the battlefield, choose a card type. +S:Mode$ Continuous | Affected$ You,Creature.YouCtrl | AddKeyword$ Protection from ChosenType | Description$ You and creatures you control have protection from the chosen type. +SVar:PlayMain1:TRUE +Oracle:As Serra's Emissary enters the battlefield, choose a card type. \nYou and creatures you control have protection from the chosen type. From 008dd2f1d74850de636f33b6d8f1d08b080b3fba Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:34:14 +0000 Subject: [PATCH 17/40] Add new file --- forge-gui/res/cardsfolder/upcoming/dress_down.txt | 12 ++++++++++++ 1 file changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dress_down.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dress_down.txt b/forge-gui/res/cardsfolder/upcoming/dress_down.txt new file mode 100644 index 00000000000..991104f0ec8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dress_down.txt @@ -0,0 +1,12 @@ +Name:Dress Down +ManaCost:1 U +Types:Enchantment +K:Flash +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 | RemoveAllAbilities$ True | Description$ All creatures lose all abilities. +T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ At the beginning of the end step, sacrifice CARDNAME. +SVar:TrigSac:DB$ Sacrifice | SacValid$ Self +SVar:EndOfTurnLeavePlay:True +AI:RemoveDeck:Random +Oracle:Flash\nWhen Dress Down enters the battlefield, draw a card.\nAll creatures lose all abilities.\nAt the beginning of the end step, sacrifice Dress Down. From a6e50452f0e41de8b15ea4dcd5514f1f8070e236 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:35:40 +0000 Subject: [PATCH 18/40] Add new file --- forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt new file mode 100644 index 00000000000..3d3ef383fe9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ghost_lit_drifter.txt @@ -0,0 +1,9 @@ +Name:Ghost-Lit Drifter +ManaCost:2 U +Types:Creature Spirit +PT:2/2 +K:Flying +A:AB$ Pump | Cost$ 2 U | ValidTgts$ Creature.Other | KW$ Flying | TgtPrompt$ Select another target creature | SpellDescription$ Another target creature gains flying until end of turn. +A:AB$ Pump | Cost$ X U Discard<1/CARDNAME> | TargetMin$ X | TargetMax$ X | KW$ Flying | ValidTgts$ Creature | TgtPrompt$ Select X target creatures | ActivationZone$ Hand | PrecostDesc$ Channel — | SpellDescription$ X target creatures gain flying until end of turn. +SVar:X:Count$xPaid +Oracle:Flying\n{2}{U}: Another target creature gains flying until end of turn.\nChannel — {X}{U}, discard Ghost-Lit Drifter: X target creatures gain flying until end of turn. From e75dedcffa9a8716f072b0952da8ef167ba4fe98 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 16:36:16 +0000 Subject: [PATCH 19/40] Add new file --- forge-gui/res/cardsfolder/upcoming/junk_winder.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/junk_winder.txt diff --git a/forge-gui/res/cardsfolder/upcoming/junk_winder.txt b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt new file mode 100644 index 00000000000..c677e5d8f08 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt @@ -0,0 +1,9 @@ +Name:Junk Winder +ManaCost:5 U U +Types:Creature Serpent +PT:5/6 +K:Affinity:Permanent.token +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.token+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. +SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | SubAbility$ DBPump +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +Oracle:Affinity for tokens (This spell costs {1} less to cast for each token you control.)\nWhenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. From 1a6d6e1290d73699030c4c2f15c0dd6f68482e34 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 17:09:03 +0000 Subject: [PATCH 20/40] Add new file --- forge-gui/res/cardsfolder/upcoming/mental_journey.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/mental_journey.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mental_journey.txt b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt new file mode 100644 index 00000000000..ceb40a54a56 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mental_journey.txt @@ -0,0 +1,6 @@ +Name:Mental Journey +ManaCost:4 U U +Types:Instant +A:SP$ Draw | Cost$ 4 U U | NumCards$ 3 | SpellDescription$ Draw three cards. +K:TypeCycling:Basic:1 U +Oracle:Draw three cards.\nBasic landcycling {1}{U} ({1}{U}, Discard this card: Search your library for a basic land card, reveal it, put it into your hand, then shuffle.) From ffba3ef18a4ea536cd1751e0a6b9ce1af0685a24 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 17:09:41 +0000 Subject: [PATCH 21/40] Add new file --- forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt diff --git a/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt new file mode 100644 index 00000000000..7916287fbc3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/mystic_redaction.txt @@ -0,0 +1,8 @@ +Name:Mystic Redaction +ManaCost:2 U +Types:Enchantment +T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigScry | TriggerDescription$ At the beginning of your upkeep, scry 1. +SVar:TrigScry:DB$ Scry | ScryNum$ 1 +T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigMill | TriggerDescription$ Whenever you discard a card, each opponent mills two cards. +SVar:TrigMill:DB$ Mill | Defined$ Player.Opponent | NumCards$ 2 +Oracle:At the beginning of your upkeep, scry 1.\nWhenever you discard a card, each opponent mills two cards. From 06a4eac1c9678146dd6f6d5da8a1df20d61f4b80 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 17:10:27 +0000 Subject: [PATCH 22/40] Add new file --- .../res/cardsfolder/upcoming/phantasmal_dreadmaw.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt diff --git a/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt new file mode 100644 index 00000000000..1cedb5aca9b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/phantasmal_dreadmaw.txt @@ -0,0 +1,9 @@ +Name:Phantasmal Dreadmaw +ManaCost:2 U U +Types:Creature Dinosaur Illusion +PT:6/6 +K:Trample +T:Mode$ BecomesTarget | ValidTarget$ Card.Self | TriggerZones$ Battlefield | Execute$ TrigSac | TriggerDescription$ When CARDNAME becomes the target of a spell or ability, sacrifice it. +SVar:TrigSac:DB$Sacrifice | Defined$ Self +SVar:Targeting:Dies +Oracle:Flying\nWhen Phantasmal Dreadmaw becomes the target of a spell or ability, sacrifice it. From c767a3b3ada9eb5f5ce1f5f3f00d20736f655837 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 17:11:10 +0000 Subject: [PATCH 23/40] Add new file --- forge-gui/res/cardsfolder/upcoming/so_shiny.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/so_shiny.txt diff --git a/forge-gui/res/cardsfolder/upcoming/so_shiny.txt b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt new file mode 100644 index 00000000000..4107b89f9be --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt @@ -0,0 +1,10 @@ +Name:So Shiny +ManaCost:2 U +Types:Enchantment Aura +K:Enchant creature +A:SP$ Attach | Cost$ 2 U | ValidTgts$ Creature | AILogic$ KeepTapped +T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | IsPresent$ Card.YouCtrl+token | PresentCompare$ GE1 | Execute$ TrigTap | TriggerDescription$ When CARDNAME enters the battlefield, if you control a token, tap enchanted creature, then scry 2. +SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBScry +SVar:DBScry:DB$ Scry | ScryNum$ 2 +S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. +Oracle:Enchant creature\nWhen So Shiny enters the battlefield, if you control a token, tap enchanted creature, then scry 2.\nEnchanted creature doesn't untap during its controller's untap step. From 2b6b2a5e95c761c23e497de11cc05f4aa22915ad Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 19:53:45 +0000 Subject: [PATCH 24/40] Update arcbound_mouser.txt --- forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt index 72f75540f07..b22e8edfa9b 100644 --- a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt @@ -4,6 +4,5 @@ Types:Artifact Creature Cat PT:0/0 K:Lifelink K:Modular:1 -SVar:BuffedBy:Artifact DeckHas:Ability$Counters Oracle:Lifelink\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) From dcd16704bdbdb9d274860b167e71ac51a7c0dd0e Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 19:54:26 +0000 Subject: [PATCH 25/40] Update dress_down.txt --- forge-gui/res/cardsfolder/upcoming/dress_down.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/upcoming/dress_down.txt b/forge-gui/res/cardsfolder/upcoming/dress_down.txt index 991104f0ec8..859adf7117e 100644 --- a/forge-gui/res/cardsfolder/upcoming/dress_down.txt +++ b/forge-gui/res/cardsfolder/upcoming/dress_down.txt @@ -9,4 +9,5 @@ T:Mode$ Phase | Phase$ End of Turn | TriggerZones$ Battlefield | Execute$ TrigSa SVar:TrigSac:DB$ Sacrifice | SacValid$ Self SVar:EndOfTurnLeavePlay:True AI:RemoveDeck:Random +DeckHas:Ability$Sacrifice Oracle:Flash\nWhen Dress Down enters the battlefield, draw a card.\nAll creatures lose all abilities.\nAt the beginning of the end step, sacrifice Dress Down. From 206194353c8a3aeb60384d408d560d8a46d6aaf9 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 19:55:23 +0000 Subject: [PATCH 26/40] Update arcbound_mouser.txt --- forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt index b22e8edfa9b..0182357296c 100644 --- a/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt +++ b/forge-gui/res/cardsfolder/upcoming/arcbound_mouser.txt @@ -4,5 +4,5 @@ Types:Artifact Creature Cat PT:0/0 K:Lifelink K:Modular:1 -DeckHas:Ability$Counters +DeckHas:Ability$Counters & Ability$LifeGain Oracle:Lifelink\nModular 1 (This creature enters the battlefield with a +1/+1 counter on it. When it dies, you may put its +1/+1 counters on target artifact creature.) From df78d375feb71c2daeb72e8a0dbdfad2a8d0ee2d Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 19:55:53 +0000 Subject: [PATCH 27/40] Update junk_winder.txt --- forge-gui/res/cardsfolder/upcoming/junk_winder.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-gui/res/cardsfolder/upcoming/junk_winder.txt b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt index c677e5d8f08..df1adbab75e 100644 --- a/forge-gui/res/cardsfolder/upcoming/junk_winder.txt +++ b/forge-gui/res/cardsfolder/upcoming/junk_winder.txt @@ -6,4 +6,5 @@ K:Affinity:Permanent.token T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Permanent.token+YouCtrl | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. SVar:TrigTap:DB$ Tap | ValidTgts$ Permanent.nonLand+OppCtrl | TgtPrompt$ Choose target nonland permanent an opponent controls | SubAbility$ DBPump SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True +DeckNeeds:Ability$Token Oracle:Affinity for tokens (This spell costs {1} less to cast for each token you control.)\nWhenever a token enters the battlefield under your control, tap target nonland permanent an opponent controls. It doesn't untap during its controller's next untap step. From 20ff40896fca72cf8527c0302f54dba92b3c5fda Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 16:47:46 -0400 Subject: [PATCH 28/40] infuse_with_vitality.txt fix --- forge-gui/res/cardsfolder/i/infuse_with_vitality.txt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt index 764df2925ed..888f37d3bb2 100644 --- a/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt +++ b/forge-gui/res/cardsfolder/i/infuse_with_vitality.txt @@ -1,10 +1,10 @@ Name:Infuse with Vitality ManaCost:B G Types:Instant -A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate -SVar:DBAnimate:DB$ Animate | Triggers$ SupernaturalStaminaChangeZone | sVars$ SupernaturalStaminaTrigChangeZone | Defined$ ParentTarget -SVar:SupernaturalStaminaChangeZone:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ SupernaturalStaminaTrigChangeZone | TriggerController$ TriggeredCardController | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. -SVar:SupernaturalStaminaTrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy | SubAbility$ DBGainLife +A:SP$ Pump | Cost$ B G | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ Deathtouch | StackDescription$ Until end of turn, {c:Targeted} gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SpellDescription$ Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control." | SubAbility$ DBAnimate +SVar:DBAnimate:DB$ Animate | Triggers$ DiesTrigger | Defined$ ParentTarget | SubAbility$ DBGainLife | StackDescription$ None +SVar:DiesTrigger:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigChangeZone | TriggerDescription$ When this creature dies, return it to the battlefield tapped under its owner's control. +SVar:TrigChangeZone:DB$ ChangeZone | Origin$ Graveyard | Destination$ Battlefield | Tapped$ True | Defined$ TriggeredNewCardLKICopy SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 DeckHas:Ability$LifeGain Oracle:Until end of turn, target creature gains deathtouch and "When this creature dies, return it to the battlefield tapped under its owner's control."\nYou gain 2 life. From 51b5c81aac57dccaad0b06af7e6f9d69b1502134 Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 21:00:37 +0000 Subject: [PATCH 29/40] Update so_shiny.txt --- forge-gui/res/cardsfolder/upcoming/so_shiny.txt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/forge-gui/res/cardsfolder/upcoming/so_shiny.txt b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt index 4107b89f9be..7a05396db2c 100644 --- a/forge-gui/res/cardsfolder/upcoming/so_shiny.txt +++ b/forge-gui/res/cardsfolder/upcoming/so_shiny.txt @@ -7,4 +7,7 @@ T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefi SVar:TrigTap:DB$ Tap | Defined$ Enchanted | SubAbility$ DBScry SVar:DBScry:DB$ Scry | ScryNum$ 2 S:Mode$ Continuous | Affected$ Creature.AttachedBy | AddHiddenKeyword$ CARDNAME doesn't untap during your untap step. | Description$ Enchanted creature doesn't untap during its controller's untap step. +DeckNeeds:Ability$Token +SVar:NeedsToPlayVar:Y GE1 +SVar:Y:Count$Valid Permanent.token+YouCtrl Oracle:Enchant creature\nWhen So Shiny enters the battlefield, if you control a token, tap enchanted creature, then scry 2.\nEnchanted creature doesn't untap during its controller's untap step. From f6358f10f2fca421df40ebe2d172b8534da5e31c Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 21:02:03 +0000 Subject: [PATCH 30/40] Add new file --- .../res/cardsfolder/upcoming/glorious_enforcer.txt | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt diff --git a/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt new file mode 100644 index 00000000000..372a1f2b377 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/glorious_enforcer.txt @@ -0,0 +1,11 @@ +Name:Glorious Enforcer +ManaCost:5 W W +Types:Creature Angel +PT:5/5 +K:Flying +K:Lifelink +T:Mode$ Phase | Phase$ BeginCombat | TriggerZones$ Battlefield | Execute$ TrigPump | CheckSVar$ Y | SVarCompare$ GTX | TriggerDescription$ At the beginning of each combat, if you have more life than an opponent, CARDNAME gains double strike until end of turn. +SVar:TrigPump:DB$ Pump | Defined$ Self | KW$ Double Strike +SVar:X:PlayerCountOpponents$LowestLifeTotal +SVar:Y:Count$YourLifeTotal +Oracle:Flying, lifelink\nAt the beginning of each combat, if you have more life than an opponent, Glorious Enforcer gains double strike until end of turn. From 88dbfba282939fc0b100b38514d2c24bcfacad0c Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 21:02:43 +0000 Subject: [PATCH 31/40] Add new file --- forge-gui/res/cardsfolder/upcoming/step_through.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/step_through.txt diff --git a/forge-gui/res/cardsfolder/upcoming/step_through.txt b/forge-gui/res/cardsfolder/upcoming/step_through.txt new file mode 100644 index 00000000000..07fc4d92541 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/step_through.txt @@ -0,0 +1,6 @@ +Name:Step Through +ManaCost:3 U U +Types:Sorcery +K:TypeCycling:Wizard:2 +A:SP$ ChangeZone | Cost$ 3 U U | TargetMin$ 2 | TargetMax$ 2 | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return two target creatures to their owners' hands. +Oracle:Return two target creatures to their owners' hands.\nWizardcycling {2} ({2}, Discard this card: Search your library for a Wizard card, reveal it, put it into your hand, then shuffle.) From eb91e106611ed2a71626d58d43c1d4738ee4852f Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 21:03:23 +0000 Subject: [PATCH 32/40] Add new file --- forge-gui/res/cardsfolder/upcoming/subtlety.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/subtlety.txt diff --git a/forge-gui/res/cardsfolder/upcoming/subtlety.txt b/forge-gui/res/cardsfolder/upcoming/subtlety.txt new file mode 100644 index 00000000000..26551f9bd68 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/subtlety.txt @@ -0,0 +1,10 @@ +Name:Subtlety +ManaCost:2 U U +Types:Creature Elemental Incarnation +PT:3/3 +K:Flash +K:Flying +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigTuck | TriggerDescription$ When CARDNAME enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +SVar:TrigTuck:DB$ ChangeZone | ValidTgts$ Card.inZoneStack+Creature,Card.inZoneStack+Planeswalker | TgtZone$ Stack | TgtPrompt$ Select up to one target creature spell or planeswalker spell | AlternativeDecider$ TargetedController | Origin$ Stack | Fizzle$ True | Destination$ Library | LibraryPosition$ 0 | DestinationAlternative$ Library | LibraryPositionAlternative$ -1 | AlternativeDestinationMessage$ Would you like to put the card on the top of your library (and not on the bottom)? | SpellDescription$ Choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library. +K:Evoke:ExileFromHand<1/Card.Blue+Other> +Oracle:Flash\nFlying\nWhen Subtlety enters the battlefield, choose up to one target creature spell or planeswalker spell. Its owner puts it on the top or bottom of their library.\nEvoke — Exile a blue card from your hand. From 4df0cf104900885ba8b5dd198a2ce30a857a47db Mon Sep 17 00:00:00 2001 From: John Date: Thu, 27 May 2021 21:03:44 +0000 Subject: [PATCH 33/40] Add new file --- forge-gui/res/cardsfolder/upcoming/suspend.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/suspend.txt diff --git a/forge-gui/res/cardsfolder/upcoming/suspend.txt b/forge-gui/res/cardsfolder/upcoming/suspend.txt new file mode 100644 index 00000000000..05857c8994f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/suspend.txt @@ -0,0 +1,7 @@ +Name:Suspend +ManaCost:U +Types:Instant +A:SP$ ChangeZone | A:SP$ ChangeZone | Cost$ U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBPutCounter | SpellDescription$ Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Remembered | CounterNum$ 2 | CounterType$ TIME | SubAbility$ DBPump +SVar:DBPump:DB$ PumpAll | ValidCards$ Card.IsRemembered+withoutSuspend | PumpZone$ Exile | KW$ Suspend | Permanent$ True | SubAbility$ DBCleanup | StackDescription$ If it doesn't have suspend, it gains suspend. +Oracle:Exile target creature and put two time counters on it. If it doesn't have suspend, it gains suspend. (At the beginning of its owner's upkeep, remove a time counter from that card. When the last is removed, the player plays it without paying its mana cost. If it's a creature, it has haste.) From 3d0009f23e92a2a5c31f4567f1ba8f562977cbb9 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Thu, 27 May 2021 23:32:33 +0200 Subject: [PATCH 34/40] Fix Drain Life --- forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java index bca037461c5..1c3cd26a61e 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -1079,7 +1079,7 @@ public class DamageDealAi extends DamageAiBase { saTgt.resetTargets(); saTgt.getTargets().add(tgtCreature != null && dmg < opponent.getLife() ? tgtCreature : opponent); - sa.setXManaCostPaid(dmg); + saTgt.setXManaCostPaid(dmg); return true; } From 1124069e521fe0fab05c522c07c475c6b9049127 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 18:54:47 -0400 Subject: [PATCH 35/40] calibrated_blast.txt --- .../res/cardsfolder/upcoming/calibrated_blast.txt | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt diff --git a/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt new file mode 100644 index 00000000000..14630b8f383 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/calibrated_blast.txt @@ -0,0 +1,10 @@ +Name:Calibrated Blast +ManaCost:2 R +Types:Instant +A:SP$ DigUntil | Valid$ Card.nonLand | ValidDescription$ nonland | RevealedDestination$ Library | RevealedLibraryPosition$ -1 | RevealRandomOrder$ True | RememberFound$ True | SubAbility$ DBImmediateTrigger | StackDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. | SpellDescription$ Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | ConditionDefined$ Remembered | ConditionPresent$ Card.nonLand | Execute$ TrigDamage | TriggerDescription$ When you reveal a nonland card this way, CARDNAME deals damage equal to that card's mana value to any target. +SVar:TrigDamage:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Remembered$CardManaCost +K:Flashback:3 R R +Oracle:Reveal cards from the top of your library until you reveal a nonland card. Put the revealed cards on the bottom of your library in a random order. When you reveal a nonland card this way, Calibrated Blast deals damage equal to that card's mana value to any target.\nFlashback {3}{R}{R} (You may cast this card from your graveyard for its flashback cost. Then exile it.) From 413e209b0bfaaf0b4dbc097cfb8a98fa8a5fe467 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 19:50:08 -0400 Subject: [PATCH 36/40] out_of_time.txt --- .../res/cardsfolder/upcoming/out_of_time.txt | 15 +++++++++++++++ 1 file changed, 15 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/out_of_time.txt diff --git a/forge-gui/res/cardsfolder/upcoming/out_of_time.txt b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt new file mode 100644 index 00000000000..1cc025d449b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/out_of_time.txt @@ -0,0 +1,15 @@ +Name:Out of Time +ManaCost:1 W W +Types:Enchantment +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Card.Self | Execute$ TrigUntap | TriggerDescription$ When CARDNAME enters the battlefield, untap all creatures, then phase them out until CARDNAME leaves the battlefield. Put a time counter on CARDNAME for each creature phased out this way. +SVar:TrigUntap:DB$ UntapAll | ValidCards$ Creature | RememberUntapped$ True | SubAbility$ DBPhase +SVar:DBPhase:DB$ Phases | Defined$ Remembered | WontPhaseInNormal$ True | ConditionPresent$ Card.Self | SubAbility$ DBEffect +SVar:DBEffect:DB$ Effect | Triggers$ TrigComeBack | RememberObjects$ Remembered | ImprintCards$ Self | ConditionPresent$ Card.Self | Duration$ Permanent | ForgetOnPhasedIn$ True | SubAbility$ DBPutCounter +SVar:TrigComeBack:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | ValidCard$ Card.IsImprinted | Execute$ DBPhaseIn | TriggerZones$ Command | TriggerController$ TriggeredCardController | Static$ True | TriggerDescription$ These creatures phase out until CARDNAME leaves the battlefield. +SVar:DBPhaseIn:DB$ Phases | Defined$ Remembered | PhaseInOrOut$ True | SubAbility$ DBExileSelf +SVar:DBExileSelf:DB$ ChangeZone | Origin$ Command | Destination$ Exile | Defined$ Self +SVar:DBPutCounter:DB$ PutCounter | CounterType$ TIME | CounterNum$ X | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:X:Count$RememberedSize +K:Vanishing:0 +Oracle:When Out of Time enters the battlefield, untap all creatures, then phase them out until Out of Time leaves the battlefield. Put a time counter on Out of Time for each creature phased out this way.\nVanishing (At the beginning of your upkeep, remove a time counter from this enchantment. When the last is removed, sacrifice it.) From d387287a0403c5c28d97c06633fe8e03fcd5be51 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 20:36:07 -0400 Subject: [PATCH 37/40] dermotaxi.txt --- forge-gui/res/cardsfolder/upcoming/dermotaxi.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dermotaxi.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt new file mode 100644 index 00000000000..103cf04837c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dermotaxi.txt @@ -0,0 +1,9 @@ +Name:Dermotaxi +ManaCost:2 +Types:Artifact Vehicle +PT:0/0 +K:ETBReplacement:Other:Imprint +SVar:Imprint:DB$ ChangeZone | Imprint$ True | ChangeType$ Creature | ChangeNum$ 1 | Origin$ Graveyard | Destination$ Exile | Mandatory$ True | Hidden$ True | Chooser$ You | SpellDescription$ Imprint - As CARDNAME enters the battlefield, exile a creature card from a graveyard. +A:AB$ Clone | Cost$ tapXType<2/Creature> | Defined$ Imprinted | Duration$ UntilEndOfTurn | AddTypes$ Vehicle & Artifact | StackDescription$ Until end of turn, CARDNAME becomes a copy of {c:Imprinted}, except it’s a Vehicle artifact in addition to its other types. | SpellDescription$ Until end of turn, CARDNAME becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. +SVar:NeedsToPlay:Creature.inZoneGraveyard +Oracle:Imprint — As Dermotaxi enters the battlefield, exile a creature card from a graveyard.\nTap two untapped creatures you control: Until end of turn, Dermotaxi becomes a copy of the imprinted card, except it’s a Vehicle artifact in addition to its other types. From 79d43f76b380398e7fa2f78eba7fa7f9ae41e753 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Thu, 27 May 2021 20:47:11 -0400 Subject: [PATCH 38/40] harmonic_prodigy.txt --- forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt diff --git a/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt new file mode 100644 index 00000000000..27d66b0d212 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/harmonic_prodigy.txt @@ -0,0 +1,8 @@ +Name:Harmonic Prodigy +ManaCost:1 R +Types:Creature Human Wizard +PT:1/3 +K:Prowess +S:Mode$ Panharmonicon | ValidCard$ Shaman.YouCtrl,Wizard.Other+YouCtrl | Description$ If an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. +DeckHints:Type$Shaman|Wizard +Oracle:Prowess (Whenever you cast a noncreature spell, this creature gets +1/+1 until end of turn.)\nIf an ability of a Shaman or another Wizard you control triggers, that ability triggers an additional time. From 66cb1c28f7d8187e21ed50c4fc559c40d80b22e2 Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Fri, 28 May 2021 07:05:06 +0100 Subject: [PATCH 39/40] Switched to F1 - should be less annoying than F2 --- forge-gui/src/main/java/forge/util/OperatingSystem.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/src/main/java/forge/util/OperatingSystem.java b/forge-gui/src/main/java/forge/util/OperatingSystem.java index ac20dcf62a6..e3cbb571ba1 100644 --- a/forge-gui/src/main/java/forge/util/OperatingSystem.java +++ b/forge-gui/src/main/java/forge/util/OperatingSystem.java @@ -50,7 +50,7 @@ public class OperatingSystem { //use robot to simulate user action so system standby timer resets java.awt.Robot robot = new java.awt.Robot(); if (isMac()) - robot.keyPress(KeyEvent.VK_F2); // F15 increases Display Brightness by default. Switch to F2 + robot.keyPress(KeyEvent.VK_F1); // F15 increases Display Brightness by default. Switch to F1 else robot.keyPress(KeyEvent.VK_F15); //simulate F15 key press since that won't do anything noticeable From 81d0a710604b677ce106c36071de974cbbee9adb Mon Sep 17 00:00:00 2001 From: Lyu Zong-Hong Date: Fri, 28 May 2021 17:25:12 +0900 Subject: [PATCH 40/40] Update FileUtil.readFile to use UTF-8 charset to read files. --- forge-core/src/main/java/forge/util/FileUtil.java | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/forge-core/src/main/java/forge/util/FileUtil.java b/forge-core/src/main/java/forge/util/FileUtil.java index d12ef2741ff..269a4c552a6 100644 --- a/forge-core/src/main/java/forge/util/FileUtil.java +++ b/forge-core/src/main/java/forge/util/FileUtil.java @@ -29,6 +29,7 @@ import java.io.OutputStream; import java.io.PrintWriter; import java.io.Reader; import java.net.URL; +import java.nio.charset.Charset; import java.util.ArrayList; import java.util.Collection; import java.util.List; @@ -208,7 +209,8 @@ public final class FileUtil { if ((file == null) || !file.exists()) { return new ArrayList<>(); } - return FileUtil.readAllLines(new FileReader(file), false); + Charset charset = Charset.forName("UTF-8"); + return FileUtil.readAllLines(new FileReader(file, charset), false); } catch (final Exception ex) { throw new RuntimeException("FileUtil : readFile() error, " + ex); }