From 039dfb63ea6082ad2dde69f6c25bad14db3ad32b Mon Sep 17 00:00:00 2001 From: Hanmac Date: Tue, 3 Oct 2017 11:17:07 +0000 Subject: [PATCH] Buyback as ReplacementEffect Soulfire Grand Master as Effects without Keyword --- .../src/main/java/forge/game/card/Card.java | 5 --- .../java/forge/game/card/CardFactoryUtil.java | 42 +++++++++++++++++++ .../main/java/forge/game/zone/MagicStack.java | 10 +---- .../cardsfolder/s/soulfire_grand_master.txt | 8 +++- 4 files changed, 49 insertions(+), 16 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 e7ee5c937da..ba629fc77d8 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2020,11 +2020,6 @@ public class Card extends GameEntity implements Comparable { final Cost cost = new Cost(n[2], false); sb.append("Splice onto ").append(n[1]).append(" ").append(cost.toSimpleString()); sb.append(" (" + Keyword.getInstance(keyword).getReminderText() + ")").append("\r\n"); - } else if (keyword.startsWith("Buyback")) { - final Cost cost = new Cost(keyword.substring(8), false); - sb.append("Buyback ").append(cost.toSimpleString()); - sb.append(" (You may pay an additional cost as you cast CARDNAME. If you do, put CARDNAME back into your hand as it resolves.)"); - sb.append("\r\n"); } else if (keyword.startsWith("Entwine")) { final String[] n = keyword.split(":"); final Cost cost = new Cost(n[1], false); 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 8698ccd19e5..5c9e8d5094e 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2018,6 +2018,9 @@ public class CardFactoryUtil { else if (keyword.startsWith("Dash")) { addSpellAbility(keyword, card, null); } + else if (keyword.startsWith("Buyback")) { + addReplacementEffect(keyword, card, null); + } else if (keyword.startsWith("Awaken")) { addSpellAbility(keyword, card, null); } @@ -3402,6 +3405,45 @@ public class CardFactoryUtil { if (!intrinsic) { kws.addReplacement(re); } + } else if (keyword.startsWith("Buyback")) { + final Cost cost = new Cost(keyword.substring(8), false); + + StringBuilder sb = new StringBuilder(); + sb.append("Event$ Moved | ValidCard$ Card.Self | Origin$ Stack | Destination$ Graveyard | Fizzle$ False "); + sb.append("ValidStackSa$ Spell.Buyback | Description$ Buyback"); + + sb.append( cost.isOnlyManaCost() ? " " : "—"); + + sb.append(cost.toSimpleString()); + + if (!cost.isOnlyManaCost()) { + sb.append("."); + } + + sb.append(" ("); + sb.append(Keyword.getInstance(keyword).getReminderText()); + sb.append(")"); + + String repeffstr = sb.toString(); + + String abReturn = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Hand"; + + SpellAbility saReturn = AbilityFactory.getAbility(abReturn, card); + + if (!intrinsic) { + saReturn.setIntrinsic(false); + } + + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card, intrinsic); + re.setLayer(ReplacementLayer.Other); + + re.setOverridingAbility(saReturn); + + ReplacementEffect cardre = card.addReplacementEffect(re); + + if (!intrinsic) { + kws.addReplacement(cardre); + } } else if (keyword.startsWith("Devour")) { final String[] k = keyword.split(":"); diff --git a/forge-game/src/main/java/forge/game/zone/MagicStack.java b/forge-game/src/main/java/forge/game/zone/MagicStack.java index 86259cf385f..72563ae9158 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -62,7 +62,6 @@ import forge.game.spellability.Spell; import forge.game.spellability.SpellAbility; import forge.game.spellability.SpellAbilityStackInstance; import forge.game.spellability.TargetChoices; -import forge.game.trigger.Trigger; import forge.game.trigger.TriggerType; import forge.game.trigger.WrappedAbility; import forge.util.TextUtil; @@ -582,12 +581,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable params = Maps.newHashMap(); diff --git a/forge-gui/res/cardsfolder/s/soulfire_grand_master.txt b/forge-gui/res/cardsfolder/s/soulfire_grand_master.txt index 045e14417c2..f8858bd8de2 100644 --- a/forge-gui/res/cardsfolder/s/soulfire_grand_master.txt +++ b/forge-gui/res/cardsfolder/s/soulfire_grand_master.txt @@ -4,9 +4,13 @@ Types:Creature Human Monk PT:2/2 K:Lifelink S:Mode$ Continuous | AddKeyword$ Lifelink | Affected$ Instant.YouCtrl,Sorcery.YouCtrl | AffectedZone$ Stack | Description$ Instant and sorcery spells you control have lifelink. -A:AB$ Effect | Cost$ 2 UR UR | Name$ Soulfire Grand Master effect | Triggers$ SpellCastTrig | SVars$ Buybacked,ExileSelf | SpellDescription$ The next time you cast an instant or sorcery spell from your hand this turn, put that card into your hand instead of into your graveyard as it resolves. +A:AB$ Effect | Cost$ 2 UR UR | Name$ Soulfire Grand Master effect | Triggers$ SpellCastTrig | SVars$ Buybacked,MoveToHandReplace,ReplaceHand,ExileSelf | SpellDescription$ The next time you cast an instant or sorcery spell from your hand this turn, put that card into your hand instead of into your graveyard as it resolves. SVar:SpellCastTrig:Mode$ SpellCast | ValidCard$ Sorcery.YouOwn+wasCastFromHand,Instant.YouOwn+wasCastFromHand | ValidActivatingPlayer$ You | Execute$ Buybacked | Static$ True | TriggerDescription$ The next time you cast an instant or sorcery spell from your hand this turn, put that card into your hand instead of into your graveyard as it resolves. -SVar:Buybacked:DB$ Pump | Defined$ TriggeredCard | PumpZone$ Stack | KW$ HIDDEN Move CARDNAME to your hand as it resolves | SubAbility$ ExileSelf +SVar:Buybacked:DB$ Effect | ReplacementEffects$ MoveToHandReplace |SVars$ MoveToHandReplace,ReplaceHand,ExileSelf | RememberObjects$ TriggeredCard | SubAbility$ ExileSelf | SpellDescription$ Put that card into your hand instead of into your graveyard as it resolves. + +SVar:MoveToHandReplace:Event$ Moved | ValidCard$ Card.IsRemembered | Origin$ Stack | Destination$ Graveyard | Fizzle$ False | ReplaceWith$ ReplaceHand | Description$ Put that card into your hand instead of into your graveyard as it resolves. +SVar:ReplaceHand:DB$ ChangeZone | Defined$ Remembered | Origin$ Stack | Destination$ Hand | SubAbility$ ExileSelf + SVar:ExileSelf:DB$ ChangeZone | Defined$ Self | Origin$ Command | Destination$ Exile SVar:Picture:http://www.wizards.com/global/images/magic/general/soulfire_grand_master.jpg Oracle:Lifelink\nInstant and sorcery spells you control have lifelink.\n{2}{U/R}{U/R}: The next time you cast an instant or sorcery spell from your hand this turn, put that card into your hand instead of into your graveyard as it resolves.