From 2efdb464fcbee66aba32fba42643078f73a0bf3c Mon Sep 17 00:00:00 2001
From: Oleg Agafonov <jaydi85@gmail.com>
Date: Sat, 28 Aug 2021 12:09:22 +0400
Subject: [PATCH] Little refactor, additional logs for CheckPlayableState
 error;

---
 .../src/mage/player/human/HumanPlayer.java                 | 4 ++++
 Mage.Sets/src/mage/cards/f/FadeAway.java                   | 2 +-
 Mage.Sets/src/mage/cards/s/ShroudedLore.java               | 7 +++----
 .../main/java/mage/abilities/costs/mana/ManaCostImpl.java  | 4 ++--
 .../main/java/mage/abilities/costs/mana/ManaCostsImpl.java | 4 ++--
 5 files changed, 12 insertions(+), 9 deletions(-)

diff --git a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
index ba1cfdc9c7..c97996682a 100644
--- a/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
+++ b/Mage.Server.Plugins/Mage.Player.Human/src/mage/player/human/HumanPlayer.java
@@ -2609,6 +2609,10 @@ public class HumanPlayer extends PlayerImpl {
     private boolean gameInCheckPlayableState(Game game, boolean ignoreWarning) {
         if (game.inCheckPlayableState()) {
             if (!ignoreWarning) {
+                logger.warn(String.format("Current stack: %d - %s",
+                        game.getStack().size(),
+                        game.getStack().stream().map(Object::toString).collect(Collectors.joining(", "))
+                ));
                 logger.warn("Player interaction in checkPlayableState", new Throwable());
             }
             return true;
diff --git a/Mage.Sets/src/mage/cards/f/FadeAway.java b/Mage.Sets/src/mage/cards/f/FadeAway.java
index a9e70c3bb6..94b255845e 100644
--- a/Mage.Sets/src/mage/cards/f/FadeAway.java
+++ b/Mage.Sets/src/mage/cards/f/FadeAway.java
@@ -63,7 +63,7 @@ class FadeAwayEffect extends OneShotEffect {
                     String message = "For how many creatures will you pay (up to " + creaturesNumber + ")?";
                     int payAmount = 0;
                     boolean paid = false;
-                    while (!paid) {
+                    while (player.canRespond() && !paid) {
                         payAmount = player.getAmount(0, creaturesNumber, message, game);
                         ManaCostsImpl cost = new ManaCostsImpl();
                         cost.add(new GenericManaCost(payAmount));
diff --git a/Mage.Sets/src/mage/cards/s/ShroudedLore.java b/Mage.Sets/src/mage/cards/s/ShroudedLore.java
index 1d74a8a34d..029746b868 100644
--- a/Mage.Sets/src/mage/cards/s/ShroudedLore.java
+++ b/Mage.Sets/src/mage/cards/s/ShroudedLore.java
@@ -84,13 +84,12 @@ class ShroudedLoreEffect extends OneShotEffect {
                 }
 
                 if (!done) {
+                    done = true;
                     if (cost.canPay(source, source, you.getId(), game) && you.chooseUse(Outcome.Benefit, "Pay {B} to choose a different card ?", source, game)) {
                         cost.clearPaid();
-                        if (!cost.pay(source, game, source, you.getId(), false, null)) {
-                            done = true;
+                        if (cost.pay(source, game, source, you.getId(), false, null)) {
+                            done = false;
                         }
-                    } else {
-                        done = true;
                     }
                 }
 
diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostImpl.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostImpl.java
index 421ce7baae..d0503b870c 100644
--- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostImpl.java
+++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostImpl.java
@@ -241,7 +241,7 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost {
             assignPayment(game, ability, player.getManaPool(), costToPay != null ? costToPay : this);
         }
         game.getState().getSpecialActions().removeManaActions();
-        while (!isPaid()) {
+        while (player.canRespond() && !isPaid()) {
             ManaCost unpaid = this.getUnpaid();
             String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid);
             if (player.playMana(ability, unpaid, promptText, game)) {
@@ -251,7 +251,7 @@ public abstract class ManaCostImpl extends CostImpl implements ManaCost {
             }
             game.getState().getSpecialActions().removeManaActions();
         }
-        return true;
+        return isPaid();
     }
 
     @Override
diff --git a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java
index bb2580d96d..59e2e9dbd7 100644
--- a/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java
+++ b/Mage/src/main/java/mage/abilities/costs/mana/ManaCostsImpl.java
@@ -128,7 +128,7 @@ public class ManaCostsImpl<T extends ManaCost> extends ArrayList<T> implements M
             assignPayment(game, ability, player.getManaPool(), this);
         }
         game.getState().getSpecialActions().removeManaActions();
-        while (!isPaid()) {
+        while (player.canRespond() && !isPaid()) {
             ManaCost unpaid = this.getUnpaid();
             String promptText = ManaUtil.addSpecialManaPayAbilities(ability, game, unpaid);
             if (player.playMana(ability, unpaid, promptText, game)) {
@@ -138,7 +138,7 @@ public class ManaCostsImpl<T extends ManaCost> extends ArrayList<T> implements M
             }
             game.getState().getSpecialActions().removeManaActions();
         }
-        return true;
+        return isPaid();
     }
 
     /**