mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-16 18:58:00 +00:00
Log uses visitor pattern instead of instance of checks
This commit is contained in:
@@ -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;
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
@@ -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());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -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; }
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user