From 70b0e7d6c0d72fd90e17e7b946b5c2861ae6bf82 Mon Sep 17 00:00:00 2001 From: Hanmac Date: Mon, 2 Oct 2017 13:42:14 +0000 Subject: [PATCH] Rebound: make it a ReplacementEffect as it should be check for Fizzle in ReplaceMoved, so it only works when it resolved from Stack --- .../ability/effects/DelayedTriggerEffect.java | 2 +- .../src/main/java/forge/game/card/Card.java | 2 +- .../java/forge/game/card/CardFactoryUtil.java | 39 +++++++++++++++++++ .../forge/game/replacement/ReplaceMoved.java | 11 ++++++ .../main/java/forge/game/zone/MagicStack.java | 20 ---------- 5 files changed, 52 insertions(+), 22 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java index f21b362b4f6..8c181d0c982 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/DelayedTriggerEffect.java @@ -71,7 +71,7 @@ public class DelayedTriggerEffect extends SpellAbilityEffect { } } - if (mapParams.containsKey("Execute")) { + if (mapParams.containsKey("Execute") || sa.hasAdditonalAbility("Execute")) { SpellAbility overridingSA = sa.getAdditonalAbility("Execute"); overridingSA.setActivatingPlayer(sa.getActivatingPlayer()); overridingSA.setDeltrigActivatingPlayer(sa.getActivatingPlayer()); // ensure that the original activator can be restored later 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 69aea8fde41..e7ee5c937da 100644 --- a/forge-game/src/main/java/forge/game/card/Card.java +++ b/forge-game/src/main/java/forge/game/card/Card.java @@ -2124,7 +2124,7 @@ public class Card extends GameEntity implements Comparable { sb.delete(sb.lastIndexOf("\r\n"), sb.lastIndexOf("\r\n") + 3); } sb.append("Remove CARDNAME from your deck before playing if you're not playing for ante.\r\n"); - } else if (keyword.equals("Rebound") || keyword.equals("Retrace") || keyword.equals("Changeling")) { + } else if (keyword.equals("Retrace") || keyword.equals("Changeling")) { sb.append(keyword + " (" + Keyword.getInstance(keyword).getReminderText() + ")"); } else if (keyword.startsWith("Presence")) { sb.append(Keyword.getInstance(keyword).getReminderText()); 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 54134a80d9d..8698ccd19e5 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2195,6 +2195,9 @@ public class CardFactoryUtil { else if (keyword.equals("Persist")) { addTriggerAbility(keyword, card, null); } + else if (keyword.equals("Rebound")) { + addReplacementEffect(keyword, card, null); + } else if (keyword.equals("Undying")) { addTriggerAbility(keyword, card, null); } @@ -3497,6 +3500,42 @@ public class CardFactoryUtil { if (!intrinsic) { kws.addReplacement(re); } + } else if (keyword.equals("Rebound")) { + String repeffstr = "Event$ Moved | ValidCard$ Card.Self+wasCastFromHand+YouOwn+YouCtrl " + + " | Origin$ Stack | Destination$ Graveyard | Fizzle$ False " + + " | Description$ " + Keyword.REBOUND.getDescription(); + + String abExile = "DB$ ChangeZone | Defined$ Self | Origin$ Stack | Destination$ Exile"; + String delTrig = "DB$ DelayedTrigger | Mode$ Phase | Phase$ Upkeep | ValidPlayer$ You " + + " | OptionalDecider$ You | RememberObjects$ Self | TriggerDescription$" + + " At the beginning of your next upkeep, you may cast " + card.toString() + " without paying it's manacost."; + // TODO add check for still in exile + String abPlay = "DB$ Play | Defined$ Self | WithoutManaCost$ True | Optional$ True"; + + SpellAbility saExile = AbilityFactory.getAbility(abExile, card); + + final AbilitySub delsub = (AbilitySub) AbilityFactory.getAbility(delTrig, card); + + final AbilitySub saPlay = (AbilitySub) AbilityFactory.getAbility(abPlay, card); + + delsub.setAdditionalAbility("Execute", saPlay); + + saExile.setSubAbility(delsub); + + if (!intrinsic) { + saExile.setIntrinsic(false); + } + + ReplacementEffect re = ReplacementHandler.parseReplacement(repeffstr, card, intrinsic); + re.setLayer(ReplacementLayer.Other); + + re.setOverridingAbility(saExile); + + ReplacementEffect cardre = card.addReplacementEffect(re); + + if (!intrinsic) { + kws.addReplacement(cardre); + } } else if (keyword.equals("Unleash")) { String effect = "DB$ PutCounter | Defined$ Self | CounterType$ P1P1 | CounterNum$ 1 | SpellDescription$ Unleash (" + Keyword.getInstance(keyword).getReminderText() + ")"; diff --git a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java index 5a5766be2fe..2febe465020 100644 --- a/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java +++ b/forge-game/src/main/java/forge/game/replacement/ReplaceMoved.java @@ -84,6 +84,17 @@ public class ReplaceMoved extends ReplacementEffect { } } + if (hasParam("Fizzle")) { + // if Replacement look for Fizzle + if (!runParams.containsKey("Fizzle")) { + return false; + } + Boolean val = (Boolean) runParams.get("Fizzle"); + if ("True".equals(getParam("Fizzle")) != val) { + return false; + } + } + if (hasParam("Cause")) { if (!runParams.containsKey("Cause")) { return false; 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 b67d2f3fc5c..86259cf385f 100644 --- a/forge-game/src/main/java/forge/game/zone/MagicStack.java +++ b/forge-game/src/main/java/forge/game/zone/MagicStack.java @@ -595,26 +595,6 @@ public class MagicStack /* extends MyObservable */ implements Iterable