From 8ccfad27cc9077152bc8ed4984247633bd636f0a Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Mon, 27 May 2013 17:50:40 +0000 Subject: [PATCH] InputPayManaBase will execute input queue unlock from the same thread that was used to activate mana ability. No showMessage() will be called. --- .../java/forge/control/input/InputPayManaBase.java | 9 ++++++--- .../control/input/InputPayManaExecuteCommands.java | 9 ++++++--- .../control/input/InputPayManaOfCostPayment.java | 8 +++++--- .../forge/control/input/InputPayManaSimple.java | 3 +-- .../java/forge/control/input/InputPayManaX.java | 2 +- .../forge/control/input/InputSyncronizedBase.java | 13 +++++++++++++ 6 files changed, 32 insertions(+), 12 deletions(-) diff --git a/src/main/java/forge/control/input/InputPayManaBase.java b/src/main/java/forge/control/input/InputPayManaBase.java index 1038f8abf4b..b1a714d8649 100644 --- a/src/main/java/forge/control/input/InputPayManaBase.java +++ b/src/main/java/forge/control/input/InputPayManaBase.java @@ -185,7 +185,10 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I public void run() { HumanPlay.playSpellAbility(chosen.getActivatingPlayer(), chosen); onManaAbilityPlayed(chosen); - FThreads.invokeInEdtLater(new Runnable() { @Override public void run() { showMessage(); } }); + if( isAlredyPaid() ) { + done(); + stopNonEdt(); + } } }; game.getInputQueue().invokeGameAction(proc); @@ -238,11 +241,11 @@ public abstract class InputPayManaBase extends InputSyncronizedBase implements I player.getZone(ZoneType.Battlefield).updateObservers(); } - protected final void checkIfAlredyPaid() { + protected boolean isAlredyPaid() { if (manaCost.isPaid()) { bPaid = true; - done(); } + return bPaid; } protected void onManaAbilityPaid() {} // some inputs overload it diff --git a/src/main/java/forge/control/input/InputPayManaExecuteCommands.java b/src/main/java/forge/control/input/InputPayManaExecuteCommands.java index 09f51424009..262969649f8 100644 --- a/src/main/java/forge/control/input/InputPayManaExecuteCommands.java +++ b/src/main/java/forge/control/input/InputPayManaExecuteCommands.java @@ -85,6 +85,7 @@ public class InputPayManaExecuteCommands extends InputPayManaBase { if (this.manaCost.isPaid()) { this.done(); + this.stop(); } else { this.showMessage(); } @@ -98,7 +99,6 @@ public class InputPayManaExecuteCommands extends InputPayManaBase { } player.getManaPool().clearManaPaid(this.saPaidFor, false); bPaid = true; - this.stop(); } /** {@inheritDoc} */ @@ -126,7 +126,10 @@ public class InputPayManaExecuteCommands extends InputPayManaBase { msg.append("\n(Click on your life total to pay life for phyrexian mana.)"); } - showMessage(msg.toString()); - checkIfAlredyPaid(); + if( isAlredyPaid() ) { + done(); + stop(); + } else + showMessage(msg.toString()); } } diff --git a/src/main/java/forge/control/input/InputPayManaOfCostPayment.java b/src/main/java/forge/control/input/InputPayManaOfCostPayment.java index c021fec3b21..ce96244bc53 100644 --- a/src/main/java/forge/control/input/InputPayManaOfCostPayment.java +++ b/src/main/java/forge/control/input/InputPayManaOfCostPayment.java @@ -40,7 +40,6 @@ public class InputPayManaOfCostPayment extends InputPayManaBase { // any mana tapabilities can't be used in payment as well as being tapped for convoke) handleConvokedCards(false); - stop(); } @Override @@ -67,7 +66,10 @@ public class InputPayManaOfCostPayment extends InputPayManaBase { msg.append("\n(Click on your life total to pay life for phyrexian mana.)"); } - showMessage(msg.toString()); - checkIfAlredyPaid(); + if( isAlredyPaid() ) { + done(); + stop(); + } else + showMessage(msg.toString()); } } diff --git a/src/main/java/forge/control/input/InputPayManaSimple.java b/src/main/java/forge/control/input/InputPayManaSimple.java index af97580f2df..1af9888a786 100644 --- a/src/main/java/forge/control/input/InputPayManaSimple.java +++ b/src/main/java/forge/control/input/InputPayManaSimple.java @@ -89,8 +89,6 @@ public class InputPayManaSimple extends InputPayManaBase { handleConvokedCards(false); } - - stop(); } /** {@inheritDoc} */ @@ -127,6 +125,7 @@ public class InputPayManaSimple extends InputPayManaBase { if (this.manaCost.isPaid() && !new ManaCostBeingPaid(this.originalManaCost).isPaid()) { this.originalCard.setSunburstValue(this.manaCost.getSunburst()); this.done(); + this.stop(); } } diff --git a/src/main/java/forge/control/input/InputPayManaX.java b/src/main/java/forge/control/input/InputPayManaX.java index 934fd9f6e88..2af2eec693c 100644 --- a/src/main/java/forge/control/input/InputPayManaX.java +++ b/src/main/java/forge/control/input/InputPayManaX.java @@ -102,6 +102,7 @@ public class InputPayManaX extends InputPayManaBase { @Override protected final void onOk() { done(); + this.stop(); } @Override @@ -116,6 +117,5 @@ public class InputPayManaX extends InputPayManaBase { card.setXManaCostPaid(this.xPaid); card.setColorsPaid(this.colorsPaid); card.setSunburstValue(ColorSet.fromMask(this.colorsPaid).countColors()); - this.stop(); } } diff --git a/src/main/java/forge/control/input/InputSyncronizedBase.java b/src/main/java/forge/control/input/InputSyncronizedBase.java index 96a28870921..303d1b2333a 100644 --- a/src/main/java/forge/control/input/InputSyncronizedBase.java +++ b/src/main/java/forge/control/input/InputSyncronizedBase.java @@ -28,6 +28,7 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn protected final void stop() { + setFinished(); FThreads.invokeInNewThread(new Runnable() { @Override @@ -38,6 +39,18 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn } }); } + + // This version does not need to be ran from EDT. + protected final void stopNonEdt() { + FThreads.assertExecutedByEdt(false); + + // ensure no clicks from EDT will be accepted + FThreads.invokeInEdtLater(new Runnable() { @Override public void run() { setFinished(); } }); + + // this will update input proxy, so there might be anything happening in the thread + getQueue().removeInput(InputSyncronizedBase.this); + cdlDone.countDown(); + } @Override public final void selectButtonCancel() {