From 7804f5f79d063b2c46a34d75a48e58cd947b26b3 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Wed, 29 May 2013 20:02:56 +0000 Subject: [PATCH] Log uses visitor pattern instead of instance of checks --- src/main/java/forge/GameLog.java | 23 ++--- src/main/java/forge/GameLogFormatter.java | 83 +++++++++---------- src/main/java/forge/game/Game.java | 2 +- .../java/forge/sound/EventVisualizer.java | 19 +---- 4 files changed, 49 insertions(+), 78 deletions(-) diff --git a/src/main/java/forge/GameLog.java b/src/main/java/forge/GameLog.java index 972777b9c92..d6abf204c96 100644 --- a/src/main/java/forge/GameLog.java +++ b/src/main/java/forge/GameLog.java @@ -22,9 +22,7 @@ import java.util.ArrayList; import java.util.List; import org.apache.commons.lang3.StringUtils; -import com.google.common.eventbus.Subscribe; - -import forge.game.event.GameEvent; +import forge.game.event.IGameEventVisitor; import forge.game.phase.Combat; import forge.util.MyObservable; @@ -69,7 +67,7 @@ public class GameLog extends MyObservable { this.updateObservers(); } - private void add(GameLogEntry entry) { + void add(GameLogEntry entry) { log.add(entry); this.updateObservers(); } @@ -107,18 +105,6 @@ public class GameLog extends MyObservable { return result; } - - // Special methods - - @Subscribe - public void receiveGameEvent(GameEvent ev) { - GameLogEntry record = formatter.recieve(ev); - if( null != record ) { - add(record); - } - } - - public void addCombatAttackers(Combat combat) { this.add(GameLogFormatter.describeAttack(combat)); } @@ -127,4 +113,9 @@ public class GameLog extends MyObservable { } // Special methods + + public IGameEventVisitor getEventVisitor() { + return formatter; + } + } diff --git a/src/main/java/forge/GameLogFormatter.java b/src/main/java/forge/GameLogFormatter.java index cd75dd4d229..5e371cd24ea 100644 --- a/src/main/java/forge/GameLogFormatter.java +++ b/src/main/java/forge/GameLogFormatter.java @@ -4,73 +4,46 @@ import java.util.ArrayList; import java.util.List; import java.util.Map.Entry; +import com.google.common.eventbus.Subscribe; + import forge.game.GameOutcome; +import forge.game.event.IGameEventVisitor; import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEvent; import forge.game.event.GameEventTurnPhase; import forge.game.event.GameEventPlayerControl; import forge.game.phase.Combat; -import forge.game.phase.PhaseType; import forge.game.player.LobbyPlayer; import forge.game.player.Player; import forge.game.player.PlayerStatistics; import forge.util.Lang; -public class GameLogFormatter { +public class GameLogFormatter extends IGameEventVisitor.Base { private final GameLog log; - public GameLogFormatter(GameLog gameLog) { log = gameLog; } - - // Some events produce several log entries. I've let them added into log directly - private GameLogEntry logEvent(GameEvent ev) { - if(ev instanceof GameEventDuelOutcome) { - return fillOutcome(((GameEventDuelOutcome) ev).result, ((GameEventDuelOutcome) ev).history ); - - } else if ( ev instanceof GameEventPlayerControl ) { - LobbyPlayer newController = ((GameEventPlayerControl) ev).newController; - Player p = ((GameEventPlayerControl) ev).player; - - final String message; - if( newController == null ) - message = p.getName() + " has restored control over themself"; - else - message = String.format("%s is controlled by %s", p.getName(), newController.getName()); - - return new GameLogEntry(GameEventType.PLAYER_CONROL, message); - } else if ( ev instanceof GameEventTurnPhase ) { - Player p = ((GameEventTurnPhase) ev).playerTurn; - PhaseType ph = ((GameEventTurnPhase) ev).phase; - return new GameLogEntry(GameEventType.PHASE, ((GameEventTurnPhase) ev).phaseDesc + Lang.getPossesive(p.getName()) + " " + ph.nameForUi); - } - return null; - } - - - /** - * Generates and adds - */ - private GameLogEntry fillOutcome(GameOutcome result, List history) { - + @Override + public GameLogEntry visit(GameEventDuelOutcome ev) { // add result entries to the game log final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer(); - + // This adds some extra entries to log final List outcomes = new ArrayList(); - for (Entry p : result) { + for (Entry p : ev.result) { String whoHas = p.getKey().equals(human) ? "You have" : p.getKey().getName() + " has"; String outcome = String.format("%s %s", whoHas, p.getValue().getOutcome().toString()); outcomes.add(outcome); log.add(GameEventType.GAME_OUTCOME, outcome); } - return generateSummary(history); + return generateSummary(ev.history); } + - private static GameLogEntry generateSummary(List gamesPlayed) { + private GameLogEntry generateSummary(List gamesPlayed) { GameOutcome outcome1 = gamesPlayed.get(0); int[] wins = new int[outcome1.getNumPlayers()]; LobbyPlayer[] players = new LobbyPlayer[outcome1.getNumPlayers()]; @@ -93,14 +66,36 @@ public class GameLogFormatter { return new GameLogEntry(GameEventType.MATCH_RESULTS, sb.toString()); } + @Override + public GameLogEntry visit(GameEventPlayerControl event) { + // TODO Auto-generated method stub + LobbyPlayer newController = event.newController; + Player p = event.player; + + final String message; + if( newController == null ) + message = p.getName() + " has restored control over themself"; + else + message = String.format("%s is controlled by %s", p.getName(), newController.getName()); + + return new GameLogEntry(GameEventType.PLAYER_CONROL, message); + } + + @Override + public GameLogEntry visit(GameEventTurnPhase ev) { + Player p = ev.playerTurn; + return new GameLogEntry(GameEventType.PHASE, ev.phaseDesc + Lang.getPossesive(p.getName()) + " " + ev.phase.nameForUi); + } + + + + static GameLogEntry describeAttack(final Combat combat) { final StringBuilder sb = new StringBuilder(); // Loop through Defenders // Append Defending Player/Planeswalker - - // Not a big fan of the triple nested loop here for (GameEntity defender : combat.getDefenders()) { List attackers = combat.getAttackersOf(defender); @@ -154,9 +149,11 @@ public class GameLogFormatter { } - - public GameLogEntry recieve(GameEvent ev) { - return logEvent(ev); + @Subscribe + public void recieve(GameEvent ev) { + GameLogEntry le = ev.visit(this); + if ( le != null ) + log.add(le); } } // end class GameLog \ No newline at end of file diff --git a/src/main/java/forge/game/Game.java b/src/main/java/forge/game/Game.java index 8bd3be1efe5..55875aed1cc 100644 --- a/src/main/java/forge/game/Game.java +++ b/src/main/java/forge/game/Game.java @@ -125,7 +125,7 @@ public class Game { if ( match0.getGameType() == GameType.Quest) events.register(Singletons.getModel().getQuest()); // this one listens to player's mulligans ATM - events.register(gameLog); + subscribeToEvents(gameLog.getEventVisitor()); } diff --git a/src/main/java/forge/sound/EventVisualizer.java b/src/main/java/forge/sound/EventVisualizer.java index fa0aa7e99c9..8a8cf787909 100644 --- a/src/main/java/forge/sound/EventVisualizer.java +++ b/src/main/java/forge/sound/EventVisualizer.java @@ -3,7 +3,6 @@ package forge.sound; import forge.Card; import forge.Singletons; import forge.card.spellability.SpellAbility; -import forge.game.event.GameEventAnteCardsSelected; import forge.game.event.GameEventBlockerAssigned; import forge.game.event.GameEventCardDamaged; import forge.game.event.GameEventCardDestroyed; @@ -14,30 +13,24 @@ import forge.game.event.GameEventCardSacrificed; import forge.game.event.GameEventCounterAdded; import forge.game.event.GameEventCounterRemoved; import forge.game.event.GameEventDrawCard; -import forge.game.event.GameEventDuelFinished; import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventEndOfTurn; import forge.game.event.GameEvent; import forge.game.event.GameEventFlipCoin; -import forge.game.event.GameEventGameRestarted; import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLifeLoss; -import forge.game.event.GameEventManaBurn; -import forge.game.event.GameEventMulligan; -import forge.game.event.GameEventPlayerControl; import forge.game.event.GameEventPoisonCounter; import forge.game.event.GameEventCardTapped; import forge.game.event.GameEventShuffle; import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventTokenCreated; -import forge.game.event.GameEventTurnPhase; import forge.game.event.IGameEventVisitor; /** * This class is in charge of converting any forge.game.event.Event to a SoundEffectType. * */ -public class EventVisualizer implements IGameEventVisitor { +public class EventVisualizer extends IGameEventVisitor.Base { public SoundEffectType visit(GameEventBlockerAssigned event) { return SoundEffectType.Block; } @@ -182,14 +175,4 @@ public class EventVisualizer implements IGameEventVisitor { return c != null ? c.getSVar("SoundEffect") : ""; } - - // These are not used by sound system - public SoundEffectType visit(GameEventGameRestarted event) { return null; } - public SoundEffectType visit(GameEventDuelFinished event) { return null; } - public SoundEffectType visit(GameEventAnteCardsSelected event) { return null; } - public SoundEffectType visit(GameEventManaBurn event) { return null; } - public SoundEffectType visit(GameEventMulligan event) { return null; } - public SoundEffectType visit(GameEventPlayerControl event) { return null; } - public SoundEffectType visit(GameEventTurnPhase event) { return null; } - }