+ phase names for scripts

+ trying to collect used threads
This commit is contained in:
Maxmtg
2013-05-28 13:45:21 +00:00
parent 2ce74d2742
commit 9d989137e8
9 changed files with 59 additions and 49 deletions

View File

@@ -418,6 +418,7 @@ public enum FControl {
if( ev instanceof DuelFinishedEvent ) { if( ev instanceof DuelFinishedEvent ) {
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
getInputQueue().onGameOver();
new ViewWinLose(game.getMatch()); new ViewWinLose(game.getMatch());
SOverlayUtils.showOverlay(); SOverlayUtils.showOverlay();
} }); } });

View File

@@ -81,7 +81,7 @@ public abstract class InputBase implements java.io.Serializable, Input {
sb.append("Priority: ").append(player).append("\n").append("\n"); sb.append("Priority: ").append(player).append("\n").append("\n");
sb.append("Turn : ").append(ph.getPlayerTurn()).append("\n"); sb.append("Turn : ").append(ph.getPlayerTurn()).append("\n");
sb.append("Phase: ").append(ph.getPhase().Name).append("\n"); sb.append("Phase: ").append(ph.getPhase().NameForUi).append("\n");
sb.append("Stack: "); sb.append("Stack: ");
if (!player.getGame().getStack().isEmpty()) { if (!player.getGame().getStack().isEmpty()) {
sb.append(player.getGame().getStack().size()).append(" to Resolve."); sb.append(player.getGame().getStack().size()).append(" to Resolve.");

View File

@@ -35,7 +35,7 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
/** Constant <code>serialVersionUID=3955194449319994301L</code>. */ /** Constant <code>serialVersionUID=3955194449319994301L</code>. */
private static final long serialVersionUID = 3955194449319994301L; private static final long serialVersionUID = 3955194449319994301L;
private final BlockingDeque<Input> inputStack = new LinkedBlockingDeque<Input>(); private final BlockingDeque<InputSynchronized> inputStack = new LinkedBlockingDeque<InputSynchronized>();
private final InputLockUI inputLock; private final InputLockUI inputLock;
@@ -43,21 +43,6 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
inputLock = new InputLockUI(this); inputLock = new InputLockUI(this);
} }
/**
* <p>
* Setter for the field <code>input</code>.
* </p>
*
* @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();
}
/** /**
* <p> * <p>
* Getter for the field <code>input</code>. * Getter for the field <code>input</code>.
@@ -106,8 +91,19 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
} }
public void setInputAndWait(InputSynchronized input) { public void setInputAndWait(InputSynchronized input) {
this.setInput(input); this.inputStack.push(input);
this.updateObservers();
input.awaitLatchRelease(); input.awaitLatchRelease();
} }
/**
* TODO: Write javadoc for this method.
*/
public void onGameOver() {
for(InputSynchronized inp : inputStack ) {
inp.relaseLatchWhenGameIsOver();
}
}
} // InputControl } // InputControl

View File

@@ -1,6 +1,6 @@
package forge.control.input; package forge.control.input;
public interface InputSynchronized extends Input { public interface InputSynchronized extends Input {
void awaitLatchRelease();
public void awaitLatchRelease(); void relaseLatchWhenGameIsOver();
} }

View File

@@ -26,6 +26,9 @@ public abstract class InputSyncronizedBase extends InputBase implements InputSyn
} }
} }
public final void relaseLatchWhenGameIsOver() {
cdlDone.countDown();
}
protected final void stop() { protected final void stop() {
// ensure input won't accept any user actions. // ensure input won't accept any user actions.

View File

@@ -86,26 +86,6 @@ public class AiController {
game = game0; 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<Card> 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);
}
/** /**
* <p> * <p>
* getAvailableSpellAbilities. * getAvailableSpellAbilities.
@@ -909,6 +889,26 @@ public class AiController {
} while ( sa != null ); } 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<Card> 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<Card> chooseCardsToDelve(int colorlessCost, List<Card> grave) { public List<Card> chooseCardsToDelve(int colorlessCost, List<Card> grave) {
List<Card> toExile = new ArrayList<Card>(); List<Card> toExile = new ArrayList<Card>();
int numToExile = Math.min(grave.size(), colorlessCost); int numToExile = Math.min(grave.size(), colorlessCost);

View File

@@ -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.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()); PhaseUtil.visuallyActivatePhase(this.getPlayerTurn(), this.getPhase());
} }
@@ -492,7 +492,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if (this.isPlayerPriorityAllowed()) { if (this.isPlayerPriorityAllowed()) {
// Run triggers if phase isn't being skipped // Run triggers if phase isn't being skipped
final HashMap<String, Object> runParams = new HashMap<String, Object>(); final HashMap<String, Object> runParams = new HashMap<String, Object>();
runParams.put("Phase", this.getPhase().Name); runParams.put("Phase", this.getPhase().NameForScripts);
runParams.put("Player", this.getPlayerTurn()); runParams.put("Player", this.getPlayerTurn());
game.getTriggerHandler().runTrigger(TriggerType.Phase, runParams, false); 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.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) { 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());
} }

View File

@@ -13,14 +13,14 @@ public enum PhaseType {
UPKEEP("Upkeep"), UPKEEP("Upkeep"),
DRAW("Draw"), DRAW("Draw"),
MAIN1("Main1"), MAIN1("Main1"),
COMBAT_BEGIN("BeginCombat"), COMBAT_BEGIN("Begin Combat", "BeginCombat"),
COMBAT_DECLARE_ATTACKERS("Declare Attackers"), COMBAT_DECLARE_ATTACKERS("Declare Attackers"),
COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY("Declare Attackers - Play Instants and Abilities"), COMBAT_DECLARE_ATTACKERS_INSTANT_ABILITY("Declare Attackers - Play Instants and Abilities"),
COMBAT_DECLARE_BLOCKERS("Declare Blockers"), COMBAT_DECLARE_BLOCKERS("Declare Blockers"),
COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY("Declare Blockers - Play Instants and Abilities"), COMBAT_DECLARE_BLOCKERS_INSTANT_ABILITY("Declare Blockers - Play Instants and Abilities"),
COMBAT_FIRST_STRIKE_DAMAGE("First Strike Damage"), COMBAT_FIRST_STRIKE_DAMAGE("First Strike Damage"),
COMBAT_DAMAGE("Combat Damage"), COMBAT_DAMAGE("Combat Damage"),
COMBAT_END("End Combat"), COMBAT_END("End Combat", "EndCombat"),
MAIN2("Main2"), MAIN2("Main2"),
END_OF_TURN("End of Turn"), END_OF_TURN("End of Turn"),
CLEANUP("Cleanup"); CLEANUP("Cleanup");
@@ -35,10 +35,17 @@ public enum PhaseType {
) )
); );
public final String Name; public final String NameForUi;
public final String NameForScripts;
private PhaseType(String name) { 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) { public final boolean isAfter(final PhaseType phase) {
return ALL_PHASES.indexOf(this) > ALL_PHASES.indexOf(phase); return ALL_PHASES.indexOf(this) > ALL_PHASES.indexOf(phase);
@@ -61,7 +68,7 @@ public enum PhaseType {
} }
final String valToCompate = value.trim(); final String valToCompate = value.trim();
for (final PhaseType v : PhaseType.values()) { for (final PhaseType v : PhaseType.values()) {
if (v.Name.compareToIgnoreCase(valToCompate) == 0) { if (v.NameForScripts.compareToIgnoreCase(valToCompate) == 0) {
return v; return v;
} }
} }

View File

@@ -278,7 +278,8 @@ public class PlayerControllerAi extends PlayerController {
@Override @Override
public void takePriority() { public void takePriority() {
// use separate thread for AI? if ( !game.isGameOver() )
brains.onPriorityRecieved(); brains.onPriorityRecieved();
// use separate thread for AI?
} }
} }