From 4f10d64b829a14f696ded13f4f2f26fcea03a6b6 Mon Sep 17 00:00:00 2001 From: Agetian Date: Thu, 19 Jan 2017 16:44:01 +0000 Subject: [PATCH] - FIXME: There is a strange bug with ETB replacement effects not being recreated under certain specific circumstances, for example, when an exiled-face-down card is returned to hand via AF ChangeZone: e.g. The Rack obtained via Necropotence does not work because its ETB effect ends up somehow being not set up correctly. - For now, introduced a local change specific to Necropotence, but I think this is indicative of a bigger issue in the underlying code. If anyone knows why this is happening and where this is best fixed, please assist. --- .../java/forge/game/ability/effects/ChangeZoneEffect.java | 8 ++++++++ .../src/main/java/forge/game/card/CardFactoryUtil.java | 2 +- forge-gui/res/cardsfolder/n/necropotence.txt | 2 +- 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java index 5bb441decf8..86bab257620 100644 --- a/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java +++ b/forge-game/src/main/java/forge/game/ability/effects/ChangeZoneEffect.java @@ -613,8 +613,16 @@ public class ChangeZoneEffect extends SpellAbilityEffect { hostCard.addImprintedCard(movedCard); } } + + // Without this, for example, The Rack returned from exile to hand via Necropotence has + // its ETB replacement effect missing and does not work. + // TODO: Why does this happen? How generic should this "ETB keyword reset" be and where is it best done? + if (sa.hasParam("ResetETBKeywords")) { + CardFactoryUtil.setupEtbKeywords(movedCard); + } } + if (!triggerList.isEmpty()) { final HashMap runParams = new HashMap(); runParams.put("Cards", triggerList); 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 130008fbc7f..67267b79a81 100644 --- a/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java +++ b/forge-game/src/main/java/forge/game/card/CardFactoryUtil.java @@ -2449,7 +2449,7 @@ public class CardFactoryUtil { * TODO: Write javadoc for this method. * @param card */ - private static void setupEtbKeywords(final Card card) { + public static void setupEtbKeywords(final Card card) { for (String kw : card.getKeywords()) { if (kw.startsWith("ETBReplacement")) { diff --git a/forge-gui/res/cardsfolder/n/necropotence.txt b/forge-gui/res/cardsfolder/n/necropotence.txt index 64cea2c2a5f..1f07811b68b 100644 --- a/forge-gui/res/cardsfolder/n/necropotence.txt +++ b/forge-gui/res/cardsfolder/n/necropotence.txt @@ -6,7 +6,7 @@ T:Mode$ Discarded | ValidCard$ Card.YouCtrl | TriggerZones$ Battlefield | Execut SVar:TrigChange:AB$ChangeZone | Cost$ 0 | Defined$ TriggeredCard | Origin$ Graveyard | Destination$ Exile A:AB$ ChangeZone | Cost$ PayLife<1> | Defined$ TopOfLibrary | Origin$ Library | Destination$ Exile | ExileFaceDown$ True | RememberChanged$ True | SubAbility$ DelayedReturn | AILogic$ Necropotence | AILifeThreshold$ 1 | SpellDescription$ Exile the top card of your library face down. Put that card into your hand at the beginning of your next end step. SVar:DelayedReturn:DB$ DelayedTrigger | Mode$ Phase | Phase$ End of Turn | ValidPlayer$ You | Execute$ TrigReturn | RememberObjects$ Remembered | TriggerDescription$ Put the exiled card into your hand. | SubAbility$ DBCleanup -SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | Defined$ DelayTriggerRemembered +SVar:TrigReturn:DB$ ChangeZone | Origin$ Exile | Destination$ Hand | ResetETBKeywords$ True | Defined$ DelayTriggerRemembered SVar:DBCleanup:DB$ Cleanup | ClearRemembered$ True SVar:AICastPreference:NeverCastIfLifeBelow$ 7 SVar:RemRandomDeck:True