- Added option to replace default "Human" with custom name during gameplay. (http://www.slightlymagic.net/forum/viewtopic.php?f=52&t=11553).

This commit is contained in:
spr
2013-10-07 19:56:00 +00:00
parent a8cf682f71
commit db9a451e32
16 changed files with 1708 additions and 1498 deletions

1
.gitattributes vendored
View File

@@ -15187,6 +15187,7 @@ src/main/java/forge/gui/home/settings/CSubmenuAvatars.java -text
src/main/java/forge/gui/home/settings/CSubmenuDownloaders.java -text
src/main/java/forge/gui/home/settings/CSubmenuPreferences.java -text
src/main/java/forge/gui/home/settings/CSubmenuReleaseNotes.java -text
src/main/java/forge/gui/home/settings/GamePlayerUtil.java -text
src/main/java/forge/gui/home/settings/VSubmenuAvatars.java -text
src/main/java/forge/gui/home/settings/VSubmenuDownloaders.java -text
src/main/java/forge/gui/home/settings/VSubmenuPreferences.java -text

View File

@@ -1,6 +1,5 @@
package forge;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.Map.Entry;
@@ -9,27 +8,25 @@ import com.google.common.eventbus.Subscribe;
import forge.card.spellability.TargetChoices;
import forge.game.GameOutcome;
import forge.game.event.GameEvent;
import forge.game.event.GameEventAttackersDeclared;
import forge.game.event.GameEventBlockersDeclared;
import forge.game.event.GameEventCardDamaged;
import forge.game.event.GameEventCardDamaged.DamageType;
import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventMulligan;
import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventPlayerDamaged;
import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventSpellAbilityCast;
import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnBegan;
import forge.game.event.IGameEventVisitor;
import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEvent;
import forge.game.event.GameEventTurnPhase;
import forge.game.event.GameEventPlayerControl;
import forge.game.event.IGameEventVisitor;
import forge.game.player.LobbyPlayer;
import forge.game.player.Player;
import forge.game.player.PlayerStatistics;
import forge.game.zone.ZoneType;
import forge.net.FServer;
import forge.util.Lang;
import forge.util.maps.MapOfLists;
@@ -42,18 +39,10 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override
public GameLogEntry visit(GameEventGameOutcome ev) {
// add result entries to the game log
final LobbyPlayer human = FServer.instance.getLobby().getGuiPlayer();
// This adds some extra entries to log
final List<String> outcomes = new ArrayList<String>();
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);
for (Player p : ev.result.getPlayers()) {
String outcome = String.format("%s has %s", p.getName(), p.getOutcome().toString());
log.add(GameLogEntryType.GAME_OUTCOME, outcome);
}
return generateSummary(ev.history);
}
@@ -91,25 +80,31 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
}
private GameLogEntry generateSummary(List<GameOutcome> 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) {
GameOutcome outcome1 = gamesPlayed.get(0);
List<Player> players = outcome1.getPlayers();
final int[] wins = new int[players.size()];
// Calculate total games each player has won.
for (GameOutcome game : gamesPlayed) {
int i = 0;
for(Entry<LobbyPlayer, PlayerStatistics> ps : go) {
players[i] = ps.getKey();
if( ps.getValue().getOutcome().hasWon() )
for (Player p : game.getPlayers()) {
if (p.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(" ");
Player player = players.get(i);
String playerName = player.getName();
playerName += " [" + player.getOriginalLobbyPlayer().getType() + "]";
sb.append(playerName).append(": ").append(wins[i]).append(" ");
}
return new GameLogEntry(GameLogEntryType.MATCH_RESULTS, sb.toString());
}

View File

@@ -35,6 +35,8 @@ import javax.swing.JLayeredPane;
import javax.swing.SwingUtilities;
import javax.swing.WindowConstants;
import org.apache.commons.lang.StringUtils;
import forge.Card;
import forge.Constant.Preferences;
import forge.Singletons;
@@ -42,7 +44,10 @@ import forge.control.KeyboardShortcuts.Shortcut;
import forge.game.Game;
import forge.game.GameType;
import forge.game.Match;
import forge.game.RegisteredPlayer;
import forge.game.player.LobbyPlayer;
import forge.game.player.LobbyPlayerAi;
import forge.game.player.LobbyPlayerHuman;
import forge.game.player.Player;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
@@ -56,6 +61,7 @@ import forge.gui.framework.SOverflowUtil;
import forge.gui.framework.SResizingUtil;
import forge.gui.home.CHomeUI;
import forge.gui.home.VHomeUI;
import forge.gui.home.settings.GamePlayerUtil;
import forge.gui.match.CMatchUI;
import forge.gui.match.VMatchUI;
import forge.gui.match.controllers.CDock;
@@ -67,6 +73,7 @@ import forge.gui.match.views.VAntes;
import forge.gui.menus.ForgeMenu;
import forge.gui.toolbox.FSkin;
import forge.net.FServer;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants;
import forge.quest.QuestController;
@@ -413,6 +420,7 @@ public enum FControl implements KeyEventDispatcher {
public final void startGameWithUi(Match match) {
setPlayerName(match.getPlayers());
Game newGame = match.createGame();
attachToGame(newGame);
match.startGame(newGame, null);
@@ -512,5 +520,23 @@ public enum FControl implements KeyEventDispatcher {
//Allow the event to be redispatched
return false;
}
/**
* Prompts user for a name that will be used instead of "Human" during gameplay.
* <p>
* This is a one time only event that is triggered when starting a game and the
* PLAYER_NAME setting is blank. Does not apply to a hotseat game.
*/
private void setPlayerName(List<RegisteredPlayer> players) {
final ForgePreferences prefs = Singletons.getModel().getPreferences();
if (StringUtils.isBlank(prefs.getPref(FPref.PLAYER_NAME))) {
boolean isPlayerOneHuman = players.get(0).getPlayer() instanceof LobbyPlayerHuman;
boolean isPlayerTwoComputer = players.get(1).getPlayer() instanceof LobbyPlayerAi;
if (isPlayerOneHuman && isPlayerTwoComputer) {
GamePlayerUtil.setPlayerName();
}
}
}
}

View File

@@ -53,10 +53,13 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
/** The player rating. */
private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2);
private final Iterable<Player> players;
private GameEndReason winCondition;
public GameOutcome(GameEndReason reason, final Iterable<Player> list) {
winCondition = reason;
players = list;
for (final Player n : list) {
this.playerRating.add(Pair.of(n.getLobbyPlayer(), n.getStats()));
}
@@ -84,7 +87,7 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
*
* @return the winner
*/
public LobbyPlayer getWinner() {
public LobbyPlayer getWinningLobbyPlayer() {
for (Entry<LobbyPlayer, PlayerStatistics> ps : playerRating) {
if (ps.getValue().getOutcome().hasWon()) {
return ps.getKey();
@@ -93,6 +96,21 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
return null;
}
/**
* Gets winning {@code Player}.
* <p>
* Alternative to {@link getWinningLobbyPlayer()} which does not
* distinguish between human player names (a problem for hotseat games).
*/
public Player getWinningPlayer() {
for (Player p: players) {
if (p.getOutcome().hasWon()) {
return p;
}
}
return null;
}
/**
* Gets the win condition.
*
@@ -159,4 +177,8 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
return playerRating.size();
}
public List<Player> getPlayers() {
return (List<Player>)players;
}
}

View File

@@ -137,7 +137,7 @@ public class Match {
public boolean isMatchOver() {
int[] victories = new int[players.size()];
for (GameOutcome go : gamesPlayed) {
LobbyPlayer winner = go.getWinner();
LobbyPlayer winner = go.getWinningLobbyPlayer();
int i = 0;
for (RegisteredPlayer p : players) {
if (p.getPlayer().equals(winner)) {
@@ -165,7 +165,7 @@ public class Match {
public int getGamesWonBy(LobbyPlayer questPlayer) {
int sum = 0;
for (GameOutcome go : gamesPlayed) {
if (questPlayer.equals(go.getWinner())) {
if (questPlayer.equals(go.getWinningLobbyPlayer())) {
sum++;
}
}

View File

@@ -52,16 +52,17 @@ import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility;
import forge.card.staticability.StaticAbility;
import forge.card.trigger.TriggerType;
import forge.game.GameActionUtil;
import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.GameAge;
import forge.game.GameType;
import forge.game.GlobalRuleChange;
import forge.game.RegisteredPlayer;
import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventPlayerLivesChanged;
import forge.game.event.GameEventMulligan;
import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventPlayerDamaged;
import forge.game.event.GameEventPlayerLivesChanged;
import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventShuffle;
import forge.game.phase.PhaseHandler;
@@ -72,6 +73,7 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType;
import forge.gui.GuiChoose;
import forge.gui.GuiDialog;
import forge.gui.GuiDisplayUtil;
import forge.properties.ForgePreferences.FPref;
import forge.util.Lang;
import forge.util.MyRandom;
@@ -210,7 +212,16 @@ public class Player extends GameEntity implements Comparable<Player> {
: new PlayerZone(z, this);
this.zones.put(z, toPut);
}
this.setName(chooseName(name));
if (isHotSeatGame(game)) {
if (game.getPlayers().size() == 1) {
Player player1 = game.getPlayers().get(0);
player1.setName("Player 1");
this.setName("Player 2");
}
} else {
this.setName(chooseName(GuiDisplayUtil.personalizeHuman(name)));
}
}
private String chooseName(String originalName) {
@@ -1580,7 +1591,7 @@ public class Player extends GameEntity implements Comparable<Player> {
}
}
return 0;
// throw new RuntimeException("Input_Draw : getDredgeNumber() card doesn't have dredge - " + c.getName());
// throw new RuntimeException("Input_Draw : getDredgeNumber() card doesn't have dredge - " + c.getName());
} // getDredgeNumber()
/**
@@ -3219,4 +3230,15 @@ public class Player extends GameEntity implements Comparable<Player> {
public boolean isPlayingExtraTurn() {
return isPlayingExtraTrun;
}
private boolean isHotSeatGame(Game game0) {
boolean isHotSeat = false;
List<RegisteredPlayer> players = game0.getMatch().getPlayers();
if (players.size() == 2) {
boolean isPlayer1Human = players.get(0).getPlayer().getType() == PlayerType.HUMAN;
boolean isPlayer2Human = players.get(1).getPlayer().getType() == PlayerType.HUMAN;
isHotSeat = (isPlayer1Human && isPlayer2Human);
}
return isHotSeat;
}
}

View File

@@ -32,6 +32,7 @@ import java.util.Map.Entry;
import javax.swing.JFileChooser;
import javax.swing.JOptionPane;
import com.google.common.base.Predicates;
import com.google.common.collect.Lists;
@@ -53,8 +54,9 @@ import forge.game.player.HumanPlay;
import forge.game.player.Player;
import forge.game.zone.ZoneType;
import forge.gui.input.InputSelectCardsFromList;
import forge.item.PaperCard;
import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref;
public final class GuiDisplayUtil {
private GuiDisplayUtil() {
@@ -496,5 +498,14 @@ public final class GuiDisplayUtil {
return Singletons.getControl().getObservedGame();
}
public static String getPlayerName() {
return Singletons.getModel().getPreferences().getPref(FPref.PLAYER_NAME);
}
public static String personalizeHuman(String text) {
String playerName = Singletons.getModel().getPreferences().getPref(FPref.PLAYER_NAME);
return text.replaceAll("(?i)human", playerName);
}
} // end class GuiDisplayUtil

View File

@@ -3,12 +3,16 @@ package forge.gui.home.settings;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;
import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JCheckBox;
import javax.swing.JComboBox;
import javax.swing.JOptionPane;
import javax.swing.SwingUtilities;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.tuple.Pair;
import forge.Command;
@@ -21,14 +25,11 @@ import forge.game.ai.AiProfileUtil;
import forge.gui.framework.ICDoc;
import forge.gui.framework.SLayoutIO;
import forge.gui.toolbox.FComboBoxPanel;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
/**
* Controls the preferences submenu in the home UI.
*
@@ -123,6 +124,7 @@ public enum CSubmenuPreferences implements ICDoc {
initializeGameLogVerbosityComboBox();
initializeAiProfilesComboBox();
initializeSkinsComboBox();
initializePlayerNameButton();
}
@@ -136,6 +138,7 @@ public enum CSubmenuPreferences implements ICDoc {
this.view = VSubmenuPreferences.SINGLETON_INSTANCE;
this.prefs = Singletons.getModel().getPreferences();
setPlayerNameButtonText();
view.getCbDevMode().setSelected(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED));
for(Pair<JCheckBox, FPref> kv: lstControls) {
@@ -260,4 +263,29 @@ public enum CSubmenuPreferences implements ICDoc {
}
});
}
private void initializePlayerNameButton() {
FLabel btn = view.getBtnPlayerName();
setPlayerNameButtonText();
btn.setCommand(getPlayerNameButtonCommand());
}
private void setPlayerNameButtonText() {
FLabel btn = view.getBtnPlayerName();
String name = prefs.getPref(FPref.PLAYER_NAME);
btn.setText(StringUtils.isBlank(name) ? "Human" : name);
}
@SuppressWarnings("serial")
private Command getPlayerNameButtonCommand() {
return new Command() {
@Override
public void run() {
GamePlayerUtil.setPlayerName();
setPlayerNameButtonText();
}
};
}
}

View File

@@ -0,0 +1,70 @@
package forge.gui.home.settings;
import javax.swing.JOptionPane;
import org.apache.commons.lang.StringUtils;
import forge.Singletons;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref;
public final class GamePlayerUtil {
private GamePlayerUtil() { };
private final static ForgePreferences prefs = Singletons.getModel().getPreferences();
public static void setPlayerName() {
String playerName = prefs.getPref(FPref.PLAYER_NAME);
String newName = null;
if (StringUtils.isBlank(playerName)) {
newName = (String)JOptionPane.showInputDialog(
Singletons.getView().getFrame(),
"By default, Forge will refer to you as the \"Human\" during gameplay.\n" +
"If you would prefer a different name please enter it now.\n",
"Personalize Forge Gameplay",
JOptionPane.QUESTION_MESSAGE,
null, null, null);
} else {
newName = getNewPlayerNameFromInputDialog(playerName);
}
if (newName == null || !StringUtils.isAlphanumericSpace(newName)) {
newName = (StringUtils.isBlank(playerName) ? "Human" : playerName);
} else if (StringUtils.isWhitespace(newName)) {
newName = "Human";
} else {
newName = newName.trim();
}
prefs.setPref(FPref.PLAYER_NAME, newName);
prefs.save();
if (StringUtils.isBlank(playerName) && newName != "Human") {
JOptionPane.showMessageDialog(
Singletons.getView().getFrame(),
"Thank you, " + newName + ". " +
"You will not be prompted again but you can change\nyour name at any time using the \"Player Name\" setting in Preferences.\n\n");
}
}
private static String getNewPlayerNameFromInputDialog(String playerName) {
String newName =
(String)JOptionPane.showInputDialog(
Singletons.getView().getFrame(),
"Please enter a new name (alpha-numeric only)\n",
"Personalize Forge Gameplay",
JOptionPane.PLAIN_MESSAGE,
null, null, playerName);
if (newName == null || !StringUtils.isAlphanumericSpace(newName)) {
return playerName;
} else if (StringUtils.isWhitespace(newName)) {
return "Human";
} else {
return newName.trim();
}
}
}

View File

@@ -1,6 +1,7 @@
package forge.gui.home.settings;
import java.awt.Color;
import java.awt.Font;
import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter;
@@ -17,6 +18,7 @@ import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils;
@@ -59,6 +61,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
private final FLabel btnReset = new FLabel.Builder().opaque(true).hoverable(true).text("Reset to Default Settings").build();
private final FLabel btnDeleteMatchUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Match Layout").build();
private final FLabel btnDeleteEditorUI = new FLabel.Builder().opaque(true).hoverable(true).text("Reset Editor Layout").build();
private final FLabel btnPlayerName = new FLabel.Builder().opaque(true).hoverable(true).text("").build();
private final JCheckBox cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures");
private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode");
@@ -119,6 +122,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
// General Configuration
pnlPrefs.add(new SectionLabel("General Configuration"), sectionConstraints + ", gaptop 2%");
pnlPrefs.add(getPlayerNamePanel(), regularConstraints + ", h 26px!");
pnlPrefs.add(new NoteLabel("Sets the name that you will be referred to by Forge during gameplay."), regularConstraints);
pnlPrefs.add(cbCompactMainMenu, regularConstraints);
pnlPrefs.add(new NoteLabel("Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED)."), regularConstraints);
@@ -528,6 +534,10 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
return cbUseThemedComboBox;
}
public FLabel getBtnPlayerName() {
return btnPlayerName;
}
//========== Overridden from IVDoc
public final FLabel getBtnDeleteMatchUI() {
@@ -577,4 +587,13 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
public DragCell getParentCell() {
return parentCell;
}
private JPanel getPlayerNamePanel() {
JPanel p = new JPanel(new MigLayout("insets 0, gap 0!"));
p.setOpaque(false);
FLabel lbl = new FLabel.Builder().text("Player Name: ").fontSize(12).fontStyle(Font.BOLD).build();
p.add(lbl, "aligny top, h 100%");
p.add(btnPlayerName, "aligny top, h 100%, w 200px!");
return p;
}
}

View File

@@ -134,7 +134,7 @@ public class QuestWinLose extends ControlWinLose {
// Ante returns to owners in a draw
if (!outcome.isDraw()) {
boolean isHumanWinner = outcome.getWinner().equals(questPlayer);
boolean isHumanWinner = outcome.getWinningLobbyPlayer().equals(questPlayer);
final List<PaperCard> anteCards = new ArrayList<PaperCard>();
for (Player p : lastGame.getRegisteredPlayers()) {
if (p.getLobbyPlayer().equals(questPlayer) == isHumanWinner) {

View File

@@ -5,14 +5,13 @@ import java.awt.Font;
import java.awt.Point;
import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.SwingConstants;
import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import net.miginfocom.swing.MigLayout;
import forge.Command;
import forge.GameLog;
@@ -21,15 +20,13 @@ import forge.GameLogEntryType;
import forge.Singletons;
import forge.game.Game;
import forge.game.GameOutcome;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerStatistics;
import forge.game.player.Player;
import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FOverlay;
import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextArea;
import forge.net.FServer;
/**
* TODO: Write javadoc for this type.
@@ -43,8 +40,13 @@ public class ViewWinLose {
private final JLabel lblStats = new JLabel("WinLoseFrame > lblStats needs updating.");
private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center"));
private final Game game;
@SuppressWarnings("serial")
public ViewWinLose(final Game game) {
public ViewWinLose(final Game game0) {
game = game0;
final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel();
final JPanel pnlLeft = new JPanel();
@@ -56,30 +58,30 @@ public class ViewWinLose {
btnRestart = new FButton();
btnQuit = new FButton();
// Control of the win/lose is handled differently for various game modes.
// Control of the win/lose is handled differently for various game
// modes.
ControlWinLose control = null;
switch (game.getType()) {
switch (game0.getType()) {
case Quest:
control = new QuestWinLose(this, game);
control = new QuestWinLose(this, game0);
break;
case Draft:
if (!Singletons.getModel().getGauntletMini().isGauntletDraft()) {
break;
}
case Sealed:
control = new LimitedWinLose(this, game);
control = new LimitedWinLose(this, game0);
break;
case Gauntlet:
control = new GauntletWinLose(this, game);
control = new GauntletWinLose(this, game0);
break;
default: // will catch it after switch
break;
}
if (null == control) {
control = new ControlWinLose(this, game);
control = new ControlWinLose(this, game0);
}
pnlLeft.setOpaque(false);
pnlRight.setOpaque(false);
pnlCustom.setOpaque(false);
@@ -97,17 +99,17 @@ public class ViewWinLose {
lblStats.setHorizontalAlignment(SwingConstants.CENTER);
FSkin.get(lblStats).setFont(FSkin.getFont(26));
btnContinue.setText("Continue");
btnContinue.setText("Next Game");
FSkin.get(btnContinue).setFont(FSkin.getFont(22));
btnRestart.setText("Restart");
btnRestart.setText("Start New Match");
FSkin.get(btnRestart).setFont(FSkin.getFont(22));
btnQuit.setText("Quit");
btnQuit.setText("Quit Match");
FSkin.get(btnQuit).setFont(FSkin.getFont(22));
btnContinue.setEnabled(!game.getMatch().isMatchOver());
btnContinue.setEnabled(!game0.getMatch().isMatchOver());
// Assemble game log scroller.
final FTextArea txtLog = new FTextArea();
txtLog.setText(game.getGameLog().getLogText(null));
txtLog.setText(game.getGameLog().getLogText(null).replace("[COMPUTER]", "[AI]"));
FSkin.get(txtLog).setFont(FSkin.getFont(14));
txtLog.setFocusable(true); // allow highlighting and copying of log
@@ -135,8 +137,7 @@ public class ViewWinLose {
overlay.add(pnlLeft, "w 40%!, h 100%!");
overlay.add(pnlRight, "w 60%!, h 100%!");
pnlRight.add(scrCustom, "w 100%!, h 100%!");
}
else {
} else {
overlay.add(pnlLeft, "w 100%!, h 100%!");
}
@@ -160,9 +161,9 @@ public class ViewWinLose {
scrLog.setBorder(null);
pnlLog.setOpaque(false);
pnlLog.add(new FLabel.Builder().text("Game Log").fontAlign(SwingConstants.CENTER)
.fontSize(18).fontStyle(Font.BOLD).build(),
"w 300px!, h 28px!, gaptop 20px");
pnlLog.add(
new FLabel.Builder().text("Game Log").fontAlign(SwingConstants.CENTER).fontSize(18)
.fontStyle(Font.BOLD).build(), "w 300px!, h 28px!, gaptop 20px");
pnlLog.add(scrLog, "w 300px!, h 100px!, gap 0 0 10 10");
pnlLog.add(btnCopyLog, "center, w pref+16, h pref+8");
@@ -172,7 +173,8 @@ public class ViewWinLose {
@Override
public void run() {
scrLog.getViewport().setViewPosition(new Point(0, 0));
// populateCustomPanel may have changed which buttons are enabled; focus on the 'best' one
// populateCustomPanel may have changed which buttons are
// enabled; focus on the 'best' one
if (btnContinue.isEnabled()) {
btnContinue.requestFocusInWindow();
} else {
@@ -181,29 +183,20 @@ public class ViewWinLose {
}
});
lblTitle.setText(composeTitle(game.getOutcome()));
lblTitle.setText(composeTitle(game0.getOutcome()));
GameLog log = game.getGameLog();
showGameOutcomeSummary();
showPlayerScores();
for (GameLogEntry o : log.getLogEntriesExact(GameLogEntryType.GAME_OUTCOME))
pnlOutcomes.add(new FLabel.Builder().text(o.message).fontSize(14).build(), "h 20!");
for (GameLogEntry o : log.getLogEntriesExact(GameLogEntryType.MATCH_RESULTS))
lblStats.setText(o.message);
}
private String composeTitle(GameOutcome outcome) {
LobbyPlayer guiPlayer = FServer.instance.getLobby().getGuiPlayer();
int nHumansInGame = 0;
for(Pair<LobbyPlayer, PlayerStatistics> pps : outcome) {
if( pps.getKey() == guiPlayer )
nHumansInGame++;
}
LobbyPlayer winner = outcome.getWinner();
if ( winner == null )
Player winner = outcome.getWinningPlayer();
if (winner == null) {
return "It's a draw!";
return nHumansInGame == 1 ? "You " + (winner == guiPlayer ? "won!" : "lost!") : winner.getName() + " Won!";
} else {
return winner.getName() + " Won!";
}
}
/** @return {@link forge.gui.toolbox.FButton} */
@@ -225,4 +218,21 @@ public class ViewWinLose {
public JPanel getPnlCustom() {
return this.pnlCustom;
}
private void showGameOutcomeSummary() {
GameLog log = game.getGameLog();
for (GameLogEntry o : log.getLogEntriesExact(GameLogEntryType.GAME_OUTCOME))
pnlOutcomes.add(new FLabel.Builder().text(o.message).fontSize(14).build(), "h 20!");
}
private void showPlayerScores() {
GameLog log = game.getGameLog();
for (GameLogEntry o : log.getLogEntriesExact(GameLogEntryType.MATCH_RESULTS)) {
lblStats.setText(removePlayerTypeFromLogMessage(o.message));
}
}
private String removePlayerTypeFromLogMessage(String message) {
return message.replaceAll("\\[[^\\]]*\\]", "");
}
}

View File

@@ -107,7 +107,7 @@ public enum FServer {
for(GameLogEntry l : log)
System.out.println(l);
System.out.println(String.format("\nGame %d ended in %d ms. %s has won!\n", 1+iGame, sw.getTime(), g1.getOutcome().getWinner().getName()));
System.out.println(String.format("\nGame %d ended in %d ms. %s has won!\n", 1+iGame, sw.getTime(), g1.getOutcome().getWinningLobbyPlayer().getName()));
}

View File

@@ -9,6 +9,7 @@ import forge.game.player.LobbyPlayer;
import forge.game.player.LobbyPlayerAi;
import forge.game.player.LobbyPlayerHuman;
import forge.game.player.LobbyPlayerRemote;
import forge.gui.GuiDisplayUtil;
import forge.gui.toolbox.FSkin;
import forge.net.client.INetClient;
import forge.util.MyRandom;
@@ -85,8 +86,12 @@ public class Lobby {
*/
private String getRandomName() {
Random my = MyRandom.getRandom();
return opponentNames[my.nextInt(opponentNames.length)];
String playerName = GuiDisplayUtil.getPlayerName();
String aiName = opponentNames[my.nextInt(opponentNames.length)];
while (aiName.equalsIgnoreCase(playerName)) {
aiName = opponentNames[my.nextInt(opponentNames.length)];
}
return aiName;
}
/**

View File

@@ -34,6 +34,7 @@ public class ForgePreferences extends PreferencesStore<ForgePreferences.FPref> {
* Preference identifiers, and their default values.
*/
public static enum FPref {
PLAYER_NAME (""),
CONSTRUCTED_P1_DECK_STATE(""),
CONSTRUCTED_P2_DECK_STATE(""),
CONSTRUCTED_GAMEPLAYERS(""),

View File

@@ -79,7 +79,7 @@ public class EventVisualizer extends IGameEventVisitor.Base<SoundEffectType> imp
* Plays the sound corresponding to the outcome of the duel.
*/
public SoundEffectType visit(GameEventGameOutcome event) {
boolean humanWonTheDuel = event.result.getWinner() == FServer.instance.getLobby().getGuiPlayer();
boolean humanWonTheDuel = event.result.getWinningLobbyPlayer() == FServer.instance.getLobby().getGuiPlayer();
return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel;
}