From a40592ce72d5e58b3ab16c3be08b7e8fa3d3f6a7 Mon Sep 17 00:00:00 2001 From: tool4EvEr Date: Sat, 30 Oct 2021 19:55:28 +0200 Subject: [PATCH] Fix Wrenn and Six Emblem not allowing to retrace adventures --- .../main/java/forge/game/GameActionUtil.java | 30 ++++++++++++++++++- .../src/main/java/forge/player/HumanPlay.java | 11 +++++-- 2 files changed, 38 insertions(+), 3 deletions(-) diff --git a/forge-game/src/main/java/forge/game/GameActionUtil.java b/forge-game/src/main/java/forge/game/GameActionUtil.java index 12c8e66505f..1951861fb44 100644 --- a/forge-game/src/main/java/forge/game/GameActionUtil.java +++ b/forge-game/src/main/java/forge/game/GameActionUtil.java @@ -366,7 +366,25 @@ public final class GameActionUtil { if (sa == null || !sa.isSpell()) { return costs; } - final Card source = sa.getHostCard(); + + Card source = sa.getHostCard(); + final Game game = source.getGame(); + boolean lkicheck = false; + + Card newHost = ((Spell)sa).getAlternateHost(source); + if (newHost != null) { + source = newHost; + lkicheck = true; + } + + if (lkicheck) { + // double freeze tracker, so it doesn't update view + game.getTracker().freeze(); + source.clearStaticChangedCardKeywords(false); + CardCollection preList = new CardCollection(source); + game.getAction().checkStaticAbilities(false, Sets.newHashSet(source), preList); + } + for (KeywordInterface inst : source.getKeywords()) { final String keyword = inst.getOriginal(); if (keyword.startsWith("Buyback")) { @@ -409,6 +427,16 @@ public final class GameActionUtil { // Surge while having OptionalCost is none of them } + + // reset static abilities + if (lkicheck) { + game.getAction().checkStaticAbilities(false); + // clear delayed changes, this check should not have updated the view + game.getTracker().clearDelayed(); + // need to unfreeze tracker + game.getTracker().unfreeze(); + } + return costs; } diff --git a/forge-gui/src/main/java/forge/player/HumanPlay.java b/forge-gui/src/main/java/forge/player/HumanPlay.java index 9b333c9765c..3e537f4b2aa 100644 --- a/forge-gui/src/main/java/forge/player/HumanPlay.java +++ b/forge-gui/src/main/java/forge/player/HumanPlay.java @@ -11,6 +11,7 @@ import org.apache.commons.lang3.StringUtils; import com.google.common.collect.Iterables; +import forge.card.CardStateName; import forge.card.mana.ManaCost; import forge.game.Game; import forge.game.GameActionUtil; @@ -83,14 +84,20 @@ public class HumanPlay { sa.setActivatingPlayer(p); boolean flippedToCast = sa.isSpell() && source.isFaceDown(); - source.setSplitStateToPlayAbility(sa); sa = chooseOptionalAdditionalCosts(p, sa); if (sa == null) { return false; } + final CardStateName oldState = source.getCurrentStateName(); + source.setSplitStateToPlayAbility(sa); + // extra play check if (sa.isSpell() && !sa.canPlay()) { + // in case human won't pay optional cost + if (source.getCurrentStateName() != oldState) { + source.setState(oldState, true); + } return false; } @@ -143,7 +150,7 @@ public class HumanPlay { final SpellAbility choosen = c.getAbilityToPlay(original.getHostCard(), abilities); - List list = GameActionUtil.getOptionalCostValues(choosen); + List list = GameActionUtil.getOptionalCostValues(choosen); if (!list.isEmpty()) { list = c.chooseOptionalCosts(choosen, list); }