diff --git a/.gitattributes b/.gitattributes
index abca738a842..dc26207456b 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -13820,6 +13820,7 @@ src/main/java/forge/control/bazaar/ControlStall.java -text
src/main/java/forge/control/bazaar/package-info.java svneol=native#text/plain
src/main/java/forge/control/input/Input.java -text
src/main/java/forge/control/input/InputAttack.java svneol=native#text/plain
+src/main/java/forge/control/input/InputAutoPassPriority.java -text
src/main/java/forge/control/input/InputBase.java svneol=native#text/plain
src/main/java/forge/control/input/InputBlock.java svneol=native#text/plain
src/main/java/forge/control/input/InputCleanup.java svneol=native#text/plain
diff --git a/src/main/java/forge/FThreads.java b/src/main/java/forge/FThreads.java
index 1c0a0aaa86a..8ca661eb834 100644
--- a/src/main/java/forge/FThreads.java
+++ b/src/main/java/forge/FThreads.java
@@ -123,5 +123,9 @@ public class FThreads {
public static void delay(int milliseconds, Runnable inputUpdater) {
getScheduledPool().schedule(inputUpdater, milliseconds, TimeUnit.MILLISECONDS);
}
+
+ public static String debugGetCurrThreadId() {
+ return isEDT() ? "EDT" : Long.toString(Thread.currentThread().getId());
+ }
}
diff --git a/src/main/java/forge/card/cost/CostPartMana.java b/src/main/java/forge/card/cost/CostPartMana.java
index 7385fbe8c57..bf9c65aecb4 100644
--- a/src/main/java/forge/card/cost/CostPartMana.java
+++ b/src/main/java/forge/card/cost/CostPartMana.java
@@ -223,7 +223,7 @@ public class CostPartMana extends CostPart {
}
if (this.getAmountOfX() > 0) {
source.setXManaCostPaid(0);
- InputPayment inpPayment = new InputPayManaX(game, ability, this.getAmountOfX(), this.canXbe0());
+ InputPayment inpPayment = new InputPayManaX(ability, this.getAmountOfX(), this.canXbe0());
FThreads.setInputAndWait(inpPayment);
if(!inpPayment.isPaid())
return false;
diff --git a/src/main/java/forge/card/cost/CostTapType.java b/src/main/java/forge/card/cost/CostTapType.java
index 26969477c28..29024f70249 100644
--- a/src/main/java/forge/card/cost/CostTapType.java
+++ b/src/main/java/forge/card/cost/CostTapType.java
@@ -23,83 +23,21 @@ import forge.Card;
import forge.CardLists;
import forge.CardPredicates.Presets;
import forge.FThreads;
-import forge.Singletons;
import forge.card.ability.AbilityUtils;
import forge.card.spellability.SpellAbility;
-import forge.control.input.InputPayment;
+import forge.control.input.InputSelectCards;
+import forge.control.input.InputSelectCardsFromList;
import forge.game.GameState;
import forge.game.ai.ComputerUtil;
import forge.game.player.AIPlayer;
import forge.game.player.Player;
-import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
-import forge.view.ButtonUtil;
/**
* The Class CostTapType.
*/
public class CostTapType extends CostPartWithList {
- /**
- * TODO: Write javadoc for this type.
- *
- */
- public static final class InputPayCostTapType extends InputPayCostBase {
- private final CostTapType tapType;
- private final int nCards;
- private final List cardList;
- private static final long serialVersionUID = 6438988130447851042L;
- private int nTapped = 0;
-
- /**
- * TODO: Write javadoc for Constructor.
- * @param sa
- * @param tapType
- * @param nCards
- * @param cardList
- * @param payment
- */
- public InputPayCostTapType(CostTapType tapType, int nCards, List cardList) {
- this.tapType = tapType;
- this.nCards = nCards;
- this.cardList = cardList;
- }
-
- @Override
- public void showMessage() {
-
- final int left = nCards - this.nTapped;
- showMessage("Select a " + tapType.getDescription() + " to tap (" + left + " left)");
- ButtonUtil.enableOnlyCancel();
- if (nCards == 0) {
- this.done();
- }
- }
-
-
-
- @Override
- public void selectCard(final Card card) {
- Zone zone = Singletons.getModel().getGame().getZoneOf(card);
- if (zone.is(ZoneType.Battlefield) && cardList.contains(card) && card.isUntapped()) {
- // send in List for Typing
- tapType.executePayment(null, card);
- cardList.remove(card);
-
- this.nTapped++;
-
- if (this.nTapped == nCards) {
- this.done();
- } else if (cardList.size() == 0) {
- // happen
- this.cancel();
- } else {
- this.showMessage();
- }
- }
- }
- }
-
private final boolean canTapSource;
/**
@@ -214,9 +152,15 @@ public class CostTapType extends CostPartWithList {
c = AbilityUtils.calculateAmount(source, amount, ability);
}
}
- InputPayment inp = new InputPayCostTapType(this, c, typeList);
+
+
+ InputSelectCards inp = new InputSelectCardsFromList(c, c, typeList);
+ inp.setMessage("Select a " + getDescription() + " to tap (%d left)");
FThreads.setInputAndWait(inp);
- return inp.isPaid();
+ if ( inp.hasCancelled() )
+ return false;
+
+ return executePayment(ability, inp.getSelected());
}
/* (non-Javadoc)
diff --git a/src/main/java/forge/card/cost/InputPayCostBase.java b/src/main/java/forge/card/cost/InputPayCostBase.java
index 00847b3c488..33c65bff7b3 100644
--- a/src/main/java/forge/card/cost/InputPayCostBase.java
+++ b/src/main/java/forge/card/cost/InputPayCostBase.java
@@ -1,5 +1,6 @@
package forge.card.cost;
+import forge.Singletons;
import forge.control.input.InputPayment;
import forge.control.input.InputSyncronizedBase;
@@ -8,6 +9,14 @@ import forge.control.input.InputSyncronizedBase;
*
*/
abstract class InputPayCostBase extends InputSyncronizedBase implements InputPayment {
+ /**
+ * TODO: Write javadoc for Constructor.
+ * @param player
+ */
+ public InputPayCostBase() {
+ super(Singletons.getControl().getPlayer());
+ }
+
private static final long serialVersionUID = -2967434867139585579L;
boolean bPaid = false;
diff --git a/src/main/java/forge/card/spellability/TargetSelection.java b/src/main/java/forge/card/spellability/TargetSelection.java
index 4f8185c312e..b1952e2b120 100644
--- a/src/main/java/forge/card/spellability/TargetSelection.java
+++ b/src/main/java/forge/card/spellability/TargetSelection.java
@@ -71,6 +71,7 @@ public class TargetSelection {
* @param mandatory
*/
public InputSelectTargets(TargetSelection select, List choices, ArrayList
*/
public final void passPriority() {
+ FThreads.checkEDT("PhaseHandler.passPriority", false);
// stop game if it's outcome is clear
if (game.isGameOver()) {
return;
diff --git a/src/main/java/forge/game/player/PlayerController.java b/src/main/java/forge/game/player/PlayerController.java
index 728d000af4a..5c34f535821 100644
--- a/src/main/java/forge/game/player/PlayerController.java
+++ b/src/main/java/forge/game/player/PlayerController.java
@@ -29,13 +29,15 @@ public abstract class PlayerController {
private PhaseType autoPassUntil = null;
-
public PlayerController(GameState game0) {
game = game0;
+
}
+
public abstract Input getDefaultInput();
public abstract Input getBlockInput();
public abstract Input getCleanupInput();
+ public abstract Input getAutoPassPriorityInput();
/**
diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java
index 242ffed7898..f405302cec1 100644
--- a/src/main/java/forge/game/player/PlayerControllerAi.java
+++ b/src/main/java/forge/game/player/PlayerControllerAi.java
@@ -13,6 +13,7 @@ import forge.GameEntity;
import forge.card.spellability.Spell;
import forge.card.spellability.SpellAbility;
import forge.control.input.Input;
+import forge.control.input.InputAutoPassPriority;
import forge.deck.Deck;
import forge.game.GameState;
import forge.game.GameType;
@@ -36,6 +37,7 @@ public class PlayerControllerAi extends PlayerController {
private Input defaultInput;
private Input blockInput;
private Input cleanupInput;
+ private Input autoPassPriorityInput;
private final AiController brains;
private final AIPlayer player;
@@ -52,9 +54,9 @@ public class PlayerControllerAi extends PlayerController {
brains = new AiController(p, game);
defaultInput = new AiInputCommon(brains);
- blockInput = new AiInputBlock(game, getPlayer());
+ blockInput = new AiInputBlock(getPlayer());
cleanupInput = getDefaultInput();
-
+ autoPassPriorityInput = new InputAutoPassPriority(getPlayer());
}
/**
@@ -75,6 +77,11 @@ public class PlayerControllerAi extends PlayerController {
return blockInput;
}
+ @Override
+ public Input getAutoPassPriorityInput() {
+ return autoPassPriorityInput;
+ }
+
/**
* @return the cleanupInput
*/
diff --git a/src/main/java/forge/game/player/PlayerControllerHuman.java b/src/main/java/forge/game/player/PlayerControllerHuman.java
index ba777e5b0db..d6a5825d9bb 100644
--- a/src/main/java/forge/game/player/PlayerControllerHuman.java
+++ b/src/main/java/forge/game/player/PlayerControllerHuman.java
@@ -16,6 +16,7 @@ import forge.FThreads;
import forge.GameEntity;
import forge.card.spellability.SpellAbility;
import forge.control.input.Input;
+import forge.control.input.InputAutoPassPriority;
import forge.control.input.InputBlock;
import forge.control.input.InputCleanup;
import forge.control.input.InputPassPriority;
@@ -45,8 +46,9 @@ public class PlayerControllerHuman extends PlayerController {
private final Input defaultInput;
private final Input blockInput;
private final Input cleanupInput;
+ private final Input autoPassPriorityInput;
private final HumanPlayer player;
-
+
public final Input getDefaultInput() {
return defaultInput;
}
@@ -55,9 +57,10 @@ public class PlayerControllerHuman extends PlayerController {
super(game0);
player = p;
- defaultInput = new InputPassPriority();
+ defaultInput = new InputPassPriority(player);
blockInput = new InputBlock(getPlayer());
- cleanupInput = new InputCleanup(game);
+ cleanupInput = new InputCleanup(getPlayer());
+ autoPassPriorityInput = new InputAutoPassPriority(getPlayer());
}
@Override
@@ -83,6 +86,11 @@ public class PlayerControllerHuman extends PlayerController {
return blockInput;
}
+ @Override
+ public Input getAutoPassPriorityInput() {
+ return autoPassPriorityInput;
+ }
+
/**
* @return the cleanupInput
*/
diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java
index 037c94a5d4c..c22e38500dc 100644
--- a/src/main/java/forge/game/zone/MagicStack.java
+++ b/src/main/java/forge/game/zone/MagicStack.java
@@ -391,7 +391,7 @@ public class MagicStack extends MyObservable {
final int xCost = sa.getXManaCost();
Player player = sp.getSourceCard().getController();
if (player.isHuman()) {
- InputSynchronized inp = new InputPayManaX(game, sa, xCost, true);
+ InputSynchronized inp = new InputPayManaX(sa, xCost, true);
FThreads.setInputAndWait(inp);
MagicStack.this.push(sa);
} else {
diff --git a/src/main/java/forge/gui/InputProxy.java b/src/main/java/forge/gui/InputProxy.java
index 17b2e107906..590e31f3c1c 100644
--- a/src/main/java/forge/gui/InputProxy.java
+++ b/src/main/java/forge/gui/InputProxy.java
@@ -26,7 +26,6 @@ import forge.FThreads;
import forge.control.input.Input;
import forge.game.GameState;
import forge.game.MatchController;
-import forge.game.ai.AiInput;
import forge.game.phase.PhaseHandler;
import forge.game.player.Player;
@@ -50,35 +49,37 @@ public class InputProxy implements Observer {
@Override
public final synchronized void update(final Observable observable, final Object obj) {
- this.input.set(null);
final GameState game = match.getCurrentGame();
final PhaseHandler ph = game.getPhaseHandler();
+ //System.out.printf("%s > InputProxy.update() =>%n", FThreads.debugGetCurrThreadId());
- //System.out.print((FThreads.isEDT() ? "EDT > " : "TRD > ") + ph.debugPrintState());
if ( match.getInput().isEmpty() && ph.hasPhaseEffects()) {
- //System.out.println(" handle begin phase");
- FThreads.invokeInNewThread(new Runnable() {
- @Override public void run() {
+ Runnable rPhase = new Runnable() {
+ @Override
+ public void run() {
+ //System.out.printf("\t%s > handle begin phase during %s%n", FThreads.debugGetCurrThreadId(), ph.debugPrintState());
ph.handleBeginPhase();
- update(observable, obj);
- }
- }, true);
+ update(null, null);
+ }
+ };
+ FThreads.invokeInNewThread(rPhase);
return;
}
final Input nextInput = match.getInput().getActualInput(game);
- //System.out.printf(" input is %s \t stack = %s%n", nextInput == null ? "null" : nextInput.getClass().getSimpleName(), match.getInput().printInputStack());
-
- if (nextInput != null) {
- this.input.set(nextInput);
- Runnable showMessage = new Runnable() { @Override public void run() { nextInput.showMessage(); } };
+ //System.out.printf("\tinput is %s during %s, \tstack = %s%n", nextInput == null ? "null" : nextInput.getClass().getSimpleName(), ph.debugPrintState(), match.getInput().printInputStack());
+
+ this.input.set(nextInput);
+ Runnable showMessage = new Runnable() {
+ @Override public void run() {
+ //System.out.printf("%s > showMessage @ %s during %s%n", FThreads.debugGetCurrThreadId(), nextInput.getClass().getSimpleName(), ph.debugPrintState());
+ nextInput.showMessage();
+ }
+ };
// if( nextInput instanceof AiInput )
// FThreads.invokeInNewThread(showMessage, true);
// else
- FThreads.invokeInEDT(showMessage);
- } else if (!ph.isPlayerPriorityAllowed()) {
- ph.getPriorityPlayer().getController().passPriority();
- }
+ FThreads.invokeInEDT(showMessage);
}
/**
*