Log uses visitor pattern instead of instance of checks

This commit is contained in:
Maxmtg
2013-05-29 20:02:56 +00:00
parent 9c5b5c6d73
commit 7804f5f79d
4 changed files with 49 additions and 78 deletions

View File

@@ -22,9 +22,7 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import com.google.common.eventbus.Subscribe; import forge.game.event.IGameEventVisitor;
import forge.game.event.GameEvent;
import forge.game.phase.Combat; import forge.game.phase.Combat;
import forge.util.MyObservable; import forge.util.MyObservable;
@@ -69,7 +67,7 @@ public class GameLog extends MyObservable {
this.updateObservers(); this.updateObservers();
} }
private void add(GameLogEntry entry) { void add(GameLogEntry entry) {
log.add(entry); log.add(entry);
this.updateObservers(); this.updateObservers();
} }
@@ -107,18 +105,6 @@ public class GameLog extends MyObservable {
return result; 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) { public void addCombatAttackers(Combat combat) {
this.add(GameLogFormatter.describeAttack(combat)); this.add(GameLogFormatter.describeAttack(combat));
} }
@@ -127,4 +113,9 @@ public class GameLog extends MyObservable {
} }
// Special methods // Special methods
public IGameEventVisitor<?> getEventVisitor() {
return formatter;
}
} }

View File

@@ -4,73 +4,46 @@ import java.util.ArrayList;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
import com.google.common.eventbus.Subscribe;
import forge.game.GameOutcome; import forge.game.GameOutcome;
import forge.game.event.IGameEventVisitor;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventDuelOutcome;
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;
import forge.game.phase.Combat; import forge.game.phase.Combat;
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.player.PlayerStatistics; import forge.game.player.PlayerStatistics;
import forge.util.Lang; import forge.util.Lang;
public class GameLogFormatter { public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
private final GameLog log; private final GameLog log;
public GameLogFormatter(GameLog gameLog) { public GameLogFormatter(GameLog gameLog) {
log = gameLog; log = gameLog;
} }
@Override
// Some events produce several log entries. I've let them added into log directly public GameLogEntry visit(GameEventDuelOutcome ev) {
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<GameOutcome> history) {
// 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();
// This adds some extra entries to log
final List<String> outcomes = new ArrayList<String>(); final List<String> outcomes = new ArrayList<String>();
for (Entry<LobbyPlayer, PlayerStatistics> p : result) { for (Entry<LobbyPlayer, PlayerStatistics> p : ev.result) {
String whoHas = p.getKey().equals(human) ? "You have" : p.getKey().getName() + " has"; String whoHas = p.getKey().equals(human) ? "You have" : p.getKey().getName() + " has";
String outcome = String.format("%s %s", whoHas, p.getValue().getOutcome().toString()); String outcome = String.format("%s %s", whoHas, p.getValue().getOutcome().toString());
outcomes.add(outcome); outcomes.add(outcome);
log.add(GameEventType.GAME_OUTCOME, outcome); log.add(GameEventType.GAME_OUTCOME, outcome);
} }
return generateSummary(history); return generateSummary(ev.history);
} }
private static GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) {
private GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) {
GameOutcome outcome1 = gamesPlayed.get(0); GameOutcome outcome1 = gamesPlayed.get(0);
int[] wins = new int[outcome1.getNumPlayers()]; int[] wins = new int[outcome1.getNumPlayers()];
LobbyPlayer[] players = new LobbyPlayer[outcome1.getNumPlayers()]; LobbyPlayer[] players = new LobbyPlayer[outcome1.getNumPlayers()];
@@ -93,14 +66,36 @@ public class GameLogFormatter {
return new GameLogEntry(GameEventType.MATCH_RESULTS, sb.toString()); 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) { static GameLogEntry describeAttack(final Combat combat) {
final StringBuilder sb = new StringBuilder(); final StringBuilder sb = new StringBuilder();
// Loop through Defenders // Loop through Defenders
// Append Defending Player/Planeswalker // Append Defending Player/Planeswalker
// Not a big fan of the triple nested loop here // Not a big fan of the triple nested loop here
for (GameEntity defender : combat.getDefenders()) { for (GameEntity defender : combat.getDefenders()) {
List<Card> attackers = combat.getAttackersOf(defender); List<Card> attackers = combat.getAttackersOf(defender);
@@ -154,9 +149,11 @@ public class GameLogFormatter {
} }
@Subscribe
public GameLogEntry recieve(GameEvent ev) { public void recieve(GameEvent ev) {
return logEvent(ev); GameLogEntry le = ev.visit(this);
if ( le != null )
log.add(le);
} }
} // end class GameLog } // end class GameLog

View File

@@ -125,7 +125,7 @@ public class Game {
if ( match0.getGameType() == GameType.Quest) if ( match0.getGameType() == GameType.Quest)
events.register(Singletons.getModel().getQuest()); // this one listens to player's mulligans ATM events.register(Singletons.getModel().getQuest()); // this one listens to player's mulligans ATM
events.register(gameLog); subscribeToEvents(gameLog.getEventVisitor());
} }

View File

@@ -3,7 +3,6 @@ package forge.sound;
import forge.Card; import forge.Card;
import forge.Singletons; import forge.Singletons;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.game.event.GameEventAnteCardsSelected;
import forge.game.event.GameEventBlockerAssigned; import forge.game.event.GameEventBlockerAssigned;
import forge.game.event.GameEventCardDamaged; import forge.game.event.GameEventCardDamaged;
import forge.game.event.GameEventCardDestroyed; import forge.game.event.GameEventCardDestroyed;
@@ -14,30 +13,24 @@ 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.GameEventDuelFinished;
import forge.game.event.GameEventDuelOutcome; import forge.game.event.GameEventDuelOutcome;
import forge.game.event.GameEventEndOfTurn; import forge.game.event.GameEventEndOfTurn;
import forge.game.event.GameEvent; import forge.game.event.GameEvent;
import forge.game.event.GameEventFlipCoin; import forge.game.event.GameEventFlipCoin;
import forge.game.event.GameEventGameRestarted;
import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventLifeLoss; 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.GameEventPoisonCounter;
import forge.game.event.GameEventCardTapped; import forge.game.event.GameEventCardTapped;
import forge.game.event.GameEventShuffle; import forge.game.event.GameEventShuffle;
import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTokenCreated; import forge.game.event.GameEventTokenCreated;
import forge.game.event.GameEventTurnPhase;
import forge.game.event.IGameEventVisitor; import forge.game.event.IGameEventVisitor;
/** /**
* This class is in charge of converting any forge.game.event.Event to a SoundEffectType. * This class is in charge of converting any forge.game.event.Event to a SoundEffectType.
* *
*/ */
public class EventVisualizer implements IGameEventVisitor<SoundEffectType> { public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
public SoundEffectType visit(GameEventBlockerAssigned event) { return SoundEffectType.Block; } public SoundEffectType visit(GameEventBlockerAssigned event) { return SoundEffectType.Block; }
@@ -182,14 +175,4 @@ public class EventVisualizer implements IGameEventVisitor<SoundEffectType> {
return c != null ? c.getSVar("SoundEffect") : ""; 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; }
} }