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 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;
}
}

View File

@@ -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<GameLogEntry> {
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<GameOutcome> 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<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 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<GameOutcome> gamesPlayed) {
private GameLogEntry generateSummary(List<GameOutcome> 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<Card> 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

View File

@@ -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());
}

View File

@@ -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<SoundEffectType> {
public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> {
public SoundEffectType visit(GameEventBlockerAssigned event) { return SoundEffectType.Block; }
@@ -182,14 +175,4 @@ public class EventVisualizer implements IGameEventVisitor<SoundEffectType> {
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; }
}