- 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/CSubmenuDownloaders.java -text
src/main/java/forge/gui/home/settings/CSubmenuPreferences.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/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/VSubmenuAvatars.java -text
src/main/java/forge/gui/home/settings/VSubmenuDownloaders.java -text src/main/java/forge/gui/home/settings/VSubmenuDownloaders.java -text
src/main/java/forge/gui/home/settings/VSubmenuPreferences.java -text src/main/java/forge/gui/home/settings/VSubmenuPreferences.java -text

View File

@@ -1,6 +1,5 @@
package forge; package forge;
import java.util.ArrayList;
import java.util.Collection; import java.util.Collection;
import java.util.List; import java.util.List;
import java.util.Map.Entry; import java.util.Map.Entry;
@@ -9,27 +8,25 @@ import com.google.common.eventbus.Subscribe;
import forge.card.spellability.TargetChoices; import forge.card.spellability.TargetChoices;
import forge.game.GameOutcome; import forge.game.GameOutcome;
import forge.game.event.GameEvent;
import forge.game.event.GameEventAttackersDeclared; import forge.game.event.GameEventAttackersDeclared;
import forge.game.event.GameEventBlockersDeclared; import forge.game.event.GameEventBlockersDeclared;
import forge.game.event.GameEventCardDamaged; import forge.game.event.GameEventCardDamaged;
import forge.game.event.GameEventCardDamaged.DamageType; import forge.game.event.GameEventCardDamaged.DamageType;
import forge.game.event.GameEventGameOutcome;
import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventMulligan; import forge.game.event.GameEventMulligan;
import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventPlayerDamaged; import forge.game.event.GameEventPlayerDamaged;
import forge.game.event.GameEventPlayerPoisoned; import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventSpellAbilityCast; import forge.game.event.GameEventSpellAbilityCast;
import forge.game.event.GameEventSpellResolved; import forge.game.event.GameEventSpellResolved;
import forge.game.event.GameEventTurnBegan; 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.GameEventTurnPhase;
import forge.game.event.GameEventPlayerControl; import forge.game.event.IGameEventVisitor;
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.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.net.FServer;
import forge.util.Lang; import forge.util.Lang;
import forge.util.maps.MapOfLists; import forge.util.maps.MapOfLists;
@@ -42,18 +39,10 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
@Override @Override
public GameLogEntry visit(GameEventGameOutcome ev) { public GameLogEntry visit(GameEventGameOutcome ev) {
// add result entries to the game log for (Player p : ev.result.getPlayers()) {
final LobbyPlayer human = FServer.instance.getLobby().getGuiPlayer(); String outcome = String.format("%s has %s", p.getName(), p.getOutcome().toString());
// 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);
log.add(GameLogEntryType.GAME_OUTCOME, outcome); log.add(GameLogEntryType.GAME_OUTCOME, outcome);
} }
return generateSummary(ev.history); return generateSummary(ev.history);
} }
@@ -91,25 +80,31 @@ public class GameLogFormatter extends IGameEventVisitor.Base<GameLogEntry> {
} }
private GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) { private GameLogEntry generateSummary(List<GameOutcome> gamesPlayed) {
GameOutcome outcome1 = gamesPlayed.get(0);
int[] wins = new int[outcome1.getNumPlayers()];
LobbyPlayer[] players = new LobbyPlayer[outcome1.getNumPlayers()];
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; int i = 0;
for(Entry<LobbyPlayer, PlayerStatistics> ps : go) { for (Player p : game.getPlayers()) {
players[i] = ps.getKey(); if (p.getOutcome().hasWon()) {
if( ps.getValue().getOutcome().hasWon() )
wins[i]++; wins[i]++;
}
i++; i++;
} }
} }
StringBuilder sb = new StringBuilder(); StringBuilder sb = new StringBuilder();
for(int i = 0; i < wins.length; i++) { 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()); 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.SwingUtilities;
import javax.swing.WindowConstants; import javax.swing.WindowConstants;
import org.apache.commons.lang.StringUtils;
import forge.Card; import forge.Card;
import forge.Constant.Preferences; import forge.Constant.Preferences;
import forge.Singletons; import forge.Singletons;
@@ -42,7 +44,10 @@ import forge.control.KeyboardShortcuts.Shortcut;
import forge.game.Game; import forge.game.Game;
import forge.game.GameType; import forge.game.GameType;
import forge.game.Match; import forge.game.Match;
import forge.game.RegisteredPlayer;
import forge.game.player.LobbyPlayer; import forge.game.player.LobbyPlayer;
import forge.game.player.LobbyPlayerAi;
import forge.game.player.LobbyPlayerHuman;
import forge.game.player.Player; import forge.game.player.Player;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils; import forge.gui.SOverlayUtils;
@@ -56,6 +61,7 @@ import forge.gui.framework.SOverflowUtil;
import forge.gui.framework.SResizingUtil; import forge.gui.framework.SResizingUtil;
import forge.gui.home.CHomeUI; import forge.gui.home.CHomeUI;
import forge.gui.home.VHomeUI; import forge.gui.home.VHomeUI;
import forge.gui.home.settings.GamePlayerUtil;
import forge.gui.match.CMatchUI; import forge.gui.match.CMatchUI;
import forge.gui.match.VMatchUI; import forge.gui.match.VMatchUI;
import forge.gui.match.controllers.CDock; import forge.gui.match.controllers.CDock;
@@ -67,6 +73,7 @@ import forge.gui.match.views.VAntes;
import forge.gui.menus.ForgeMenu; import forge.gui.menus.ForgeMenu;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.net.FServer; import forge.net.FServer;
import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.properties.NewConstants; import forge.properties.NewConstants;
import forge.quest.QuestController; import forge.quest.QuestController;
@@ -413,6 +420,7 @@ public enum FControl implements KeyEventDispatcher {
public final void startGameWithUi(Match match) { public final void startGameWithUi(Match match) {
setPlayerName(match.getPlayers());
Game newGame = match.createGame(); Game newGame = match.createGame();
attachToGame(newGame); attachToGame(newGame);
match.startGame(newGame, null); match.startGame(newGame, null);
@@ -512,5 +520,23 @@ public enum FControl implements KeyEventDispatcher {
//Allow the event to be redispatched //Allow the event to be redispatched
return false; 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. */ /** The player rating. */
private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2); private final List<Pair<LobbyPlayer, PlayerStatistics>> playerRating = new ArrayList<Pair<LobbyPlayer, PlayerStatistics>>(2);
private final Iterable<Player> players;
private GameEndReason winCondition; private GameEndReason winCondition;
public GameOutcome(GameEndReason reason, final Iterable<Player> list) { public GameOutcome(GameEndReason reason, final Iterable<Player> list) {
winCondition = reason; winCondition = reason;
players = list;
for (final Player n : list) { for (final Player n : list) {
this.playerRating.add(Pair.of(n.getLobbyPlayer(), n.getStats())); 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 * @return the winner
*/ */
public LobbyPlayer getWinner() { public LobbyPlayer getWinningLobbyPlayer() {
for (Entry<LobbyPlayer, PlayerStatistics> ps : playerRating) { for (Entry<LobbyPlayer, PlayerStatistics> ps : playerRating) {
if (ps.getValue().getOutcome().hasWon()) { if (ps.getValue().getOutcome().hasWon()) {
return ps.getKey(); return ps.getKey();
@@ -93,6 +96,21 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
return null; 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. * Gets the win condition.
* *
@@ -159,4 +177,8 @@ public final class GameOutcome implements Iterable<Pair<LobbyPlayer, PlayerStati
return playerRating.size(); return playerRating.size();
} }
public List<Player> getPlayers() {
return (List<Player>)players;
}
} }

View File

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

View File

@@ -52,16 +52,17 @@ import forge.card.spellability.Ability;
import forge.card.spellability.SpellAbility; import forge.card.spellability.SpellAbility;
import forge.card.staticability.StaticAbility; import forge.card.staticability.StaticAbility;
import forge.card.trigger.TriggerType; import forge.card.trigger.TriggerType;
import forge.game.GameActionUtil;
import forge.game.Game; import forge.game.Game;
import forge.game.GameActionUtil;
import forge.game.GameAge; import forge.game.GameAge;
import forge.game.GameType; import forge.game.GameType;
import forge.game.GlobalRuleChange; import forge.game.GlobalRuleChange;
import forge.game.RegisteredPlayer;
import forge.game.event.GameEventLandPlayed; import forge.game.event.GameEventLandPlayed;
import forge.game.event.GameEventPlayerLivesChanged;
import forge.game.event.GameEventMulligan; import forge.game.event.GameEventMulligan;
import forge.game.event.GameEventPlayerControl; import forge.game.event.GameEventPlayerControl;
import forge.game.event.GameEventPlayerDamaged; import forge.game.event.GameEventPlayerDamaged;
import forge.game.event.GameEventPlayerLivesChanged;
import forge.game.event.GameEventPlayerPoisoned; import forge.game.event.GameEventPlayerPoisoned;
import forge.game.event.GameEventShuffle; import forge.game.event.GameEventShuffle;
import forge.game.phase.PhaseHandler; import forge.game.phase.PhaseHandler;
@@ -72,6 +73,7 @@ import forge.game.zone.Zone;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.GuiChoose; import forge.gui.GuiChoose;
import forge.gui.GuiDialog; import forge.gui.GuiDialog;
import forge.gui.GuiDisplayUtil;
import forge.properties.ForgePreferences.FPref; import forge.properties.ForgePreferences.FPref;
import forge.util.Lang; import forge.util.Lang;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -207,10 +209,19 @@ public class Player extends GameEntity implements Comparable<Player> {
for (final ZoneType z : Player.ALL_ZONES) { for (final ZoneType z : Player.ALL_ZONES) {
final PlayerZone toPut = z == ZoneType.Battlefield final PlayerZone toPut = z == ZoneType.Battlefield
? new PlayerZoneBattlefield(z, this) ? new PlayerZoneBattlefield(z, this)
: new PlayerZone(z, this); : new PlayerZone(z, this);
this.zones.put(z, toPut); this.zones.put(z, toPut);
}
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)));
} }
this.setName(chooseName(name));
} }
private String chooseName(String originalName) { private String chooseName(String originalName) {
@@ -803,7 +814,7 @@ public class Player extends GameEntity implements Comparable<Player> {
restDamage = restDamage / 2; restDamage = restDamage / 2;
} else if (c.getName().equals("Benevolent Unicorn")) { } else if (c.getName().equals("Benevolent Unicorn")) {
if (source.isSpell()) { if (source.isSpell()) {
restDamage -= 1; restDamage -= 1;
} }
} else if (c.getName().equals("Divine Presence")) { } else if (c.getName().equals("Divine Presence")) {
if (restDamage > 3) { if (restDamage > 3) {
@@ -942,7 +953,7 @@ public class Player extends GameEntity implements Comparable<Player> {
if (DEBUGShieldsWithEffects) { if (DEBUGShieldsWithEffects) {
System.out.println("Remaining shields: " System.out.println("Remaining shields: "
+ (shieldMap.containsKey(shieldSource) ? shieldMap.get(shieldSource).get("ShieldAmount") : "all shields used")); + (shieldMap.containsKey(shieldSource) ? shieldMap.get(shieldSource).get("ShieldAmount") : "all shields used"));
System.out.println("Remaining damage: " + restDamage); System.out.println("Remaining damage: " + restDamage);
} }
} }
@@ -1042,7 +1053,7 @@ public class Player extends GameEntity implements Comparable<Player> {
damageToDo = this.preventDamage(damageToDo, source, true); damageToDo = this.preventDamage(damageToDo, source, true);
this.addDamageAfterPrevention(damageToDo, source, true); // damage this.addDamageAfterPrevention(damageToDo, source, true); // damage
// prevention // prevention
// is already // is already
// checked // checked
@@ -1580,7 +1591,7 @@ public class Player extends GameEntity implements Comparable<Player> {
} }
} }
return 0; 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() } // getDredgeNumber()
/** /**
@@ -1791,7 +1802,7 @@ public class Player extends GameEntity implements Comparable<Player> {
// Play the shuffle sound // Play the shuffle sound
game.fireEvent(new GameEventShuffle(this)); game.fireEvent(new GameEventShuffle(this));
} // shuffle } // shuffle
// ////////////////////////////// // //////////////////////////////
// ////////////////////////////// // //////////////////////////////
@@ -1874,7 +1885,7 @@ public class Player extends GameEntity implements Comparable<Player> {
// **** Check for land play limit per turn **** // **** Check for land play limit per turn ****
// Dev Mode // Dev Mode
if (this.getLobbyPlayer().getType() == PlayerType.HUMAN && Preferences.DEV_MODE && if (this.getLobbyPlayer().getType() == PlayerType.HUMAN && Preferences.DEV_MODE &&
Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_UNLIMITED_LAND)) { Singletons.getModel().getPreferences().getPrefBoolean(FPref.DEV_UNLIMITED_LAND)) {
return true; return true;
} }
if (this.isCardInPlay("Fastbond") || this.isCardInCommand("Naya")) { if (this.isCardInPlay("Fastbond") || this.isCardInCommand("Naya")) {
@@ -2378,7 +2389,7 @@ public class Player extends GameEntity implements Comparable<Player> {
if (incR.length > 1) { if (incR.length > 1) {
final String excR = incR[1]; final String excR = incR[1];
final String[] exR = excR.split("\\+"); // Exclusive Restrictions final String[] exR = excR.split("\\+"); // Exclusive Restrictions
// are ... // are ...
for (int j = 0; j < exR.length; j++) { for (int j = 0; j < exR.length; j++) {
if (!this.hasProperty(exR[j], sourceController, source)) { if (!this.hasProperty(exR[j], sourceController, source)) {
return false; return false;
@@ -2848,7 +2859,7 @@ public class Player extends GameEntity implements Comparable<Player> {
+ getCardsIn(ZoneType.Battlefield, "Doubling Season").size() + getCardsIn(ZoneType.Battlefield, "Doubling Season").size()
+ CardLists.filter(getGame().getCardsIn(ZoneType.Command), + CardLists.filter(getGame().getCardsIn(ZoneType.Command),
CardPredicates.nameEquals("Selesnya Loft Gardens")).size();; CardPredicates.nameEquals("Selesnya Loft Gardens")).size();;
return 1 << tokenDoublers; // pow(a,0) = 1; pow(a,1) = a return 1 << tokenDoublers; // pow(a,0) = 1; pow(a,1) = a
} }
public void onCleanupPhase() { public void onCleanupPhase() {
@@ -3024,7 +3035,7 @@ public class Player extends GameEntity implements Comparable<Player> {
{ {
if(!currentPlanes.isEmpty()) if(!currentPlanes.isEmpty())
{ {
//Run PlaneswalkedFrom triggers here. //Run PlaneswalkedFrom triggers here.
HashMap<String,Object> runParams = new HashMap<String,Object>(); HashMap<String,Object> runParams = new HashMap<String,Object>();
runParams.put("Card", new ArrayList<Card>(currentPlanes)); runParams.put("Card", new ArrayList<Card>(currentPlanes));
game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedFrom, runParams,false); game.getTriggerHandler().runTrigger(TriggerType.PlaneswalkedFrom, runParams,false);
@@ -3219,4 +3230,15 @@ public class Player extends GameEntity implements Comparable<Player> {
public boolean isPlayingExtraTurn() { public boolean isPlayingExtraTurn() {
return isPlayingExtraTrun; 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.JFileChooser;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import com.google.common.base.Predicates; import com.google.common.base.Predicates;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
@@ -53,8 +54,9 @@ import forge.game.player.HumanPlay;
import forge.game.player.Player; import forge.game.player.Player;
import forge.game.zone.ZoneType; import forge.game.zone.ZoneType;
import forge.gui.input.InputSelectCardsFromList; import forge.gui.input.InputSelectCardsFromList;
import forge.item.PaperCard;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard;
import forge.properties.ForgePreferences.FPref;
public final class GuiDisplayUtil { public final class GuiDisplayUtil {
private GuiDisplayUtil() { private GuiDisplayUtil() {
@@ -496,5 +498,14 @@ public final class GuiDisplayUtil {
return Singletons.getControl().getObservedGame(); 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 } // end class GuiDisplayUtil

View File

@@ -3,12 +3,16 @@ package forge.gui.home.settings;
import java.awt.event.ItemEvent; import java.awt.event.ItemEvent;
import java.awt.event.ItemListener; import java.awt.event.ItemListener;
import java.io.File; import java.io.File;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import javax.swing.JCheckBox; import javax.swing.JCheckBox;
import javax.swing.JComboBox; import javax.swing.JComboBox;
import javax.swing.JOptionPane; import javax.swing.JOptionPane;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang.StringUtils;
import org.apache.commons.lang3.tuple.Pair; import org.apache.commons.lang3.tuple.Pair;
import forge.Command; import forge.Command;
@@ -21,14 +25,11 @@ import forge.game.ai.AiProfileUtil;
import forge.gui.framework.ICDoc; import forge.gui.framework.ICDoc;
import forge.gui.framework.SLayoutIO; import forge.gui.framework.SLayoutIO;
import forge.gui.toolbox.FComboBoxPanel; import forge.gui.toolbox.FComboBoxPanel;
import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.properties.ForgePreferences; import forge.properties.ForgePreferences;
import forge.properties.ForgePreferences.FPref; 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. * Controls the preferences submenu in the home UI.
* *
@@ -123,6 +124,7 @@ public enum CSubmenuPreferences implements ICDoc {
initializeGameLogVerbosityComboBox(); initializeGameLogVerbosityComboBox();
initializeAiProfilesComboBox(); initializeAiProfilesComboBox();
initializeSkinsComboBox(); initializeSkinsComboBox();
initializePlayerNameButton();
} }
@@ -136,6 +138,7 @@ public enum CSubmenuPreferences implements ICDoc {
this.view = VSubmenuPreferences.SINGLETON_INSTANCE; this.view = VSubmenuPreferences.SINGLETON_INSTANCE;
this.prefs = Singletons.getModel().getPreferences(); this.prefs = Singletons.getModel().getPreferences();
setPlayerNameButtonText();
view.getCbDevMode().setSelected(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED)); view.getCbDevMode().setSelected(prefs.getPrefBoolean(FPref.DEV_MODE_ENABLED));
for(Pair<JCheckBox, FPref> kv: lstControls) { for(Pair<JCheckBox, FPref> kv: lstControls) {
@@ -159,7 +162,7 @@ public enum CSubmenuPreferences implements ICDoc {
private void resetForgeSettingsToDefault() { private void resetForgeSettingsToDefault() {
String userPrompt = String userPrompt =
"This will reset all preferences to their defaults and restart Forge.\n\n" + "This will reset all preferences to their defaults and restart Forge.\n\n" +
"Reset and restart Forge?"; "Reset and restart Forge?";
int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Settings", JOptionPane.YES_NO_OPTION); int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Settings", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION) { if (reply == JOptionPane.YES_OPTION) {
ForgePreferences prefs = Singletons.getModel().getPreferences(); ForgePreferences prefs = Singletons.getModel().getPreferences();
@@ -173,8 +176,8 @@ public enum CSubmenuPreferences implements ICDoc {
private void resetDeckEditorLayout() { private void resetDeckEditorLayout() {
String userPrompt = String userPrompt =
"This will reset the Deck Editor screen layout.\n" + "This will reset the Deck Editor screen layout.\n" +
"All tabbed views will be restored to their default positions.\n\n" + "All tabbed views will be restored to their default positions.\n\n" +
"Reset layout?"; "Reset layout?";
int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Deck Editor Layout", JOptionPane.YES_NO_OPTION); int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Deck Editor Layout", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION) { if (reply == JOptionPane.YES_OPTION) {
deleteScreenLayoutFile(Screens.DECK_EDITOR_CONSTRUCTED); deleteScreenLayoutFile(Screens.DECK_EDITOR_CONSTRUCTED);
@@ -185,9 +188,9 @@ public enum CSubmenuPreferences implements ICDoc {
private void resetMatchScreenLayout() { private void resetMatchScreenLayout() {
String userPrompt = String userPrompt =
"This will reset the layout of the Match screen.\n" + "This will reset the layout of the Match screen.\n" +
"If you want to save the current layout first, please use " + "If you want to save the current layout first, please use " +
"the Dock tab -> Save Layout option in the Match screen.\n\n" + "the Dock tab -> Save Layout option in the Match screen.\n\n" +
"Reset layout?"; "Reset layout?";
int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Match Screen Layout", JOptionPane.YES_NO_OPTION); int reply = JOptionPane.showConfirmDialog(null, userPrompt, "Reset Match Screen Layout", JOptionPane.YES_NO_OPTION);
if (reply == JOptionPane.YES_OPTION) { if (reply == JOptionPane.YES_OPTION) {
deleteScreenLayoutFile(Screens.MATCH_SCREEN); deleteScreenLayoutFile(Screens.MATCH_SCREEN);
@@ -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; package forge.gui.home.settings;
import java.awt.Color; import java.awt.Color;
import java.awt.Font;
import java.awt.event.FocusAdapter; import java.awt.event.FocusAdapter;
import java.awt.event.FocusEvent; import java.awt.event.FocusEvent;
import java.awt.event.KeyAdapter; import java.awt.event.KeyAdapter;
@@ -17,6 +18,7 @@ import javax.swing.JPanel;
import javax.swing.JTextField; import javax.swing.JTextField;
import javax.swing.ScrollPaneConstants; import javax.swing.ScrollPaneConstants;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import org.apache.commons.lang3.StringUtils; 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 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 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 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 cbRemoveSmall = new OptionsCheckBox("Remove Small Creatures");
private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode"); private final JCheckBox cbSingletons = new OptionsCheckBox("Singleton Mode");
@@ -119,6 +122,9 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
// General Configuration // General Configuration
pnlPrefs.add(new SectionLabel("General Configuration"), sectionConstraints + ", gaptop 2%"); 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(cbCompactMainMenu, regularConstraints);
pnlPrefs.add(new NoteLabel("Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED)."), regularConstraints); pnlPrefs.add(new NoteLabel("Enable for a space efficient sidebar that displays only one menu group at a time (RESTART REQUIRED)."), regularConstraints);
@@ -506,7 +512,7 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
/** @return {@link javax.swing.JCheckBox} */ /** @return {@link javax.swing.JCheckBox} */
public JCheckBox getCbAltSoundSystem() { public JCheckBox getCbAltSoundSystem() {
return cbAltSoundSystem; return cbAltSoundSystem;
} }
public final JCheckBox getCbUiForTouchScreen() { public final JCheckBox getCbUiForTouchScreen() {
@@ -528,6 +534,10 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
return cbUseThemedComboBox; return cbUseThemedComboBox;
} }
public FLabel getBtnPlayerName() {
return btnPlayerName;
}
//========== Overridden from IVDoc //========== Overridden from IVDoc
public final FLabel getBtnDeleteMatchUI() { public final FLabel getBtnDeleteMatchUI() {
@@ -577,4 +587,13 @@ public enum VSubmenuPreferences implements IVSubmenu<CSubmenuPreferences> {
public DragCell getParentCell() { public DragCell getParentCell() {
return parentCell; 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 // Ante returns to owners in a draw
if (!outcome.isDraw()) { if (!outcome.isDraw()) {
boolean isHumanWinner = outcome.getWinner().equals(questPlayer); boolean isHumanWinner = outcome.getWinningLobbyPlayer().equals(questPlayer);
final List<PaperCard> anteCards = new ArrayList<PaperCard>(); final List<PaperCard> anteCards = new ArrayList<PaperCard>();
for (Player p : lastGame.getRegisteredPlayers()) { for (Player p : lastGame.getRegisteredPlayers()) {
if (p.getLobbyPlayer().equals(questPlayer) == isHumanWinner) { if (p.getLobbyPlayer().equals(questPlayer) == isHumanWinner) {

View File

@@ -5,14 +5,13 @@ import java.awt.Font;
import java.awt.Point; import java.awt.Point;
import java.awt.Toolkit; import java.awt.Toolkit;
import java.awt.datatransfer.StringSelection; import java.awt.datatransfer.StringSelection;
import javax.swing.JLabel; import javax.swing.JLabel;
import javax.swing.JPanel; import javax.swing.JPanel;
import javax.swing.JScrollPane; import javax.swing.JScrollPane;
import javax.swing.SwingConstants; import javax.swing.SwingConstants;
import javax.swing.SwingUtilities; import javax.swing.SwingUtilities;
import org.apache.commons.lang3.tuple.Pair;
import net.miginfocom.swing.MigLayout; import net.miginfocom.swing.MigLayout;
import forge.Command; import forge.Command;
import forge.GameLog; import forge.GameLog;
@@ -21,15 +20,13 @@ import forge.GameLogEntryType;
import forge.Singletons; import forge.Singletons;
import forge.game.Game; import forge.game.Game;
import forge.game.GameOutcome; import forge.game.GameOutcome;
import forge.game.player.LobbyPlayer; import forge.game.player.Player;
import forge.game.player.PlayerStatistics;
import forge.gui.toolbox.FButton; import forge.gui.toolbox.FButton;
import forge.gui.toolbox.FLabel; import forge.gui.toolbox.FLabel;
import forge.gui.toolbox.FOverlay; import forge.gui.toolbox.FOverlay;
import forge.gui.toolbox.FScrollPane; import forge.gui.toolbox.FScrollPane;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.gui.toolbox.FTextArea; import forge.gui.toolbox.FTextArea;
import forge.net.FServer;
/** /**
* TODO: Write javadoc for this type. * 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 JLabel lblStats = new JLabel("WinLoseFrame > lblStats needs updating.");
private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center")); private final JPanel pnlOutcomes = new JPanel(new MigLayout("wrap, align center"));
private final Game game;
@SuppressWarnings("serial") @SuppressWarnings("serial")
public ViewWinLose(final Game game) { public ViewWinLose(final Game game0) {
game = game0;
final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel(); final JPanel overlay = FOverlay.SINGLETON_INSTANCE.getPanel();
final JPanel pnlLeft = new JPanel(); final JPanel pnlLeft = new JPanel();
@@ -56,30 +58,30 @@ public class ViewWinLose {
btnRestart = new FButton(); btnRestart = new FButton();
btnQuit = 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; ControlWinLose control = null;
switch (game.getType()) { switch (game0.getType()) {
case Quest: case Quest:
control = new QuestWinLose(this, game); control = new QuestWinLose(this, game0);
break; break;
case Draft: case Draft:
if (!Singletons.getModel().getGauntletMini().isGauntletDraft()) { if (!Singletons.getModel().getGauntletMini().isGauntletDraft()) {
break;
}
case Sealed:
control = new LimitedWinLose(this, game);
break;
case Gauntlet:
control = new GauntletWinLose(this, game);
break;
default: // will catch it after switch
break; break;
}
case Sealed:
control = new LimitedWinLose(this, game0);
break;
case Gauntlet:
control = new GauntletWinLose(this, game0);
break;
default: // will catch it after switch
break;
} }
if (null == control) { if (null == control) {
control = new ControlWinLose(this, game); control = new ControlWinLose(this, game0);
} }
pnlLeft.setOpaque(false); pnlLeft.setOpaque(false);
pnlRight.setOpaque(false); pnlRight.setOpaque(false);
pnlCustom.setOpaque(false); pnlCustom.setOpaque(false);
@@ -97,17 +99,17 @@ public class ViewWinLose {
lblStats.setHorizontalAlignment(SwingConstants.CENTER); lblStats.setHorizontalAlignment(SwingConstants.CENTER);
FSkin.get(lblStats).setFont(FSkin.getFont(26)); FSkin.get(lblStats).setFont(FSkin.getFont(26));
btnContinue.setText("Continue"); btnContinue.setText("Next Game");
FSkin.get(btnContinue).setFont(FSkin.getFont(22)); FSkin.get(btnContinue).setFont(FSkin.getFont(22));
btnRestart.setText("Restart"); btnRestart.setText("Start New Match");
FSkin.get(btnRestart).setFont(FSkin.getFont(22)); FSkin.get(btnRestart).setFont(FSkin.getFont(22));
btnQuit.setText("Quit"); btnQuit.setText("Quit Match");
FSkin.get(btnQuit).setFont(FSkin.getFont(22)); FSkin.get(btnQuit).setFont(FSkin.getFont(22));
btnContinue.setEnabled(!game.getMatch().isMatchOver()); btnContinue.setEnabled(!game0.getMatch().isMatchOver());
// Assemble game log scroller. // Assemble game log scroller.
final FTextArea txtLog = new FTextArea(); 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)); FSkin.get(txtLog).setFont(FSkin.getFont(14));
txtLog.setFocusable(true); // allow highlighting and copying of log 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(pnlLeft, "w 40%!, h 100%!");
overlay.add(pnlRight, "w 60%!, h 100%!"); overlay.add(pnlRight, "w 60%!, h 100%!");
pnlRight.add(scrCustom, "w 100%!, h 100%!"); pnlRight.add(scrCustom, "w 100%!, h 100%!");
} } else {
else {
overlay.add(pnlLeft, "w 100%!, h 100%!"); overlay.add(pnlLeft, "w 100%!, h 100%!");
} }
@@ -160,9 +161,9 @@ public class ViewWinLose {
scrLog.setBorder(null); scrLog.setBorder(null);
pnlLog.setOpaque(false); pnlLog.setOpaque(false);
pnlLog.add(new FLabel.Builder().text("Game Log").fontAlign(SwingConstants.CENTER) pnlLog.add(
.fontSize(18).fontStyle(Font.BOLD).build(), new FLabel.Builder().text("Game Log").fontAlign(SwingConstants.CENTER).fontSize(18)
"w 300px!, h 28px!, gaptop 20px"); .fontStyle(Font.BOLD).build(), "w 300px!, h 28px!, gaptop 20px");
pnlLog.add(scrLog, "w 300px!, h 100px!, gap 0 0 10 10"); pnlLog.add(scrLog, "w 300px!, h 100px!, gap 0 0 10 10");
pnlLog.add(btnCopyLog, "center, w pref+16, h pref+8"); pnlLog.add(btnCopyLog, "center, w pref+16, h pref+8");
@@ -172,7 +173,8 @@ public class ViewWinLose {
@Override @Override
public void run() { public void run() {
scrLog.getViewport().setViewPosition(new Point(0, 0)); 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()) { if (btnContinue.isEnabled()) {
btnContinue.requestFocusInWindow(); btnContinue.requestFocusInWindow();
} else { } 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) { private String composeTitle(GameOutcome outcome) {
LobbyPlayer guiPlayer = FServer.instance.getLobby().getGuiPlayer(); Player winner = outcome.getWinningPlayer();
int nHumansInGame = 0; if (winner == null) {
for(Pair<LobbyPlayer, PlayerStatistics> pps : outcome) {
if( pps.getKey() == guiPlayer )
nHumansInGame++;
}
LobbyPlayer winner = outcome.getWinner();
if ( winner == null )
return "It's a draw!"; return "It's a draw!";
} else {
return nHumansInGame == 1 ? "You " + (winner == guiPlayer ? "won!" : "lost!") : winner.getName() + " Won!"; return winner.getName() + " Won!";
}
} }
/** @return {@link forge.gui.toolbox.FButton} */ /** @return {@link forge.gui.toolbox.FButton} */
@@ -225,4 +218,21 @@ public class ViewWinLose {
public JPanel getPnlCustom() { public JPanel getPnlCustom() {
return this.pnlCustom; 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) for(GameLogEntry l : log)
System.out.println(l); 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.LobbyPlayerAi;
import forge.game.player.LobbyPlayerHuman; import forge.game.player.LobbyPlayerHuman;
import forge.game.player.LobbyPlayerRemote; import forge.game.player.LobbyPlayerRemote;
import forge.gui.GuiDisplayUtil;
import forge.gui.toolbox.FSkin; import forge.gui.toolbox.FSkin;
import forge.net.client.INetClient; import forge.net.client.INetClient;
import forge.util.MyRandom; import forge.util.MyRandom;
@@ -85,8 +86,12 @@ public class Lobby {
*/ */
private String getRandomName() { private String getRandomName() {
Random my = MyRandom.getRandom(); 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. * Preference identifiers, and their default values.
*/ */
public static enum FPref { public static enum FPref {
PLAYER_NAME (""),
CONSTRUCTED_P1_DECK_STATE(""), CONSTRUCTED_P1_DECK_STATE(""),
CONSTRUCTED_P2_DECK_STATE(""), CONSTRUCTED_P2_DECK_STATE(""),
CONSTRUCTED_GAMEPLAYERS(""), 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. * Plays the sound corresponding to the outcome of the duel.
*/ */
public SoundEffectType visit(GameEventGameOutcome event) { 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; return humanWonTheDuel ? SoundEffectType.WinDuel : SoundEffectType.LoseDuel;
} }