diff --git a/.gitattributes b/.gitattributes index ba02d3b76dd..6dcf9bf86d4 100644 --- a/.gitattributes +++ b/.gitattributes @@ -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 diff --git a/src/main/java/forge/GameLogFormatter.java b/src/main/java/forge/GameLogFormatter.java index c677d8d6008..5b87e9d9f88 100644 --- a/src/main/java/forge/GameLogFormatter.java +++ b/src/main/java/forge/GameLogFormatter.java @@ -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 { } @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(); diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 0525c576331..f1b3b93c18f 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -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); } diff --git a/src/main/java/forge/control/FControlGameEventHandler.java b/src/main/java/forge/control/FControlGameEventHandler.java index 9f4720d0024..f15b3a3f490 100644 --- a/src/main/java/forge/control/FControlGameEventHandler.java +++ b/src/main/java/forge/control/FControlGameEventHandler.java @@ -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,15 +81,15 @@ public class FControlGameEventHandler extends IGameEventVisitor.Base { } @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 } }); return null; - } + } @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(); diff --git a/src/main/java/forge/control/FControlGamePlayback.java b/src/main/java/forge/control/FControlGamePlayback.java index 081b7f176bb..b620f22a6b2 100644 --- a/src/main/java/forge/control/FControlGamePlayback.java +++ b/src/main/java/forge/control/FControlGamePlayback.java @@ -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 { 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 { } - - @Override public Void visit(GameEventBlockerAssigned event) { pauseForEvent(combatDelay); @@ -67,6 +78,22 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { return null; } + + /* (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) { @@ -75,9 +102,73 @@ public class FControlGamePlayback extends IGameEventVisitor.Base { } @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(); + } } \ No newline at end of file diff --git a/src/main/java/forge/control/InputQueue.java b/src/main/java/forge/control/InputQueue.java index 72ddad2ef0d..64ad008f618 100644 --- a/src/main/java/forge/control/InputQueue.java +++ b/src/main/java/forge/control/InputQueue.java @@ -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) { diff --git a/src/main/java/forge/game/Game.java b/src/main/java/forge/game/Game.java index 72195544edb..c8bcf28f64e 100644 --- a/src/main/java/forge/game/Game.java +++ b/src/main/java/forge/game/Game.java @@ -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) { diff --git a/src/main/java/forge/game/GameAction.java b/src/main/java/forge/game/GameAction.java index aa70b66da7f..666cc094dff 100644 --- a/src/main/java/forge/game/GameAction.java +++ b/src/main/java/forge/game/GameAction.java @@ -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) { diff --git a/src/main/java/forge/game/Match.java b/src/main/java/forge/game/Match.java index 94da1cc5d68..b3dcce4f4f7 100644 --- a/src/main/java/forge/game/Match.java +++ b/src/main/java/forge/game/Match.java @@ -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. diff --git a/src/main/java/forge/game/event/GameEventDuelFinished.java b/src/main/java/forge/game/event/GameEventGameFinished.java similarity index 77% rename from src/main/java/forge/game/event/GameEventDuelFinished.java rename to src/main/java/forge/game/event/GameEventGameFinished.java index c6663782112..ddcb0c89468 100644 --- a/src/main/java/forge/game/event/GameEventDuelFinished.java +++ b/src/main/java/forge/game/event/GameEventGameFinished.java @@ -1,6 +1,6 @@ package forge.game.event; -public class GameEventDuelFinished extends GameEvent { +public class GameEventGameFinished extends GameEvent { diff --git a/src/main/java/forge/game/event/GameEventDuelOutcome.java b/src/main/java/forge/game/event/GameEventGameOutcome.java similarity index 73% rename from src/main/java/forge/game/event/GameEventDuelOutcome.java rename to src/main/java/forge/game/event/GameEventGameOutcome.java index 22e0e0a07f3..412a5fff470 100644 --- a/src/main/java/forge/game/event/GameEventDuelOutcome.java +++ b/src/main/java/forge/game/event/GameEventGameOutcome.java @@ -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 history; - public GameEventDuelOutcome(GameOutcome lastOne, List history) { + public GameEventGameOutcome(GameOutcome lastOne, List history) { this.result = lastOne; this.history = history; } diff --git a/src/main/java/forge/game/event/GameEventPlayerPriority.java b/src/main/java/forge/game/event/GameEventPlayerPriority.java new file mode 100644 index 00000000000..e30f5719ca7 --- /dev/null +++ b/src/main/java/forge/game/event/GameEventPlayerPriority.java @@ -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 visit(IGameEventVisitor visitor) { + return visitor.visit(this); + } + +} diff --git a/src/main/java/forge/game/event/IGameEventVisitor.java b/src/main/java/forge/game/event/IGameEventVisitor.java index 151705d661c..8a864c2cedc 100644 --- a/src/main/java/forge/game/event/IGameEventVisitor.java +++ b/src/main/java/forge/game/event/IGameEventVisitor.java @@ -17,8 +17,8 @@ public interface IGameEventVisitor { 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 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 { 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 { 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 { public T visit(GameEventPlayerDamaged event) { return null; } } + + + } diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index 39b3efcf88a..0c09bb2cded 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -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 ) { diff --git a/src/main/java/forge/gui/input/InputBase.java b/src/main/java/forge/gui/input/InputBase.java index b1be07c7ecf..f94c5710e03 100644 --- a/src/main/java/forge/gui/input/InputBase.java +++ b/src/main/java/forge/gui/input/InputBase.java @@ -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(); } } diff --git a/src/main/java/forge/gui/input/InputPassPriority.java b/src/main/java/forge/gui/input/InputPassPriority.java index 1c1c90ee843..3152dbef240 100644 --- a/src/main/java/forge/gui/input/InputPassPriority.java +++ b/src/main/java/forge/gui/input/InputPassPriority.java @@ -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(); } diff --git a/src/main/java/forge/gui/input/InputPlaybackControl.java b/src/main/java/forge/gui/input/InputPlaybackControl.java new file mode 100644 index 00000000000..119da483718 --- /dev/null +++ b/src/main/java/forge/gui/input/InputPlaybackControl.java @@ -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(); + } + +} diff --git a/src/main/java/forge/gui/match/controllers/CDock.java b/src/main/java/forge/gui/match/controllers/CDock.java index bcd5d442f82..d4d26c422af 100644 --- a/src/main/java/forge/gui/match/controllers/CDock.java +++ b/src/main/java/forge/gui/match/controllers/CDock.java @@ -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; diff --git a/src/main/java/forge/sound/EventVisualizer.java b/src/main/java/forge/sound/EventVisualizer.java index 645b71a2829..d7fcc1cee61 100644 --- a/src/main/java/forge/sound/EventVisualizer.java +++ b/src/main/java/forge/sound/EventVisualizer.java @@ -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 { /** * 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; }