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;