From 606f2b9ca5c62ab3ff69304b6ca30e5941ef2e4a Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 20 May 2019 00:08:40 +0800 Subject: [PATCH 1/3] Add Serra the Benevolent by nikivan --- .../upcoming/serra_the_benevolent.txt | 11 +++++++++ forge-gui/res/editions/Modern Horizons.txt | 24 +++++++++++++++++++ 2 files changed, 35 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt create mode 100644 forge-gui/res/editions/Modern Horizons.txt diff --git a/forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt b/forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt new file mode 100644 index 00000000000..86ba1e2eca3 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/serra_the_benevolent.txt @@ -0,0 +1,11 @@ +Name:Serra the Benevolent +ManaCost:2 W W +Types:Legendary Planeswalker Serra +Loyalty:4 +A:AB$ PumpAll | Cost$ AddCounter<2/LOYALTY> | Planeswalker$ True | ValidCards$ Creature.withFlying+YouCtrl | NumAtt$ +1 | NumDef$ +1 | SpellDescription$ Creatures you control with flying get +1/+1 until end of turn. +A:AB$ Token | Cost$ SubCounter<3/LOYALTY> | Planeswalker$ True | TokenScript$ w_4_4_angel_flying_vigilance | TokenOwner$ You | LegacyImage$ w 4 4 angel flying vigilance mh1 | SpellDescription$ Create a 4/4 white Angel creature token with flying and vigilance. +A:AB$ Effect | Cost$ SubCounter<6/LOYALTY> | Name$ Emblem - Serra the Benevolent | Image$ emblem_serra_the_benevolent | StaticAbilities$ STWorship | Planeswalker$ True | Ultimate$ True | Stackable$ False | Duration$ Permanent | AILogic$ Always | SpellDescription$ You get an emblem with "If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead." +SVar:STWorship:Mode$ Continuous | EffectZone$ Command | Affected$ You | AddKeyword$ DamageLifeThreshold:1 | IsPresent$ Creature.YouCtrl | Description$ If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead. +DeckHas:Ability$Token +SVar:Picture:http://www.wizards.com/global/images/magic/general/serra_the_benevolent.jpg +Oracle:[+2]: Creatures you control with flying get +1/+1 until end of turn.\n[-3]: Create a 4/4 white Angel creature token with flying and vigilance.\n[-6]: You get an emblem with "If you control a creature, damage that would reduce your life total to less than 1 reduces it to 1 instead." diff --git a/forge-gui/res/editions/Modern Horizons.txt b/forge-gui/res/editions/Modern Horizons.txt new file mode 100644 index 00000000000..58a50a855c0 --- /dev/null +++ b/forge-gui/res/editions/Modern Horizons.txt @@ -0,0 +1,24 @@ +[metadata] +Code=MH1 +Date=2019-6-14 +Name=Modern Horizons +Code2=MH1 +MciCode=mh1 +Type=Other + +[cards] + +26 M Serra the Benevolent + +80 R Cabal Therapist + +250 L Plains +251 L Island +252 L Swamp +253 L Mountain +254 L Forest +255 R Flusterstorm + + +[tokens] +w_4_4_angel_flying_vigilance \ No newline at end of file From 5b6655e14bb1b46c8162028cb12eb92951ca89fa Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 20 May 2019 09:03:00 +0800 Subject: [PATCH 2/3] Merge branch 'master' of https://git.cardforge.org/core-developers/forge into patch --- forge-ai/pom.xml | 2 +- .../java/forge/ai/AiAttackController.java | 23 ++++++++++++++++++- .../java/forge/ai/ability/ChangeZoneAi.java | 5 ++-- .../java/forge/ai/ability/DamageDealAi.java | 14 +++++------ forge-core/pom.xml | 2 +- forge-game/pom.xml | 2 +- forge-gui-android/pom.xml | 2 +- forge-gui-desktop/pom.xml | 2 +- forge-gui-ios/pom.xml | 2 +- forge-gui-mobile-dev/pom.xml | 2 +- forge-gui-mobile/pom.xml | 2 +- forge-gui/pom.xml | 2 +- forge-gui/release-files/ANNOUNCEMENTS.txt | 6 ++--- .../res/cardsfolder/s/storm_elemental.txt | 2 +- .../res/cardsfolder/t/teferis_time_twist.txt | 9 ++++---- .../cardsfolder/upcoming/cabal_therapist.txt | 12 ++++++++++ pom.xml | 2 +- 17 files changed, 62 insertions(+), 29 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt diff --git a/forge-ai/pom.xml b/forge-ai/pom.xml index 89c157c81ae..ec14ef4f065 100644 --- a/forge-ai/pom.xml +++ b/forge-ai/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-ai diff --git a/forge-ai/src/main/java/forge/ai/AiAttackController.java b/forge-ai/src/main/java/forge/ai/AiAttackController.java index e98fd7b6a7e..f4d65fa5980 100644 --- a/forge-ai/src/main/java/forge/ai/AiAttackController.java +++ b/forge-ai/src/main/java/forge/ai/AiAttackController.java @@ -190,7 +190,28 @@ public class AiAttackController { if ((attacker.getNetToughness() + ComputerUtilCombat.predictToughnessBonusOfAttacker(attacker, null, combat, true)) <= 0) { return false; } - + + // the attacker will die to a triggered ability (e.g. Sarkhan the Masterless) + for (Card c : ai.getOpponents().getCardsIn(ZoneType.Battlefield)) { + for (Trigger t : c.getTriggers()) { + if (t.getMode() == TriggerType.Attacks) { + SpellAbility sa = t.getOverridingAbility(); + if (sa == null && t.hasParam("Execute")) { + sa = AbilityFactory.getAbility(c, t.getParam("Execute")); + } + + if (sa != null && sa.getApi() == ApiType.EachDamage && "TriggeredAttacker".equals(sa.getParam("DefinedPlayers"))) { + List valid = CardLists.getValidCards(c.getController().getCreaturesInPlay(), sa.getParam("ValidCards"), c.getController(), c, sa); + // TODO: this assumes that 1 damage is dealt per creature. Improve this to check the parameter/X to determine + // how much damage is dealt by each of the creatures in the valid list. + if (attacker.getNetToughness() <= valid.size()) { + return false; + } + } + } + } + } + if ("TRUE".equals(attacker.getSVar("HasAttackEffect"))) { return true; } diff --git a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java index 69d55bb9281..9085d922e54 100644 --- a/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/ChangeZoneAi.java @@ -676,7 +676,8 @@ public class ChangeZoneAi extends SpellAbilityAi { } // only use blink or bounce effects - if (!(destination.equals(ZoneType.Exile) && (subApi == ApiType.DelayedTrigger || subApi == ApiType.ChangeZone)) + if (!(destination.equals(ZoneType.Exile) + && (subApi == ApiType.DelayedTrigger || subApi == ApiType.ChangeZone || "DelayedBounce".equals(sa.getParam("AILogic")))) && !destination.equals(ZoneType.Hand)) { return false; } @@ -936,7 +937,7 @@ public class ChangeZoneAi extends SpellAbilityAi { // if it's blink or bounce, try to save my about to die stuff final boolean blink = (destination.equals(ZoneType.Exile) && (subApi == ApiType.DelayedTrigger - || (subApi == ApiType.ChangeZone && subAffected.equals("Remembered")))); + || "DelayedBounce".equals(sa.getParam("AILogic")) || (subApi == ApiType.ChangeZone && subAffected.equals("Remembered")))); if ((destination.equals(ZoneType.Hand) || blink) && (tgt.getMinTargets(sa.getHostCard(), sa) <= 1)) { // save my about to die stuff Card tobounce = canBouncePermanent(ai, sa, list); 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 531ba01988a..32a604679d2 100644 --- a/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java +++ b/forge-ai/src/main/java/forge/ai/ability/DamageDealAi.java @@ -75,7 +75,7 @@ public class DamageDealAi extends DamageAiBase { // Set PayX here to maximum value. dmg = ComputerUtilMana.determineLeftoverMana(sa, ai); - source.setSVar("PayX", Integer.toString(dmg)); + sa.setSVar("PayX", Integer.toString(dmg)); } else if (sa.getSVar(damage).equals("Count$CardsInYourHand") && source.getZone().is(ZoneType.Hand)) { dmg--; // the card will be spent casting the spell, so actual damage is 1 less } @@ -115,7 +115,7 @@ public class DamageDealAi extends DamageAiBase { } // Set PayX here to maximum value. It will be adjusted later depending on the target. - source.setSVar("PayX", Integer.toString(dmg)); + sa.setSVar("PayX", Integer.toString(dmg)); } else if (sa.getSVar(damage).contains("InYourHand") && source.getZone().is(ZoneType.Hand)) { dmg = CardFactoryUtil.xCount(source, sa.getSVar(damage)) - 1; // the card will be spent casting the spell, so actual damage is 1 less } else if (sa.getSVar(damage).equals("TargetedPlayer$CardsInHand")) { @@ -283,7 +283,7 @@ public class DamageDealAi extends DamageAiBase { if (sourceName.equals("Crater's Claws") && ai.hasFerocious()) { actualPay = actualPay > 2 ? actualPay - 2 : 0; } - source.setSVar("PayX", Integer.toString(actualPay)); + sa.setSVar("PayX", Integer.toString(actualPay)); } } @@ -291,7 +291,7 @@ public class DamageDealAi extends DamageAiBase { // Check to ensure that we have enough counters to remove per the defined PayX for (CostPart part : sa.getPayCosts().getCostParts()) { if (part instanceof CostRemoveCounter) { - if (source.getCounters(((CostRemoveCounter) part).counter) < Integer.valueOf(source.getSVar("PayX"))) { + if (source.getCounters(((CostRemoveCounter) part).counter) < Integer.valueOf(sa.getSVar("PayX"))) { return false; } break; @@ -941,7 +941,7 @@ public class DamageDealAi extends DamageAiBase { if (damage.equals("X") && sa.getSVar(damage).equals("Count$xPaid")) { // Set PayX here to maximum value. dmg = ComputerUtilMana.determineLeftoverMana(sa, ai); - source.setSVar("PayX", Integer.toString(dmg)); + sa.setSVar("PayX", Integer.toString(dmg)); } final TargetRestrictions tgt = sa.getTargetRestrictions(); @@ -971,7 +971,7 @@ public class DamageDealAi extends DamageAiBase { } } - source.setSVar("PayX", Integer.toString(actualPay)); + sa.setSVar("PayX", Integer.toString(actualPay)); } } @@ -1031,7 +1031,7 @@ public class DamageDealAi extends DamageAiBase { saTgt.resetTargets(); saTgt.getTargets().add(tgtCreature != null && dmg < opponent.getLife() ? tgtCreature : opponent); - source.setSVar("PayX", Integer.toString(dmg)); + sa.setSVar("PayX", Integer.toString(dmg)); return true; } diff --git a/forge-core/pom.xml b/forge-core/pom.xml index afb89ae67bc..8a79508056a 100644 --- a/forge-core/pom.xml +++ b/forge-core/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-core diff --git a/forge-game/pom.xml b/forge-game/pom.xml index f5bd19fa4fe..1133ec9e0f9 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -6,7 +6,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-game diff --git a/forge-gui-android/pom.xml b/forge-gui-android/pom.xml index a2736015655..a9faad63827 100644 --- a/forge-gui-android/pom.xml +++ b/forge-gui-android/pom.xml @@ -19,7 +19,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui-android diff --git a/forge-gui-desktop/pom.xml b/forge-gui-desktop/pom.xml index f15c0200d06..13d08231132 100644 --- a/forge-gui-desktop/pom.xml +++ b/forge-gui-desktop/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui-desktop diff --git a/forge-gui-ios/pom.xml b/forge-gui-ios/pom.xml index 1fb892305c9..eb8797043a4 100644 --- a/forge-gui-ios/pom.xml +++ b/forge-gui-ios/pom.xml @@ -12,7 +12,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui-ios diff --git a/forge-gui-mobile-dev/pom.xml b/forge-gui-mobile-dev/pom.xml index 351ccbfe15a..6aaa483d474 100644 --- a/forge-gui-mobile-dev/pom.xml +++ b/forge-gui-mobile-dev/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui-mobile-dev diff --git a/forge-gui-mobile/pom.xml b/forge-gui-mobile/pom.xml index f0f247a1f8c..d0e1c628b54 100644 --- a/forge-gui-mobile/pom.xml +++ b/forge-gui-mobile/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui-mobile diff --git a/forge-gui/pom.xml b/forge-gui/pom.xml index 8a781f93577..e2602b9e7d3 100644 --- a/forge-gui/pom.xml +++ b/forge-gui/pom.xml @@ -4,7 +4,7 @@ forge forge - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT forge-gui diff --git a/forge-gui/release-files/ANNOUNCEMENTS.txt b/forge-gui/release-files/ANNOUNCEMENTS.txt index 3c4f31a98f1..6029ab366c0 100644 --- a/forge-gui/release-files/ANNOUNCEMENTS.txt +++ b/forge-gui/release-files/ANNOUNCEMENTS.txt @@ -1,7 +1,5 @@ #Add one announcement per line -War for the Spark is here! We're still missing a few cards, but hopefully we'll get those added soon. -A very drastic change has happened for tokens and token images. Check out the information here: https://www.slightlymagic.net/forum/viewtopic.php?f=26&t=23317 +War for the Spark is all added. I'm sure we didn't get all of the bugs fully worked out, so please let us know if you see anything weird. A significant improvement was made to how we cache images which should improve memory usage [b]Forge now requires Java 8 (or newer). You will not be able to start the game if you are not yet running Java 8.[/b] -We have a Discord server for hanging out with Forge devs and other Forge fans. Feel free to [url=https://discord.gg/3v9JCVr]jump on in and say hi[/url]! -Online Multiplayer is once again functional! \ No newline at end of file +We have a Discord server for hanging out with Forge devs and other Forge fans. Feel free to [url=https://discord.gg/3v9JCVr]jump on in and say hi[/url]! \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/s/storm_elemental.txt b/forge-gui/res/cardsfolder/s/storm_elemental.txt index f4161f70e5c..c1cd409f89d 100644 --- a/forge-gui/res/cardsfolder/s/storm_elemental.txt +++ b/forge-gui/res/cardsfolder/s/storm_elemental.txt @@ -4,7 +4,7 @@ Types:Creature Elemental PT:3/4 K:Flying A:AB$ Tap | Cost$ U ExileFromTop<1/Card> | ValidTgts$ Creature.withFlying | TgtPrompt$ Select target creature with flying | SpellDescription$ Tap target creature with flying. -A:AB$ Pump | Cost$ U ExileFromTop<1/Card> | Defined$ Self | NumAtt$ +X | NumDef$ +X | SpellDescription$ If the exiled card is a snow land, CARDNAME gets +1/+1 until end of turn. +A:AB$ Pump | Cost$ U ExileFromTop<1/Card> | Defined$ Self | NumAtt$ +X | NumDef$ +X | References$ X | SpellDescription$ If the exiled card is a snow land, CARDNAME gets +1/+1 until end of turn. SVar:X:Exiled$Valid Land.Snow SVar:Picture:http://www.wizards.com/global/images/magic/general/storm_elemental.jpg Oracle:Flying\n{U}, Exile the top card of your library: Tap target creature with flying.\n{U}, Exile the top card of your library: If the exiled card is a snow land, Storm Elemental gets +1/+1 until end of turn. diff --git a/forge-gui/res/cardsfolder/t/teferis_time_twist.txt b/forge-gui/res/cardsfolder/t/teferis_time_twist.txt index c134268c417..cfa594d4401 100644 --- a/forge-gui/res/cardsfolder/t/teferis_time_twist.txt +++ b/forge-gui/res/cardsfolder/t/teferis_time_twist.txt @@ -1,9 +1,10 @@ Name:Teferi's Time Twist ManaCost:1 U Types:Instant -A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent.YouCtrl | Mandatory$ True | TgtPrompt$ Select target permanent you control | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBAnimate | SpellDescription$ Exile target permanent you control. Return that card to the battlefield under its owner’s control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. -SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Keywords$ etbCounter:P1P1:1:ValidCard$ Creature.IsRemembered | RememberObjects$ Remembered | SubAbility$ DelTrig -SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | RememberObjects$ Remembered | TriggerDescription$ Return that card to the battlefield under its owner’s control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. +A:SP$ ChangeZone | Cost$ 1 U | ValidTgts$ Permanent.YouCtrl | TgtPrompt$ Select target permanent you control | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | AILogic$ DelayedBounce | SubAbility$ DBAnimate | SpellDescription$ Exile target permanent you control. Return that card to the battlefield under its owner’s control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. +SVar:DBAnimate:DB$ Animate | Defined$ Remembered | Keywords$ etbCounter:P1P1:1:ValidCard$ Creature.IsRemembered | RememberObjects$ Remembered | SubAbility$ DelTrig | AILogic$ Always +SVar:DelTrig:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | Execute$ TrigBounce | RememberObjects$ Remembered | AILogic$ Always | TriggerDescription$ Return that card to the battlefield under its owner’s control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. SVar:TrigBounce:DB$ ChangeZone | Origin$ Exile | Destination$ Battlefield | Defined$ DelayTriggerRemembered SVar:Picture:https://gatherer.wizards.com/Handlers/Image.ashx?multiverseid=460999&type=card -Oracle: Exile target permanent you control. Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. \ No newline at end of file +DeckHas:Ability$Counters +Oracle:Exile target permanent you control. Return that card to the battlefield under its owner's control at the beginning of the next end step. If it enters the battlefield as a creature, it enters with an additional +1/+1 counter on it. \ No newline at end of file diff --git a/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt b/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt new file mode 100644 index 00000000000..1e295b95933 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt @@ -0,0 +1,12 @@ +Name:Cabal Therapist +ManaCost:B +Types:Creature Horror +PT:1/1 +K:Menace +T:Mode$ Phase | Phase$ Main1 | PreCombatMain$ True | ValidPlayer$ You | Execute$ DBImmediateTrigger | TriggerZones$ Battlefield | TriggerDescription$ At the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. +SVar:DBImmediateTrigger:DB$ ImmediateTrigger | Execute$ NameCard | TriggerDescription$ You may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. | UnlessCost$ Sac<1/Creature> | UnlessPayer$ You | UnlessSwitched$ True +SVar:NameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SubAbility$ DBDiscard | SpellDescription$ Choose a nonland card name. Target player reveals their hand and discards all cards with that name. +SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealDiscardAll | DiscardValid$ Card.NamedCard +AI:RemoveDeck:All +SVar:https://i.imgur.com/ZLMSgWt.jpg +Oracle:Menace \nAt the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. \ No newline at end of file diff --git a/pom.xml b/pom.xml index 5ff444063e8..9c0b3538532 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ forge pom Forge Parent - 1.6.25-SNAPSHOT + 1.6.26-SNAPSHOT Forge lets you play the card game Magic: The Gathering against a computer opponent using all of the rules. From 32223f0993beb3afc8f3feb59db3b742cfd67d4f Mon Sep 17 00:00:00 2001 From: swordshine Date: Mon, 20 May 2019 10:10:29 +0800 Subject: [PATCH 3/3] Add Savage Swipe --- .../res/cardsfolder/b/bant_sojourners.txt | 2 +- .../cardsfolder/upcoming/cabal_therapist.txt | 3 +-- .../res/cardsfolder/upcoming/savage_swipe.txt | 6 ++++++ forge-gui/res/editions/Modern Horizons.txt | 20 ++++++++++++++++--- 4 files changed, 25 insertions(+), 6 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/savage_swipe.txt diff --git a/forge-gui/res/cardsfolder/b/bant_sojourners.txt b/forge-gui/res/cardsfolder/b/bant_sojourners.txt index 2c53d45b060..1c4b986fe4d 100644 --- a/forge-gui/res/cardsfolder/b/bant_sojourners.txt +++ b/forge-gui/res/cardsfolder/b/bant_sojourners.txt @@ -4,7 +4,7 @@ Types:Creature Human Soldier PT:2/4 K:Cycling:2 W T:Mode$ Cycled | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerDescription$ When you cycle CARDNAME or it dies, you may create a 1/1 white Soldier creature token. -T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it dies, you may create a 1/1 white Soldier creature token. +T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.Self | Execute$ TrigToken | OptionalDecider$ You | TriggerController$ TriggeredCardController | Secondary$ True | TriggerDescription$ When you cycle CARDNAME or it dies, you may create a 1/1 white Soldier creature token. SVar:TrigToken:DB$ Token | TokenAmount$ 1 | TokenScript$ w_1_1_soldier | TokenOwner$ You | LegacyImage$ w 1 1 soldier arb SVar:Picture:http://www.wizards.com/global/images/magic/general/bant_sojourners.jpg Oracle:When you cycle Bant Sojourners or it dies, you may create a 1/1 white Soldier creature token.\nCycling {2}{W} ({2}{W}, Discard this card: Draw a card.) diff --git a/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt b/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt index 1e295b95933..a97e8a7fc1d 100644 --- a/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt +++ b/forge-gui/res/cardsfolder/upcoming/cabal_therapist.txt @@ -8,5 +8,4 @@ SVar:DBImmediateTrigger:DB$ ImmediateTrigger | Execute$ NameCard | TriggerDescri SVar:NameCard:DB$ NameCard | Defined$ You | ValidCards$ Card.nonLand | ValidDesc$ nonland | SubAbility$ DBDiscard | SpellDescription$ Choose a nonland card name. Target player reveals their hand and discards all cards with that name. SVar:DBDiscard:DB$ Discard | ValidTgts$ Player | TgtPrompt$ Select target player | Mode$ RevealDiscardAll | DiscardValid$ Card.NamedCard AI:RemoveDeck:All -SVar:https://i.imgur.com/ZLMSgWt.jpg -Oracle:Menace \nAt the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. \ No newline at end of file +Oracle:Menace\nAt the beginning of your precombat main phase, you may sacrifice a creature. When you do, choose a nonland card name, then target player reveals their hand and discards all cards with that name. diff --git a/forge-gui/res/cardsfolder/upcoming/savage_swipe.txt b/forge-gui/res/cardsfolder/upcoming/savage_swipe.txt new file mode 100644 index 00000000000..091b096da5f --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/savage_swipe.txt @@ -0,0 +1,6 @@ +Name:Savage Swipe +ManaCost:G +Types:Sorcery +A:SP$ Pump | Cost$ G | ValidTgts$ Creature.YouCtrl | AILogic$ Fight | AITgts$ Creature.YouCtrl+powerEQ2 | TgtPrompt$ Select target creature you control | SubAbility$ DBFight | NumAtt$ +2 | NumDef$ +2 | ConditionDefined$ Targeted | ConditionPresent$ Creature.powerEQ2 | SpellDescription$ Target creature you control gets +2/+2 until end of turn. It fights target creature you don't control. +SVar:DBFight:DB$ Fight | Defined$ ParentTarget | ValidTgts$ Creature.YouDontCtrl | TgtPrompt$ Select target creature you don't control +Oracle:Target creature you control gets +2/+2 until end of turn if its power is 2. Then it fights target creature you don't control. (Each deals damage equal to its power to the other.) diff --git a/forge-gui/res/editions/Modern Horizons.txt b/forge-gui/res/editions/Modern Horizons.txt index 58a50a855c0..a5a9a1c85ae 100644 --- a/forge-gui/res/editions/Modern Horizons.txt +++ b/forge-gui/res/editions/Modern Horizons.txt @@ -7,11 +7,25 @@ MciCode=mh1 Type=Other [cards] - +14 C Impostor of the Sixth Pride +19 C Martyr's Soul 26 M Serra the Benevolent - +36 C Wall of One Thousand Cuts +38 U Wing Shards +44 C Choking Tethers +52 R Force of Negation +64 C Prohibit +71 C Stream of Thought 80 R Cabal Therapist - +95 C Headless Specter +114 C Venomous Changling +122 U Firebolt +129 U Goblin Matron +131 C Goblin War Party +134 C Lava Dart +161 R Deep Forest Hermit +162 C Elvish Fury +178 C Savage Swipe 250 L Plains 251 L Island 252 L Swamp