AI vs AI playback controls - almost working

This commit is contained in:
Maxmtg
2013-05-30 13:49:15 +00:00
parent e3f34ff833
commit 92ed246e83
19 changed files with 242 additions and 42 deletions

6
.gitattributes vendored
View File

@@ -14231,9 +14231,9 @@ src/main/java/forge/game/event/GameEventCardTapped.java -text
src/main/java/forge/game/event/GameEventCounterAdded.java -text src/main/java/forge/game/event/GameEventCounterAdded.java -text
src/main/java/forge/game/event/GameEventCounterRemoved.java -text src/main/java/forge/game/event/GameEventCounterRemoved.java -text
src/main/java/forge/game/event/GameEventDrawCard.java -text src/main/java/forge/game/event/GameEventDrawCard.java -text
src/main/java/forge/game/event/GameEventDuelFinished.java -text
src/main/java/forge/game/event/GameEventDuelOutcome.java -text
src/main/java/forge/game/event/GameEventFlipCoin.java -text src/main/java/forge/game/event/GameEventFlipCoin.java -text
src/main/java/forge/game/event/GameEventGameFinished.java -text
src/main/java/forge/game/event/GameEventGameOutcome.java -text
src/main/java/forge/game/event/GameEventGameRestarted.java -text src/main/java/forge/game/event/GameEventGameRestarted.java -text
src/main/java/forge/game/event/GameEventGameStarted.java -text src/main/java/forge/game/event/GameEventGameStarted.java -text
src/main/java/forge/game/event/GameEventLandPlayed.java -text src/main/java/forge/game/event/GameEventLandPlayed.java -text
@@ -14243,6 +14243,7 @@ src/main/java/forge/game/event/GameEventMulligan.java -text
src/main/java/forge/game/event/GameEventPlayerControl.java -text src/main/java/forge/game/event/GameEventPlayerControl.java -text
src/main/java/forge/game/event/GameEventPlayerDamaged.java -text src/main/java/forge/game/event/GameEventPlayerDamaged.java -text
src/main/java/forge/game/event/GameEventPlayerPoisoned.java -text src/main/java/forge/game/event/GameEventPlayerPoisoned.java -text
src/main/java/forge/game/event/GameEventPlayerPriority.java -text
src/main/java/forge/game/event/GameEventShuffle.java -text src/main/java/forge/game/event/GameEventShuffle.java -text
src/main/java/forge/game/event/GameEventSpellResolved.java -text src/main/java/forge/game/event/GameEventSpellResolved.java -text
src/main/java/forge/game/event/GameEventTokenCreated.java -text src/main/java/forge/game/event/GameEventTokenCreated.java -text
@@ -14457,6 +14458,7 @@ src/main/java/forge/gui/input/InputPayManaOfCostPayment.java -text
src/main/java/forge/gui/input/InputPayManaSimple.java svneol=native#text/plain src/main/java/forge/gui/input/InputPayManaSimple.java svneol=native#text/plain
src/main/java/forge/gui/input/InputPayManaX.java -text src/main/java/forge/gui/input/InputPayManaX.java -text
src/main/java/forge/gui/input/InputPlayOrDraw.java -text src/main/java/forge/gui/input/InputPlayOrDraw.java -text
src/main/java/forge/gui/input/InputPlaybackControl.java -text
src/main/java/forge/gui/input/InputProliferate.java -text src/main/java/forge/gui/input/InputProliferate.java -text
src/main/java/forge/gui/input/InputSelectCards.java -text src/main/java/forge/gui/input/InputSelectCards.java -text
src/main/java/forge/gui/input/InputSelectCardsFromList.java -text src/main/java/forge/gui/input/InputSelectCardsFromList.java -text

View File

@@ -15,7 +15,7 @@ import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventTurnPhase;
import forge.game.event.GameEventPlayerControl; import forge.game.event.GameEventPlayerControl;
@@ -33,7 +33,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
} }
@Override @Override
public GameLogEntry visit(GameEventDuelOutcome ev) { public GameLogEntry visit(GameEventGameOutcome ev) {
// add result entries to the game log // add result entries to the game log
final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer(); final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer();

View File

@@ -61,7 +61,6 @@ import forge.gui.match.controllers.CStack;
import forge.gui.match.nonsingleton.VField; import forge.gui.match.nonsingleton.VField;
import forge.gui.match.views.VAntes; import forge.gui.match.views.VAntes;
import forge.gui.toolbox.CardFaceSymbols; import forge.gui.toolbox.CardFaceSymbols;
import forge.gui.toolbox.FOverlay;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.net.NetServer; import forge.net.NetServer;
import forge.properties.NewConstants; import forge.properties.NewConstants;
@@ -349,6 +348,8 @@ public enum FControl {
} }
private Game game; private Game game;
private boolean gameHasHumanPlayer;
public Game getObservedGame() { public Game getObservedGame() {
return game; return game;
} }
@@ -412,12 +413,13 @@ public enum FControl {
game.subscribeToEvents(fcVisitor); game.subscribeToEvents(fcVisitor);
// Add playback controls to match if needed // Add playback controls to match if needed
boolean hasHuman = false; gameHasHumanPlayer = false;
for(Player p : game.getPlayers()) { for(Player p : game.getPlayers()) {
if ( p.getController().getLobbyPlayer() == getLobby().getGuiPlayer() ) if ( p.getController().getLobbyPlayer() == getLobby().getGuiPlayer() )
hasHuman = true; gameHasHumanPlayer = true;
} }
if (!hasHuman) {
if (!gameHasHumanPlayer) {
game.subscribeToEvents(playbackControl); game.subscribeToEvents(playbackControl);
} }

View File

@@ -10,8 +10,8 @@ import forge.Card;
import forge.FThreads; import forge.FThreads;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventDuelFinished; import forge.game.event.GameEventGameFinished;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEventPlayerControl; import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventTurnPhase;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
@@ -81,7 +81,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
} }
@Override @Override
public Void visit(GameEventDuelOutcome ev) { public Void visit(GameEventGameOutcome ev) {
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
fc.getInputQueue().onGameOver(); // this will unlock any game threads waiting for inputs to complete fc.getInputQueue().onGameOver(); // this will unlock any game threads waiting for inputs to complete
} }); } });
@@ -89,7 +89,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
} }
@Override @Override
public Void visit(GameEventDuelFinished ev) { public Void visit(GameEventGameFinished ev) {
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
new ViewWinLose(fc.getObservedGame().getMatch()); new ViewWinLose(fc.getObservedGame().getMatch());
SOverlayUtils.showOverlay(); SOverlayUtils.showOverlay();

View File

@@ -1,19 +1,32 @@
package forge.control; package forge.control;
import java.util.concurrent.BrokenBarrierException;
import java.util.concurrent.CyclicBarrier;
import java.util.concurrent.atomic.AtomicBoolean;
import com.google.common.eventbus.Subscribe; import com.google.common.eventbus.Subscribe;
import forge.FThreads;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventBlockerAssigned; import forge.game.event.GameEventBlockerAssigned;
import forge.game.event.GameEventGameFinished;
import forge.game.event.GameEventGameStarted; import forge.game.event.GameEventGameStarted;
import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventPlayerPriority;
import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventTurnPhase;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
import forge.game.player.Player; import forge.gui.input.InputPlaybackControl;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;
public class FControlGamePlayback extends IGameEventVisitor.Base<Void> { public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
private final FControl fc; private final FControl fc;
private final InputPlaybackControl inputPlayback = new InputPlaybackControl(this);
private final AtomicBoolean paused = new AtomicBoolean(false);
private final CyclicBarrier gameThreadPauser = new CyclicBarrier(2);
public FControlGamePlayback(FControl fc ) { public FControlGamePlayback(FControl fc ) {
this.fc = fc; this.fc = fc;
} }
@@ -35,8 +48,6 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
} }
@Override @Override
public Void visit(GameEventBlockerAssigned event) { public Void visit(GameEventBlockerAssigned event) {
pauseForEvent(combatDelay); pauseForEvent(combatDelay);
@@ -68,6 +79,22 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
} }
/* (non-Javadoc)
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventDuelFinished)
*/
@Override
public Void visit(GameEventGameFinished event) {
fc.getInputQueue().removeInput(inputPlayback);
return null;
}
@Override
public Void visit(GameEventGameStarted event) {
fc.getInputQueue().setInput(inputPlayback);
return null;
}
@Override @Override
public Void visit(GameEventLandPlayed event) { public Void visit(GameEventLandPlayed event) {
pauseForEvent(resolveDelay); pauseForEvent(resolveDelay);
@@ -75,9 +102,73 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
} }
@Override @Override
public Void visit(GameEventSpellResolved event) { public Void visit(final GameEventSpellResolved event) {
FThreads.invokeInEdtNowOrLater(new Runnable() {
@Override
public void run() {
CMatchUI.SINGLETON_INSTANCE.setCard(event.spell.getSourceCard());
}
});
pauseForEvent(resolveDelay); pauseForEvent(resolveDelay);
return null; return null;
} }
/* (non-Javadoc)
* @see forge.game.event.IGameEventVisitor.Base#visit(forge.game.event.GameEventPlayerPriority)
*/
@Override
public Void visit(GameEventPlayerPriority event) {
if ( paused.get() ) {
try {
inputPlayback.onGamePaused();
gameThreadPauser.await();
gameThreadPauser.reset();
} catch (InterruptedException e) {
e.printStackTrace();
} catch (BrokenBarrierException e) {
e.printStackTrace();
}
}
return null;
}
private void releaseGameThread() {
// just need to run another thread through the barrier... not edt preferrably :)
fc.getObservedGame().getAction().invoke( new Runnable() {
@Override
public void run() {
try {
gameThreadPauser.await();
} catch (InterruptedException e) {
// TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.
e.printStackTrace();
} catch (BrokenBarrierException e) {
// TODO Auto-generated catch block ignores the exception, but sends it to System.err and probably forge.log.
e.printStackTrace();
}
}
});
}
public void resume() {
paused.set(false);
releaseGameThread();
}
public void pause() {
paused.set(true);
}
public void singleStep() {
releaseGameThread();
}
public void endGame() {
fc.stopGame();
releaseGameThread();
}
} }

View File

@@ -94,6 +94,12 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
input.awaitLatchRelease(); input.awaitLatchRelease();
} }
public void setInput(InputSynchronized input) {
this.inputStack.push(input);
syncPoint();
this.updateObservers();
}
public void syncPoint() { public void syncPoint() {
synchronized (inputLock) { synchronized (inputLock) {

View File

@@ -39,7 +39,7 @@ import forge.card.spellability.SpellAbilityStackInstance;
import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerHandler;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventGameOutcome;
import forge.game.phase.Cleanup; import forge.game.phase.Cleanup;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.game.phase.EndOfCombat; import forge.game.phase.EndOfCombat;
@@ -319,7 +319,7 @@ public class Game {
match.addGamePlayed(result); match.addGamePlayed(result);
// The log shall listen to events and generate text internally // The log shall listen to events and generate text internally
fireEvent(new GameEventDuelOutcome(result, match.getPlayedGames())); fireEvent(new GameEventGameOutcome(result, match.getPlayedGames()));
} }
public Zone getZoneOf(final Card c) { public Zone getZoneOf(final Card c) {

View File

@@ -62,7 +62,7 @@ import forge.game.ai.ComputerUtilCost;
import forge.game.event.GameEventCardDestroyed; import forge.game.event.GameEventCardDestroyed;
import forge.game.event.GameEventCardRegenerated; import forge.game.event.GameEventCardRegenerated;
import forge.game.event.GameEventCardSacrificed; import forge.game.event.GameEventCardSacrificed;
import forge.game.event.GameEventDuelFinished; import forge.game.event.GameEventGameFinished;
import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventFlipCoin;
import forge.game.event.GameEventGameStarted; import forge.game.event.GameEventGameStarted;
import forge.game.player.GameLossReason; import forge.game.player.GameLossReason;
@@ -1531,7 +1531,7 @@ public class GameAction {
} while( game.getAge() == GameAge.RestartedByKarn ); } while( game.getAge() == GameAge.RestartedByKarn );
// will pull UI dialog, when the UI is listening // will pull UI dialog, when the UI is listening
game.fireEvent(new GameEventDuelFinished()); game.fireEvent(new GameEventGameFinished());
} }
private void performMulligans(final Player firstPlayer, final boolean isCommander) { private void performMulligans(final Player firstPlayer, final boolean isCommander) {

View File

@@ -10,11 +10,9 @@ import com.google.common.collect.Lists;
import forge.Card; import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventFlipCoin;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.util.Aggregates;
/** /**
* TODO: Write javadoc for this type. * TODO: Write javadoc for this type.

View File

@@ -1,6 +1,6 @@
package forge.game.event; package forge.game.event;
public class GameEventDuelFinished extends GameEvent { public class GameEventGameFinished extends GameEvent {

View File

@@ -4,11 +4,11 @@ import java.util.List;
import forge.game.GameOutcome; import forge.game.GameOutcome;
public class GameEventDuelOutcome extends GameEvent { public class GameEventGameOutcome extends GameEvent {
public final GameOutcome result; public final GameOutcome result;
public final List<GameOutcome> history; public final List<GameOutcome> history;
public GameEventDuelOutcome(GameOutcome lastOne, List<GameOutcome> history) { public GameEventGameOutcome(GameOutcome lastOne, List<GameOutcome> history) {
this.result = lastOne; this.result = lastOne;
this.history = history; this.history = history;
} }

View File

@@ -0,0 +1,27 @@
package forge.game.event;
import forge.game.phase.PhaseType;
import forge.game.player.Player;
/**
* TODO: Write javadoc for this type.
*
*/
public class GameEventPlayerPriority extends GameEvent {
public final Player turn;
public final PhaseType phase;
public final Player priority;
public GameEventPlayerPriority(Player playerTurn, PhaseType phase, Player priorityPlayer) {
turn = playerTurn;
this.phase = phase;
priority = priorityPlayer;
}
@Override
public <T> T visit(IGameEventVisitor<T> visitor) {
return visitor.visit(this);
}
}

View File

@@ -17,8 +17,8 @@ public interface IGameEventVisitor<T> {
T visit(GameEventCounterAdded event); T visit(GameEventCounterAdded event);
T visit(GameEventCounterRemoved event); T visit(GameEventCounterRemoved event);
T visit(GameEventDrawCard event); T visit(GameEventDrawCard event);
T visit(GameEventDuelFinished event); T visit(GameEventGameFinished event);
T visit(GameEventDuelOutcome event); T visit(GameEventGameOutcome event);
T visit(GameEventFlipCoin event); T visit(GameEventFlipCoin event);
T visit(GameEventGameStarted event); T visit(GameEventGameStarted event);
T visit(GameEventGameRestarted event); T visit(GameEventGameRestarted event);
@@ -29,6 +29,7 @@ public interface IGameEventVisitor<T> {
T visit(GameEventPlayerControl event); T visit(GameEventPlayerControl event);
T visit(GameEventPlayerDamaged gameEventPlayerDamaged); T visit(GameEventPlayerDamaged gameEventPlayerDamaged);
T visit(GameEventPlayerPoisoned event); T visit(GameEventPlayerPoisoned event);
T visit(GameEventPlayerPriority event);
T visit(GameEventShuffle event); T visit(GameEventShuffle event);
T visit(GameEventSpellResolved event); T visit(GameEventSpellResolved event);
T visit(GameEventTokenCreated event); T visit(GameEventTokenCreated event);
@@ -51,8 +52,8 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventCounterAdded event) { return null; } public T visit(GameEventCounterAdded event) { return null; }
public T visit(GameEventCounterRemoved event) { return null; } public T visit(GameEventCounterRemoved event) { return null; }
public T visit(GameEventDrawCard event) { return null; } public T visit(GameEventDrawCard event) { return null; }
public T visit(GameEventDuelFinished event) { return null; } public T visit(GameEventGameFinished event) { return null; }
public T visit(GameEventDuelOutcome event) { return null; } public T visit(GameEventGameOutcome event) { return null; }
public T visit(GameEventFlipCoin event) { return null; } public T visit(GameEventFlipCoin event) { return null; }
public T visit(GameEventGameStarted event) { return null; } public T visit(GameEventGameStarted event) { return null; }
public T visit(GameEventGameRestarted event) { return null; } public T visit(GameEventGameRestarted event) { return null; }
@@ -62,6 +63,7 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventMulligan event) { return null; } public T visit(GameEventMulligan event) { return null; }
public T visit(GameEventPlayerControl event) { return null; } public T visit(GameEventPlayerControl event) { return null; }
public T visit(GameEventPlayerPoisoned event) { return null; } public T visit(GameEventPlayerPoisoned event) { return null; }
public T visit(GameEventPlayerPriority event) { return null; }
public T visit(GameEventShuffle event) { return null; } public T visit(GameEventShuffle event) { return null; }
public T visit(GameEventSpellResolved event) { return null; } public T visit(GameEventSpellResolved event) { return null; }
public T visit(GameEventTokenCreated event) { return null; } public T visit(GameEventTokenCreated event) { return null; }
@@ -71,5 +73,8 @@ public interface IGameEventVisitor<T> {
public T visit(GameEventPlayerDamaged event) { return null; } public T visit(GameEventPlayerDamaged event) { return null; }
} }
} }

View File

@@ -32,6 +32,7 @@ import forge.card.trigger.TriggerType;
import forge.game.GameAge; import forge.game.GameAge;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType; import forge.game.GameType;
import forge.game.event.GameEventPlayerPriority;
import forge.game.event.GameEventTurnBegan; import forge.game.event.GameEventTurnBegan;
import forge.game.event.GameEventTurnEnded; import forge.game.event.GameEventTurnEnded;
import forge.game.event.GameEventGameRestarted; import forge.game.event.GameEventGameRestarted;
@@ -702,6 +703,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
if( DEBUG_PHASES ) if( DEBUG_PHASES )
sw.start(); sw.start();
game.fireEvent(new GameEventPlayerPriority(getPlayerTurn(), getPhase(), getPriorityPlayer()));
pPlayerPriority.getController().takePriority(); pPlayerPriority.getController().takePriority();
if( DEBUG_PHASES ) { if( DEBUG_PHASES ) {

View File

@@ -18,6 +18,7 @@
package forge.gui.input; package forge.gui.input;
import forge.Card; import forge.Card;
import forge.game.Game;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.framework.SDisplayUtil; import forge.gui.framework.SDisplayUtil;
@@ -84,21 +85,20 @@ public abstract class InputBase implements java.io.Serializable, Input {
SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE); SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE);
} }
protected String getTurnPhasePriorityMessage(Player player) { protected String getTurnPhasePriorityMessage(Game game) {
final PhaseHandler ph = player.getGame().getPhaseHandler(); final PhaseHandler ph = game.getPhaseHandler();
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
sb.append("Priority: ").append(player).append("\n").append("\n"); sb.append("Priority: ").append(ph.getPriorityPlayer()).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().nameForUi).append("\n"); sb.append("Phase: ").append(ph.getPhase().nameForUi).append("\n");
sb.append("Stack: "); sb.append("Stack: ");
if (!player.getGame().getStack().isEmpty()) { if (!game.getStack().isEmpty()) {
sb.append(player.getGame().getStack().size()).append(" to Resolve."); sb.append(game.getStack().size()).append(" to Resolve.");
} else { } else {
sb.append("Empty"); sb.append("Empty");
} }
sb.append("\n"); sb.append("\n");
String message = sb.toString(); return sb.toString();
return message;
} }
} }

View File

@@ -48,7 +48,7 @@ public class InputPassPriority extends InputSyncronizedBase {
for (Player p : player.getGame().getRegisteredPlayers()) { for (Player p : player.getGame().getRegisteredPlayers()) {
p.getZone(ZoneType.Battlefield).updateObservers(); p.getZone(ZoneType.Battlefield).updateObservers();
} }
showMessage(getTurnPhasePriorityMessage(player)); showMessage(getTurnPhasePriorityMessage(player.getGame()));
chosenSa = null; chosenSa = null;
ButtonUtil.enableOnlyOk(); ButtonUtil.enableOnlyOk();
} }

View File

@@ -0,0 +1,69 @@
package forge.gui.input;
import forge.control.FControl;
import forge.control.FControlGamePlayback;
import forge.view.ButtonUtil;
/**
* TODO: Write javadoc for this type.
*
*/
public class InputPlaybackControl extends InputSyncronizedBase implements InputSynchronized {
private static final long serialVersionUID = 7979208993306642072L;
FControlGamePlayback control;
private boolean isPaused = false;
/**
* TODO: Write javadoc for Constructor.
* @param fControlGamePlayback
*/
public InputPlaybackControl(FControlGamePlayback fControlGamePlayback) {
control = fControlGamePlayback;
}
/* (non-Javadoc)
* @see forge.gui.input.InputBase#showMessage()
*/
@Override
protected void showMessage() {
setPause(false);
}
private void setPause(boolean pause) {
isPaused = pause;
if ( isPaused )
ButtonUtil.setButtonText("Resume", "Step");
else {
ButtonUtil.setButtonText("Pause", "End game");
showMessage("Press pause to pause game.");
}
}
public void onGamePaused() {
showMessage(getTurnPhasePriorityMessage(FControl.instance.getObservedGame()));
}
@Override
protected void onOk() {
if ( isPaused ) {
control.resume();
setPause(false);
} else {
control.pause();
setPause(true);
}
}
@Override
protected void onCancel() {
if ( isPaused ) {
control.singleStep();
} else
control.endGame();
}
}

View File

@@ -33,7 +33,6 @@ import forge.FThreads;
import forge.Singletons; import forge.Singletons;
import forge.CardPredicates.Presets; import forge.CardPredicates.Presets;
import forge.Command; import forge.Command;
import forge.control.FControl;
import forge.deck.Deck; import forge.deck.Deck;
import forge.game.Game; import forge.game.Game;
import forge.game.phase.CombatUtil; import forge.game.phase.CombatUtil;
@@ -42,7 +41,6 @@ import forge.game.phase.PhaseType;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.framework.SLayoutIO; import forge.gui.framework.SLayoutIO;

View File

@@ -13,7 +13,7 @@ import forge.game.event.GameEventCardSacrificed;
import forge.game.event.GameEventCounterAdded; import forge.game.event.GameEventCounterAdded;
import forge.game.event.GameEventCounterRemoved; import forge.game.event.GameEventCounterRemoved;
import forge.game.event.GameEventDrawCard; import forge.game.event.GameEventDrawCard;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEventTurnEnded; import forge.game.event.GameEventTurnEnded;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventFlipCoin;
@@ -53,7 +53,7 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
/** /**
* Plays the sound corresponding to the outcome of the duel. * Plays the sound corresponding to the outcome of the duel.
*/ */
public SoundEffectType visit(GameEventDuelOutcome event) { public SoundEffectType visit(GameEventGameOutcome event) {
boolean humanWonTheDuel = event.result.getWinner() == Singletons.getControl().getLobby().getGuiPlayer(); boolean humanWonTheDuel = event.result.getWinner() == Singletons.getControl().getLobby().getGuiPlayer();
return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel; return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel;
} }