();
private final InputLockUI inputLock;
@@ -43,21 +43,6 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
inputLock = new InputLockUI(this);
}
- /**
- *
- * Setter for the field input.
- *
- *
- * @param in
- * a {@link forge.control.input.InputBase} object.
- */
- private final void setInput(final Input in) {
- //System.out.println(in.getClass().getName());
- this.inputStack.push(in);
- // System.out.print("Current: " + input + "; Stack = " + inputStack);
- this.updateObservers();
- }
-
/**
*
* Getter for the field input.
@@ -106,8 +91,19 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
}
public void setInputAndWait(InputSynchronized input) {
- this.setInput(input);
+ this.inputStack.push(input);
+ this.updateObservers();
+
input.awaitLatchRelease();
}
+
+ /**
+ * TODO: Write javadoc for this method.
+ */
+ public void onGameOver() {
+ for(InputSynchronized inp : inputStack ) {
+ inp.relaseLatchWhenGameIsOver();
+ }
+ }
} // InputControl
diff --git a/src/main/java/forge/control/input/InputSynchronized.java b/src/main/java/forge/control/input/InputSynchronized.java
index c89fa472aee..4ff5c7c3bfe 100644
--- a/src/main/java/forge/control/input/InputSynchronized.java
+++ b/src/main/java/forge/control/input/InputSynchronized.java
@@ -1,6 +1,6 @@
package forge.control.input;
public interface InputSynchronized extends Input {
-
- public void awaitLatchRelease();
+ void awaitLatchRelease();
+ void relaseLatchWhenGameIsOver();
}
diff --git a/src/main/java/forge/control/input/InputSyncronizedBase.java b/src/main/java/forge/control/input/InputSyncronizedBase.java
index a5adf64470b..9306756e56d 100644
--- a/src/main/java/forge/control/input/InputSyncronizedBase.java
+++ b/src/main/java/forge/control/input/InputSyncronizedBase.java
@@ -26,6 +26,9 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
}
}
+ public final void relaseLatchWhenGameIsOver() {
+ cdlDone.countDown();
+ }
protected final void stop() {
// ensure input won't accept any user actions.
diff --git a/src/main/java/forge/game/ai/AiController.java b/src/main/java/forge/game/ai/AiController.java
index 5e52148e7dc..c61d126c2b7 100644
--- a/src/main/java/forge/game/ai/AiController.java
+++ b/src/main/java/forge/game/ai/AiController.java
@@ -86,26 +86,6 @@ public class AiController {
game = game0;
}
- private final SpellAbility getSpellAbilityToPlay() {
- // if top of stack is owned by me
- if (!game.getStack().isEmpty() && game.getStack().peekAbility().getActivatingPlayer().equals(player)) {
- // probably should let my stuff resolve
- return null;
- }
- final List cards = getAvailableCards();
-
- if ( !game.getStack().isEmpty() ) {
- SpellAbility counter = chooseCounterSpell(getPlayableCounters(cards));
- if( counter != null ) return counter;
-
- SpellAbility counterETB = chooseSpellAbilyToPlay(this.getPossibleETBCounters(), false);
- if( counterETB != null )
- return counterETB;
- }
-
- return chooseSpellAbilyToPlay(getSpellAbilities(cards), true);
- }
-
/**
*
* getAvailableSpellAbilities.
@@ -909,6 +889,26 @@ public class AiController {
} while ( sa != null );
}
+ private final SpellAbility getSpellAbilityToPlay() {
+ // if top of stack is owned by me
+ if (!game.getStack().isEmpty() && game.getStack().peekAbility().getActivatingPlayer().equals(player)) {
+ // probably should let my stuff resolve
+ return null;
+ }
+ final List cards = getAvailableCards();
+
+ if ( !game.getStack().isEmpty() ) {
+ SpellAbility counter = chooseCounterSpell(getPlayableCounters(cards));
+ if( counter != null ) return counter;
+
+ SpellAbility counterETB = chooseSpellAbilyToPlay(this.getPossibleETBCounters(), false);
+ if( counterETB != null )
+ return counterETB;
+ }
+
+ return chooseSpellAbilyToPlay(getSpellAbilities(cards), true);
+ }
+
public List chooseCardsToDelve(int colorlessCost, List grave) {
List toExile = new ArrayList();
int numToExile = Math.min(grave.size(), colorlessCost);
diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java
index 37c6636edf0..692088445a3 100644
--- a/src/main/java/forge/game/phase/PhaseHandler.java
+++ b/src/main/java/forge/game/phase/PhaseHandler.java
@@ -301,7 +301,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
game.getGameLog().add(GameEventType.TURN, "Turn " + this.turn + " (" + this.getPlayerTurn() + ")");
}
- game.getGameLog().add(GameEventType.PHASE, phaseType + Lang.getPossesive(this.getPlayerTurn().getName()) + " " + this.getPhase().Name);
+ game.getGameLog().add(GameEventType.PHASE, phaseType + Lang.getPossesive(this.getPlayerTurn().getName()) + " " + this.getPhase().NameForUi);
PhaseUtil.visuallyActivatePhase(this.getPlayerTurn(), this.getPhase());
}
@@ -492,7 +492,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (this.isPlayerPriorityAllowed()) {
// Run triggers if phase isn't being skipped
final HashMap runParams = new HashMap();
- runParams.put("Phase", this.getPhase().Name);
+ runParams.put("Phase", this.getPhase().NameForScripts);
runParams.put("Player", this.getPlayerTurn());
game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams, false);
}
@@ -786,6 +786,8 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
System.out.print(" >>\n");
}
}
+
+ System.out.println(FThreads.prependThreadId("Thread exited game loop due to ... " + ( game.isGameOver() ? "game over" : "interrupt" )));
}
@@ -875,7 +877,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
}
public String debugPrintState(boolean hasPriority) {
- return String.format("%s's %s [%sP] %s", getPlayerTurn(), getPhase().Name, hasPriority ? "+" : "-", getPriorityPlayer());
+ return String.format("%s's %s [%sP] %s", getPlayerTurn(), getPhase().NameForUi, hasPriority ? "+" : "-", getPriorityPlayer());
}
diff --git a/src/main/java/forge/game/phase/PhaseType.java b/src/main/java/forge/game/phase/PhaseType.java
index 8c768585572..cbbe22c57fa 100644
--- a/src/main/java/forge/game/phase/PhaseType.java
+++ b/src/main/java/forge/game/phase/PhaseType.java
@@ -13,14 +13,14 @@ public enum PhaseType {
UPKEEP("Upkeep"),
DRAW("Draw"),
MAIN1("Main1"),
- COMBAT_BEGIN("BeginCombat"),
+ COMBAT_BEGIN("Begin Combat", "BeginCombat"),
COMBAT_DECLARE_ATTACKERS("Declare Attackers"),
COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY("Declare Attackers - Play Instants and Abilities"),
COMBAT_DECLARE_BLOCKERS("Declare Blockers"),
COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY("Declare Blockers - Play Instants and Abilities"),
COMBAT_FIRST_STRIKE_DAMAGE("First Strike Damage"),
COMBAT_DAMAGE("Combat Damage"),
- COMBAT_END("End Combat"),
+ COMBAT_END("End Combat", "EndCombat"),
MAIN2("Main2"),
END_OF_TURN("End of Turn"),
CLEANUP("Cleanup");
@@ -35,11 +35,18 @@ public enum PhaseType {
)
);
- public final String Name;
+ public final String NameForUi;
+ public final String NameForScripts;
+
private PhaseType(String name) {
- Name = name;
+ this(name, name);
+ }
+ private PhaseType(String name, String name_for_scripts) {
+ NameForUi = name;
+ NameForScripts = name_for_scripts;
}
+
public final boolean isAfter(final PhaseType phase) {
return ALL_PHASES.indexOf(this) > ALL_PHASES.indexOf(phase);
}
@@ -61,7 +68,7 @@ public enum PhaseType {
}
final String valToCompate = value.trim();
for (final PhaseType v : PhaseType.values()) {
- if (v.Name.compareToIgnoreCase(valToCompate) == 0) {
+ if (v.NameForScripts.compareToIgnoreCase(valToCompate) == 0) {
return v;
}
}
diff --git a/src/main/java/forge/game/player/PlayerControllerAi.java b/src/main/java/forge/game/player/PlayerControllerAi.java
index 3685e295c90..455bdebae7a 100644
--- a/src/main/java/forge/game/player/PlayerControllerAi.java
+++ b/src/main/java/forge/game/player/PlayerControllerAi.java
@@ -278,7 +278,8 @@ public class PlayerControllerAi extends PlayerController {
@Override
public void takePriority() {
+ if ( !game.isGameOver() )
+ brains.onPriorityRecieved();
// use separate thread for AI?
- brains.onPriorityRecieved();
}
}