mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-17 19:28:01 +00:00
AI vs AI playback controls - almost working
This commit is contained in:
6
.gitattributes
vendored
6
.gitattributes
vendored
@@ -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/GameEventCounterRemoved.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/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/GameEventGameStarted.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/GameEventPlayerDamaged.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/GameEventSpellResolved.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/InputPayManaX.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/InputSelectCards.java -text
|
||||
src/main/java/forge/gui/input/InputSelectCardsFromList.java -text
|
||||
|
||||
@@ -15,7 +15,7 @@ import forge.game.event.GameEventPlayerPoisoned;
|
||||
import forge.game.event.GameEventSpellResolved;
|
||||
import forge.game.event.GameEventTurnBegan;
|
||||
import forge.game.event.IGameEventVisitor;
|
||||
import forge.game.event.GameEventDuelOutcome;
|
||||
import forge.game.event.GameEventGameOutcome;
|
||||
import forge.game.event.GameEvent;
|
||||
import forge.game.event.GameEventTurnPhase;
|
||||
import forge.game.event.GameEventPlayerControl;
|
||||
@@ -33,7 +33,7 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public GameLogEntry visit(GameEventDuelOutcome ev) {
|
||||
public GameLogEntry visit(GameEventGameOutcome ev) {
|
||||
// add result entries to the game log
|
||||
final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer();
|
||||
|
||||
|
||||
@@ -61,7 +61,6 @@ import forge.gui.match.controllers.CStack;
|
||||
import forge.gui.match.nonsingleton.VField;
|
||||
import forge.gui.match.views.VAntes;
|
||||
import forge.gui.toolbox.CardFaceSymbols;
|
||||
import forge.gui.toolbox.FOverlay;
|
||||
import forge.gui.toolbox.FSkin;
|
||||
import forge.net.NetServer;
|
||||
import forge.properties.NewConstants;
|
||||
@@ -349,6 +348,8 @@ public enum FControl {
|
||||
}
|
||||
|
||||
private Game game;
|
||||
private boolean gameHasHumanPlayer;
|
||||
|
||||
public Game getObservedGame() {
|
||||
return game;
|
||||
}
|
||||
@@ -412,12 +413,13 @@ public enum FControl {
|
||||
game.subscribeToEvents(fcVisitor);
|
||||
|
||||
// Add playback controls to match if needed
|
||||
boolean hasHuman = false;
|
||||
gameHasHumanPlayer = false;
|
||||
for(Player p : game.getPlayers()) {
|
||||
if ( p.getController().getLobbyPlayer() == getLobby().getGuiPlayer() )
|
||||
hasHuman = true;
|
||||
gameHasHumanPlayer = true;
|
||||
}
|
||||
if (!hasHuman) {
|
||||
|
||||
if (!gameHasHumanPlayer) {
|
||||
game.subscribeToEvents(playbackControl);
|
||||
}
|
||||
|
||||
|
||||
@@ -10,8 +10,8 @@ import forge.Card;
|
||||
import forge.FThreads;
|
||||
import forge.game.event.GameEvent;
|
||||
import forge.game.event.GameEventAnteCardsSelected;
|
||||
import forge.game.event.GameEventDuelFinished;
|
||||
import forge.game.event.GameEventDuelOutcome;
|
||||
import forge.game.event.GameEventGameFinished;
|
||||
import forge.game.event.GameEventGameOutcome;
|
||||
import forge.game.event.GameEventPlayerControl;
|
||||
import forge.game.event.GameEventTurnPhase;
|
||||
import forge.game.event.IGameEventVisitor;
|
||||
@@ -81,7 +81,7 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base<Void> {
|
||||
}
|
||||
|
||||
@Override
|
||||
public Void visit(GameEventDuelOutcome ev) {
|
||||
public Void visit(GameEventGameOutcome ev) {
|
||||
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
|
||||
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
|
||||
public Void visit(GameEventDuelFinished ev) {
|
||||
public Void visit(GameEventGameFinished ev) {
|
||||
FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() {
|
||||
new ViewWinLose(fc.getObservedGame().getMatch());
|
||||
SOverlayUtils.showOverlay();
|
||||
|
||||
@@ -1,19 +1,32 @@
|
||||
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 forge.FThreads;
|
||||
import forge.game.event.GameEvent;
|
||||
import forge.game.event.GameEventBlockerAssigned;
|
||||
import forge.game.event.GameEventGameFinished;
|
||||
import forge.game.event.GameEventGameStarted;
|
||||
import forge.game.event.GameEventLandPlayed;
|
||||
import forge.game.event.GameEventPlayerPriority;
|
||||
import forge.game.event.GameEventSpellResolved;
|
||||
import forge.game.event.GameEventTurnPhase;
|
||||
import forge.game.event.IGameEventVisitor;
|
||||
import forge.game.player.Player;
|
||||
import forge.gui.input.InputPlaybackControl;
|
||||
import forge.gui.match.CMatchUI;
|
||||
|
||||
public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
||||
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 ) {
|
||||
this.fc = fc;
|
||||
}
|
||||
@@ -35,8 +48,6 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@Override
|
||||
public Void visit(GameEventBlockerAssigned event) {
|
||||
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
|
||||
public Void visit(GameEventLandPlayed event) {
|
||||
pauseForEvent(resolveDelay);
|
||||
@@ -75,9 +102,73 @@ public class FControlGamePlayback extends IGameEventVisitor.Base<Void> {
|
||||
}
|
||||
|
||||
@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);
|
||||
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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -94,6 +94,12 @@ public class InputQueue extends MyObservable implements java.io.Serializable {
|
||||
input.awaitLatchRelease();
|
||||
}
|
||||
|
||||
public void setInput(InputSynchronized input) {
|
||||
this.inputStack.push(input);
|
||||
syncPoint();
|
||||
this.updateObservers();
|
||||
}
|
||||
|
||||
|
||||
public void syncPoint() {
|
||||
synchronized (inputLock) {
|
||||
|
||||
@@ -39,7 +39,7 @@ import forge.card.spellability.SpellAbilityStackInstance;
|
||||
import forge.card.trigger.TriggerHandler;
|
||||
import forge.card.trigger.TriggerType;
|
||||
import forge.game.event.GameEvent;
|
||||
import forge.game.event.GameEventDuelOutcome;
|
||||
import forge.game.event.GameEventGameOutcome;
|
||||
import forge.game.phase.Cleanup;
|
||||
import forge.game.phase.Combat;
|
||||
import forge.game.phase.EndOfCombat;
|
||||
@@ -319,7 +319,7 @@ public class Game {
|
||||
match.addGamePlayed(result);
|
||||
|
||||
// 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) {
|
||||
|
||||
@@ -62,7 +62,7 @@ import forge.game.ai.ComputerUtilCost;
|
||||
import forge.game.event.GameEventCardDestroyed;
|
||||
import forge.game.event.GameEventCardRegenerated;
|
||||
import forge.game.event.GameEventCardSacrificed;
|
||||
import forge.game.event.GameEventDuelFinished;
|
||||
import forge.game.event.GameEventGameFinished;
|
||||
import forge.game.event.GameEventFlipCoin;
|
||||
import forge.game.event.GameEventGameStarted;
|
||||
import forge.game.player.GameLossReason;
|
||||
@@ -1531,7 +1531,7 @@ public class GameAction {
|
||||
} while( game.getAge() == GameAge.RestartedByKarn );
|
||||
|
||||
// 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) {
|
||||
|
||||
@@ -10,11 +10,9 @@ import com.google.common.collect.Lists;
|
||||
import forge.Card;
|
||||
import forge.Singletons;
|
||||
import forge.game.event.GameEventAnteCardsSelected;
|
||||
import forge.game.event.GameEventFlipCoin;
|
||||
import forge.game.player.LobbyPlayer;
|
||||
import forge.game.player.Player;
|
||||
import forge.properties.ForgePreferences.FPref;
|
||||
import forge.util.Aggregates;
|
||||
|
||||
/**
|
||||
* TODO: Write javadoc for this type.
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
package forge.game.event;
|
||||
|
||||
public class GameEventDuelFinished extends GameEvent {
|
||||
public class GameEventGameFinished extends GameEvent {
|
||||
|
||||
|
||||
|
||||
@@ -4,11 +4,11 @@ import java.util.List;
|
||||
|
||||
import forge.game.GameOutcome;
|
||||
|
||||
public class GameEventDuelOutcome extends GameEvent {
|
||||
public class GameEventGameOutcome extends GameEvent {
|
||||
public final GameOutcome result;
|
||||
public final List<GameOutcome> history;
|
||||
|
||||
public GameEventDuelOutcome(GameOutcome lastOne, List<GameOutcome> history) {
|
||||
public GameEventGameOutcome(GameOutcome lastOne, List<GameOutcome> history) {
|
||||
this.result = lastOne;
|
||||
this.history = history;
|
||||
}
|
||||
27
src/main/java/forge/game/event/GameEventPlayerPriority.java
Normal file
27
src/main/java/forge/game/event/GameEventPlayerPriority.java
Normal 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);
|
||||
}
|
||||
|
||||
}
|
||||
@@ -17,8 +17,8 @@ public interface IGameEventVisitor<T> {
|
||||
T visit(GameEventCounterAdded event);
|
||||
T visit(GameEventCounterRemoved event);
|
||||
T visit(GameEventDrawCard event);
|
||||
T visit(GameEventDuelFinished event);
|
||||
T visit(GameEventDuelOutcome event);
|
||||
T visit(GameEventGameFinished event);
|
||||
T visit(GameEventGameOutcome event);
|
||||
T visit(GameEventFlipCoin event);
|
||||
T visit(GameEventGameStarted event);
|
||||
T visit(GameEventGameRestarted event);
|
||||
@@ -29,6 +29,7 @@ public interface IGameEventVisitor<T> {
|
||||
T visit(GameEventPlayerControl event);
|
||||
T visit(GameEventPlayerDamaged gameEventPlayerDamaged);
|
||||
T visit(GameEventPlayerPoisoned event);
|
||||
T visit(GameEventPlayerPriority event);
|
||||
T visit(GameEventShuffle event);
|
||||
T visit(GameEventSpellResolved event);
|
||||
T visit(GameEventTokenCreated event);
|
||||
@@ -51,8 +52,8 @@ public interface IGameEventVisitor<T> {
|
||||
public T visit(GameEventCounterAdded event) { return null; }
|
||||
public T visit(GameEventCounterRemoved event) { return null; }
|
||||
public T visit(GameEventDrawCard event) { return null; }
|
||||
public T visit(GameEventDuelFinished event) { return null; }
|
||||
public T visit(GameEventDuelOutcome event) { return null; }
|
||||
public T visit(GameEventGameFinished event) { return null; }
|
||||
public T visit(GameEventGameOutcome event) { return null; }
|
||||
public T visit(GameEventFlipCoin event) { return null; }
|
||||
public T visit(GameEventGameStarted 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(GameEventPlayerControl 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(GameEventSpellResolved 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; }
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -32,6 +32,7 @@ import forge.card.trigger.TriggerType;
|
||||
import forge.game.GameAge;
|
||||
import forge.game.Game;
|
||||
import forge.game.GameType;
|
||||
import forge.game.event.GameEventPlayerPriority;
|
||||
import forge.game.event.GameEventTurnBegan;
|
||||
import forge.game.event.GameEventTurnEnded;
|
||||
import forge.game.event.GameEventGameRestarted;
|
||||
@@ -702,6 +703,7 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable {
|
||||
if( DEBUG_PHASES )
|
||||
sw.start();
|
||||
|
||||
game.fireEvent(new GameEventPlayerPriority(getPlayerTurn(), getPhase(), getPriorityPlayer()));
|
||||
pPlayerPriority.getController().takePriority();
|
||||
|
||||
if( DEBUG_PHASES ) {
|
||||
|
||||
@@ -18,6 +18,7 @@
|
||||
package forge.gui.input;
|
||||
|
||||
import forge.Card;
|
||||
import forge.game.Game;
|
||||
import forge.game.phase.PhaseHandler;
|
||||
import forge.game.player.Player;
|
||||
import forge.gui.framework.SDisplayUtil;
|
||||
@@ -84,21 +85,20 @@ public abstract class InputBase implements java.io.Serializable, Input {
|
||||
SDisplayUtil.remind(VMessage.SINGLETON_INSTANCE);
|
||||
}
|
||||
|
||||
protected String getTurnPhasePriorityMessage(Player player) {
|
||||
final PhaseHandler ph = player.getGame().getPhaseHandler();
|
||||
protected String getTurnPhasePriorityMessage(Game game) {
|
||||
final PhaseHandler ph = game.getPhaseHandler();
|
||||
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("Phase: ").append(ph.getPhase().nameForUi).append("\n");
|
||||
sb.append("Stack: ");
|
||||
if (!player.getGame().getStack().isEmpty()) {
|
||||
sb.append(player.getGame().getStack().size()).append(" to Resolve.");
|
||||
if (!game.getStack().isEmpty()) {
|
||||
sb.append(game.getStack().size()).append(" to Resolve.");
|
||||
} else {
|
||||
sb.append("Empty");
|
||||
}
|
||||
sb.append("\n");
|
||||
String message = sb.toString();
|
||||
return message;
|
||||
return sb.toString();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ public class InputPassPriority extends InputSyncronizedBase {
|
||||
for (Player p : player.getGame().getRegisteredPlayers()) {
|
||||
p.getZone(ZoneType.Battlefield).updateObservers();
|
||||
}
|
||||
showMessage(getTurnPhasePriorityMessage(player));
|
||||
showMessage(getTurnPhasePriorityMessage(player.getGame()));
|
||||
chosenSa = null;
|
||||
ButtonUtil.enableOnlyOk();
|
||||
}
|
||||
|
||||
69
src/main/java/forge/gui/input/InputPlaybackControl.java
Normal file
69
src/main/java/forge/gui/input/InputPlaybackControl.java
Normal 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();
|
||||
}
|
||||
|
||||
}
|
||||
@@ -33,7 +33,6 @@ import forge.FThreads;
|
||||
import forge.Singletons;
|
||||
import forge.CardPredicates.Presets;
|
||||
import forge.Command;
|
||||
import forge.control.FControl;
|
||||
import forge.deck.Deck;
|
||||
import forge.game.Game;
|
||||
import forge.game.phase.CombatUtil;
|
||||
@@ -42,7 +41,6 @@ import forge.game.phase.PhaseType;
|
||||
import forge.game.player.LobbyPlayer;
|
||||
import forge.game.player.Player;
|
||||
import forge.game.zone.ZoneType;
|
||||
import forge.gui.GuiDialog;
|
||||
import forge.gui.SOverlayUtils;
|
||||
import forge.gui.framework.ICDoc;
|
||||
import forge.gui.framework.SLayoutIO;
|
||||
|
||||
@@ -13,7 +13,7 @@ import forge.game.event.GameEventCardSacrificed;
|
||||
import forge.game.event.GameEventCounterAdded;
|
||||
import forge.game.event.GameEventCounterRemoved;
|
||||
import forge.game.event.GameEventDrawCard;
|
||||
import forge.game.event.GameEventDuelOutcome;
|
||||
import forge.game.event.GameEventGameOutcome;
|
||||
import forge.game.event.GameEventTurnEnded;
|
||||
import forge.game.event.GameEvent;
|
||||
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.
|
||||
*/
|
||||
public SoundEffectType visit(GameEventDuelOutcome event) {
|
||||
public SoundEffectType visit(GameEventGameOutcome event) {
|
||||
boolean humanWonTheDuel = event.result.getWinner() == Singletons.getControl().getLobby().getGuiPlayer();
|
||||
return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user