From 6029c3cb9976ff13ed087a488519992cc71dbba1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:44:17 -0400 Subject: [PATCH 01/21] a_little_chat.txt --- forge-gui/res/cardsfolder/upcoming/a_little_chat.txt | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/a_little_chat.txt diff --git a/forge-gui/res/cardsfolder/upcoming/a_little_chat.txt b/forge-gui/res/cardsfolder/upcoming/a_little_chat.txt new file mode 100644 index 00000000000..22db1fc02b4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/a_little_chat.txt @@ -0,0 +1,6 @@ +Name:A Little Chat +ManaCost:1 U +Types:Instant +K:Casualty:1 +A:SP$ Dig | DigNum$ 2 | ChangeNum$ 1 | SpellDescription$ Look at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. +Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell.)\nLook at the top two cards of your library. Put one of them into your hand and the other on the bottom of your library. From 9e40b5b3a42e74a7adb7bee9d67bad6fe5908cde Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:44:28 -0400 Subject: [PATCH 02/21] ob_nixilis_the_adversary.txt --- .../upcoming/ob_nixilis_the_adversary.txt | 14 ++++++++++++++ 1 file changed, 14 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/ob_nixilis_the_adversary.txt diff --git a/forge-gui/res/cardsfolder/upcoming/ob_nixilis_the_adversary.txt b/forge-gui/res/cardsfolder/upcoming/ob_nixilis_the_adversary.txt new file mode 100644 index 00000000000..d51f0da7ee9 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/ob_nixilis_the_adversary.txt @@ -0,0 +1,14 @@ +Name:Ob Nixilis, the Adversary +ManaCost:1 B R +Types:Legendary Planeswalker Nixilis +Loyalty:3 +K:Casualty:X:NonLegendary$ True | CopySetLoyalty$ Casualty:The copy isn't legendary and has starting loyalty X. +A:AB$ RepeatEach | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | RepeatPlayers$ Opponent | RepeatSubAbility$ DBDrain | SubAbility$ DBGainLife | SpellDescription$ Each opponent loses 2 life unless they discard a card. If you control a Demon or Devil, you gain 2 life. +SVar:DBDrain:DB$ LoseLife | Defined$ Player.IsRemembered | LifeAmount$ 2 | UnlessCost$ Discard<1/Card> | UnlessPayer$ Player.IsRemembered +SVar:DBGainLife:DB$ GainLife | LifeAmount$ 2 | ConditionPresent$ Demon.YouCtrl,Devil.YouCtrl | StackDescription$ None +A:AB$ Token | Cost$ SubCounter<2/LOYALTY> | TokenScript$ r_1_1_devil_burn | Planeswalker$ True | SpellDescription$ Create a 1/1 red Devil creature token with "When this creature dies, it deals 1 damage to any target." +A:AB$ Draw | Cost$ SubCounter<7/LOYALTY> | Planeswalker$ True | Ultimate$ True | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ 7 | SubAbility$ DBLoseLife | SpellDescription$ Target player draws seven cards and loses 7 life. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ 7 | Defined$ Targeted +DeckHas:Ability$Sacrifice|LifeGain|Token & Type$Devil +DeckHints:Type$Demon|Devil +Oracle:Casualty X. The copy isn't legendary and has starting loyalty X. (As you cast this spell, you may sacrifice a creature with power X. When you do, copy this spell and you may choose new targets for the copy.)\n[+1]: Each opponent loses 2 life unless they discard a card. If you control a Demon or Devil, you gain 2 life.\n[−2]: Create a 1/1 red Devil creature token with "When this creature dies, it deals 1 damage to any target."\n[−7]: Target player draws seven cards and loses 7 life. From 996a011b666e3cad7dc229c1c000c9b24e1f61d8 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:45:28 -0400 Subject: [PATCH 03/21] Card.java add Casualty description builders --- .../src/main/java/forge/game/card/Card.java | 23 ++++++++++++++----- 1 file changed, 17 insertions(+), 6 deletions(-) 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 5a7b41c2d98..07a69d5e38c 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2095,6 +2095,13 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.startsWith("Renown") || keyword.startsWith("Annihilator") || keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); sbLong.append(k[0]).append(" ").append(k[1]).append(" (").append(inst.getReminderText()).append(")"); + } else if (keyword.startsWith("Casualty")) { + final String[] k = keyword.split(":"); + sbLong.append("Casualty ").append(k[1]); + if (k.length >= 4) { + sbLong.append(". ").append(k[3]); + } + sbLong.append(" (").append(inst.getReminderText()).append(")"); } else if (keyword.startsWith("Starting intensity")) { sbLong.append(TextUtil.fastReplace(keyword, ":", " ")); } else if (keyword.contains("Haunt")) { @@ -2552,12 +2559,16 @@ public class Card extends GameEntity implements Comparable, IHasSVars { || keyword.equals("Fuse")) { sbAfter.append(keyword).append(" (").append(inst.getReminderText()).append(")"); sbAfter.append("\r\n"); - } else if (keyword.startsWith("Ripple")) { - sbBefore.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); - sbBefore.append("\r\n"); - } else if (keyword.startsWith("Dredge")) { - sbAfter.append(TextUtil.fastReplace(keyword, ":", " ")).append(" (").append(inst.getReminderText()).append(")"); - sbAfter.append("\r\n"); + } else if (keyword.startsWith("Casualty")) { + final String[] k = keyword.split(":"); + sbBefore.append("Casualty ").append(k[1]); + if (k.length >= 4) { + sbBefore.append(". ").append(k[3]); + } + sbBefore.append(" (").append(inst.getReminderText()).append(")").append("\r\n\r\n"); + } else if (keyword.startsWith("Dredge") || keyword.startsWith("Ripple")) { + sbAfter.append(TextUtil.fastReplace(keyword, ":", " ")); + sbAfter.append(" (").append(inst.getReminderText()).append(")").append("\r\n"); } else if (keyword.startsWith("Starting intensity")) { sbAfter.append(TextUtil.fastReplace(keyword, ":", " ")).append("\r\n"); } else if (keyword.startsWith("Escalate") || keyword.startsWith("Buyback") From dbbe57e1f564b61ed59c49c42e1f34d6e89b7059 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:45:46 -0400 Subject: [PATCH 04/21] Card.java add setBaseLoyalty --- forge-game/src/main/java/forge/game/card/Card.java | 4 ++++ 1 file changed, 4 insertions(+) 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 07a69d5e38c..ee5bd350e71 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -3816,6 +3816,10 @@ public class Card extends GameEntity implements Comparable, IHasSVars { return getCounters(CounterEnumType.LOYALTY); } + public final void setBaseLoyalty(final int n) { + currentState.setBaseLoyalty(Integer.toString(n)); + } + // values that are printed on card public final int getBasePower() { return currentState.getBasePower(); From aa5aa2e08789532620d3084e51ebc11ec05c4f71 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:46:13 -0400 Subject: [PATCH 05/21] CardFactory support "CopySetLoyalty" --- forge-game/src/main/java/forge/game/card/CardFactory.java | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index f6551840e24..7f7f70a9c39 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -40,6 +40,7 @@ import forge.item.IPaperCard; import forge.item.PaperCard; import forge.util.CardTranslation; import forge.util.TextUtil; +import org.apache.commons.lang3.StringUtils; import java.util.Arrays; import java.util.List; @@ -137,6 +138,11 @@ public class CardFactory { c.setBaseToughness(Integer.parseInt(sourceSA.getParam("CopySetToughness"))); } + if (sourceSA.hasParam("CopySetLoyalty")) { + final String s = sourceSA.getParam("CopySetLoyalty"); + c.setBaseLoyalty(StringUtils.isNumeric(s) ? Integer.parseInt(s) : Integer.parseInt(targetSA.getSVar(s))); + } + if (sourceSA.hasParam("CopyAddTypes")) { c.addType(Arrays.asList(sourceSA.getParam("CopyAddTypes").split(" & "))); } From 1f28a731576c4d222df8e9e5f2823e1d2efe938d Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:47:29 -0400 Subject: [PATCH 06/21] CardFactoryUtil add Casualty trigger ability --- .../java/forge/game/card/CardFactoryUtil.java | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java index 145ca73b613..5da90ca4dd9 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -920,7 +920,7 @@ public class CardFactoryUtil { StringBuilder trig = new StringBuilder(); trig.append("Mode$ ChangesZone | Destination$ Battlefield | ValidCard$ Card.Self"); trig.append(" | TriggerDescription$ Champion ").append(article).append(" ").append(desc); - trig.append(" (").append(Keyword.getInstance("Champion:"+desc).getReminderText()) .append(")"); + trig.append(" (").append(Keyword.getInstance("Champion:" + desc).getReminderText()).append(")"); StringBuilder trigReturn = new StringBuilder(); trigReturn.append("Mode$ ChangesZone | Origin$ Battlefield | ValidCard$ Card.Self"); @@ -955,6 +955,19 @@ public class CardFactoryUtil { inst.addTrigger(parsedTrigger); inst.addTrigger(parsedTrigReturn); + } else if (keyword.startsWith("Casualty")) { + final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ Casualty | Secondary$ True"; + String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1 | MayChooseTarget$ True"; + String[] k = keyword.split(":"); + if (k.length > 2) { + abString = abString + " | " + k[2]; + } + + final Trigger casualtyTrigger = TriggerHandler.parseTrigger(trigScript, card, intrinsic); + casualtyTrigger.setOverridingAbility(AbilityFactory.getAbility(abString, card)); + casualtyTrigger.setSVar("Casualty", "0"); + + inst.addTrigger(casualtyTrigger); } else if (keyword.equals("Conspire")) { final String trigScript = "Mode$ SpellCast | ValidCard$ Card.Self | CheckSVar$ Conspire | Secondary$ True | TriggerDescription$ Copy CARDNAME if its conspire cost was paid"; final String abString = "DB$ CopySpellAbility | Defined$ TriggeredSpellAbility | Amount$ 1 | MayChooseTarget$ True"; From 8b4a6d21f3a01eacf9d4177682e2d59906e23e66 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:48:14 -0400 Subject: [PATCH 07/21] GameActionUtil add Casualty to checkStaticAfterPaying --- .../main/java/forge/game/GameActionUtil.java | 30 +++++++++++++++++-- 1 file changed, 28 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 1d9ea43ba38..3653f9a0698 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -562,7 +562,31 @@ public final class GameActionUtil { for (KeywordInterface ki : host.getKeywords()) { final String o = ki.getOriginal(); - if (o.equals("Conspire")) { + if (o.startsWith("Casualty")) { + Trigger tr = Iterables.getFirst(ki.getTriggers(), null); + if (tr != null) { + String n = o.split(":")[1]; + if (host.wasCast() && n.equals("X")) { + n = Integer.toString(pc.announceRequirements(sa, "X for Casualty")); + } + final String casualtyCost = "Sac<1/Creature.powerGE" + n + "/creature with power " + n + + " or greater>"; + final Cost cost = new Cost(casualtyCost, false); + String str = "Pay for Casualty? " + cost.toSimpleString(); + boolean v = pc.addKeywordCost(sa, cost, ki, str); + + tr.setSVar("Casualty", v ? n : "0"); + + if (v) { + if (result == null) { + result = sa.copy(); + } + result.getPayCosts().add(cost); + result.setSVar("Casualty", n); + reset = true; + } + } + } else if (o.equals("Conspire")) { Trigger tr = Iterables.getFirst(ki.getTriggers(), null); if (tr != null) { final String conspireCost = "tapXType<2/Creature.SharesColorWith/" + @@ -807,7 +831,9 @@ public final class GameActionUtil { for (Table.Cell entry : oldKW.cellSet()) { for (KeywordInterface ki : entry.getValue().getKeywords()) { // check if this keyword existed previously - if ((ki.getOriginal().startsWith("Replicate") || ki.getOriginal().startsWith("Conspire")) && updatedKW.get(entry.getRowKey(), entry.getColumnKey()) != null) { + if ((ki.getOriginal().startsWith("Replicate") || ki.getOriginal().startsWith("Conspire") + || ki.getOriginal().startsWith("Casualty")) + && updatedKW.get(entry.getRowKey(), entry.getColumnKey()) != null) { updatedKW.put(entry.getRowKey(), entry.getColumnKey(), oldKW.get(entry.getRowKey(), entry.getColumnKey())); } } From 617a0639a2fd66d87c633f2b575b843e6bb06afa Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:48:31 -0400 Subject: [PATCH 08/21] Keyword add Casualty --- forge-game/src/main/java/forge/game/keyword/Keyword.java | 1 + 1 file changed, 1 insertion(+) diff --git a/forge-game/src/main/java/forge/game/keyword/Keyword.java b/forge-game/src/main/java/forge/game/keyword/Keyword.java index 9912796aac4..ce0e6070b17 100644 --- a/forge-game/src/main/java/forge/game/keyword/Keyword.java +++ b/forge-game/src/main/java/forge/game/keyword/Keyword.java @@ -35,6 +35,7 @@ public enum Keyword { BUSHIDO("Bushido", KeywordWithAmount.class, false, "Whenever this creature blocks or becomes blocked, it gets +%1$d/+%1$d until end of turn."), BUYBACK("Buyback", KeywordWithCost.class, false, "You may pay an additional %s as you cast this spell. If you do, put it into your hand instead of your graveyard as it resolves."), CASCADE("Cascade", SimpleKeyword.class, false, "When you cast this spell, exile cards from the top of your library until you exile a nonland card whose mana value is less than this spell's mana value. You may cast that spell without paying its mana cost if its mana value is less than this spell's mana value. Then put all cards exiled this way that weren't cast on the bottom of your library in a random order."), + CASUALTY("Casualty", KeywordWithAmount.class, false, "As you cast this spell, you may sacrifice a creature with power %1$d or greater. When you do, copy this spell."), CHAMPION("Champion", KeywordWithType.class, false, "When this enters the battlefield, sacrifice it unless you exile another %s you control. When this leaves the battlefield, that card returns to the battlefield."), CHANGELING("Changeling", SimpleKeyword.class, true, "This card is every creature type."), CIPHER("Cipher", SimpleKeyword.class, true, "Then you may exile this spell card encoded on a creature you control. Whenever that creature deals combat damage to a player, its controller may cast a copy of the encoded card without paying its mana cost."), From 920d6775bd929613cb03b796e4931fdc8823c5ca Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:48:54 -0400 Subject: [PATCH 09/21] KeywordWithAmount don't add Extra if it's card script params --- .../src/main/java/forge/game/keyword/KeywordWithAmount.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java index 1a569e5e471..dea434cbd2e 100644 --- a/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java +++ b/forge-game/src/main/java/forge/game/keyword/KeywordWithAmount.java @@ -28,7 +28,7 @@ public class KeywordWithAmount extends KeywordInstance { StringBuilder result = new StringBuilder( String.format(reminderText.replaceAll("\\%(\\d+\\$)?d", "%$1s"), "X") ); - if (!extra.isEmpty()) { + if (!extra.isEmpty() && !extra.contains("$")) { result.insert(result.length()-1, extra); } return result.toString(); From a823578af230782943aea6a449f6cccfd09e6ad9 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sat, 9 Apr 2022 23:58:57 -0400 Subject: [PATCH 10/21] make_disappear.txt --- forge-gui/res/cardsfolder/upcoming/make_disappear.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/make_disappear.txt diff --git a/forge-gui/res/cardsfolder/upcoming/make_disappear.txt b/forge-gui/res/cardsfolder/upcoming/make_disappear.txt new file mode 100644 index 00000000000..059f506d304 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/make_disappear.txt @@ -0,0 +1,7 @@ +Name:Make Disappear +ManaCost:1 U +Types:Instant +K:Casualty:1 +A:SP$ Counter | TargetType$ Spell | TgtPrompt$ Select target spell | ValidTgts$ Card | UnlessCost$ 2 | SpellDescription$ Counter target spell unless its controller pays {2}. +DeckHas:Ability$Sacrifice +Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nCounter target spell unless its controller pays {2}. From 9b7f7433d825e1da5bde4c0c78b19ed1d99cc238 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 10 Apr 2022 09:56:58 -0400 Subject: [PATCH 11/21] CardFactory - improve "CopySetLoyalty" --- forge-game/src/main/java/forge/game/card/CardFactory.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 7f7f70a9c39..29855e5449d 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -139,8 +139,7 @@ public class CardFactory { } if (sourceSA.hasParam("CopySetLoyalty")) { - final String s = sourceSA.getParam("CopySetLoyalty"); - c.setBaseLoyalty(StringUtils.isNumeric(s) ? Integer.parseInt(s) : Integer.parseInt(targetSA.getSVar(s))); + c.setBaseLoyalty(AbilityUtils.calculateAmount(source, sourceSA.getParam("CopySetLoyalty"), sourceSA)); } if (sourceSA.hasParam("CopyAddTypes")) { From 6aa847b2ccb74c654c3ac61371d26bbb18b2fb37 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Sun, 10 Apr 2022 10:02:26 -0400 Subject: [PATCH 12/21] GameActionUtil - better place to add Casualty SVar --- forge-game/src/main/java/forge/game/GameActionUtil.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 3653f9a0698..9ac19451116 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -582,7 +582,7 @@ public final class GameActionUtil { result = sa.copy(); } result.getPayCosts().add(cost); - result.setSVar("Casualty", n); + tr.getOverridingAbility().setSVar("Casualty", n); reset = true; } } From aee6467af8f8e2cd3fc2a9209dfac51d2a595111 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 07:30:54 -0400 Subject: [PATCH 13/21] CardFactory remove unneeded import --- forge-game/src/main/java/forge/game/card/CardFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/forge-game/src/main/java/forge/game/card/CardFactory.java b/forge-game/src/main/java/forge/game/card/CardFactory.java index 29855e5449d..2a9b6e232bf 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactory.java +++ b/forge-game/src/main/java/forge/game/card/CardFactory.java @@ -40,7 +40,6 @@ import forge.item.IPaperCard; import forge.item.PaperCard; import forge.util.CardTranslation; import forge.util.TextUtil; -import org.apache.commons.lang3.StringUtils; import java.util.Arrays; import java.util.List; From 63c98db53ce261d345c56b9edeb911daaddebcbb Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 19:29:14 -0400 Subject: [PATCH 14/21] cut_your_losses.txt --- forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt b/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt new file mode 100644 index 00000000000..20fec4188a4 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt @@ -0,0 +1,7 @@ +Name:Cut Your Losses +ManaCost:4 U U +Types:Sorcery +K:Casualty:2 +A:SP$ Mill | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | SpellDescription$ Target player mills half their library, rounded down. +SVar:X:TargetedPlayer$CardsInLibrary/HalfDown +Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nTarget player mills half their library, rounded down. From ca1e4e6f639032d085d2545a0cac445ae4763468 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 19:37:51 -0400 Subject: [PATCH 15/21] cut_of_the_profits.txt --- .../res/cardsfolder/upcoming/cut_of_the_profits.txt | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/cut_of_the_profits.txt diff --git a/forge-gui/res/cardsfolder/upcoming/cut_of_the_profits.txt b/forge-gui/res/cardsfolder/upcoming/cut_of_the_profits.txt new file mode 100644 index 00000000000..f843b935a2a --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/cut_of_the_profits.txt @@ -0,0 +1,9 @@ +Name:Cut of the Profits +ManaCost:X B B +Types:Sorcery +K:Casualty:3 +A:SP$ Draw | NumCards$ X | SubAbility$ DBLoseLife | SpellDescription$ You draw X cards and you lose X life. +SVar:DBLoseLife:DB$ LoseLife | LifeAmount$ X +SVar:X:Count$xPaid +DeckHas:Ability$Sacrifice +Oracle:Casualty 3 (As you cast this spell, you may sacrifice a creature with power 3 or greater. When you do, copy this spell.)\nYou draw X cards and you lose X life. From 1066e5dc21b4d0adcd9b81d3f37d5844965ee08e Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 20:03:05 -0400 Subject: [PATCH 16/21] join_the_maestros.txt and token --- forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt | 6 ++++++ forge-gui/res/tokenscripts/b_4_3_ogre_warrior.txt | 6 ++++++ 2 files changed, 12 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt create mode 100644 forge-gui/res/tokenscripts/b_4_3_ogre_warrior.txt diff --git a/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt b/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt new file mode 100644 index 00000000000..ea1002a3163 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt @@ -0,0 +1,6 @@ +Name:Join the Maestros +ManaCost:4 B +Types:Sorcery +K:Casualty:2 +A:SP$ Token | TokenScript$ b_4_3_ogre_warrior | SpellDescription$ Create a 4/3 black Ogre Warrior creature token. +Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nCreate a 4/3 black Ogre Warrior creature token. diff --git a/forge-gui/res/tokenscripts/b_4_3_ogre_warrior.txt b/forge-gui/res/tokenscripts/b_4_3_ogre_warrior.txt new file mode 100644 index 00000000000..e3246bc1e12 --- /dev/null +++ b/forge-gui/res/tokenscripts/b_4_3_ogre_warrior.txt @@ -0,0 +1,6 @@ +Name:Ogre Warrior Token +ManaCost:no cost +Types:Creature Ogre Warrior +Colors:black +PT:4/3 +Oracle: From 8f786325cf23b56fef92983ca2d7d1a3f9af1415 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 20:03:33 -0400 Subject: [PATCH 17/21] light_em_up.txt | rob_the_archives.txt | rooftop_nuisance.txt --- forge-gui/res/cardsfolder/upcoming/light_em_up.txt | 6 ++++++ forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt | 9 +++++++++ forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt | 8 ++++++++ 3 files changed, 23 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/light_em_up.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt diff --git a/forge-gui/res/cardsfolder/upcoming/light_em_up.txt b/forge-gui/res/cardsfolder/upcoming/light_em_up.txt new file mode 100644 index 00000000000..60ff5041304 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/light_em_up.txt @@ -0,0 +1,6 @@ +Name:Light 'Em Up +ManaCost:1 R +Types:Sorcery +K:Casualty:2 +A:SP$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. +Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nLight 'Em Up deals 2 damage to target creature or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt b/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt new file mode 100644 index 00000000000..4ceced3dae7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt @@ -0,0 +1,9 @@ +Name:Rob the Archives +ManaCost:1 R +Types:Sorcery +K:Casualty:1 +A:SP$ Dig | DigNum$ 2 | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top two cards of your library. You may play those cards this turn. +SVar:DBEffect:DB$ Effect | StaticAbilities$ MayPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup | StackDescription$ They may play those cards this turn. +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True +SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ You may play those cards this turn. +Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell.)\nExile the top two cards of your library. You may play those cards this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt b/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt new file mode 100644 index 00000000000..003b11cf4a6 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt @@ -0,0 +1,8 @@ +Name:Rooftop Nuisance +ManaCost:2 U +Types:Sorcery +K:Casualty:1 +A:SP$ Tap | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. +SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw | SpellDescription$ It doesn't untap during its controller's next untap step. +SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nTap target creature. It doesn't untap during its controller's next untap step.\nDraw a card. From a5a795ec3aeca5b0f651437455ad71c42cd8ecf1 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 21:11:26 -0400 Subject: [PATCH 18/21] AI hints --- forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt | 1 + forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt | 1 + forge-gui/res/cardsfolder/upcoming/light_em_up.txt | 1 + forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt | 1 + forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt | 1 + 5 files changed, 5 insertions(+) diff --git a/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt b/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt index 20fec4188a4..b6603da27c9 100644 --- a/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt +++ b/forge-gui/res/cardsfolder/upcoming/cut_your_losses.txt @@ -4,4 +4,5 @@ Types:Sorcery K:Casualty:2 A:SP$ Mill | ValidTgts$ Player | TgtPrompt$ Select target player | NumCards$ X | SpellDescription$ Target player mills half their library, rounded down. SVar:X:TargetedPlayer$CardsInLibrary/HalfDown +DeckHas:Ability$Sacrifice|Mill Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nTarget player mills half their library, rounded down. diff --git a/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt b/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt index ea1002a3163..ca4a58974d3 100644 --- a/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt +++ b/forge-gui/res/cardsfolder/upcoming/join_the_maestros.txt @@ -3,4 +3,5 @@ ManaCost:4 B Types:Sorcery K:Casualty:2 A:SP$ Token | TokenScript$ b_4_3_ogre_warrior | SpellDescription$ Create a 4/3 black Ogre Warrior creature token. +DeckHas:Ability$Sacrifice|Token & Type$Ogre|Warrior Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nCreate a 4/3 black Ogre Warrior creature token. diff --git a/forge-gui/res/cardsfolder/upcoming/light_em_up.txt b/forge-gui/res/cardsfolder/upcoming/light_em_up.txt index 60ff5041304..d4bec5fb531 100644 --- a/forge-gui/res/cardsfolder/upcoming/light_em_up.txt +++ b/forge-gui/res/cardsfolder/upcoming/light_em_up.txt @@ -3,4 +3,5 @@ ManaCost:1 R Types:Sorcery K:Casualty:2 A:SP$ DealDamage | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ 2 | SpellDescription$ CARDNAME deals 2 damage to target creature or planeswalker. +DeckHas:Ability$Sacrifice Oracle:Casualty 2 (As you cast this spell, you may sacrifice a creature with power 2 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nLight 'Em Up deals 2 damage to target creature or planeswalker. diff --git a/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt b/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt index 4ceced3dae7..7ada5733a08 100644 --- a/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt +++ b/forge-gui/res/cardsfolder/upcoming/rob_the_archives.txt @@ -6,4 +6,5 @@ A:SP$ Dig | DigNum$ 2 | ChangeNum$ All | DestinationZone$ Exile | RememberChange SVar:DBEffect:DB$ Effect | StaticAbilities$ MayPlay | RememberObjects$ Remembered | ForgetOnMoved$ Exile | SubAbility$ DBCleanup | StackDescription$ They may play those cards this turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | EffectZone$ Command | AffectedZone$ Exile | MayPlay$ True | Description$ You may play those cards this turn. +DeckHas:Ability$Sacrifice Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell.)\nExile the top two cards of your library. You may play those cards this turn. diff --git a/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt b/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt index 003b11cf4a6..a71c7944a9f 100644 --- a/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt +++ b/forge-gui/res/cardsfolder/upcoming/rooftop_nuisance.txt @@ -5,4 +5,5 @@ K:Casualty:1 A:SP$ Tap | ValidTgts$ Creature | SubAbility$ DBPump | SpellDescription$ Tap target creature. It doesn't untap during its controller's next untap step. SVar:DBPump:DB$ Pump | Defined$ Targeted | KW$ HIDDEN This card doesn't untap during your next untap step. | Duration$ Permanent | SubAbility$ DBDraw | SpellDescription$ It doesn't untap during its controller's next untap step. SVar:DBDraw:DB$ Draw | NumCards$ 1 | SpellDescription$ Draw a card. +DeckHas:Ability$Sacrifice Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nTap target creature. It doesn't untap during its controller's next untap step.\nDraw a card. From df090e48cf03da5ebf1fc86eaafe53dd2071ac76 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 21:34:55 -0400 Subject: [PATCH 19/21] dig_up_the_body.txt --- forge-gui/res/cardsfolder/upcoming/dig_up_the_body.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/dig_up_the_body.txt diff --git a/forge-gui/res/cardsfolder/upcoming/dig_up_the_body.txt b/forge-gui/res/cardsfolder/upcoming/dig_up_the_body.txt new file mode 100644 index 00000000000..36f3b623ace --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/dig_up_the_body.txt @@ -0,0 +1,8 @@ +Name:Dig Up the Body +ManaCost:2 B +Types:Instant +K:Casualty:1 +A:SP$ Mill | NumCards$ 2 | SubAbility$ DBReturn | SpellDescription$ Mill two cards, +SVar:DBReturn:DB$ ChangeZone | Origin$ Graveyard | Destination$ Hand | ChangeType$ Creature.YouOwn | Hidden$ True | SpellDescription$ then return a creature card from your graveyard to your hand. (To mill a card, put the top card of your library into your graveyard.) +DeckHas:Ability$Graveyard|Mill|Sacrifice +Oracle:Casualty 1 (As you cast this spell, you may sacrifice a creature with power 1 or greater. When you do, copy this spell.)\nMill two cards, then return a creature card from your graveyard to your hand. (To mill a card, a player puts the top card of their library into their graveyard.) From a65fd8843fb302acf09fb7f3a2f9ed0479b78000 Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 21:39:55 -0400 Subject: [PATCH 20/21] illicit_shipment.txt --- forge-gui/res/cardsfolder/upcoming/illicit_shipment.txt | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/illicit_shipment.txt diff --git a/forge-gui/res/cardsfolder/upcoming/illicit_shipment.txt b/forge-gui/res/cardsfolder/upcoming/illicit_shipment.txt new file mode 100644 index 00000000000..de9a27a1ebb --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/illicit_shipment.txt @@ -0,0 +1,7 @@ +Name:Illicit Shipment +ManaCost:3 B B +Types:Sorcery +K:Casualty:3 +A:SP$ ChangeZone | Origin$ Library | Destination$ Hand | NoReveal$ True | ChangeType$ Card | ChangeNum$ 1 | Mandatory$ True | SpellDescription$ Search your library for a card, put that card into your hand, then shuffle. +DeckHas:Ability$Sacrifice +Oracle:Casualty 3 (As you cast this spell, you may sacrifice a creature with power 3 or greater. When you do, copy this spell and you may choose new targets for the copy.)\nSearch your library for a card, put that card into your hand, then shuffle. From 2c1e4c15f6025ccf52e2d2dfa3b96a6ed41dbb8c Mon Sep 17 00:00:00 2001 From: Northmoc Date: Mon, 11 Apr 2022 21:43:58 -0400 Subject: [PATCH 21/21] anhelo_the_painter.txt --- forge-gui/res/cardsfolder/upcoming/anhelo_the_painter.txt | 8 ++++++++ 1 file changed, 8 insertions(+) create mode 100644 forge-gui/res/cardsfolder/upcoming/anhelo_the_painter.txt diff --git a/forge-gui/res/cardsfolder/upcoming/anhelo_the_painter.txt b/forge-gui/res/cardsfolder/upcoming/anhelo_the_painter.txt new file mode 100644 index 00000000000..ba7ab91bea7 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/anhelo_the_painter.txt @@ -0,0 +1,8 @@ +Name:Anhelo, the Painter +ManaCost:U B R +Types:Legendary Creature Vampire Assassin +K:Deathtouch +PT:1/3 +S:Mode$ Continuous | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AffectedZone$ Stack | CheckSVar$ X | SVarCompare$ EQ0 | AddKeyword$ Casualty:2 | Description$ The first instant or sorcery spell you cast each turn has casualty 2. (As you cast that spell, you may sacrifice a creature with power 2 or greater. When you do, copy the spell and you may choose new targets for the copy.) +SVar:X:Count$ThisTurnCast_Instant.YouCtrl,Sorcery.YouCtrl +Oracle:Deathtouch\nThe first instant or sorcery spell you cast each turn has casualty 2. (As you cast that spell, you may sacrifice a creature with power 2 or greater. When you do, copy the spell and you may choose new targets for the copy.)