mirror of
https://github.com/Card-Forge/forge.git
synced 2025-11-18 03:38:01 +00:00
- 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:
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -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
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -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++;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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();
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
70
src/main/java/forge/gui/home/settings/GamePlayerUtil.java
Normal file
70
src/main/java/forge/gui/home/settings/GamePlayerUtil.java
Normal 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();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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) {
|
||||
|
||||
@@ -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("\\[[^\\]]*\\]", "");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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()));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -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(""),
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user