From 5c6afc446d0ee380c6ebe1c705f665a791f07b40 Mon Sep 17 00:00:00 2001 From: Maxmtg Date: Sat, 25 May 2013 09:52:50 +0000 Subject: [PATCH] Game Outcome strings are now built in GameLog class, because MatchController should not compose logs GameLog is subscribed to DuelOutcomeEvent. GameLog uses enum to indicate record priority, as well as its kind ViewWinLose takes strings from log. --- .gitattributes | 2 + src/main/java/forge/Card.java | 8 +- src/main/java/forge/GameLog.java | 179 +++++++++--------- src/main/java/forge/GameLogEntry.java | 22 +++ src/main/java/forge/GameLogLevel.java | 25 +++ .../card/cardfactory/CardFactoryUtil.java | 5 +- .../card/replacement/ReplacementHandler.java | 3 +- src/main/java/forge/control/FControl.java | 3 + src/main/java/forge/game/GameNew.java | 5 +- src/main/java/forge/game/GameOutcome.java | 85 +++------ src/main/java/forge/game/MatchController.java | 65 +------ .../forge/game/event/DuelOutcomeEvent.java | 12 +- .../java/forge/game/phase/CombatUtil.java | 10 +- .../java/forge/game/phase/PhaseHandler.java | 8 +- src/main/java/forge/game/phase/PhaseUtil.java | 5 +- .../java/forge/game/player/HumanPlay.java | 3 +- src/main/java/forge/game/player/Player.java | 11 +- src/main/java/forge/game/zone/MagicStack.java | 7 +- .../java/forge/gui/match/ViewWinLose.java | 32 ++-- src/main/java/forge/gui/match/views/VLog.java | 7 +- .../java/forge/sound/EventVisualizer.java | 2 +- 21 files changed, 245 insertions(+), 254 deletions(-) create mode 100644 src/main/java/forge/GameLogEntry.java create mode 100644 src/main/java/forge/GameLogLevel.java diff --git a/.gitattributes b/.gitattributes index db17646d5e4..d3ebaec76c2 100644 --- a/.gitattributes +++ b/.gitattributes @@ -13759,6 +13759,8 @@ src/main/java/forge/CounterType.java svneol=native#text/plain src/main/java/forge/FThreads.java -text src/main/java/forge/GameEntity.java -text src/main/java/forge/GameLog.java -text +src/main/java/forge/GameLogEntry.java -text +src/main/java/forge/GameLogLevel.java -text src/main/java/forge/ImageCache.java svneol=native#text/plain src/main/java/forge/ImageLoader.java -text src/main/java/forge/Singletons.java svneol=native#text/plain diff --git a/src/main/java/forge/Card.java b/src/main/java/forge/Card.java index 6acbf619a59..d72263face3 100644 --- a/src/main/java/forge/Card.java +++ b/src/main/java/forge/Card.java @@ -3169,7 +3169,7 @@ public class Card extends GameEntity implements Comparable { public final void equipCard(final Card c) { if (c.hasKeyword("CARDNAME can't be equipped.")) { getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() - + " but it can't be equipped.", 2); + + " but it can't be equipped.", GameLogLevel.STACK); return; } if (this.hasStartOfKeyword("CantEquip")) { @@ -3179,7 +3179,7 @@ public class Card extends GameEntity implements Comparable { final String[] restrictions = k[1].split(","); if (c.isValid(restrictions, this.getController(), this)) { getGame().getGameLog().add("ResolveStack", "Trying to equip " + c.getName() - + " but it can't be equipped.", 2); + + " but it can't be equipped.", GameLogLevel.STACK); return; } } @@ -3372,7 +3372,7 @@ public class Card extends GameEntity implements Comparable { public final void enchantEntity(final GameEntity entity) { if (entity.hasKeyword("CARDNAME can't be enchanted.")) { getGame().getGameLog().add("ResolveStack", "Trying to enchant " + entity.getName() - + " but it can't be enchanted.", 2); + + " but it can't be enchanted.", GameLogLevel.STACK); return; } this.addEnchanting(entity); @@ -7460,7 +7460,7 @@ public class Card extends GameEntity implements Comparable { game.getEvents().post(new CardDamagedEvent()); } - getGame().getGameLog().add("Damage", String.format("Dealing %d damage to %s. %s", damageToAdd, this.getName(), additionalLog), 3); + getGame().getGameLog().add("Damage", String.format("Dealing %d damage to %s. %s", damageToAdd, this.getName(), additionalLog), GameLogLevel.DAMAGE); return true; } diff --git a/src/main/java/forge/GameLog.java b/src/main/java/forge/GameLog.java index b933b39d81d..1bf5cc3b5ba 100644 --- a/src/main/java/forge/GameLog.java +++ b/src/main/java/forge/GameLog.java @@ -20,28 +20,39 @@ package forge; import java.util.ArrayList; import java.util.List; +import java.util.Map.Entry; +import org.apache.commons.lang3.StringUtils; +import com.google.common.eventbus.Subscribe; + +import forge.game.GameOutcome; +import forge.game.event.DuelOutcomeEvent; +import forge.game.event.Event; +import forge.game.player.LobbyPlayer; +import forge.game.player.PlayerStatistics; import forge.util.MyObservable; /** *

* GameLog class. - *

- * - * Logging level: - * 0 - Turn - * 2 - Stack items - * 3 - Poison Counters - * 4 - Mana abilities - * 6 - All Phase information * * @author Forge * @version $Id: GameLog.java 12297 2011-11-28 19:56:47Z slapshot5 $ */ public class GameLog extends MyObservable { - private ArrayList log = new ArrayList(); + private List log = new ArrayList(); + /** Logging level: + * 0 - Turn + * 2 - Stack items + * 3 - Poison Counters + * 4 - Mana abilities + * 6 - All Phase information + */ + + + /** * Instantiates a new game log. */ @@ -49,6 +60,58 @@ public class GameLog extends MyObservable { } + @Subscribe + public void receiveGameEvent(Event ev) { + if(ev instanceof DuelOutcomeEvent) { + fillOutcome( ((DuelOutcomeEvent) ev).result, ((DuelOutcomeEvent) ev).history ); + } + } + + /** + * Generates and adds + */ + private void fillOutcome(GameOutcome result, List history) { + + // add result entries to the game log + final LobbyPlayer human = Singletons.getControl().getLobby().getGuiPlayer(); + + + final List outcomes = new ArrayList(); + for (Entry p : 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); + this.add("Final", outcome, GameLogLevel.GAME_OUTCOME); + } + + final String statsSummary = generateSummary(history); + this.add("Final", statsSummary, GameLogLevel.MATCH_RESULTS); + } + + private static String generateSummary(List gamesPlayed) { + GameOutcome outcome1 = gamesPlayed.get(0); + int[] wins = new int[outcome1.getNumPlayers()]; + LobbyPlayer[] players = new LobbyPlayer[outcome1.getNumPlayers()]; + for(int i = 0; i < wins.length; wins[i++] = 0); + + for (GameOutcome go : gamesPlayed) { + int i = 0; + for(Entry ps : go) { + players[i] = ps.getKey(); + if( ps.getValue().getOutcome().hasWon() ) + wins[i]++; + i++; + } + } + + StringBuilder sb = new StringBuilder(); + for(int i = 0; i < wins.length; i++) { + sb.append(players[i].getName()).append(": ").append(wins[i]).append(" "); + } + return sb.toString(); + } + + /** * Adds the. * @@ -56,8 +119,8 @@ public class GameLog extends MyObservable { * @param message the message * @param level the level */ - public void add(final String type, final String message, final int level) { - log.add(new LogEntry(type, message, level)); + public void add(final String type, final String message, final GameLogLevel level) { + log.add(new GameLogEntry(type, message, level)); this.updateObservers(); } @@ -67,54 +130,13 @@ public class GameLog extends MyObservable { * @return the log text */ public String getLogText() { - return getLogText(10); + return getLogText(null); } - /** - * Gets the log text. - * - * @param logLevel the log level - * @return the log text - */ - public String getLogText(final int logLevel) { - StringBuilder sb = new StringBuilder(); - for (int i = log.size() - 1; i >= 0; i--) { - LogEntry le = log.get(i); - if (le.getLevel() > logLevel) { - continue; - } - sb.append(le.getType()).append(": ").append(le.getMessage()); - if (i > 0) { - sb.append("\r\n"); - } - } - return sb.toString(); - } - /** - * Reset. - */ - public void reset() { - log.clear(); - this.updateObservers(); - } - - /** - * Gets the log entry. - * - * @param index the index - * @return the log entry - */ - public LogEntry getLogEntry(int index) { - return log.get(index); - } - - /** - * Gets the log entries as a list. - * @return List - */ - public List getLogEntries() { - return log; + public String getLogText(final GameLogLevel logLevel) { + List filteredAndReversed = getLogEntries(logLevel); + return StringUtils.join(filteredAndReversed, "\r\n"); } /** @@ -123,41 +145,26 @@ public class GameLog extends MyObservable { * @param logLevel the log level * @return the log text */ - public List getLogEntries(final int logLevel) { - final List entries = new ArrayList(); + public List getLogEntries(final GameLogLevel logLevel) { // null to fetch all + final List result = new ArrayList(); for (int i = log.size() - 1; i >= 0; i--) { - LogEntry le = log.get(i); - if (le.getLevel() > logLevel) { - continue; - } - - entries.add(le); + GameLogEntry le = log.get(i); + if(logLevel == null || le.level.compareTo(logLevel) <= 0 ) + result.add(le); } - return entries; + return result; } + + public List getLogEntriesExact(final GameLogLevel logLevel) { // null to fetch all + final List result = new ArrayList(); - public class LogEntry { - private String type; - private String message; - private int level; - - LogEntry(final String typeIn, final String messageIn, final int levelIn) { - type = typeIn; - message = messageIn; - level = levelIn; - } - - public String getType() { - return type; - } - - public String getMessage() { - return message; - } - - public int getLevel() { - return level; + for (int i = log.size() - 1; i >= 0; i--) { + GameLogEntry le = log.get(i); + if(logLevel == null || le.level.compareTo(logLevel) == 0 ) + result.add(le); } + return result; } + } // end class GameLog diff --git a/src/main/java/forge/GameLogEntry.java b/src/main/java/forge/GameLogEntry.java new file mode 100644 index 00000000000..b84ca13031c --- /dev/null +++ b/src/main/java/forge/GameLogEntry.java @@ -0,0 +1,22 @@ +package forge; + +public class GameLogEntry { + public final String type; + public final String message; + public final GameLogLevel level; + + GameLogEntry(final String typeIn, final String messageIn, final GameLogLevel levelIn) { + type = typeIn; + message = messageIn; + level = levelIn; + } + + /* (non-Javadoc) + * @see java.lang.Object#toString() + */ + @Override + public String toString() { + // TODO Auto-generated method stub + return type + ": " + message; + } +} \ No newline at end of file diff --git a/src/main/java/forge/GameLogLevel.java b/src/main/java/forge/GameLogLevel.java new file mode 100644 index 00000000000..e7dc9190e9c --- /dev/null +++ b/src/main/java/forge/GameLogLevel.java @@ -0,0 +1,25 @@ +package forge; + +public enum GameLogLevel { + GAME_OUTCOME("Game outcome"), + MATCH_RESULTS("Match result"), + TURN("Turn"), + MULLIGAN("Mulligan"), + ANTE("Ante"), + COMBAT("Combat"), + EFFECT_REPLACED("ReplacementEffect"), + LAND("Land"), + STACK("Stack"), + DAMAGE("Damage"), + MANA("Mana"), + PHASE("Phase"); + + private final String caption; + private GameLogLevel(String name) { + this.caption = name; + } + + public String getCaption() { + return caption; + } +} \ No newline at end of file diff --git a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java index 69b3d29669c..95329e99c87 100644 --- a/src/main/java/forge/card/cardfactory/CardFactoryUtil.java +++ b/src/main/java/forge/card/cardfactory/CardFactoryUtil.java @@ -35,6 +35,7 @@ import forge.Command; import forge.Constant; import forge.CounterType; import forge.GameEntity; +import forge.GameLogLevel; import forge.card.ColorSet; import forge.card.MagicColor; import forge.card.ability.AbilityFactory; @@ -207,7 +208,7 @@ public class CardFactoryUtil { StringBuilder sb = new StringBuilder(); sb.append(this.getActivatingPlayer()).append(" has unmorphed "); sb.append(sourceCard.getName()); - sourceCard.getGame().getGameLog().add("ResolveStack", sb.toString(), 2); + sourceCard.getGame().getGameLog().add("ResolveStack", sb.toString(), GameLogLevel.STACK); } } @@ -433,7 +434,7 @@ public class CardFactoryUtil { sb.append(this.getActivatingPlayer()).append(" has suspended "); sb.append(c.getName()).append("with "); sb.append(counters).append(" time counters on it."); - game.getGameLog().add("ResolveStack", sb.toString(), 2); + game.getGameLog().add("ResolveStack", sb.toString(), GameLogLevel.STACK); } }; final StringBuilder sbDesc = new StringBuilder(); diff --git a/src/main/java/forge/card/replacement/ReplacementHandler.java b/src/main/java/forge/card/replacement/ReplacementHandler.java index 761a9ef0e7c..953b38a9479 100644 --- a/src/main/java/forge/card/replacement/ReplacementHandler.java +++ b/src/main/java/forge/card/replacement/ReplacementHandler.java @@ -24,6 +24,7 @@ import java.util.List; import java.util.Map; import forge.Card; +import forge.GameLogLevel; import forge.card.ability.AbilityFactory; import forge.card.ability.AbilityUtils; import forge.card.spellability.SpellAbility; @@ -149,7 +150,7 @@ public class ReplacementHandler { ReplacementResult res = this.executeReplacement(runParams, chosenRE, decider, game); if (res != ReplacementResult.NotReplaced) { chosenRE.setHasRun(false); - game.getGameLog().add("ReplacementEffect", chosenRE.toString(), 2); + game.getGameLog().add("ReplacementEffect", chosenRE.toString(), GameLogLevel.EFFECT_REPLACED); return res; } else { if (possibleReplacers.size() == 0) { diff --git a/src/main/java/forge/control/FControl.java b/src/main/java/forge/control/FControl.java index 5e406d6e3ea..cace32c0608 100644 --- a/src/main/java/forge/control/FControl.java +++ b/src/main/java/forge/control/FControl.java @@ -375,5 +375,8 @@ public enum FControl { } // per player observers were set in CMatchUI.SINGLETON_INSTANCE.initMatch + //Set Field shown to current player. + VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(game.getPlayers().get(0)); + SDisplayUtil.showTab(nextField); } } diff --git a/src/main/java/forge/game/GameNew.java b/src/main/java/forge/game/GameNew.java index 945d5db9bf0..6a760bbc5d5 100644 --- a/src/main/java/forge/game/GameNew.java +++ b/src/main/java/forge/game/GameNew.java @@ -19,6 +19,7 @@ import com.google.common.collect.Lists; import forge.Card; import forge.CardLists; import forge.CardPredicates; +import forge.GameLogLevel; import forge.card.trigger.Trigger; import forge.card.trigger.TriggerHandler; import forge.card.trigger.TriggerType; @@ -313,10 +314,10 @@ public class GameNew { Predicate goodForAnte = Predicates.not(CardPredicates.Presets.BASIC_LANDS); Card ante = Aggregates.random(Iterables.filter(lib, goodForAnte)); if (ante == null) { - game.getGameLog().add("Ante", "Only basic lands found. Will ante one of them", 0); + game.getGameLog().add("Ante", "Only basic lands found. Will ante one of them", GameLogLevel.ANTE); ante = Aggregates.random(lib); } - game.getGameLog().add("Ante", p + " anted " + ante, 0); + game.getGameLog().add("Ante", p + " anted " + ante, GameLogLevel.ANTE); game.getAction().moveTo(ZoneType.Ante, ante); msg.append(p.getName()).append(" ante: ").append(ante).append(nl); } diff --git a/src/main/java/forge/game/GameOutcome.java b/src/main/java/forge/game/GameOutcome.java index ae658a76615..d259e579013 100644 --- a/src/main/java/forge/game/GameOutcome.java +++ b/src/main/java/forge/game/GameOutcome.java @@ -17,14 +17,16 @@ */ package forge.game; -import java.util.Arrays; -import java.util.HashMap; +import java.util.ArrayList; import java.util.Iterator; -import java.util.Map; +import java.util.List; import java.util.Map.Entry; +import org.apache.commons.lang3.tuple.Pair; + import forge.game.player.LobbyPlayer; import forge.game.player.Player; +import forge.game.player.PlayerOutcome; import forge.game.player.PlayerStatistics; /** @@ -39,7 +41,7 @@ import forge.game.player.PlayerStatistics; // This class might be divided in two parts: the very summary (immutable with // only getters) and // GameObserver class - who should be notified of any considerable ingame event -public final class GameOutcome implements Iterable> { +public final class GameOutcome implements Iterable> { /** The player got first turn. */ @@ -49,55 +51,32 @@ public final class GameOutcome implements Iterable playerRating = new HashMap(4); + private final List> playerRating = new ArrayList>(2); private GameEndReason winCondition; - /** - * Instantiates a new game summary. - * - * @param names - * the names - */ - public GameOutcome(GameEndReason reason, final Player... names) { - this(reason, Arrays.asList(names)); - } - public GameOutcome(GameEndReason reason, final Iterable list) { winCondition = reason; for (final Player n : list) { - this.playerRating.put(n.getLobbyPlayer(), n.getStats()); + this.playerRating.add(Pair.of(n.getLobbyPlayer(), n.getStats())); } } - - /** - * Checks if is draw. - * - * @return true, if is draw - */ public boolean isDraw() { - for (PlayerStatistics pv : playerRating.values()) { - - if (pv.getOutcome().hasWon()) { + for (Pair pv : playerRating) { + if (pv.getValue().getOutcome().hasWon()) { return false; } } return true; } - /** - * Checks if is winner. - * - * @param name - * the name - * @return true, if is winner - */ + public boolean isWinner(final LobbyPlayer who) { - PlayerStatistics stats = playerRating.get(who); - if ( stats == null ) - return false; - return stats.getOutcome().hasWon(); + for (Pair pv : playerRating) + if (pv.getValue().getOutcome().hasWon() && pv.getKey() == who ) + return true; + return false; } /** @@ -106,8 +85,7 @@ public final class GameOutcome implements Iterable ps : playerRating.entrySet()) { - + for (Entry ps : playerRating) { if (ps.getValue().getOutcome().hasWon()) { return ps.getKey(); } @@ -124,17 +102,6 @@ public final class GameOutcome implements Iterable pv : playerRating) { + PlayerOutcome po = pv.getValue().getOutcome(); + if (po.hasWon()) { + return po.altWinSourceName; } } return null; @@ -172,8 +139,8 @@ public final class GameOutcome implements Iterable> iterator() { - return playerRating.entrySet().iterator(); + public Iterator> iterator() { + return playerRating.iterator(); } /** @@ -184,4 +151,12 @@ public final class GameOutcome implements Iterable outcomes = new ArrayList(); - for (Entry p : 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); - game.getGameLog().add("Final", outcome, 0); - } - - final String statsSummary = generateSummary(); - game.getGameLog().add("Final", statsSummary, 0); - + // The log shall listen to events and generate text internally + game.getEvents().post(new DuelOutcomeEvent(result, gamesPlayedRo)); FThreads.invokeInEdtNowOrLater(new Runnable() { @Override public void run() { - String title = result.getWinner().getName() + " Won!"; ViewWinLose v = new ViewWinLose(MatchController.this); - v.setTitle(title); - v.setOutcomes(outcomes); - v.setStatsSummary(statsSummary); + SOverlayUtils.showOverlay(); } }); } @@ -149,10 +123,6 @@ public class MatchController { if(currentGame.getType() == GameType.Planechase) firstPlayer.initPlane(); - //Set Field shown to current player. - VField nextField = CMatchUI.SINGLETON_INSTANCE.getFieldViewFor(firstPlayer); - SDisplayUtil.showTab(nextField); - // Update observers currentGame.getGameLog().updateObservers(); @@ -190,6 +160,10 @@ public class MatchController { public GameOutcome getLastGameOutcome() { return gamesPlayed.isEmpty() ? null : gamesPlayed.get(gamesPlayed.size() - 1); } + + public Iterable getOutcomes() { + return gamesPlayedRo; + } public GameState getCurrentGame() { return currentGame; @@ -238,29 +212,6 @@ public class MatchController { return sum; } - public String generateSummary() { - HashMap playerWins = new HashMap(); - - for(Pair playerPair : this.players) { - playerWins.put(playerPair.getKey(), 0); - } - - for (GameOutcome go : gamesPlayed) { - LobbyPlayer p = go.getWinner(); - if (p != null) { - int incrementWins = playerWins.get(p) + 1; - playerWins.put(p, incrementWins); - } - } - - StringBuilder sb = new StringBuilder(""); - for(LobbyPlayer p : playerWins.keySet()) { - sb.append(p.getName()).append(": "); - sb.append(playerWins.get(p)).append(" "); - } - return sb.toString(); - } - /** * TODO: Write javadoc for this method. * diff --git a/src/main/java/forge/game/event/DuelOutcomeEvent.java b/src/main/java/forge/game/event/DuelOutcomeEvent.java index e6e6ab1a54e..4ab3aabee5a 100644 --- a/src/main/java/forge/game/event/DuelOutcomeEvent.java +++ b/src/main/java/forge/game/event/DuelOutcomeEvent.java @@ -1,11 +1,15 @@ package forge.game.event; -import forge.game.player.LobbyPlayer; +import java.util.List; + +import forge.game.GameOutcome; public class DuelOutcomeEvent extends Event { - public final LobbyPlayer winner; + public final GameOutcome result; + public final List history; - public DuelOutcomeEvent(LobbyPlayer winner) { - this.winner = winner; + public DuelOutcomeEvent(GameOutcome lastOne, List history) { + this.result = lastOne; + this.history = history; } } diff --git a/src/main/java/forge/game/phase/CombatUtil.java b/src/main/java/forge/game/phase/CombatUtil.java index 4d90c345ed1..bc51537e7f5 100644 --- a/src/main/java/forge/game/phase/CombatUtil.java +++ b/src/main/java/forge/game/phase/CombatUtil.java @@ -970,12 +970,12 @@ public class CombatUtil { * * @return a String */ - public static String getCombatAttackForLog(GameState game) { + public static String getCombatAttackForLog(final Combat combat) { final StringBuilder sb = new StringBuilder(); // Loop through Defenders // Append Defending Player/Planeswalker - final Combat combat = game.getCombat(); + // Not a big fan of the triple nested loop here @@ -999,12 +999,12 @@ public class CombatUtil { * * @return a String */ - public static String getCombatBlockForLog(GameState game) { + public static String getCombatBlockForLog(final Combat combat) { final StringBuilder sb = new StringBuilder(); // Loop through Defenders // Append Defending Player/Planeswalker - final Combat combat = game.getCombat(); + List blockers = null; @@ -1020,7 +1020,7 @@ public class CombatUtil { for (final Card attacker : attackers) { if ( !firstAttacker ) sb.append("\n"); - blockers = game.getCombat().getBlockers(attacker); + blockers = combat.getBlockers(attacker); if ( blockers.isEmpty() ) { sb.append(controllerName).append(" didn't block "); } else { diff --git a/src/main/java/forge/game/phase/PhaseHandler.java b/src/main/java/forge/game/phase/PhaseHandler.java index ed4ec13cf7f..dc42171e6ab 100644 --- a/src/main/java/forge/game/phase/PhaseHandler.java +++ b/src/main/java/forge/game/phase/PhaseHandler.java @@ -26,6 +26,7 @@ import com.esotericsoftware.minlog.Log; import forge.Card; import forge.FThreads; +import forge.GameLogLevel; import forge.Singletons; import forge.card.trigger.TriggerType; import forge.game.GameState; @@ -507,15 +508,16 @@ public class PhaseHandler extends MyObservable implements java.io.Serializable { } } - game.getGameLog().add(sb.toString(), this.getPlayerTurn() + " " + this.getPhase().Name, 6); + // **** Anything BELOW Here is actually in the next phase. Maybe move // this to handleBeginPhase if (this.phase == PhaseType.UNTAP) { this.turn++; - game.getGameLog().add("Turn", "Turn " + this.turn + " (" + this.getPlayerTurn() + ")", 0); + game.getGameLog().add("Turn", "Turn " + this.turn + " (" + this.getPlayerTurn() + ")", GameLogLevel.TURN); } - + + game.getGameLog().add(sb.toString(), this.getPlayerTurn() + " " + this.getPhase().Name, GameLogLevel.PHASE); PhaseUtil.visuallyActivatePhase(this.getPlayerTurn(), this.getPhase()); // When consecutively skipping phases (like in combat) this section diff --git a/src/main/java/forge/game/phase/PhaseUtil.java b/src/main/java/forge/game/phase/PhaseUtil.java index a138154a7ec..bc78b001782 100644 --- a/src/main/java/forge/game/phase/PhaseUtil.java +++ b/src/main/java/forge/game/phase/PhaseUtil.java @@ -26,6 +26,7 @@ import com.google.common.base.Predicate; import forge.Card; import forge.CardLists; import forge.CardPredicates.Presets; +import forge.GameLogLevel; import forge.card.cost.Cost; import forge.card.mana.ManaCost; import forge.card.spellability.Ability; @@ -175,7 +176,7 @@ public class PhaseUtil { } - game.getGameLog().add("Combat", CombatUtil.getCombatAttackForLog(game), 1); + game.getGameLog().add("Combat", CombatUtil.getCombatAttackForLog(game.getCombat()), GameLogLevel.COMBAT); final HashMap runParams = new HashMap(); runParams.put("Attackers", list); @@ -271,7 +272,7 @@ public class PhaseUtil { game.getStack().unfreezeStack(); - game.getGameLog().add("Combat", CombatUtil.getCombatBlockForLog(game), 1); + game.getGameLog().add("Combat", CombatUtil.getCombatBlockForLog(game.getCombat()), GameLogLevel.COMBAT); } diff --git a/src/main/java/forge/game/player/HumanPlay.java b/src/main/java/forge/game/player/HumanPlay.java index 83720f63a23..1590bc5257c 100644 --- a/src/main/java/forge/game/player/HumanPlay.java +++ b/src/main/java/forge/game/player/HumanPlay.java @@ -10,6 +10,7 @@ import forge.CardLists; import forge.CardPredicates.Presets; import forge.CounterType; import forge.FThreads; +import forge.GameLogLevel; import forge.card.ability.AbilityUtils; import forge.card.ability.ApiType; import forge.card.ability.effects.CharmEffect; @@ -355,7 +356,7 @@ public class HumanPlay { if (false == source.canReceiveCounters(counterType)) { String message = String.format("Won't be able to pay upkeep for %s but it can't have %s counters put on it.", source, counterType.getName()); - p.getGame().getGameLog().add("ResolveStack", message, 2); + p.getGame().getGameLog().add("ResolveStack", message, GameLogLevel.STACK); return false; } diff --git a/src/main/java/forge/game/player/Player.java b/src/main/java/forge/game/player/Player.java index 6bba252725f..8354da07dd9 100644 --- a/src/main/java/forge/game/player/Player.java +++ b/src/main/java/forge/game/player/Player.java @@ -39,6 +39,7 @@ import forge.Constant.Preferences; import forge.CounterType; import forge.FThreads; import forge.GameEntity; +import forge.GameLogLevel; import forge.Singletons; import forge.card.MagicColor; import forge.card.ability.AbilityFactory; @@ -680,7 +681,7 @@ public class Player extends GameEntity implements Comparable { game.getTriggerHandler().runTrigger(TriggerType.DamageDone, runParams, false); game.getGameLog().add("Damage", String.format("Dealing %d damage to %s. %s", - damageToDo, this.getName(), additionalLog), 3); + damageToDo, this.getName(), additionalLog), GameLogLevel.DAMAGE); return true; } @@ -1028,7 +1029,7 @@ public class Player extends GameEntity implements Comparable { this.poisonCounters += num; game.getEvents().post(new PoisonCounterEvent(this, source, num)); - game.getGameLog().add("Poison", this + " receives a poison counter from " + source, 3); + game.getGameLog().add("Poison", this + " receives a poison counter from " + source, GameLogLevel.DAMAGE); this.updateObservers(); } @@ -1255,7 +1256,7 @@ public class Player extends GameEntity implements Comparable { game.getEvents().post(new MulliganEvent(this)); // quest listener may interfere here final int newHand = getCardsIn(ZoneType.Hand).size(); - game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", 0); + game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", GameLogLevel.MULLIGAN); stats.notifyHasMulliganed(); stats.notifyOpeningHandSize(newHand); } @@ -1799,7 +1800,7 @@ public class Player extends GameEntity implements Comparable { game.getAction().checkStateEffects(); // add to log - game.getGameLog().add("Land", this + " played " + land, 2); + game.getGameLog().add("Land", this + " played " + land, GameLogLevel.LAND); // play a sound game.getEvents().post(new LandPlayedEvent(this, land)); @@ -3159,7 +3160,7 @@ public class Player extends GameEntity implements Comparable { public void onMulliganned() { game.getEvents().post(new MulliganEvent(this)); // quest listener may interfere here final int newHand = getCardsIn(ZoneType.Hand).size(); - game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", 0); + game.getGameLog().add("Mulligan", this + " has mulliganed down to " + newHand + " cards.", GameLogLevel.MULLIGAN); stats.notifyHasMulliganed(); stats.notifyOpeningHandSize(newHand); } diff --git a/src/main/java/forge/game/zone/MagicStack.java b/src/main/java/forge/game/zone/MagicStack.java index 534fd11f640..d1e2079d9dd 100644 --- a/src/main/java/forge/game/zone/MagicStack.java +++ b/src/main/java/forge/game/zone/MagicStack.java @@ -33,6 +33,7 @@ import forge.Card; import forge.CardLists; import forge.FThreads; import forge.CardPredicates.Presets; +import forge.GameLogLevel; import forge.card.ability.AbilityUtils; import forge.card.cardfactory.CardFactory; import forge.card.cardfactory.CardFactoryUtil; @@ -310,7 +311,7 @@ public class MagicStack extends MyObservable implements Iterable lblStats needs updating."); private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center")); - /** - * @param match */ @SuppressWarnings("serial") public ViewWinLose(MatchController match) { final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel(); @@ -177,23 +175,17 @@ public class ViewWinLose { } }); - SOverlayUtils.showOverlay(); + lblTitle.setText(match.getLastGameOutcome().getWinner().getName() + " Won!"); + + GameLog log = match.getCurrentGame().getGameLog(); + + for (GameLogEntry o : log.getLogEntriesExact(GameLogLevel.GAME_OUTCOME)) + pnlOutcomes.add(new FLabel.Builder().text(o.message).fontSize(14).build(), "h 20!"); + + for (GameLogEntry o : log.getLogEntriesExact(GameLogLevel.MATCH_RESULTS)) + lblStats.setText(o.message); } - public void setTitle(String title) { - lblTitle.setText(title); - } - - public void setOutcomes(List outcomes) { - for (String o : outcomes) { - pnlOutcomes.add(new FLabel.Builder().text(o).fontSize(14).build(), "h 20!"); - } - } - - public void setStatsSummary(String statsSummary) { - lblStats.setText(statsSummary); - } - /** @return {@link forge.gui.toolbox.FButton} */ public FButton getBtnContinue() { return this.btnContinue; diff --git a/src/main/java/forge/gui/match/views/VLog.java b/src/main/java/forge/gui/match/views/VLog.java index 83608182d08..7b56dcdd810 100644 --- a/src/main/java/forge/gui/match/views/VLog.java +++ b/src/main/java/forge/gui/match/views/VLog.java @@ -26,7 +26,8 @@ import javax.swing.border.EmptyBorder; import net.miginfocom.swing.MigLayout; import forge.GameLog; -import forge.GameLog.LogEntry; +import forge.GameLogEntry; +import forge.GameLogLevel; import forge.gui.framework.DragCell; import forge.gui.framework.DragTab; import forge.gui.framework.EDocID; @@ -118,13 +119,13 @@ public enum VLog implements IVDoc { // TODO - some option to make this configurable is probably desirable // By default, grab everything log level 3 or less. - final List data = model.getLogEntries(3); + final List data = model.getLogEntries(GameLogLevel.DAMAGE); final int size = data.size(); pnl.removeAll(); for (int i = size - 1; i >= 0; i--) { - JTextArea tar = new JTextArea(data.get(i).getMessage()); + JTextArea tar = new JTextArea(data.get(i).message); if (i % 2 == 1) { tar.setOpaque(false); } else { tar.setBackground(FSkin.getColor(FSkin.Colors.CLR_ZEBRA)); } diff --git a/src/main/java/forge/sound/EventVisualizer.java b/src/main/java/forge/sound/EventVisualizer.java index 1ef2d575fae..46311f5ad25 100644 --- a/src/main/java/forge/sound/EventVisualizer.java +++ b/src/main/java/forge/sound/EventVisualizer.java @@ -81,7 +81,7 @@ public class EventVisualizer { return getSoundEffectForTapState(((SetTappedEvent) evt).Tapped); } if (evt instanceof DuelOutcomeEvent) { - return getSoundEffectForDuelOutcome(((DuelOutcomeEvent) evt).winner.getType() == PlayerType.HUMAN); + return getSoundEffectForDuelOutcome(((DuelOutcomeEvent) evt).result.getWinner().getType() == PlayerType.HUMAN); } return fromMap;