From 03c091fb8027d4bb77aeac44e441374a71b09fee Mon Sep 17 00:00:00 2001 From: Paul Hammerton Date: Fri, 18 Feb 2022 08:31:19 +0000 Subject: [PATCH 1/9] Update Secret Lair Drop Series.txt --- .../res/editions/Secret Lair Drop Series.txt | 41 +++++++++++++++++++ 1 file changed, 41 insertions(+) diff --git a/forge-gui/res/editions/Secret Lair Drop Series.txt b/forge-gui/res/editions/Secret Lair Drop Series.txt index 1dcc92643cd..237712fa9ca 100644 --- a/forge-gui/res/editions/Secret Lair Drop Series.txt +++ b/forge-gui/res/editions/Secret Lair Drop Series.txt @@ -363,6 +363,42 @@ ScryfallCode=SLD 383★ R Krark's Thumb @Wooden Cyclops 384 R Swamp @Jeanne D'Angelo 385 R Island @Jeanne D'Angelo +396 M Tamiyo, the Moon Sage @Uta Natsume +397 M Ajani, Mentor of Heroes @Uta Natsume +398 M Angrath, the Flame-Chained @Uta Natsume +399 R Ashiok, Dream Render @Uta Natsume +400 M Sorin, Grim Nemesis @Uta Natsume +410 R Brain Freeze @Rorubei +411 R Bribery @Rorubei +412 R Snap @Rorubei +413 R Unmask @Rorubei +414 R Shadow of Doubt @Rorubei +415 R Plains @Ben Schnuck +416 R Island @Ben Schnuck +417 R Swamp @Ben Schnuck +418 R Mountain @Ben Schnuck +419 R Forest @Ben Schnuck +420 R Hokori, Dust Drinker @Yuko Shimizu +421 R Kira, Great Glass-Spinner @Yuko Shimizu +422 R Eidolon of the Great Revel @Yuko Shimizu +423 R Elvish Spirit Guide @Yuko Shimizu +424 R Ghostly Prison @Ai Nanahira +425 R Freed from the Real @SENNSU +426 R Boseiju, Who Shelters All @Esuthio +427 R Hall of the Bandit Lord @ZOUNOSE +428 R E. Honda, Sumo Champion @Victor Adame Minguez +429 R Ryu, World Warrior @Jason Rainville +430 R Ken, Burning Brawler @Yongjae Choi +431 R Blanka, Ferocious Friend @David Rapoza +432 R Chun-Li, Countless Kicks @Martina Fackova +433 R Dhalsim, Pliable Pacifist @Victor Adame Minguez +434 R Guile, Sonic Soldier @Wesley Burt +435 R Zangief, the Red Cyclone @Maria Zolotukhina +436 R Windbrisk Heights @Tomohito +437 R Shelldock Isle @Amayagido +438 R Howltooth Hollow @Shie Nanahara +439 R Spinerock Knoll @Nagano +440 R Mosswort Bridge @Maiko Aoji 477 R Path to Exile @Riot Games 478 R Rhystic Study @Riot Games 479 R Duress @Riot Games @@ -479,6 +515,11 @@ ScryfallCode=SLD 672 R Questing Phelddagrif @Mark Rosewater 696 R Spore Frog @Riot Games 697 R Command Tower @Riot Games +1020 R Idyllic Tutor @Riyou Kamei +1021 R Swords to Plowshares @Riyou Kamei +1022 R Solve the Equation @Riyou Kamei +1023 R Praetor's Grasp @Riyou Kamei +1024 R Veil of Summer @Riyou Kamei VS C Viscera Seer @John Stanko [tokens] From e0c718c790683cf3cfe00dd677f4b2a8e2029a4f Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Fri, 18 Feb 2022 11:18:47 +0000 Subject: [PATCH 2/9] Rework ExcessDamage trigger --- .../src/main/java/forge/game/GameAction.java | 18 ++++++++++++++++ .../src/main/java/forge/game/card/Card.java | 20 ------------------ .../java/forge/game/card/CardDamageMap.java | 21 +++++++++++++++++++ .../game/trigger/TriggerExcessDamage.java | 6 ------ 4 files changed, 39 insertions(+), 26 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameAction.java b/forge-game/src/main/java/forge/game/GameAction.java index 15e30155bd2..4f8a3b03c99 100644 --- a/forge-game/src/main/java/forge/game/GameAction.java +++ b/forge-game/src/main/java/forge/game/GameAction.java @@ -2269,6 +2269,8 @@ public class GameAction { // Run replacement effect for each entity dealt damage game.getReplacementHandler().runReplaceDamage(isCombat, damageMap, preventMap, counterTable, cause); + Map lethalDamage = Maps.newHashMap(); + // Actually deal damage according to replaced damage map for (Map.Entry> et : damageMap.rowMap().entrySet()) { final Card sourceLKI = et.getKey(); @@ -2277,6 +2279,21 @@ public class GameAction { if (e.getValue() <= 0) { continue; } + + if (e.getKey() instanceof Card && !lethalDamage.containsKey(e.getKey())) { + Card c = (Card) e.getKey(); + int lethal = 0; + if (c.isCreature()) { + lethal = Math.max(0, c.getLethalDamage()); + } + if (c.isPlaneswalker()) { + int lethalPW = c.getCurrentLoyalty(); + // 120.10 + lethal = c.isCreature() ? Math.min(lethal, lethalPW) : lethalPW; + } + lethalDamage.put(c, lethal); + } + e.setValue(Integer.valueOf(e.getKey().addDamageAfterPrevention(e.getValue(), sourceLKI, isCombat, counterTable))); sum += e.getValue(); } @@ -2314,6 +2331,7 @@ public class GameAction { preventMap.clear(); damageMap.triggerDamageDoneOnce(isCombat, game); + damageMap.triggerExcessDamage(isCombat, lethalDamage, game); damageMap.clear(); counterTable.replaceCounterEffect(game, cause, !isCombat); 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 cb8792b58cd..35535d84f81 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -5418,16 +5418,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { runParams.put(AbilityKey.DefendingPlayer, game.getCombat() != null ? game.getCombat().getDefendingPlayerRelatedTo(source) : null); getGame().getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); - int excess = 0; - if (isPlaneswalker()) { - excess = damageIn - getCurrentLoyalty(); - } else if (getDamage() > getLethal()) { - // Creature already has lethal damage - excess = damageIn; - } else { - excess = damageIn + getDamage() - getLethal(); - } - DamageType damageType = DamageType.Normal; if (isPlaneswalker()) { // 120.3c subtractCounter(CounterType.get(CounterEnumType.LOYALTY), damageIn); @@ -5459,16 +5449,6 @@ public class Card extends GameEntity implements Comparable, IHasSVars { game.fireEvent(new GameEventCardDamaged(this, source, damageIn, damageType)); } - if (excess > 0) { - // Run triggers - runParams = AbilityKey.newMap(); - runParams.put(AbilityKey.DamageSource, source); - runParams.put(AbilityKey.DamageTarget, this); - runParams.put(AbilityKey.DamageAmount, excess); - runParams.put(AbilityKey.IsCombatDamage, isCombat); - getGame().getTriggerHandler().runTrigger(TriggerType.ExcessDamage, runParams, false); - } - return damageIn; } diff --git a/forge-game/src/main/java/forge/game/card/CardDamageMap.java b/forge-game/src/main/java/forge/game/card/CardDamageMap.java index 2783d5793ec..34947967c04 100644 --- a/forge-game/src/main/java/forge/game/card/CardDamageMap.java +++ b/forge-game/src/main/java/forge/game/card/CardDamageMap.java @@ -4,6 +4,7 @@ package forge.game.card; import java.util.Map; +import java.util.Map.Entry; import java.util.Set; import com.google.common.collect.ForwardingTable; @@ -87,6 +88,26 @@ public class CardDamageMap extends ForwardingTable { runParams.put(AbilityKey.IsCombatDamage, isCombat); game.getTriggerHandler().runTrigger(TriggerType.DamageAll, runParams, false); } + + public void triggerExcessDamage(boolean isCombat, Map lethalDamage, final Game game) { + for (Entry damaged : lethalDamage.entrySet()) { + int sum = 0; + for (Integer i : this.column(damaged.getKey()).values()) { + sum += i; + } + + int excess = sum - (damaged.getKey().hasBeenDealtDeathtouchDamage() ? 1 : damaged.getValue()); + if (excess > 0) { + // Run triggers + final Map runParams = AbilityKey.newMap(); + runParams.put(AbilityKey.DamageTarget, damaged.getKey()); + runParams.put(AbilityKey.DamageAmount, excess); + runParams.put(AbilityKey.IsCombatDamage, isCombat); + game.getTriggerHandler().runTrigger(TriggerType.ExcessDamage, runParams, false); + } + } + } + /** * special put logic, sum the values */ diff --git a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java index 51df52b3dc9..a5e3bd3d821 100644 --- a/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java +++ b/forge-game/src/main/java/forge/game/trigger/TriggerExcessDamage.java @@ -21,7 +21,6 @@ import java.util.Map; import forge.game.ability.AbilityKey; import forge.game.card.Card; -import forge.game.card.CardUtil; import forge.game.spellability.SpellAbility; import forge.util.Localizer; @@ -49,9 +48,6 @@ public class TriggerExcessDamage extends Trigger { * @param runParams*/ @Override public final boolean performTest(final Map runParams) { - if (!matchesValidParam("ValidSource", runParams.get(AbilityKey.DamageSource))) { - return false; - } if (!matchesValidParam("ValidTarget", runParams.get(AbilityKey.DamageTarget))) { return false; } @@ -68,7 +64,6 @@ public class TriggerExcessDamage extends Trigger { /** {@inheritDoc} */ @Override public final void setTriggeringObjects(final SpellAbility sa, Map runParams) { - sa.setTriggeringObject(AbilityKey.Source, CardUtil.getLKICopy((Card)runParams.get(AbilityKey.DamageSource))); sa.setTriggeringObject(AbilityKey.Target, runParams.get(AbilityKey.DamageTarget)); sa.setTriggeringObjectsFrom(runParams, AbilityKey.DamageAmount); } @@ -76,7 +71,6 @@ public class TriggerExcessDamage extends Trigger { @Override public String getImportantStackObjects(SpellAbility sa) { StringBuilder sb = new StringBuilder(); - sb.append(Localizer.getInstance().getMessage("lblDamageSource")).append(": ").append(sa.getTriggeringObject(AbilityKey.Source)).append(", "); sb.append(Localizer.getInstance().getMessage("lblDamaged")).append(": ").append(sa.getTriggeringObject(AbilityKey.Target)).append(", "); sb.append(Localizer.getInstance().getMessage("lblAmount")).append(": ").append(sa.getTriggeringObject(AbilityKey.DamageAmount)); return sb.toString(); From f84acff98194e52f9e47e79062988a81d34174ac Mon Sep 17 00:00:00 2001 From: Bug Hunter Date: Fri, 18 Feb 2022 11:54:33 +0000 Subject: [PATCH 3/9] Update forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt --- forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt b/forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt index 569f79b4220..8c4dea64ea9 100644 --- a/forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt +++ b/forge-gui/res/cardsfolder/upcoming/shigeki_jukai_visionary.txt @@ -3,7 +3,7 @@ ManaCost:1 G Types:Legendary Enchantment Creature Snake Druid PT:1/3 A:AB$ Dig | Cost$ 1 G T Return<1/CARDNAME> | DigNum$ 4 | Reveal$ True | ChangeNum$ 1 | Optional$ True | ChangeValid$ Land | DestinationZone$ Battlefield | Tapped$ True | DestinationZone2$ Graveyard | SpellDescription$ Reveal the top four cards of your library. You may put a land card from among them onto the battlefield tapped. Put the rest into your graveyard. -A:AB$ ChangeZone | PrecostDesc$ Channel — | Cost$ X X G G Discard<1/NICKNAME> | ActivationZone$ Hand | Origin$ Graveyard | Destination$ Hand | ChangeType$ Card.nonLegendary | ChangeNum$ X | Mandatory$ True | SpellDescription$ Return X target nonlegendary cards from your graveyard to your hand. +A:AB$ ChangeZone | PrecostDesc$ Channel — | Cost$ X X G G Discard<1/NICKNAME> | ActivationZone$ Hand | Origin$ Graveyard | Destination$ Hand | ValidTgts$ Card.nonLegendary+YouOwn | TargetMin$ X | TargetMax$ X | SpellDescription$ Return X target nonlegendary cards from your graveyard to your hand. SVar:X:Count$xPaid DeckHas:Ability$Graveyard|Discard Oracle:{1}{G}, {T}, Return Shigeki, Jukai Visionary to its owner's hand: Reveal the top four cards of your library. You may put a land card from among them onto the battlefield tapped. Put the rest into your graveyard.\nChannel — {X}{X}{G}{G}, Discard Shigeki: Return X target nonlegendary cards from your graveyard to your hand. From b88ddf14e4b89980e236b29543a467ed3aa91b70 Mon Sep 17 00:00:00 2001 From: TRT <> Date: Fri, 18 Feb 2022 17:14:34 +0100 Subject: [PATCH 4/9] Fix StaticAbilityContinuous wrong indentation --- .../staticability/StaticAbilityContinuous.java | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java index cb0c6956af2..2460aad3bf6 100644 --- a/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java +++ b/forge-game/src/main/java/forge/game/staticability/StaticAbilityContinuous.java @@ -319,18 +319,18 @@ public final class StaticAbilityContinuous { String[] restrictions = params.containsKey("SharedRestrictions") ? params.get("SharedRestrictions").split(",") : new String[] {"Card"}; addKeywords = CardFactoryUtil.sharedKeywords(addKeywords, restrictions, zones, hostCard, stAb); } + } - if (params.containsKey("CantHaveKeyword")) { - cantHaveKeyword = Keyword.setValueOf(params.get("CantHaveKeyword")); - } + if (params.containsKey("CantHaveKeyword")) { + cantHaveKeyword = Keyword.setValueOf(params.get("CantHaveKeyword")); + } - if (params.containsKey("RemoveKeyword")) { - removeKeywords = Arrays.asList(params.get("RemoveKeyword").split(" & ")); - } + if (params.containsKey("RemoveKeyword")) { + removeKeywords = Arrays.asList(params.get("RemoveKeyword").split(" & ")); } } - if ((layer == StaticAbilityLayer.RULES) && params.containsKey("AddHiddenKeyword")) { + if (layer == StaticAbilityLayer.RULES && params.containsKey("AddHiddenKeyword")) { addHiddenKeywords.addAll(Arrays.asList(params.get("AddHiddenKeyword").split(" & "))); } From 00ceefa8d99f049b4cdda63a38219949e9fd88c7 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Fri, 18 Feb 2022 19:42:44 +0000 Subject: [PATCH 5/9] NEO: Reckoner Shakedown and BranchEffect upgrade --- .../game/ability/effects/BranchEffect.java | 13 +++++++++---- .../game/ability/effects/ChooseCardEffect.java | 17 ++++++++++++++--- .../forge/game/ability/effects/MillEffect.java | 1 + forge-gui/res/cardsfolder/n/nightsnare.txt | 11 ++++++----- .../cardsfolder/upcoming/reckoner_shakedown.txt | 12 ++++++++++++ 5 files changed, 42 insertions(+), 12 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/reckoner_shakedown.txt diff --git a/forge-game/src/main/java/forge/game/ability/effects/BranchEffect.java b/forge-game/src/main/java/forge/game/ability/effects/BranchEffect.java index da738e1fc7b..a8f5cb2dedc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/BranchEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/BranchEffect.java @@ -13,18 +13,23 @@ public class BranchEffect extends SpellAbilityEffect { // TODO Reuse SpellAbilityCondition and areMet() here instead of repeating each - // For now branch conditions will only be an Svar Compare - String branchSVar = sa.getParam("BranchConditionSVar"); + int value = 0; + if (sa.hasParam("BranchCondition")) { + if (sa.getParam("BranchCondition").equals("ChosenCard")) { + value = host.getChosenCards().size(); + } + } else { + value = AbilityUtils.calculateAmount(host, sa.getParam("BranchConditionSVar"), sa); + } String branchCompare = sa.getParamOrDefault("BranchConditionSVarCompare", "GE1"); String operator = branchCompare.substring(0, 2); String operand = branchCompare.substring(2); - final int svarValue = AbilityUtils.calculateAmount(host, branchSVar, sa); final int operandValue = AbilityUtils.calculateAmount(host, operand, sa); SpellAbility sub = null; - if (Expressions.compare(svarValue, operator, operandValue)) { + if (Expressions.compare(value, operator, operandValue)) { sub = sa.getAdditionalAbility("TrueSubAbility"); } else { sub = sa.getAdditionalAbility("FalseSubAbility"); diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java index dd4397f1663..1b708fb097c 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChooseCardEffect.java @@ -32,11 +32,22 @@ public class ChooseCardEffect extends SpellAbilityEffect { @Override protected String getStackDescription(SpellAbility sa) { final StringBuilder sb = new StringBuilder(); + final int numCards = sa.hasParam("Amount") ? + AbilityUtils.calculateAmount(sa.getHostCard(), sa.getParam("Amount"), sa) : 1; - for (final Player p : getTargetPlayers(sa)) { - sb.append(p).append(" "); + sb.append(Lang.joinHomogenous(getTargetPlayers(sa))).append(" "); + if (sa.hasParam("Mandatory")) { + sb.append(getTargetPlayers(sa).size() == 1 ? "chooses " : "choose "); + } else { + sb.append("may choose "); } - sb.append("chooses a card."); + String desc = sa.getParamOrDefault("ChoiceDesc", ""); + desc = desc.isEmpty() ? "card" : desc + " card"; + sb.append(Lang.nounWithNumeralExceptOne(numCards, desc)); + if (sa.hasParam("FromDesc")) { + sb.append(" ").append(sa.getParam("FromDesc")); + } + sb.append("."); return sb.toString(); } diff --git a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java index d1cca2c1262..d9c2ff553fa 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/MillEffect.java @@ -97,6 +97,7 @@ public class MillEffect extends SpellAbilityEffect { sb.append("antes "); } + sb.append(Lang.nounWithNumeralExceptOne(numCards, "card")).append("."); sb.append(numCards == 1 ? "a card" : (Lang.getNumeral(numCards) + " cards")).append("."); return sb.toString(); diff --git a/forge-gui/res/cardsfolder/n/nightsnare.txt b/forge-gui/res/cardsfolder/n/nightsnare.txt index aad334cff65..bae5b954d81 100644 --- a/forge-gui/res/cardsfolder/n/nightsnare.txt +++ b/forge-gui/res/cardsfolder/n/nightsnare.txt @@ -1,10 +1,11 @@ Name:Nightsnare ManaCost:3 B Types:Sorcery -A:SP$ RevealHand | Cost$ 3 B | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose | StackDescription$ SpellDescription | SpellDescription$ Target opponent reveals their hand. You may choose a nonland card from it. If you do, that player discards that card. If you don't, that player discards two cards. -SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | SubAbility$ DBDiscard | ChoiceTitle$ You may choose a nonland card | StackDescription$ None -SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup | StackDescription$ None | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ1 | SubAbility$ DBDiscard2 -SVar:DBDiscard2:DB$ Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCleanup | ConditionDefined$ ChosenCard | ConditionPresent$ Card | ConditionCompare$ EQ0 | StackDescription$ None +A:SP$ RevealHand | ValidTgts$ Opponent | RememberRevealed$ True | SubAbility$ DBChoose | SpellDescription$ Target opponent reveals their hand. +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ from it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. +SVar:DBBranch:DB$ Branch | BranchCondition$ ChosenCard | TrueSubAbility$ DBDiscard | FalseSubAbility$ DBDiscard2 | StackDescription$ If they do, {p:Targeted} discards that card. If they don't, {p:Targeted} discards two cards. | SpellDescription$ If you do, that player discards that card. If you don't, that player discards two cards. +SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup +SVar:DBDiscard2:DB$ Discard | Defined$ Targeted | NumCards$ 2 | Mode$ TgtChoose | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True -AI:RemoveDeck:All +DeckHas:Ability$Discard Oracle:Target opponent reveals their hand. You may choose a nonland card from it. If you do, that player discards that card. If you don't, that player discards two cards. diff --git a/forge-gui/res/cardsfolder/upcoming/reckoner_shakedown.txt b/forge-gui/res/cardsfolder/upcoming/reckoner_shakedown.txt new file mode 100644 index 00000000000..af849b2eb72 --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/reckoner_shakedown.txt @@ -0,0 +1,12 @@ +Name:Reckoner Shakedown +ManaCost:2 B +Types:Sorcery +A:SP$ RevealHand | ValidTgts$ Opponent | TgtPrompt$ Select target opponent | RememberRevealed$ True | SubAbility$ DBChoose | SpellDescription$ Target opponent reveals their hand. +SVar:DBChoose:DB$ ChooseCard | ChoiceZone$ Hand | Amount$ 1 | Choices$ Card.nonLand+IsRemembered | ChoiceDesc$ nonland | FromDesc$ from it | SubAbility$ DBBranch | ChoiceTitle$ You may choose a nonland card | SpellDescription$ You may choose a nonland card from it. +SVar:DBBranch:DB$ Branch | BranchCondition$ ChosenCard | TrueSubAbility$ DBDiscard | FalseSubAbility$ DBPutCounter | StackDescription$ If they do, {p:Targeted} discards that card. If they don't, they put two +1/+1 counters on a creature or Vehicle they control. | SpellDescription$ If you do, that player discards that card. If you don't, put two +1/+1 counters on a creature or Vehicle you control. +SVar:DBDiscard:DB$ Discard | DefinedCards$ ChosenCard | Defined$ Targeted | Mode$ Defined | SubAbility$ DBCleanup +SVar:DBPutCounter:DB$ PutCounter | Choices$ Creature.YouCtrl,Vehicle.YouCtrl | ChoiceTitle$ Choose a creature or Vehicle you control | CounterType$ P1P1 | CounterNum$ 2 | SubAbility$ DBCleanup +SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True | ClearChosenCard$ True +DeckHas:Ability$Discard|Counters +DeckHints:Type$Creature|Vehicle +Oracle:Target opponent reveals their hand. You may choose a nonland card from it. If you do, that player discards that card. If you don't, put two +1/+1 counters on a creature or Vehicle you control. From 2886711f4e15d585d36e5dbe93c859de1d4ba9a2 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Fri, 18 Feb 2022 22:38:34 +0100 Subject: [PATCH 6/9] DiscardEffect: don't reveal to all if effect is just look --- .../forge/game/ability/effects/DiscardEffect.java | 13 ++++++++----- forge-gui/res/cardsfolder/a/abandon_hope.txt | 2 +- forge-gui/res/cardsfolder/d/discordant_dirge.txt | 2 +- forge-gui/res/cardsfolder/e/extortion.txt | 2 +- forge-gui/res/cardsfolder/l/leshracs_sigil.txt | 2 +- forge-gui/res/cardsfolder/m/mind_warp.txt | 2 +- forge-gui/res/cardsfolder/s/seers_vision.txt | 2 +- forge-gui/res/cardsfolder/t/thrull_surgeon.txt | 2 +- 8 files changed, 15 insertions(+), 12 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java index f9b9160b9e1..c0951e8f1cc 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DiscardEffect.java @@ -238,7 +238,7 @@ public class DiscardEffect extends SpellAbilityEffect { if (toBeDiscarded.size() > 1) { toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa); } - } else if (mode.equals("RevealYouChoose") || mode.equals("RevealTgtChoose") || mode.equals("TgtChoose")) { + } else if (mode.endsWith("YouChoose") || mode.endsWith("TgtChoose")) { CardCollectionView dPHand = p.getCardsIn(ZoneType.Hand); dPHand = CardLists.filter(dPHand, Presets.NON_TOKEN); if (dPHand.isEmpty()) @@ -253,15 +253,18 @@ public class DiscardEffect extends SpellAbilityEffect { CardCollection validCards = CardLists.getValidCards(dPHand, valid, source.getController(), source, sa); Player chooser = p; - if (mode.equals("RevealYouChoose")) { + if (mode.endsWith("YouChoose")) { chooser = source.getController(); - } else if (mode.equals("RevealTgtChoose")) { + } else if (mode.endsWith("TgtChoose")) { chooser = firstTarget; } - if (mode.startsWith("Reveal") && p != chooser) { + if (mode.startsWith("Reveal")) { game.getAction().reveal(dPHand, p); } + if (mode.startsWith("Look")) { + game.getAction().revealTo(dPHand, chooser); + } if (!p.canDiscardBy(sa, true)) { continue; @@ -276,7 +279,7 @@ public class DiscardEffect extends SpellAbilityEffect { toBeDiscarded = GameActionUtil.orderCardsByTheirOwners(game, toBeDiscarded, ZoneType.Graveyard, sa); } - if (mode.startsWith("Reveal") ) { + if (mode.startsWith("Reveal") && p != chooser) { p.getController().reveal(toBeDiscarded, ZoneType.Hand, p, Localizer.getInstance().getMessage("lblPlayerHasChosenCardsFrom", chooser.getName())); } } diff --git a/forge-gui/res/cardsfolder/a/abandon_hope.txt b/forge-gui/res/cardsfolder/a/abandon_hope.txt index 97920f9be98..c1d301a3534 100644 --- a/forge-gui/res/cardsfolder/a/abandon_hope.txt +++ b/forge-gui/res/cardsfolder/a/abandon_hope.txt @@ -1,7 +1,7 @@ Name:Abandon Hope ManaCost:X 1 B Types:Sorcery -A:SP$ Discard | Cost$ X 1 B Discard | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ X | SpellDescription$ Look at target opponent's hand and choose X cards from it. That player discards those cards. +A:SP$ Discard | Cost$ X 1 B Discard | ValidTgts$ Opponent | Mode$ LookYouChoose | NumCards$ X | SpellDescription$ Look at target opponent's hand and choose X cards from it. That player discards those cards. SVar:X:Count$xPaid AI:RemoveDeck:All Oracle:As an additional cost to cast this spell, discard X cards.\nLook at target opponent's hand and choose X cards from it. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/d/discordant_dirge.txt b/forge-gui/res/cardsfolder/d/discordant_dirge.txt index 5bed90444b4..e5c34788b68 100644 --- a/forge-gui/res/cardsfolder/d/discordant_dirge.txt +++ b/forge-gui/res/cardsfolder/d/discordant_dirge.txt @@ -3,6 +3,6 @@ ManaCost:3 B B Types:Enchantment T:Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigPutCounter | OptionalDecider$ You | TriggerDescription$ At the beginning of your upkeep, you may put a verse counter on CARDNAME. SVar:TrigPutCounter:DB$ PutCounter | Defined$ Self | CounterType$ VERSE | CounterNum$ 1 -A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ X | SpellDescription$ Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on CARDNAME. That player discards those cards. +A:AB$ Discard | Cost$ B Sac<1/CARDNAME> | ValidTgts$ Opponent | Mode$ LookYouChoose | NumCards$ X | SpellDescription$ Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on CARDNAME. That player discards those cards. SVar:X:Count$CardCounters.VERSE Oracle:At the beginning of your upkeep, you may put a verse counter on Discordant Dirge.\n{B}, Sacrifice Discordant Dirge: Look at target opponent's hand and choose up to X cards from it, where X is the number of verse counters on Discordant Dirge. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/e/extortion.txt b/forge-gui/res/cardsfolder/e/extortion.txt index 3a945d4e0bd..ecd4761bcac 100644 --- a/forge-gui/res/cardsfolder/e/extortion.txt +++ b/forge-gui/res/cardsfolder/e/extortion.txt @@ -1,5 +1,5 @@ Name:Extortion ManaCost:3 B B Types:Sorcery -A:SP$ Discard | Cost$ 3 B B | ValidTgts$ Opponent | Mode$ RevealYouChoose | NumCards$ 2 | SpellDescription$ Look at target player's hand and choose up to two cards from it. That player discards those cards. +A:SP$ Discard | Cost$ 3 B B | ValidTgts$ Opponent | Mode$ LookYouChoose | NumCards$ 2 | SpellDescription$ Look at target player's hand and choose up to two cards from it. That player discards those cards. Oracle:Look at target player's hand and choose up to two cards from it. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/l/leshracs_sigil.txt b/forge-gui/res/cardsfolder/l/leshracs_sigil.txt index a65eebef0c9..25228385645 100644 --- a/forge-gui/res/cardsfolder/l/leshracs_sigil.txt +++ b/forge-gui/res/cardsfolder/l/leshracs_sigil.txt @@ -3,6 +3,6 @@ ManaCost:B B Types:Enchantment A:AB$ ChangeZone | Cost$ B B | Origin$ Battlefield | Destination$ Hand | SpellDescription$ Return CARDNAME to its owner's hand. T:Mode$ SpellCast | ValidCard$ Card.Green | ValidActivatingPlayer$ Opponent | TriggerZones$ Battlefield | Execute$ TrigDiscard | OptionalDecider$ You | TriggerDescription$ Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card. -SVar:TrigDiscard:AB$ Discard | Cost$ B B | Defined$ TriggeredActivator | NumCards$ 1 | Mode$ RevealYouChoose +SVar:TrigDiscard:AB$ Discard | Cost$ B B | Defined$ TriggeredActivator | NumCards$ 1 | Mode$ LookYouChoose AI:RemoveDeck:Random Oracle:Whenever an opponent casts a green spell, you may pay {B}{B}. If you do, look at that player's hand and choose a card from it. The player discards that card.\n{B}{B}: Return Leshrac's Sigil to its owner's hand. diff --git a/forge-gui/res/cardsfolder/m/mind_warp.txt b/forge-gui/res/cardsfolder/m/mind_warp.txt index cc89ce5ff13..05261fa8a37 100644 --- a/forge-gui/res/cardsfolder/m/mind_warp.txt +++ b/forge-gui/res/cardsfolder/m/mind_warp.txt @@ -1,6 +1,6 @@ Name:Mind Warp ManaCost:X 3 B Types:Sorcery -A:SP$ Discard | Cost$ X 3 B | ValidTgts$ Player | Mode$ RevealYouChoose | NumCards$ X | SpellDescription$ Target player reveals their hand. You choose X cards from it. That player discards those cards. +A:SP$ Discard | Cost$ X 3 B | ValidTgts$ Player | Mode$ LookYouChoose | NumCards$ X | SpellDescription$ Target player reveals their hand. You choose X cards from it. That player discards those cards. SVar:X:Count$xPaid Oracle:Look at target player's hand and choose X cards from it. That player discards those cards. diff --git a/forge-gui/res/cardsfolder/s/seers_vision.txt b/forge-gui/res/cardsfolder/s/seers_vision.txt index 5e0d79e54c9..871b69280fa 100644 --- a/forge-gui/res/cardsfolder/s/seers_vision.txt +++ b/forge-gui/res/cardsfolder/s/seers_vision.txt @@ -2,5 +2,5 @@ Name:Seer's Vision ManaCost:2 U B Types:Enchantment S:Mode$ Continuous | AffectedZone$ Hand | Affected$ Card.OppOwn | MayLookAt$ Player | Description$ Your opponents play with their hands revealed. -A:AB$ Discard | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player. | Mode$ RevealYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. +A:AB$ Discard | Cost$ Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player. | Mode$ LookYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. Oracle:Your opponents play with their hands revealed.\nSacrifice Seer's Vision: Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. diff --git a/forge-gui/res/cardsfolder/t/thrull_surgeon.txt b/forge-gui/res/cardsfolder/t/thrull_surgeon.txt index 95c6548d77c..d0e21cee1da 100644 --- a/forge-gui/res/cardsfolder/t/thrull_surgeon.txt +++ b/forge-gui/res/cardsfolder/t/thrull_surgeon.txt @@ -2,5 +2,5 @@ Name:Thrull Surgeon ManaCost:1 B Types:Creature Thrull PT:1/1 -A:AB$ Discard | Cost$ 1 B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player. | Mode$ RevealYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. +A:AB$ Discard | Cost$ 1 B Sac<1/CARDNAME> | ValidTgts$ Player | TgtPrompt$ Select target player. | Mode$ LookYouChoose | NumCards$ 1 | SorcerySpeed$ True | SpellDescription$ Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. Oracle:{1}{B}, Sacrifice Thrull Surgeon: Look at target player's hand and choose a card from it. That player discards that card. Activate only as a sorcery. From acb75de48cddaeefb4654899223b8272fc76cc3a Mon Sep 17 00:00:00 2001 From: Northmoc Date: Fri, 18 Feb 2022 17:46:32 -0500 Subject: [PATCH 7/9] fix some bad Graveyard targeting --- .../upcoming/boseiju_reaches_skyward_branch_of_boseiju.txt | 2 +- .../res/cardsfolder/upcoming/tameshi_reality_architect.txt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/forge-gui/res/cardsfolder/upcoming/boseiju_reaches_skyward_branch_of_boseiju.txt b/forge-gui/res/cardsfolder/upcoming/boseiju_reaches_skyward_branch_of_boseiju.txt index 2e474d955cf..b7baf0d5b35 100644 --- a/forge-gui/res/cardsfolder/upcoming/boseiju_reaches_skyward_branch_of_boseiju.txt +++ b/forge-gui/res/cardsfolder/upcoming/boseiju_reaches_skyward_branch_of_boseiju.txt @@ -3,7 +3,7 @@ ManaCost:3 G Types:Enchantment Saga K:Saga:3:DBSearch,DBPut,DBTransform SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Hand | ChangeType$ Forest.Basic | ChangeNum$ 2 | SpellDescription$ Search your library for up to two basic Forest cards, reveal them, put them into your hand, then shuffle. -SVar:DBPut:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Land | TgtPrompt$ Select up to one target land card | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Put up to one target land card from your graveyard on top of your library. +SVar:DBPut:DB$ ChangeZone | Origin$ Graveyard | Destination$ Library | LibraryPosition$ 0 | ValidTgts$ Land.YouOwn | TgtPrompt$ Select up to one target land card | TargetMin$ 0 | TargetMax$ 1 | SpellDescription$ Put up to one target land card from your graveyard on top of your library. SVar:DBTransform:DB$ ChangeZone | Origin$ Battlefield | Destination$ Exile | RememberChanged$ True | SubAbility$ DBReturn | SpellDescription$ Exile this Saga, then return it to the battlefield transformed under your control. SVar:DBReturn:DB$ ChangeZone | Defined$ Remembered | Origin$ Exile | Destination$ Battlefield | Transformed$ True | GainControl$ True | SubAbility$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True diff --git a/forge-gui/res/cardsfolder/upcoming/tameshi_reality_architect.txt b/forge-gui/res/cardsfolder/upcoming/tameshi_reality_architect.txt index ad0f695fe3e..25d4f1b5702 100644 --- a/forge-gui/res/cardsfolder/upcoming/tameshi_reality_architect.txt +++ b/forge-gui/res/cardsfolder/upcoming/tameshi_reality_architect.txt @@ -4,7 +4,7 @@ Types:Legendary Creature Moonfolk Wizard PT:2/3 T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Hand | ValidCard$ Permanent.nonCreature | ActivationLimit$ 1 | Execute$ TrigDraw | TriggerDescription$ Whenever one or more noncreature permanents are returned to hand, draw a card. This ability triggers only once each turn. SVar:TrigDraw:DB$ Draw | NumCards$ 1 -A:AB$ ChangeZone | Cost$ X W Return<1/Land/land> | ValidTgts$ Artifact.cmcLEX,Enchantment.cmcLEX | TgtPrompt$ Select target artifact or enchantment card with mana value X or less | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | SpellDescription$ Return target artifact or enchantment card with mana value X or less from your graveyard to the battlefield. Activate only as a sorcery. +A:AB$ ChangeZone | Cost$ X W Return<1/Land/land> | ValidTgts$ Artifact.cmcLEX+YouOwn,Enchantment.cmcLEX+YouOwn | TgtPrompt$ Select target artifact or enchantment card with mana value X or less | Origin$ Graveyard | Destination$ Battlefield | SorcerySpeed$ True | SpellDescription$ Return target artifact or enchantment card with mana value X or less from your graveyard to the battlefield. Activate only as a sorcery. SVar:X:Count$xPaid DeckHints:Type$Artifact|Enchantment DeckHas:Ability$Graveyard From dc949b1a89c11feefb0b509ef5f9614cd911873d Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sat, 19 Feb 2022 04:24:16 +0000 Subject: [PATCH 8/9] NEO: March cycle --- .../upcoming/march_of_burgeoning_life.txt | 2 +- .../upcoming/march_of_otherworldly_light.txt | 11 +++++++++++ .../cardsfolder/upcoming/march_of_reckless_joy.txt | 8 ++++---- .../cardsfolder/upcoming/march_of_swirling_mist.txt | 11 +++++++++++ .../upcoming/march_of_wretched_sorrow.txt | 13 +++++++++++++ .../main/java/forge/player/HumanCostDecision.java | 4 ++++ .../java/forge/player/HumanPlaySpellAbility.java | 9 +++++++++ 7 files changed, 53 insertions(+), 5 deletions(-) create mode 100644 forge-gui/res/cardsfolder/upcoming/march_of_otherworldly_light.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/march_of_swirling_mist.txt create mode 100644 forge-gui/res/cardsfolder/upcoming/march_of_wretched_sorrow.txt diff --git a/forge-gui/res/cardsfolder/upcoming/march_of_burgeoning_life.txt b/forge-gui/res/cardsfolder/upcoming/march_of_burgeoning_life.txt index 73d24de635d..f8681ff11c5 100644 --- a/forge-gui/res/cardsfolder/upcoming/march_of_burgeoning_life.txt +++ b/forge-gui/res/cardsfolder/upcoming/march_of_burgeoning_life.txt @@ -1,7 +1,7 @@ Name:March of Burgeoning Life ManaCost:X G Types:Instant -A:SP$ Pump | AnnounceTitle$ how many green cards to exile | Announce$ Exiled | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Creature.cmcLTX | TgtPrompt$ Choose target creature with mana value less than X | SubAbility$ DBSearch | StackDescription$ None | SpellDescription$ Choose target creature with mana value less than X. Search your library for a creature card with the same name as that creature, put it onto the battlefield tapped, then shuffle. +A:SP$ Pump | AnnounceTitle$ how many green cards to exile | Announce$ Exiled | ValidTgts$ Creature.cmcLTX | TgtPrompt$ Choose target creature with mana value less than X | SubAbility$ DBSearch | StackDescription$ None | SpellDescription$ Choose target creature with mana value less than X. Search your library for a creature card with the same name as that creature, put it onto the battlefield tapped, then shuffle. SVar:DBSearch:DB$ ChangeZone | Origin$ Library | Destination$ Battlefield | ChangeType$ Targeted.Creature+sameName | ChangeTypeDesc$ creature card with the same name as {c:Targeted} | ChangeNum$ 1 | Mandatory$ True | Tapped$ True S:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Cost$ ExileFromHand | EffectZone$ All | Description$ As an additional cost to cast this spell, you may exile any number of green cards from your hand. This spell costs {2} less to cast for each card exiled this way. S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Relative$ True | Secondary$ True | Description$ This spell costs {2} less to cast for each card exiled this way. diff --git a/forge-gui/res/cardsfolder/upcoming/march_of_otherworldly_light.txt b/forge-gui/res/cardsfolder/upcoming/march_of_otherworldly_light.txt new file mode 100644 index 00000000000..32d4a8661fc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/march_of_otherworldly_light.txt @@ -0,0 +1,11 @@ +Name:March of Otherworldly Light +ManaCost:X W +Types:Instant +A:SP$ ChangeZone | AnnounceTitle$ how many white cards to exile | Announce$ Exiled | Origin$ Battlefield | Destination$ Exile | ValidTgts$ Artifact.cmcLEX,Creature.cmcLEX,Enchantment.cmcLEX | TgtPrompt$ Select target artifact, creature, or enchantment with mana value X or less | SpellDescription$ Exile target artifact, creature, or enchantment with mana value X or less. +S:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Cost$ ExileFromHand | EffectZone$ All | Description$ As an additional cost to cast this spell, you may exile any number of white cards from your hand. This spell costs {2} less to cast for each card exiled this way. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Relative$ True | Secondary$ True | Description$ This spell costs {2} less to cast for each card exiled this way. +SVar:X:Count$xPaid +SVar:Y:SVar$Exiled +SVar:Z:SVar$Y/Times.2 +SVar:Exiled:Number$0 +Oracle:As an additional cost to cast this spell, you may exile any number of white cards from your hand. This spell costs {2} less to cast for each card exiled this way.\nExile target artifact, creature, or enchantment with mana value X or less. diff --git a/forge-gui/res/cardsfolder/upcoming/march_of_reckless_joy.txt b/forge-gui/res/cardsfolder/upcoming/march_of_reckless_joy.txt index 59c3412f279..2c87ce2f970 100644 --- a/forge-gui/res/cardsfolder/upcoming/march_of_reckless_joy.txt +++ b/forge-gui/res/cardsfolder/upcoming/march_of_reckless_joy.txt @@ -1,14 +1,14 @@ Name:March of Reckless Joy ManaCost:X R Types:Instant -A:SP$ Dig | Cost$ X R | AdditionalDesc$ This spell costs {2} less to cast for each card exiled this way. | AnnounceTitle$ how many red cards to exile | Announce$ Exiled | DB$ Dig | Defined$ You | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top X cards of your library. Until the end of your next turn, you may play up to two of those cards. +A:SP$ Dig | Cost$ X R | AdditionalDesc$ This spell costs {2} less to cast for each card exiled this way. | AnnounceTitle$ how many red cards to exile | Announce$ Exiled | Defined$ You | DigNum$ X | ChangeNum$ All | DestinationZone$ Exile | RememberChanged$ True | SubAbility$ DBEffect | SpellDescription$ Exile the top X cards of your library. You may play up to two of those cards until the end of your next turn. S:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Cost$ ExileFromHand | EffectZone$ All | Description$ As an additional cost to cast this spell, you may exile any number of red cards from your hand. This spell costs {2} less to cast for each card exiled this way. S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Relative$ True | Secondary$ True | Description$ This spell costs {2} less to cast for each card exiled this way. -SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ MayPlay | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup -SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayLimit$ 2 | EffectZone$ Command | AffectedZone$ Exile | Description$ Until the end of your next turn, you may play up to two of those cards. +SVar:DBEffect:DB$ Effect | RememberObjects$ RememberedCard | StaticAbilities$ MayPlay | Duration$ UntilTheEndOfYourNextTurn | ForgetOnMoved$ Exile | SubAbility$ DBCleanup | SpellDescription$ You may play up to two of those cards until the end of your next turn. +SVar:MayPlay:Mode$ Continuous | Affected$ Card.IsRemembered | MayPlay$ True | MayPlayLimit$ 2 | EffectZone$ Command | AffectedZone$ Exile | Description$ You may play up to two of those cards until the end of your next turn. SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:X:Count$xPaid SVar:Y:SVar$Exiled SVar:Z:SVar$Y/Times.2 SVar:Exiled:Number$0 -Oracle:As an additional cost to cast this spell, you may exile any number of red cards from your hand. This spell costs {2} less to cast for each card exiled this way.\nExile the top X cards of your library. Until the end of your next turn, you may play up to two of those cards. +Oracle:As an additional cost to cast this spell, you may exile any number of red cards from your hand. This spell costs {2} less to cast for each card exiled this way.\nExile the top X cards of your library. You may play up to two of those cards until the end of your next turn. diff --git a/forge-gui/res/cardsfolder/upcoming/march_of_swirling_mist.txt b/forge-gui/res/cardsfolder/upcoming/march_of_swirling_mist.txt new file mode 100644 index 00000000000..925dcc5e47b --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/march_of_swirling_mist.txt @@ -0,0 +1,11 @@ +Name:March of Swirling Mist +ManaCost:X U +Types:Instant +A:SP$ Phases | AnnounceTitle$ how many blue cards to exile | Announce$ Exiled | ValidTgts$ Creature | TgtPrompt$ Select up to X target creatures | TargetMin$ 0 | TargetMax$ X | SpellDescription$ Up to X target creatures phase out. (While they're phased out, they're treated as though they don't exist. Each one phases in before its controller untaps during their next untap step.) +S:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Cost$ ExileFromHand | EffectZone$ All | Description$ As an additional cost to cast this spell, you may exile any number of blue cards from your hand. This spell costs {2} less to cast for each card exiled this way. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Relative$ True | Secondary$ True | Description$ This spell costs {2} less to cast for each card exiled this way. +SVar:X:Count$xPaid +SVar:Y:SVar$Exiled +SVar:Z:SVar$Y/Times.2 +SVar:Exiled:Number$0 +Oracle:As an additional cost to cast this spell, you may exile any number of blue cards from your hand. This spell costs {2} less to cast for each card exiled this way.\nUp to X target creatures phase out. (While they're phased out, they're treated as though they don't exist. Each one phases in before its controller untaps during their next untap step.) diff --git a/forge-gui/res/cardsfolder/upcoming/march_of_wretched_sorrow.txt b/forge-gui/res/cardsfolder/upcoming/march_of_wretched_sorrow.txt new file mode 100644 index 00000000000..c3d808c15fc --- /dev/null +++ b/forge-gui/res/cardsfolder/upcoming/march_of_wretched_sorrow.txt @@ -0,0 +1,13 @@ +Name:March of Wretched Sorrow +ManaCost:X B +Types:Instant +A:SP$ DealDamage | AnnounceTitle$ how many black cards to exile | Announce$ Exiled | ValidTgts$ Creature,Planeswalker | TgtPrompt$ Select target creature or planeswalker | NumDmg$ X | SubAbility$ DBGainLife | SpellDescription$ CARDNAME deals X damage to target creature or planeswalker +SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ X | SpellDescription$ and you gain X life. +S:Mode$ RaiseCost | ValidCard$ Card.Self | Type$ Spell | Cost$ ExileFromHand | EffectZone$ All | Description$ As an additional cost to cast this spell, you may exile any number of black cards from your hand. This spell costs {2} less to cast for each card exiled this way. +S:Mode$ ReduceCost | ValidCard$ Card.Self | Type$ Spell | Amount$ Z | EffectZone$ All | Relative$ True | Secondary$ True | Description$ This spell costs {2} less to cast for each card exiled this way. +SVar:X:Count$xPaid +SVar:Y:SVar$Exiled +SVar:Z:SVar$Y/Times.2 +SVar:Exiled:Number$0 +DeckHas:Ability$LifeGain +Oracle:As an additional cost to cast this spell, you may exile any number of black cards from your hand. This spell costs {2} less to cast for each card exiled this way.\nMarch of Wretched Sorrow deals X damage to target creature or planeswalker and you gain X life. diff --git a/forge-gui/src/main/java/forge/player/HumanCostDecision.java b/forge-gui/src/main/java/forge/player/HumanCostDecision.java index 54886c64129..36dda164c41 100644 --- a/forge-gui/src/main/java/forge/player/HumanCostDecision.java +++ b/forge-gui/src/main/java/forge/player/HumanCostDecision.java @@ -257,6 +257,10 @@ public class HumanCostDecision extends CostDecisionMakerBase { return null; } + if (c == 0) { //in case choice was already made to pay 0 cards + return PaymentDecision.number(c); + } + if (cost.from == ZoneType.Battlefield || cost.from == ZoneType.Hand) { final InputSelectCardsFromList inp = new InputSelectCardsFromList(controller, c, c, list, ability); inp.setMessage(Localizer.getInstance().getMessage("lblExileNCardsFromYourZone", "%d", cost.getFrom().getTranslatedName())); diff --git a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java index b5874416e8f..2b09d24bce5 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java +++ b/forge-gui/src/main/java/forge/player/HumanPlaySpellAbility.java @@ -217,6 +217,15 @@ public class HumanPlaySpellAbility { fromZone.add(oldCard, zonePosition >= 0 ? Integer.valueOf(zonePosition) : null); ability.setHostCard(oldCard); ability.setXManaCostPaid(null); + if (ability.hasParam("Announce")) { + final String announce = ability.getParam("Announce"); + for (final String aVar : announce.split(",")) { + final String varName = aVar.trim(); + if (!varName.equals("X")) { + ability.setSVar(varName, "0"); + } + } + } // better safe than sorry approach in case rolled back ability was copy (from addExtraKeywordCost) for (SpellAbility sa : oldCard.getSpells()) { sa.setHostCard(oldCard); From 429e8e715c5d618449eb0faa0850c2cca2bc7025 Mon Sep 17 00:00:00 2001 From: Tim Mocny Date: Sat, 19 Feb 2022 04:24:52 +0000 Subject: [PATCH 9/9] capital S Strike in scripts, lowercase s strike in descriptions/detail --- forge-game/src/main/java/forge/game/card/Card.java | 3 +++ forge-gui/res/cardsfolder/c/captain_eberhart.txt | 2 +- forge-gui/res/cardsfolder/c/caravan_escort.txt | 2 +- forge-gui/res/cardsfolder/e/ember_weaver.txt | 2 +- forge-gui/res/cardsfolder/f/firjas_retribution.txt | 2 +- forge-gui/res/cardsfolder/n/natures_blessing.txt | 2 +- forge-gui/res/cardsfolder/n/nirkana_cutthroat.txt | 4 ++-- forge-gui/res/cardsfolder/s/skillful_lunge.txt | 2 +- forge-gui/res/cardsfolder/s/stromkirk_captain.txt | 2 +- forge-gui/res/cardsfolder/s/student_of_warfare.txt | 4 ++-- .../cardsfolder/t/twinblade_geist_twinblade_invocation.txt | 2 +- forge-gui/res/cardsfolder/u/urzas_avenger.txt | 2 +- forge-gui/res/cardsfolder/upcoming/blade_blizzard_kitsune.txt | 2 +- forge-gui/res/cardsfolder/upcoming/eater_of_virtue.txt | 4 ++-- .../upcoming/era_of_enlightenment_hand_of_enlightenment.txt | 2 +- .../res/cardsfolder/upcoming/go_shintai_of_ancient_wars.txt | 2 +- forge-gui/res/cardsfolder/upcoming/kitsune_ace.txt | 2 +- forge-gui/res/cardsfolder/upcoming/lizard_blades.txt | 4 ++-- forge-gui/res/cardsfolder/upcoming/raiyuu_storms_edge.txt | 2 +- forge-gui/res/cardsfolder/upcoming/the_wandering_emperor.txt | 2 +- forge-gui/res/cardsfolder/v/valor.txt | 2 +- 21 files changed, 27 insertions(+), 24 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 35535d84f81..aa7e3c311ed 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2155,6 +2155,9 @@ public class Card extends GameEntity implements Comparable, IHasSVars { } else if (keyword.endsWith(".") && !keyword.startsWith("Haunt")) { sbLong.append(keyword).append("\r\n"); } else { + if (keyword.contains("Strike")) { + keyword = keyword.replace("Strike", "strike"); + } sb.append(i !=0 && sb.length() !=0 ? ", " : ""); sb.append(i > 0 && sb.length() !=0 ? keyword.toLowerCase() : keyword); } diff --git a/forge-gui/res/cardsfolder/c/captain_eberhart.txt b/forge-gui/res/cardsfolder/c/captain_eberhart.txt index fbe63216608..8859f8e746d 100644 --- a/forge-gui/res/cardsfolder/c/captain_eberhart.txt +++ b/forge-gui/res/cardsfolder/c/captain_eberhart.txt @@ -2,7 +2,7 @@ Name:Captain Eberhart ManaCost:1 W Types:Legendary Creature Human Soldier PT:1/1 -K:Double strike +K:Double Strike S:Mode$ ReduceCost | ValidCard$ Card.YouOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards you drew this turn cost {1} less to cast. S:Mode$ RaiseCost | ValidCard$ Card.OppOwn+DrawnThisTurn | Type$ Spell | Amount$ 1 | Description$ Spells cast from among cards your opponents drew this turn cost {1} more to cast. Oracle:Double strike\nSpells cast from among cards you drew this turn cost {1} less to cast.\nSpells cast from among cards your opponents drew this turn cost {1} more to cast. diff --git a/forge-gui/res/cardsfolder/c/caravan_escort.txt b/forge-gui/res/cardsfolder/c/caravan_escort.txt index e5fc6cd5914..a1f47ab8c06 100644 --- a/forge-gui/res/cardsfolder/c/caravan_escort.txt +++ b/forge-gui/res/cardsfolder/c/caravan_escort.txt @@ -5,5 +5,5 @@ PT:1/1 K:Level up:2 SVar:maxLevel:5 S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 2 | SetToughness$ 2 | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE4_LEVEL | Description$ LEVEL 1-4 2/2 -S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE5_LEVEL | AddKeyword$ First Strike | Description$ LEVEL 5+ 5/5 CARDNAME has First Strike +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 5 | IsPresent$ Card.Self+counters_GE5_LEVEL | AddKeyword$ First Strike | Description$ LEVEL 5+ 5/5 First strike Oracle:Level up {2} ({2}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-4\n2/2\nLEVEL 5+\n5/5\nFirst strike diff --git a/forge-gui/res/cardsfolder/e/ember_weaver.txt b/forge-gui/res/cardsfolder/e/ember_weaver.txt index 25b28a620ed..ca67c260069 100644 --- a/forge-gui/res/cardsfolder/e/ember_weaver.txt +++ b/forge-gui/res/cardsfolder/e/ember_weaver.txt @@ -3,7 +3,7 @@ ManaCost:2 G Types:Creature Spider PT:2/3 K:Reach -S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddKeyword$ First strike | IsPresent$ Permanent.Red+YouCtrl | Description$ As long as you control a red permanent, CARDNAME gets +1/+0 and has first strike. +S:Mode$ Continuous | Affected$ Card.Self | AddPower$ 1 | AddKeyword$ First Strike | IsPresent$ Permanent.Red+YouCtrl | Description$ As long as you control a red permanent, CARDNAME gets +1/+0 and has first strike. SVar:BuffedBy:Permanent.Red DeckHints:Color$Red Oracle:Reach (This creature can block creatures with flying.)\nAs long as you control a red permanent, Ember Weaver gets +1/+0 and has first strike. diff --git a/forge-gui/res/cardsfolder/f/firjas_retribution.txt b/forge-gui/res/cardsfolder/f/firjas_retribution.txt index d7d771ae634..169fe498480 100644 --- a/forge-gui/res/cardsfolder/f/firjas_retribution.txt +++ b/forge-gui/res/cardsfolder/f/firjas_retribution.txt @@ -6,6 +6,6 @@ SVar:TrigAngel:DB$ Token | TokenAmount$ 1 | TokenScript$ w_4_4_angel_warrior_fly SVar:DBAnimateAll:DB$ AnimateAll | ValidCards$ Angel.YouCtrl | Abilities$ TapDestroy | SpellDescription$ Until the end of turn, Angels you control gain "{T}: Destroy target creature with power less than this creature." SVar:TapDestroy:AB$ Destroy | Cost$ T | ValidTgts$ Creature.powerLTX | TgtPrompt$ Select target creature with power less than this creature | SpellDescription$ Destroy target creature with power less than this creature. SVar:X:Count$CardPower -SVar:TrigPump:DB$ PumpAll | ValidCards$ Angel.YouCtrl | KW$ Double Strike | SpellDescription$ Angels you control gain Double Strike until end of turn. +SVar:TrigPump:DB$ PumpAll | ValidCards$ Angel.YouCtrl | KW$ Double Strike | SpellDescription$ Angels you control gain double strike until end of turn. DeckHints:Type$Angel Oracle:(As this Saga enters and after your draw step, add a lore counter. Sacrifice after III.)\nI — Create a 4/4 white Angel Warrior creature token with flying and vigilance.\nII — Until end of turn, Angels you control gain "{T}: Destroy target creature with power less than this creature's power."\nIII — Angels you control gain double strike until end of turn. diff --git a/forge-gui/res/cardsfolder/n/natures_blessing.txt b/forge-gui/res/cardsfolder/n/natures_blessing.txt index ef6c37b9f82..c25f015cbd9 100644 --- a/forge-gui/res/cardsfolder/n/natures_blessing.txt +++ b/forge-gui/res/cardsfolder/n/natures_blessing.txt @@ -4,7 +4,7 @@ Types:Enchantment A:AB$ GenericChoice | Cost$ G W Discard<1/Card> | ValidTgts$ Creature | Defined$ You | Choices$ DBPutCounter,DBBanding,DBFirstStrike,DBTrample | SpellDescription$ Put a +1/+1 counter on target creature or that creature gains banding, first strike, or trample. SVar:DBPutCounter:DB$ PutCounter | Defined$ Targeted | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Put a +1/+1 counter on target creature. SVar:DBBanding:DB$ Pump | Defined$ Targeted | KW$ Banding | Duration$ Permanent | SpellDescription$ Target creature gains Banding -SVar:DBFirstStrike:DB$ Pump | Defined$ Targeted | KW$ First Strike | Duration$ Permanent | SpellDescription$ Target creature gains First Strike +SVar:DBFirstStrike:DB$ Pump | Defined$ Targeted | KW$ First Strike | Duration$ Permanent | SpellDescription$ Target creature gains first strike SVar:DBTrample:DB$ Pump | Defined$ Targeted | KW$ Trample | Duration$ Permanent | SpellDescription$ Target creature gains Trample AI:RemoveDeck:All SVar:NonStackingEffect:True diff --git a/forge-gui/res/cardsfolder/n/nirkana_cutthroat.txt b/forge-gui/res/cardsfolder/n/nirkana_cutthroat.txt index ae54f9da494..fecf0fdf63e 100644 --- a/forge-gui/res/cardsfolder/n/nirkana_cutthroat.txt +++ b/forge-gui/res/cardsfolder/n/nirkana_cutthroat.txt @@ -4,6 +4,6 @@ Types:Creature Vampire Warrior PT:3/2 K:Level up:2 B SVar:maxLevel:3 -S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 3 | AddKeyword$ Deathtouch | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 4/3 CARDNAME has Deathtouch -S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 4 | AddKeyword$ First Strike & Deathtouch | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 5/4 CARDNAME has First Strike and Deathtouch +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 3 | AddKeyword$ Deathtouch | IsPresent$ Card.Self+counters_GE1_LEVEL+counters_LE2_LEVEL | Description$ LEVEL 1-2 4/3 Deathtouch +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 5 | SetToughness$ 4 | AddKeyword$ First Strike & Deathtouch | IsPresent$ Card.Self+counters_GE3_LEVEL | Description$ LEVEL 3+ 5/4 First strike, deathtouch Oracle:Level up {2}{B} ({2}{B}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 1-2\n4/3\nDeathtouch\nLEVEL 3+\n5/4\nFirst strike, deathtouch diff --git a/forge-gui/res/cardsfolder/s/skillful_lunge.txt b/forge-gui/res/cardsfolder/s/skillful_lunge.txt index e2dda77fe2a..877640db3df 100644 --- a/forge-gui/res/cardsfolder/s/skillful_lunge.txt +++ b/forge-gui/res/cardsfolder/s/skillful_lunge.txt @@ -1,5 +1,5 @@ Name:Skillful Lunge ManaCost:1 W Types:Instant -A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ First Strike | SpellDescription$ Target creature gets +2/+0 and gains First Strike until end of turn. +A:SP$ Pump | Cost$ 1 W | ValidTgts$ Creature | TgtPrompt$ Select target creature | NumAtt$ +2 | KW$ First Strike | SpellDescription$ Target creature gets +2/+0 and gains first strike until end of turn. Oracle:Target creature gets +2/+0 and gains first strike until end of turn. diff --git a/forge-gui/res/cardsfolder/s/stromkirk_captain.txt b/forge-gui/res/cardsfolder/s/stromkirk_captain.txt index 6c016813cc5..07facdb991b 100644 --- a/forge-gui/res/cardsfolder/s/stromkirk_captain.txt +++ b/forge-gui/res/cardsfolder/s/stromkirk_captain.txt @@ -3,5 +3,5 @@ ManaCost:1 B R Types:Creature Vampire Soldier PT:2/2 K:First Strike -S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ First Strike | Description$ Other Vampire creatures you control get +1/+1 and have First Strike. +S:Mode$ Continuous | Affected$ Creature.Vampire+Other+YouCtrl | AddPower$ 1 | AddToughness$ 1 | AddKeyword$ First Strike | Description$ Other Vampire creatures you control get +1/+1 and have first strike. Oracle:First strike\nOther Vampire creatures you control get +1/+1 and have first strike. diff --git a/forge-gui/res/cardsfolder/s/student_of_warfare.txt b/forge-gui/res/cardsfolder/s/student_of_warfare.txt index d38ca713fc7..a76daf6bfd7 100644 --- a/forge-gui/res/cardsfolder/s/student_of_warfare.txt +++ b/forge-gui/res/cardsfolder/s/student_of_warfare.txt @@ -4,6 +4,6 @@ Types:Creature Human Knight PT:1/1 K:Level up:W SVar:maxLevel:7 -S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ First Strike | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 2-6 3/3 CARDNAME has First Strike -S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Double Strike | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 4/4 CARDNAME has Double Strike +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 3 | SetToughness$ 3 | AddKeyword$ First Strike | IsPresent$ Card.Self+counters_GE2_LEVEL+counters_LE6_LEVEL | Description$ LEVEL 2-6 3/3 First strike +S:Mode$ Continuous | Affected$ Card.Self | SetPower$ 4 | SetToughness$ 4 | AddKeyword$ Double Strike | IsPresent$ Card.Self+counters_GE7_LEVEL | Description$ LEVEL 7+ 4/4 Double strike Oracle:Level up {W} ({W}: Put a level counter on this. Level up only as a sorcery.)\nLEVEL 2-6\n3/3\nFirst strike\nLEVEL 7+\n4/4\nDouble strike diff --git a/forge-gui/res/cardsfolder/t/twinblade_geist_twinblade_invocation.txt b/forge-gui/res/cardsfolder/t/twinblade_geist_twinblade_invocation.txt index 57640ebf4f1..2bf09e436ec 100644 --- a/forge-gui/res/cardsfolder/t/twinblade_geist_twinblade_invocation.txt +++ b/forge-gui/res/cardsfolder/t/twinblade_geist_twinblade_invocation.txt @@ -16,7 +16,7 @@ Colors:white Types:Enchantment Aura K:Enchant creature A:SP$ Attach | ValidTgts$ Creature | TgtPrompt$ Select target creature | AILogic$ Pump -S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Double strike | Description$ Enchanted creature has double strike. +S:Mode$ Continuous | Affected$ Creature.EnchantedBy | AddKeyword$ Double Strike | Description$ Enchanted creature has double strike. R:Event$ Moved | ValidCard$ Card.Self | Destination$ Graveyard | ReplaceWith$ Exile | Description$ If CARDNAME would be put into a graveyard from anywhere, exile it instead. SVar:Exile:DB$ ChangeZone | Hidden$ True | Origin$ All | Destination$ Exile | Defined$ ReplacedCard Oracle:Enchant creature\nEnchanted creature has double strike.\nIf Twinblade Invocation would be put into a graveyard from anywhere, exile it instead. diff --git a/forge-gui/res/cardsfolder/u/urzas_avenger.txt b/forge-gui/res/cardsfolder/u/urzas_avenger.txt index 0c37ab36e90..706a3598ea5 100644 --- a/forge-gui/res/cardsfolder/u/urzas_avenger.txt +++ b/forge-gui/res/cardsfolder/u/urzas_avenger.txt @@ -6,7 +6,7 @@ A:AB$ Pump | Cost$ 0 | Defined$ Self | NumAtt$ -1 | NumDef$ -1 | SubAbility$ DBC SVar:DBChoose:DB$ GenericChoice | Defined$ You | Choices$ DBFlying,DBBanding,DBFirstStrike,DBTrample SVar:DBFlying:DB$ Pump | KW$ Flying | Defined$ Self | SpellDescription$ Target creature gains Flying until end of turn. SVar:DBBanding:DB$ Pump | KW$ Banding | Defined$ Self | SpellDescription$ Target creature gains Banding until end of turn. -SVar:DBFirstStrike:DB$ Pump | KW$ First Strike | Defined$ Self | SpellDescription$ Target creature gains First Strike until end of turn. +SVar:DBFirstStrike:DB$ Pump | KW$ First Strike | Defined$ Self | SpellDescription$ Target creature gains first strike until end of turn. SVar:DBTrample:DB$ Pump | KW$ Trample | Defined$ Self | SpellDescription$ Target creature gains Trample until end of turn. AI:RemoveDeck:All Oracle:{0}: Urza's Avenger gets -1/-1 and gains your choice of banding, flying, first strike, or trample until end of turn. (Any creatures with banding, and up to one without, can attack in a band. Bands are blocked as a group. If any creatures with banding you control are blocking or being blocked by a creature, you divide that creature's combat damage, not its controller, among any of the creatures it's being blocked by or is blocking.) diff --git a/forge-gui/res/cardsfolder/upcoming/blade_blizzard_kitsune.txt b/forge-gui/res/cardsfolder/upcoming/blade_blizzard_kitsune.txt index 1016e8ffc9f..5f4fef96ea2 100644 --- a/forge-gui/res/cardsfolder/upcoming/blade_blizzard_kitsune.txt +++ b/forge-gui/res/cardsfolder/upcoming/blade_blizzard_kitsune.txt @@ -3,5 +3,5 @@ ManaCost:2 W Types:Creature Fox Ninja PT:2/2 K:Ninjutsu:3 W -K:Double strike +K:Double Strike Oracle:Ninjutsu {3}{W} ({3}{W}, Return an unblocked attacker you control to hand: Put this card onto the battlefield from your hand tapped and attacking.)\nDouble strike diff --git a/forge-gui/res/cardsfolder/upcoming/eater_of_virtue.txt b/forge-gui/res/cardsfolder/upcoming/eater_of_virtue.txt index 0b5a745f78c..85254653020 100644 --- a/forge-gui/res/cardsfolder/upcoming/eater_of_virtue.txt +++ b/forge-gui/res/cardsfolder/upcoming/eater_of_virtue.txt @@ -5,10 +5,10 @@ K:Equip:1 S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddPower$ 2 | Description$ Equipped creature gets +2/+0. T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Graveyard | ValidCard$ Card.EquippedBy | Execute$ TrigExile | TriggerDescription$ Whenever equipped creature dies, exile it. SVar:TrigExile:DB$ ChangeZone | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile | RememberChanged$ True -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying & First strike & Double strike & Deathtouch & Haste & Hexproof & Indestructible & Lifelink & Menace & Protection & Reach & Trample & Vigilance | SharedKeywordsZone$ Exile | SharedRestrictions$ Card.IsRemembered+ExiledWithSource | Description$ As long as a card exiled with CARDNAME has flying, equipped creature has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance. +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Flying & First Strike & Double Strike & Deathtouch & Haste & Hexproof & Indestructible & Lifelink & Menace & Protection & Reach & Trample & Vigilance | SharedKeywordsZone$ Exile | SharedRestrictions$ Card.IsRemembered+ExiledWithSource | Description$ As long as a card exiled with CARDNAME has flying, equipped creature has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance. T:Mode$ ChangesZone | Origin$ Exile | Destination$ Any | Static$ True | ValidCard$ Card.IsRemembered | Execute$ DBForget SVar:DBForget:DB$ Pump | ForgetObjects$ TriggeredCard T:Mode$ ChangesZone | Origin$ Battlefield | Destination$ Any | Static$ True | ValidCard$ Card.Self | Execute$ DBCleanup SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True -DeckHints:Keyword$Flying|First strike|Double strike|Deathtouch|Haste|Hexproof|Indestructible|Lifelink|Menace|Protection|Reach|Trample|Vigilance +DeckHints:Keyword$Flying|First Strike|Double Strike|Deathtouch|Haste|Hexproof|Indestructible|Lifelink|Menace|Protection|Reach|Trample|Vigilance Oracle:Whenever equipped creature dies, exile it.\nEquipped creature gets +2/+0.\nAs long as a card exiled with Eater of Virtue has flying, equipped creature has flying. The same is true for first strike, double strike, deathtouch, haste, hexproof, indestructible, lifelink, menace, protection, reach, trample, and vigilance.\nEquip {1} diff --git a/forge-gui/res/cardsfolder/upcoming/era_of_enlightenment_hand_of_enlightenment.txt b/forge-gui/res/cardsfolder/upcoming/era_of_enlightenment_hand_of_enlightenment.txt index 566e720fab3..66df0c46e7a 100644 --- a/forge-gui/res/cardsfolder/upcoming/era_of_enlightenment_hand_of_enlightenment.txt +++ b/forge-gui/res/cardsfolder/upcoming/era_of_enlightenment_hand_of_enlightenment.txt @@ -18,5 +18,5 @@ ManaCost:no cost Colors:white Types:Enchantment Creature Human Monk PT:2/2 -K:First strike +K:First Strike Oracle:First strike diff --git a/forge-gui/res/cardsfolder/upcoming/go_shintai_of_ancient_wars.txt b/forge-gui/res/cardsfolder/upcoming/go_shintai_of_ancient_wars.txt index 5784bdb21a7..ec73fcdb3c7 100644 --- a/forge-gui/res/cardsfolder/upcoming/go_shintai_of_ancient_wars.txt +++ b/forge-gui/res/cardsfolder/upcoming/go_shintai_of_ancient_wars.txt @@ -2,7 +2,7 @@ Name:Go-Shintai of Ancient Wars ManaCost:2 R Types:Legendary Enchantment Creature Shrine PT:2/2 -K:First strike +K:First Strike T:Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | TriggerZones$ Battlefield | Execute$ TrigImmediateTrig | TriggerDescription$ At the beginning of your end step, you may pay {1}. When you do, CARDNAME deals X damage to target player or planeswalker, where X is the number of Shrines you control. SVar:TrigImmediateTrig:AB$ ImmediateTrigger | Cost$ 1 | Execute$ TrigDealDamage | SpellDescription$ CARDNAME deals X damage to target player or planeswalker, where X is the number of Shrines you control. SVar:TrigDealDamage:DB$ DealDamage | ValidTgts$ Player,Planeswalker | TgtPrompt$ Select target player or planeswalker | NumDmg$ X diff --git a/forge-gui/res/cardsfolder/upcoming/kitsune_ace.txt b/forge-gui/res/cardsfolder/upcoming/kitsune_ace.txt index 0c36ef19539..c80f08a37e6 100644 --- a/forge-gui/res/cardsfolder/upcoming/kitsune_ace.txt +++ b/forge-gui/res/cardsfolder/upcoming/kitsune_ace.txt @@ -4,7 +4,7 @@ Types:Creature Fox Pilot PT:2/2 T:Mode$ Attacks | ValidCard$ Vehicle.YouCtrl | TriggerZones$ Battlefield | Execute$ TrigCharm | TriggerDescription$ Whenever a Vehicle you control attacks, ABILITY SVar:TrigCharm:DB$ Charm | Choices$ DBPump,DBUntap -SVar:DBPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ First strike | SpellDescription$ That Vehicle gains first strike until end of turn +SVar:DBPump:DB$ Pump | Defined$ TriggeredAttacker | KW$ First Strike | SpellDescription$ That Vehicle gains first strike until end of turn SVar:DBUntap:DB$ Untap | Defined$ Self | SpellDescription$ Untap CARDNAME DeckNeeds:Type$Vehicle Oracle:Whenever a Vehicle you control attacks, choose one —\n• That Vehicle gains first strike until end of turn.\n• Untap Kitsune Ace. diff --git a/forge-gui/res/cardsfolder/upcoming/lizard_blades.txt b/forge-gui/res/cardsfolder/upcoming/lizard_blades.txt index d83c063fd53..8cec347e6f2 100644 --- a/forge-gui/res/cardsfolder/upcoming/lizard_blades.txt +++ b/forge-gui/res/cardsfolder/upcoming/lizard_blades.txt @@ -2,7 +2,7 @@ Name:Lizard Blades ManaCost:1 R Types:Artifact Creature Equipment Lizard PT:1/1 -K:Double strike -S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Double strike | Description$ Equipped creature has double strike. +K:Double Strike +S:Mode$ Continuous | Affected$ Creature.EquippedBy | AddKeyword$ Double Strike | Description$ Equipped creature has double strike. K:Reconfigure:2 Oracle:Trample\nEquipped creature has double strike.\nReconfigure {2} ({2}: Attach to target creature you control; or unattach from a creature. Reconfigure only as a sorcery. While attached, this isn't a creature.) diff --git a/forge-gui/res/cardsfolder/upcoming/raiyuu_storms_edge.txt b/forge-gui/res/cardsfolder/upcoming/raiyuu_storms_edge.txt index 6d96b1cc380..c8c0ae5e577 100644 --- a/forge-gui/res/cardsfolder/upcoming/raiyuu_storms_edge.txt +++ b/forge-gui/res/cardsfolder/upcoming/raiyuu_storms_edge.txt @@ -2,7 +2,7 @@ Name:Raiyuu, Storm's Edge ManaCost:2 R W Types:Legendary Creature Human Samurai PT:3/3 -K:First strike +K:First Strike T:Mode$ Attacks | ValidCard$ Samurai.YouCtrl,Warrior.YouCtrl | Alone$ True | TriggerZones$ Battlefield | Execute$ TrigUntap | TriggerDescription$ Whenever a Samurai or Warrior you control attacks alone, untap it. If it's the first combat phase of the turn, there is an additional combat phase after this phase. SVar:TrigUntap:DB$ Untap | Defined$ TriggeredAttacker | SubAbility$ DBAddPhase SVar:DBAddPhase:DB$ AddPhase | ExtraPhase$ Combat | ConditionFirstCombat$ True | AfterPhase$ EndCombat diff --git a/forge-gui/res/cardsfolder/upcoming/the_wandering_emperor.txt b/forge-gui/res/cardsfolder/upcoming/the_wandering_emperor.txt index d38a3708868..3ca7937daf8 100644 --- a/forge-gui/res/cardsfolder/upcoming/the_wandering_emperor.txt +++ b/forge-gui/res/cardsfolder/upcoming/the_wandering_emperor.txt @@ -5,7 +5,7 @@ Loyalty:3 K:Flash S:Mode$ CastWithFlash | ValidCard$ Card.Self+ThisTurnEntered | ValidSA$ Activated.Loyalty | Caster$ You | Description$ As long as CARDNAME entered the battlefield this turn, you may activate her loyalty abilities any time you could cast an instant. A:AB$ PutCounter | Cost$ AddCounter<1/LOYALTY> | Planeswalker$ True | CounterType$ P1P1 | CounterNum$ 1 | ValidTgts$ Creature | TargetMin$ 0 | TargetMax$ 1 | TgtPrompt$ Select target creature | SubAbility$ DBPump | SpellDescription$ Put a +1/+1 counter on up to one target creature. It gains first strike until end of turn. -SVar:DBPump:DB$ Pump | Defined$ Targeted | Keywords$ First strike +SVar:DBPump:DB$ Pump | Defined$ Targeted | Keywords$ First Strike A:AB$ Token | Cost$ SubCounter<1/LOYALTY> | Planeswalker$ True | TokenAmount$ 1 | TokenScript$ w_2_2_samurai_vigilance | TokenOwner$ You | SpellDescription$ Create a 2/2 white Samurai creature token with vigilance. A:AB$ ChangeZone | Cost$ SubCounter<2/LOYALTY> | Planeswalker$ True | ValidTgts$ Creature.tapped | TgtPrompt$ Select target tapped creature | Origin$ Battlefield | Destination$ Exile | SpellDescription$ Exile target tapped creature. You gain 2 life. | SubAbility$ DBGainLife SVar:DBGainLife:DB$ GainLife | Defined$ You | LifeAmount$ 2 diff --git a/forge-gui/res/cardsfolder/v/valor.txt b/forge-gui/res/cardsfolder/v/valor.txt index a2eb5c9e45e..8b357737d27 100644 --- a/forge-gui/res/cardsfolder/v/valor.txt +++ b/forge-gui/res/cardsfolder/v/valor.txt @@ -3,6 +3,6 @@ ManaCost:3 W Types:Creature Incarnation PT:2/2 K:First Strike -S:Mode$ Continuous | Affected$ Creature.YouCtrl | EffectZone$ Graveyard | AddKeyword$ First strike | IsPresent$ Plains.YouCtrl | Description$ As long as CARDNAME is in your graveyard and you control a Plains, creatures you control have first strike. +S:Mode$ Continuous | Affected$ Creature.YouCtrl | EffectZone$ Graveyard | AddKeyword$ First Strike | IsPresent$ Plains.YouCtrl | Description$ As long as CARDNAME is in your graveyard and you control a Plains, creatures you control have first strike. SVar:DiscardMe:2 Oracle:First strike\nAs long as Valor is in your graveyard and you control a Plains, creatures you control have first strike.