From f6201d178edeb35095324c9810e7ba0c9666fa87 Mon Sep 17 00:00:00 2001 From: austinio7116 Date: Mon, 13 Apr 2020 17:47:30 +0100 Subject: [PATCH 1/3] Alternative image lookup to avoid issues with multiple printings in a single edition - e.g. supporting loading *1.full.jpg if only .full.jpg is present, or loading the standard card if the promo is missing. --- forge-core/src/main/java/forge/ImageKeys.java | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/forge-core/src/main/java/forge/ImageKeys.java b/forge-core/src/main/java/forge/ImageKeys.java index 37b1ba34128..4ea30d2a17d 100644 --- a/forge-core/src/main/java/forge/ImageKeys.java +++ b/forge-core/src/main/java/forge/ImageKeys.java @@ -6,6 +6,8 @@ import forge.util.ImageUtil; import forge.util.TextUtil; import org.apache.commons.lang3.StringUtils; + + import java.io.File; import java.util.HashMap; import java.util.Map; @@ -119,8 +121,11 @@ public final class ImageKeys { // if there's a 1st art variant try without it for .fullborder images file = findFile(dir, TextUtil.fastReplace(fullborderFile, "1.fullborder", ".fullborder")); if (file != null) { return file; } - // if there's a 1st art variant try without it for .full images - file = findFile(dir, TextUtil.fastReplace(filename, "1.full", ".full")); + // if there's an art variant try without it for .full images + file = findFile(dir, filename.replaceAll("[0-9].full]",".full")); + if (file != null) { return file; } + // if there's a 1st art variant try with it for .full images + file = findFile(dir, filename.replaceAll("[0-9]*.full", "1.full")); if (file != null) { return file; } } //if an image, like phenomenon or planes is missing .full in their filenames but you have an existing images that have .full/.fullborder From f1690f2d84a2921f91572862b0a4ba9f378f248b Mon Sep 17 00:00:00 2001 From: Hans Mackowiak Date: Tue, 14 Apr 2020 06:25:53 +0000 Subject: [PATCH 2/3] CounterPutEffect: add Choicer Param --- .../game/ability/effects/CountersPutEffect.java | 15 ++++++++++++--- .../src/main/java/forge/game/card/Card.java | 5 ++++- forge-gui/res/cardsfolder/e/eye_of_doom.txt | 5 ++--- .../cardsfolder/upcoming/C2020/agitator_ant.txt | 7 +++---- 4 files changed, 21 insertions(+), 11 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java index 63a8536f1ff..c7ba5ebf244 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/CountersPutEffect.java @@ -148,21 +148,30 @@ public class CountersPutEffect extends SpellAbilityEffect { if (sa.hasParam("Bolster")) { CardCollection creatsYouCtrl = CardLists.filter(activator.getCardsIn(ZoneType.Battlefield), Presets.CREATURES); CardCollection leastToughness = new CardCollection(Aggregates.listWithMin(creatsYouCtrl, CardPredicates.Accessors.fnGetDefense)); - tgtCards.addAll(pc.chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false)); + tgtCards.addAll(activator.getController().chooseCardsForEffect(leastToughness, sa, Localizer.getInstance().getMessage("lblChooseACreatureWithLeastToughness"), 1, 1, false)); tgtObjects.addAll(tgtCards); } else if (sa.hasParam("Choices")) { ZoneType choiceZone = ZoneType.Battlefield; if (sa.hasParam("ChoiceZone")) { choiceZone = ZoneType.smartValueOf(sa.getParam("ChoiceZone")); } + Player chooser = activator; + if (sa.hasParam("Chooser")) { + List choosers = AbilityUtils.getDefinedPlayers(sa.getHostCard(), sa.getParam("Chooser"), sa); + if (choosers.isEmpty()) { + return; + } + chooser = choosers.get(0); + } + CardCollection choices = new CardCollection(game.getCardsIn(choiceZone)); int n = sa.hasParam("ChoiceAmount") ? Integer.parseInt(sa.getParam("ChoiceAmount")) : 1; - choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, card); + choices = CardLists.getValidCards(choices, sa.getParam("Choices"), activator, card, sa); String title = sa.hasParam("ChoiceTitle") ? sa.getParam("ChoiceTitle") : Localizer.getInstance().getMessage("lblChooseaCard") + " "; - tgtObjects.addAll(new CardCollection(pc.chooseCardsForEffect(choices, sa, title, n, n, !sa.hasParam("ChoiceOptional")))); + tgtObjects.addAll(new CardCollection(chooser.getController().chooseCardsForEffect(choices, sa, title, n, n, sa.hasParam("ChoiceOptional")))); } else { tgtObjects.addAll(getDefinedOrTargeted(sa, "Defined")); } 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 b16350a164b..548e7001496 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -6350,10 +6350,13 @@ public class Card extends GameEntity implements Comparable { public final void addGoad(Long timestamp, final Player p) { goad.put(timestamp, p); + updateAbilityTextForView(); } public final void removeGoad(Long timestamp) { - goad.remove(timestamp); + if (goad.remove(timestamp) != null) { + updateAbilityTextForView(); + } } public final boolean isGoaded() { diff --git a/forge-gui/res/cardsfolder/e/eye_of_doom.txt b/forge-gui/res/cardsfolder/e/eye_of_doom.txt index 9a002bde0c2..43abb2b5a3a 100644 --- a/forge-gui/res/cardsfolder/e/eye_of_doom.txt +++ b/forge-gui/res/cardsfolder/e/eye_of_doom.txt @@ -2,9 +2,8 @@ Name:Eye of Doom ManaCost:4 Types:Artifact T:Mode$ ChangesZone | ValidCard$ Card.Self | Origin$ Any | Destination$ Battlefield | Execute$ TrigChoose | TriggerDescription$ When CARDNAME enters the battlefield, each player chooses a nonland permanent and puts a doom counter on it. -SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Choices$ Permanent.nonLand | AILogic$ OppPreferred | Mandatory$ True | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ DOOM | CounterNum$ 1 +SVar:TrigChoose:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBPutCounter +SVar:DBPutCounter:DB$ PutCounter | Chooser$ Remembered | Choices$ Permanent.nonLand | CounterType$ DOOM | CounterNum$ 1 A:AB$ DestroyAll | Cost$ 2 T Sac<1/CARDNAME> | ValidCards$ Permanent.counters_GE1_DOOM | SpellDescription$ Destroy each permanent with a doom counter. AI:RemoveDeck:All SVar:Picture:http://www.wizards.com/global/images/magic/general/eye_of_doom.jpg diff --git a/forge-gui/res/cardsfolder/upcoming/C2020/agitator_ant.txt b/forge-gui/res/cardsfolder/upcoming/C2020/agitator_ant.txt index 90bd546f0cb..be28f69d4c7 100755 --- a/forge-gui/res/cardsfolder/upcoming/C2020/agitator_ant.txt +++ b/forge-gui/res/cardsfolder/upcoming/C2020/agitator_ant.txt @@ -3,9 +3,8 @@ ManaCost:2 R Types:Creature Insect PT:2/2 T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigRepeat | TriggerDescription$ At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) -SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBChoose | SubAbility$ DBGoad -SVar:DBChoose:DB$ ChooseCard | Defined$ Player.IsRemembered | Amount$ 1 | MinAmount$ 0 | Choices$ Creature.RememberedPlayerCtrl | SubAbility$ DBPutCounter -SVar:DBPutCounter:DB$ PutCounter | Defined$ ChosenCard | CounterType$ P1P1 | CounterNum$ 2 | RememberCards$ True +SVar:TrigRepeat:DB$ RepeatEach | RepeatPlayers$ Player | RepeatSubAbility$ DBPutCounter | SubAbility$ DBGoad +SVar:DBPutCounter:DB$ PutCounter | Chooser$ Remembered | Choices$ Creature.RememberedPlayerCtrl | ChoiceOptional$ True | CounterType$ P1P1 | CounterNum$ 2 | RememberCards$ True SVar:DBGoad:DB$ Goad | Defined$ Remembered | SubAbility$ DBCleanup -SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True Oracle:At the beginning of your end step, each player may put two +1/+1 counters on a creature they control. Goad each creature that had counters put on it this way. (Until your next turn, those creatures attack each combat if able and attack a player other than you if able.) From 38d708ce65fdfcef105f7a2cc882a7a13db90ece Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Tue, 14 Apr 2020 17:25:43 +0000 Subject: [PATCH 3/3] IKO - 13 April --- .../cardsfolder/upcoming/bonders_enclave.txt | 2 +- .../upcoming/narset_of_the_ancient_way.txt | 2 +- .../upcoming/serrated_scorpion.txt | 8 +++ .../cardsfolder/upcoming/skycat_sovereign.txt | 10 ++++ .../res/cardsfolder/upcoming/sleeper_dart.txt | 7 +++ .../res/cardsfolder/upcoming/slitherwisp.txt | 9 +++ .../cardsfolder/upcoming/snare_tactician.txt | 8 +++ .../cardsfolder/upcoming/solid_footing.txt | 9 +++ .../cardsfolder/upcoming/song_of_creation.txt | 9 +++ .../upcoming/sonorous_howlbonder.txt | 8 +++ .../upcoming/spelleater_wolverine.txt | 7 +++ .../cardsfolder/upcoming/springjaw_trap.txt | 6 ++ .../upcoming/startling_development.txt | 6 ++ .../upcoming/sudden_spinnerets.txt | 7 +++ .../upcoming/suffocating_fumes.txt | 6 ++ .../cardsfolder/upcoming/survivors_bond.txt | 7 +++ .../cardsfolder/upcoming/unexpected_fangs.txt | 7 +++ .../upcoming/whirlwind_of_thought.txt | 7 +++ .../cardsfolder/upcoming/whisper_squad.txt | 8 +++ .../cardsfolder/upcoming/wingspan_mentor.txt | 10 ++++ .../res/editions/Ikoria Lair of Behemoths.txt | 57 ++++++++++++++++++- 21 files changed, 197 insertions(+), 3 deletions(-) create mode 100755 forge-gui/res/cardsfolder/upcoming/serrated_scorpion.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/skycat_sovereign.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/sleeper_dart.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/slitherwisp.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/snare_tactician.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/solid_footing.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/song_of_creation.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/sonorous_howlbonder.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/spelleater_wolverine.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/springjaw_trap.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/startling_development.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/sudden_spinnerets.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/suffocating_fumes.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/survivors_bond.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/unexpected_fangs.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/whirlwind_of_thought.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/whisper_squad.txt create mode 100755 forge-gui/res/cardsfolder/upcoming/wingspan_mentor.txt diff --git a/forge-gui/res/cardsfolder/upcoming/bonders_enclave.txt b/forge-gui/res/cardsfolder/upcoming/bonders_enclave.txt index deafbdb731f..c6600c070e3 100755 --- a/forge-gui/res/cardsfolder/upcoming/bonders_enclave.txt +++ b/forge-gui/res/cardsfolder/upcoming/bonders_enclave.txt @@ -1,4 +1,4 @@ -Name:Bonder's Enclave +Name:Bonders' Enclave ManaCost:no cost Types:Land A:AB$ Mana | Cost$ T | Produced$ C | SpellDescription$ Add {C}. diff --git a/forge-gui/res/cardsfolder/upcoming/narset_of_the_ancient_way.txt b/forge-gui/res/cardsfolder/upcoming/narset_of_the_ancient_way.txt index b0a7724f27e..b3849b2871e 100644 --- a/forge-gui/res/cardsfolder/upcoming/narset_of_the_ancient_way.txt +++ b/forge-gui/res/cardsfolder/upcoming/narset_of_the_ancient_way.txt @@ -12,4 +12,4 @@ SVar:X:Remembered$CardManaCost A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Planeswalker$ True | Ultimate$ True | Name$ Emblem - Narset of the Ancient Way | Image$ emblem_narset_of_the_ancient_way | Triggers$ TrigSpellCast | SVars$ EffSpellCast | Duration$ Permanent | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "Whenever you cast a noncreature spell, this emblem deals 2 damage to any target." SVar:TrigSpellCast:Mode$ SpellCast | ValidActivatingPlayer$ You | ValidCard$ Card.nonCreature | Execute$ EffSpellCast | TriggerDescription$ Whenever you cast a noncreature spell, this emblem deals 2 damage to any target. SVar:EffSpellCast:DB$ DealDamage | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 2 -Oracle[+1]: You gain 2 life. Add {U}, {R}, or {W}. Spend this mana only to cast a noncreature spell.\n[−2]: Draw a card, then you may discard a card. When you discard a nonland card this way, Narset of the Ancient Way deals damage equal to that card's converted mana cost to target creature or planeswalker.\n[−6]: You get an emblem with "Whenever you cast a noncreature spell, this emblem deals 2 damage to any target." +Oracle:[+1]: You gain 2 life. Add {U}, {R}, or {W}. Spend this mana only to cast a noncreature spell.\n[−2]: Draw a card, then you may discard a card. When you discard a nonland card this way, Narset of the Ancient Way deals damage equal to that card's converted mana cost to target creature or planeswalker.\n[−6]: You get an emblem with "Whenever you cast a noncreature spell, this emblem deals 2 damage to any target." diff --git a/forge-gui/res/cardsfolder/upcoming/serrated_scorpion.txt b/forge-gui/res/cardsfolder/upcoming/serrated_scorpion.txt new file mode 100755 index 00000000000..e05e626c4b6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serrated_scorpion.txt @@ -0,0 +1,8 @@ +Name:Serrated Scorpion +ManaCost:B +Types:Creature Scorpion +PT:1/2 +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigDealDamage | TriggerController$ TriggeredCardController | TriggerDescription$ When CARDNAME dies, it deals 2 damage to each opponent and you gain 2 life. +SVar:TrigDealDamage:DB$ DamageAll | ValidPlayers$ Player.Opponent | NumDmg$ 2 | SubAbility$ DBGainLife +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 +Oracle:When Serrated Scorpion dies, it deals 2 damage to each opponent and you gain 2 life. diff --git a/forge-gui/res/cardsfolder/upcoming/skycat_sovereign.txt b/forge-gui/res/cardsfolder/upcoming/skycat_sovereign.txt new file mode 100755 index 00000000000..4a3c3f55fa5 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/skycat_sovereign.txt @@ -0,0 +1,10 @@ +Name:Skycat Sovereign +ManaCost:W U +Types:Creature Elemental Cat +PT:1/1 +K:Flying +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ X | AddToughness$ X | Description$ CARDNAME gets +1/+1 for each other creature you control with flying. +SVar:X:Count$Valid Creature.Other+YouCtrl+withFlying +SVar:BuffedBy:Creature.withFlying +A:AB$ Token | Cost$ 2 W U | TokenAmount$ 1 | TokenScript$ w_1_1_cat_bird_flying | TokenOwner$ You | SpellDescription$ Create a 1/1 white Cat Bird creature token with flying. +Oracle:Flying\nSkycat Sovereign gets +1/+1 for each other creature you control with flying.\n{2}{W}{U}: Create a 1/1 white Cat Bird creature token with flying. diff --git a/forge-gui/res/cardsfolder/upcoming/sleeper_dart.txt b/forge-gui/res/cardsfolder/upcoming/sleeper_dart.txt new file mode 100755 index 00000000000..fe465e01231 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sleeper_dart.txt @@ -0,0 +1,7 @@ +Name:Sleeper Dart +ManaCost:2 +Types:Artifact +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 +A:AB$ Pump | Cost$ T Sac<1/CARDNAME> | ValidTgts$ Creature | TgtPrompt$ Select target creature | KW$ HIDDEN This card doesn't untap during your next untap step. | Permanent$ True | IsCurse$ True | SpellDescription$ Target creature doesn't untap during its controller's next untap step. +Oracle:When Sleeper Dart enters the battlefield, draw a card.\n{T}, Sacrifice Sleeper Dart: Target creature doesn't untap during its controller's next untap step. diff --git a/forge-gui/res/cardsfolder/upcoming/slitherwisp.txt b/forge-gui/res/cardsfolder/upcoming/slitherwisp.txt new file mode 100755 index 00000000000..74be44428e8 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/slitherwisp.txt @@ -0,0 +1,9 @@ +Name:Slitherwisp +ManaCost:U B B +Types:Creature Elemental Nightmare +PT:3/2 +K:Flash +T:Mode$ SpellCast | ValidCard$ Card.hasKeywordFlash+Other | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you cast another spell with flash, you draw a card and each opponent loses 1 life. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 | SubAbility$ DBLoseLife +SVar:DBLoseLife:DB$ LoseLife | Defined$ Player.Opponent | LifeAmount$ 1 +Oracle:Flash\nWhenever you cast another spell with flash, you draw a card and each opponent loses 1 life. diff --git a/forge-gui/res/cardsfolder/upcoming/snare_tactician.txt b/forge-gui/res/cardsfolder/upcoming/snare_tactician.txt new file mode 100755 index 00000000000..f38dc39050d --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/snare_tactician.txt @@ -0,0 +1,8 @@ +Name:Snare Tactician +ManaCost:2 W +Types:Creature Human Soldier +PT:2/3 +T:Mode$ Cycled | ValidCard$ Card.YouOwn | TriggerZones$ Battlefield | Execute$ TrigTap | TriggerDescription$ Whenever you cycle a card, tap target creature an opponent controls. +SVar:TrigTap:DB$ Tap | ValidTgts$ Creature.OppCtrl | TgtPrompt$ Choose target creature an opponent controls +SVar:PlayMain1:TRUE +Oracle:Whenever you cycle a card, tap target creature an opponent controls. diff --git a/forge-gui/res/cardsfolder/upcoming/solid_footing.txt b/forge-gui/res/cardsfolder/upcoming/solid_footing.txt new file mode 100755 index 00000000000..a63503ebdf9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/solid_footing.txt @@ -0,0 +1,9 @@ +Name:Solid Footing +ManaCost:W +Types:Enchantment Aura +K:Flash +K:Enchant creature +A:SP$ Attach | Cost$ W | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Pump +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddPower$ 1 | AddToughness$ 1 | Description$ Enchanted creature gets +1/+1. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy+withVigilance | AddHiddenKeyword$ CARDNAME assigns combat damage equal to its toughness rather than its power | Description$ As long as enchanted creature has vigilance, it assigns combat damage equal to its toughness rather than its power. +Oracle:Flash\nEnchant creature\nEnchanted creature gets +1/+1.\nAs long as enchanted creature has vigilance, it assigns combat damage equal to its toughness rather than its power. diff --git a/forge-gui/res/cardsfolder/upcoming/song_of_creation.txt b/forge-gui/res/cardsfolder/upcoming/song_of_creation.txt new file mode 100755 index 00000000000..31ec7ee9007 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/song_of_creation.txt @@ -0,0 +1,9 @@ +Name:Song of Creation +ManaCost:1 G U R +Types:Enchantment +S:Mode$ Continuous | Affected$ You | AdjustLandPlays$ 1 | Description$ You may play an additional land on each of your turns. +T:Mode$ SpellCast | ValidCard$ Card | ValidActivatingPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDraw | TriggerDescription$ Whenever you cast a spell, draw two cards. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 2 +T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigDiscard | TriggerDescription$ At the beginning of your end step, discard your hand. +SVar:TrigDiscard:DB$ Discard | Mode$ Hand | Defined$ You +Oracle:You may play an additional land on each of your turns.\nWhenever you cast a spell, draw two cards.\nAt the beginning of your end step, discard your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/sonorous_howlbonder.txt b/forge-gui/res/cardsfolder/upcoming/sonorous_howlbonder.txt new file mode 100755 index 00000000000..53ef5c6700c --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sonorous_howlbonder.txt @@ -0,0 +1,8 @@ +Name:Sonorous Howlbonder +ManaCost:1 B/R B/R +Types:Creature Human Warrior +PT:2/2 +K:Menace +S:Mode$ Continuous | Affected$ Creature.YouCtrl+withMenace | AddHiddenKeyword$ CantBeBlockedByAmount LT3 | Description$ Each creature you control with menace can't be blocked except by three or more creatures. +SVar:PlayMain1:TRUE +Oracle:Menace\nEach creature you control with menace can't be blocked except by three or more creatures. diff --git a/forge-gui/res/cardsfolder/upcoming/spelleater_wolverine.txt b/forge-gui/res/cardsfolder/upcoming/spelleater_wolverine.txt new file mode 100755 index 00000000000..84b76059dbe --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/spelleater_wolverine.txt @@ -0,0 +1,7 @@ +Name:Spelleater Wolverine +ManaCost:2 R +Types:Creature Wolverine +PT:3/2 +S:Mode$ Continuous | Affected$ Card.Self | AddKeyword$ Double Strike | CheckSVar$ X | SVarCompare$ GE3 | Description$ CARDNAME has double strike as long as there are three or more instant and/or sorcery cards in your graveyard. +SVar:X:Count$ValidGraveyard Instant.YouOwn,Sorcery.YouOwn +Oracle:Spelleater Wolverine has double strike as long as there are three or more instant and/or sorcery cards in your graveyard. diff --git a/forge-gui/res/cardsfolder/upcoming/springjaw_trap.txt b/forge-gui/res/cardsfolder/upcoming/springjaw_trap.txt new file mode 100755 index 00000000000..1e4eaabac55 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/springjaw_trap.txt @@ -0,0 +1,6 @@ +Name:Springjaw Trap +ManaCost:1 +Types:Artifact +K:Flash +A:AB$ DealDamage | Cost$ 4 T Sac<1/CARDNAME> | ValidTgts$ Creature,Player,Planeswalker | TgtPrompt$ Select any target | NumDmg$ 3 | SpellDescription$ CARDNAME deals 3 damage to any target. +Oracle:Flash\n{4}, {T}, Sacrifice Springjaw Trap: It deals 3 damage to any target. diff --git a/forge-gui/res/cardsfolder/upcoming/startling_development.txt b/forge-gui/res/cardsfolder/upcoming/startling_development.txt new file mode 100755 index 00000000000..01fa738a037 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/startling_development.txt @@ -0,0 +1,6 @@ +Name:Startling Development +ManaCost:1 U +Types:Instant +A:SP$ Animate | Cost$ 1 U | ValidTgts$ Creature | TgtPrompt$ Select target creature | Colors$ Blue | OverwriteColors$ True | Types$ Serpent | RemoveCreatureTypes$ True | Power$ 4 | Toughness$ 4 | StackDescription$ SpellDescription | SpellDescription$ Until end of turn, target creature becomes a blue Serpent with base power and toughness 4/4. +K:Cycling:1 +Oracle:Until end of turn, target creature becomes a blue Serpent with base power and toughness 4/4.\nCycling {1} ({1}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/sudden_spinnerets.txt b/forge-gui/res/cardsfolder/upcoming/sudden_spinnerets.txt new file mode 100755 index 00000000000..80e1a932cb1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/sudden_spinnerets.txt @@ -0,0 +1,7 @@ +Name:Sudden Spinnerets +ManaCost:G +Types:Instant +A:SP$ Pump | Cost$ G | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +1 | NumDef$ +3 | SubAbility$ DBPutCounter | SpellDescription$ Target creature gets +1/+3 until end of turn. Put a reach counter on it. Untap it. +SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ REACH | CounterNum$ 1 | SubAbility$ DBUntap +SVar:DBUntap:DB$ Untap | Defined$ Targeted +Oracle:Target creature gets +1/+3 until end of turn. Put a reach counter on it. Untap it. diff --git a/forge-gui/res/cardsfolder/upcoming/suffocating_fumes.txt b/forge-gui/res/cardsfolder/upcoming/suffocating_fumes.txt new file mode 100755 index 00000000000..4746508e6e4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/suffocating_fumes.txt @@ -0,0 +1,6 @@ +Name:Suffocating Fumes +ManaCost:2 B +Types:Instant +A:SP$ PumpAll | Cost$ 2 B | ValidCards$ Creature.OppCtrl | NumAtt$ -1 | NumDef$ -1 | IsCurse$ True | SpellDescription$ Creatures your opponents control get -1/-1 until end of turn. +K:Cycling:2 +Oracle:Creatures your opponents control get -1/-1 until end of turn.\nCycling {2} ({2}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/survivors_bond.txt b/forge-gui/res/cardsfolder/upcoming/survivors_bond.txt new file mode 100755 index 00000000000..334ff596a4e --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/survivors_bond.txt @@ -0,0 +1,7 @@ +Name:Survivors' Bond +ManaCost:1 G +Types:Sorcery +A:SP$ Charm | Cost$ 1 G | MinCharmNum$ 1 | CharmNum$ 2 | Choices$ Human,NonHuman +SVar:Human:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target Human creature card in your graveyard | ValidTgts$ Creature.Human+YouOwn | SpellDescription$ Return target Human creature card from your graveyard to your hand. +SVar:NonHuman:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | TgtPrompt$ Select target non-Human creature card in your graveyard | ValidTgts$ Creature.nonHuman+YouOwn | SpellDescription$ Return target non-Human creature card from your graveyard to your hand. +Oracle:Choose one or both —\n• Return target Human creature card from your graveyard to your hand.\n• Return target non-Human creature card from your graveyard to your hand. diff --git a/forge-gui/res/cardsfolder/upcoming/unexpected_fangs.txt b/forge-gui/res/cardsfolder/upcoming/unexpected_fangs.txt new file mode 100755 index 00000000000..fe6371d7f02 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/unexpected_fangs.txt @@ -0,0 +1,7 @@ +Name:Unexpected Fangs +ManaCost:1 B +Types:Instant +A:SP$ PutCounter | Cost$ 1 B | ValidTgts$ Creature | TgtPrompt$ Select target creature | CounterType$ P1P1 | CounterNum$ 1 | SubAbility$ DBPutCounter | SpellDescription$ Put a +1/+1 counter and a lifelink counter on target creature. +SVar:DBPutCounter:DB$ PutCounter | CounterType$ LIFELINK | CounterNum$ 1 | Defined$ Targeted +DeckHas:Ability$Counters +Oracle:Put a +1/+1 counter and a lifelink counter on target creature. diff --git a/forge-gui/res/cardsfolder/upcoming/whirlwind_of_thought.txt b/forge-gui/res/cardsfolder/upcoming/whirlwind_of_thought.txt new file mode 100755 index 00000000000..9244242bbf1 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/whirlwind_of_thought.txt @@ -0,0 +1,7 @@ +Name:Whirlwind of Thought +ManaCost:1 U R W +Types:Enchantment +T:Mode$ SpellCast | ValidCard$ Card.nonCreature | ValidActivatingPlayer$ You | Execute$ TrigDraw | TriggerZones$ Battlefield | TriggerDescription$ Whenever you cast a noncreature spell, draw a card. +SVar:TrigDraw:DB$ Draw | Defined$ You | NumCards$ 1 +SVar:BuffedBy:Card.nonCreature +Oracle:Whenever you cast a noncreature spell, draw a card. diff --git a/forge-gui/res/cardsfolder/upcoming/whisper_squad.txt b/forge-gui/res/cardsfolder/upcoming/whisper_squad.txt new file mode 100755 index 00000000000..db645dd8a23 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/whisper_squad.txt @@ -0,0 +1,8 @@ +Name:Whisper Squad +ManaCost:B +Types:Creature Human Soldier +PT:1/1 +A:AB$ ChangeZone | Cost$ 1 B | Origin$ Library | Destination$ Battlefield | ChangeType$ Card.namedWhisper Squad | ChangeNum$ 1 | Tapped$ True | StackDescription$ SpellDescription | SpellDescription$ Search your library for a card named CARDNAME, put it onto the battlefield tapped, then shuffle your library. +DeckHints:Type$Human +DeckNeeds:Name$Whisper Squad +Oracle:{1}{B}: Search your library for a card named Whisper Squad, put it onto the battlefield tapped, then shuffle your library. diff --git a/forge-gui/res/cardsfolder/upcoming/wingspan_mentor.txt b/forge-gui/res/cardsfolder/upcoming/wingspan_mentor.txt new file mode 100755 index 00000000000..0c6fd836596 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/wingspan_mentor.txt @@ -0,0 +1,10 @@ +Name:Wingspan Mentor +ManaCost:2 U +Types:Creature Human Wizard +PT:1/3 +T:Mode$ ChangesZone | Origin$ Any | Destination$ Battlefield | ValidCard$ Creature.Self | Execute$ TrigPut | TriggerDescription$ When CARDNAME enters the battlefield, put a flying counter on target non-Human creature you control. +SVar:TrigPut:DB$PutCounter | ValidTgts$ Creature.nonHuman+YouCtrl | TgtPrompt$ Select target non-Human creature | CounterType$ FLYING | CounterNum$ 1 +A:AB$ PutCounterAll | Cost$ 2 U T | ValidCards$ Creature.YouCtrl+withFlying | CounterType$ P1P1 | CounterNum$ 1 | StackDescription$ SpellDescription | SpellDescription$ Put a +1/+1 counter on each creature you control with flying. +SVar:PlayMain1:TRUE +DeckHas:Ability$Counters +Oracle:When Wingspan Mentor enters the battlefield, put a flying counter on target non-Human creature you control.\n{2}{U}, {T}: Put a +1/+1 counter on each creature you control with flying. diff --git a/forge-gui/res/editions/Ikoria Lair of Behemoths.txt b/forge-gui/res/editions/Ikoria Lair of Behemoths.txt index c6da43f9242..3f66d9dcb73 100644 --- a/forge-gui/res/editions/Ikoria Lair of Behemoths.txt +++ b/forge-gui/res/editions/Ikoria Lair of Behemoths.txt @@ -228,6 +228,7 @@ Type=Expansion 222 R Jegantha, the Wellspring 223 U Jubilant Skybonder 224 R Kaheera, the Orphanguard +225 R Keruga, the Macrosage 226 R Lurrus of the Dream-Den 227 R Lutri, the Spellchaser 228 R Obosh, the Preypiercer @@ -247,7 +248,7 @@ Type=Expansion 242 U Zagoth Crystal 243 C Bloodfell Caves 244 C Blossoming Sands -245 R Bonder's Enclave +245 R Bonders' Enclave 246 C Dismal Backwater 247 C Evolving Wilds 248 R Indatha Triome @@ -277,10 +278,13 @@ Type=Expansion 272 L Forest 273 L Forest 274 L Forest +#Buy-A-Box Promo 275 M Zilortha, Strength Incarnate +#Borderless Planeswalkers 276 M Lukka, Coppercoat Outcast 277 M Vivien, Monsters' Advocate 278 M Narset of the Ancient Way +#Showcase Cards 279 R Cubwarden 280 U Huntmaster Liger 281 U Majestic Auricorn @@ -316,11 +320,62 @@ Type=Expansion 311 R Raugrin Triome 312 R Savai Triome 313 R Zagoth Triome +314 R Drannith Magistrate +315 R Lavabrink Venturer 316 M Luminous Broodmoth +317 R Mythos of Snapdax +318 R Mythos of Illuna +319 R Shark Typhoon 320 R Voracious Greatshark +321 R Extinction Event +322 R Hunted Nightmare +323 R Mythos of Nethroi +324 R Mythos of Vadrok +325 R Unpredictable Cyclone 326 R Yidaro, Wandering Monster +327 R Colossification +328 R Kogla, the Titan Ape +329 R Mythos of Brokkos +330 M Chevill, Bane of Monsters +331 R Death's Oasis +332 R Eerie Ultimatum +333 R Emergent Ultimatum +334 R Frondland Felidar +335 M General Kudro of Drannith +336 R Genesis Ultimatum +337 R Inspired Ultimatum +338 M Kinnan, Bonder Prodigy +339 R Labyrinth Raptor +340 R Offspring's Revenge +341 R Quartzwood Crasher +342 M Rielle, the Everwise +343 R Ruinous Ultimatum +344 R Skycat Sovereign +345 R Slitherwisp +346 R Song of Creation +347 R Titans' Nest +348 R Whirlwind of Thought +349 M Winota, Joiner of Forces +350 M Fiend Artisan +351 R Gyruda, Doom of Depths +352 R Jegantha, the Wellspring +353 R Kaheera, the Orphanguard 354 R Keruga, the Macrosage +355 R Lurrus of the Dream-Den +356 R Lutri, the Spellchaser +357 R Obosh, the Preypiercer +358 R Umori, the Collector +359 R Yorion, Sky Nomad +360 R Zirda, the Dawnwaker +361 R Crystalline Giant +362 R The Ozolith +363 R Bonders' Enclave 364 R Colossification +365 U Flourishing Fox +366 U Heartless Act +367 C Forbidden Friendship +368 U Migration Path +369 U Sprite Dragon 370 U Huntmaster Liger 371 M Luminous Broodmoth 372 U Pollywog Symbiote