Changed interfaces to acquire players for lobby - human uses a single LobbyPlayer for all games.

NetClient now adds its player to lobby
This commit is contained in:
Maxmtg
2013-04-14 11:33:20 +00:00
parent 07fbc7c6a9
commit 0d3a727610
16 changed files with 67 additions and 53 deletions

View File

@@ -1,6 +1,8 @@
package forge.control;
import java.util.Map;
import java.util.Random;
import java.util.concurrent.ConcurrentHashMap;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
@@ -55,31 +57,22 @@ public class Lobby {
"Walter", "Wilfred", "William", "Winston"
};
/**
* TODO: Write javadoc for this method.
* @param human
* @return
*/
public LobbyPlayer findLocalPlayer(PlayerType type, String name) {
private Map<String, LobbyPlayer> remotePlayers = new ConcurrentHashMap<String, LobbyPlayer>();
private final LobbyPlayer guiPlayer = new LobbyPlayer(PlayerType.HUMAN, "Human");
return new LobbyPlayer(type, name);
public final LobbyPlayer getGuiPlayer() {
return guiPlayer;
}
/**
* TODO: Write javadoc for this method.
* @param human
* @return
*/
public LobbyPlayer findLocalPlayer(PlayerType type) {
if (type == PlayerType.HUMAN) {
return new LobbyPlayer(type, "Human"); // need to get name!
}
LobbyPlayer player = findLocalPlayer(type, getRandomName());
public final LobbyPlayer getAiPlayer() { return getAiPlayer(getRandomName()); }
public final LobbyPlayer getAiPlayer(String name) {
LobbyPlayer player = new LobbyPlayer(PlayerType.COMPUTER, name);
player.setAvatarIndex(MyRandom.getRandom().nextInt(FSkin.getAvatars().size()));
return player;
}
/**
* TODO: Write javadoc for this method.
* @param nextInt
@@ -96,7 +89,26 @@ public class Lobby {
* @return
*/
public LobbyPlayer getQuestPlayer() {
return new LobbyPlayer(PlayerType.HUMAN, "Human"); // need to get name!
return guiPlayer;
}
/**
* TODO: Write javadoc for this method.
* @param name
* @return
*/
public synchronized LobbyPlayer findOrCreateRemotePlayer(String name) {
if (remotePlayers.containsKey(name))
return remotePlayers.get(name);
LobbyPlayer res = new LobbyPlayer(PlayerType.REMOTE, name);
// have to load avatar from remote user's preferences here
remotePlayers.put(name, res);
return res;
}
public void disconnectPlayer(LobbyPlayer player) {
// Should set up a timer here to discard player and all of his games after 20 minutes of being offline
}

View File

@@ -30,7 +30,6 @@ import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions;
import forge.game.player.PlayerType;
import forge.gui.SOverlayUtils;
/**
@@ -170,8 +169,8 @@ public class GauntletMini {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck);
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiOpponents.get(currentRound - 1));
starter.addPlayer(lobby.getGuiPlayer(), humanDeck);
starter.addPlayer(lobby.getAiPlayer(), aiOpponents.get(currentRound - 1));
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(gauntletType, starter.getPlayerMap());

View File

@@ -253,8 +253,9 @@ public enum CSubmenuGauntletContests implements ICDoc {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck());
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck);
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck());
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(GameType.Gauntlet, starter.getPlayerMap());

View File

@@ -17,7 +17,6 @@ import forge.deck.Deck;
import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.player.PlayerType;
import forge.gauntlet.GauntletData;
import forge.gauntlet.GauntletIO;
import forge.gui.SOverlayUtils;
@@ -116,8 +115,8 @@ public enum CSubmenuGauntletLoad implements ICDoc {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck());
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck);
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck());
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(GameType.Gauntlet, starter.getPlayerMap());

View File

@@ -299,8 +299,9 @@ public enum CSubmenuGauntletQuick implements ICDoc {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), gd.getUserDeck());
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck);
starter.addPlayer(lobby.getGuiPlayer(), gd.getUserDeck());
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(GameType.Gauntlet, starter.getPlayerMap());

View File

@@ -19,7 +19,6 @@ import forge.game.GameType;
import forge.game.MatchStartHelper;
import forge.game.PlayerStartConditions;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI;
@@ -418,7 +417,7 @@ public class SSubmenuQuestUtil {
MatchStartHelper msh = new MatchStartHelper();
msh.addPlayer(Singletons.getControl().getLobby().getQuestPlayer(), humanStart);
LobbyPlayer aiPlayer = Singletons.getControl().getLobby().findLocalPlayer(PlayerType.COMPUTER, event.getOpponent() == null ? event.getTitle() : event.getOpponent());
LobbyPlayer aiPlayer = Singletons.getControl().getLobby().getAiPlayer(event.getOpponent() == null ? event.getTitle() : event.getOpponent());
aiPlayer.setIconImageKey(event.getIconImageKey());
msh.addPlayer(aiPlayer, aiStart);

View File

@@ -14,7 +14,6 @@ import forge.deck.Deck;
import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.player.PlayerType;
import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc;
import forge.properties.ForgePreferences;
@@ -120,8 +119,8 @@ public enum CSubmenuConstructed implements ICDoc {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck);
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck);
starter.addPlayer(lobby.getGuiPlayer(), humanDeck);
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(gameType, starter.getPlayerMap());

View File

@@ -21,7 +21,6 @@ import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.limited.BoosterDraft;
import forge.game.limited.CardPoolLimitation;
import forge.game.player.PlayerType;
import forge.gui.GuiChoose;
import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI;
@@ -136,8 +135,8 @@ public enum CSubmenuDraft implements ICDoc {
MatchStartHelper starter = new MatchStartHelper();
Lobby lobby = Singletons.getControl().getLobby();
starter.addPlayer(lobby.findLocalPlayer(PlayerType.HUMAN), humanDeck);
starter.addPlayer(lobby.findLocalPlayer(PlayerType.COMPUTER), aiDeck);
starter.addPlayer(lobby.getGuiPlayer(), humanDeck);
starter.addPlayer(lobby.getAiPlayer(), aiDeck);
MatchController mc = Singletons.getModel().getMatch();
mc.initMatch(GameType.Draft, starter.getPlayerMap());

View File

@@ -22,7 +22,6 @@ import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI;
@@ -227,7 +226,7 @@ public enum CSubmenuArchenemy implements ICDoc {
Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper();
for (int i = 0; i < view.getNumPlayers(); i++) {
LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER);
LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer();
if (i == 0) {

View File

@@ -22,7 +22,6 @@ import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
import forge.gui.deckeditor.CDeckEditorUI;
@@ -221,9 +220,7 @@ public enum CSubmenuPlanechase implements ICDoc {
GuiDialog.message("Player " + (i+1) + " will use a default planar deck.");
}
LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER);
LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer();
helper.addPlanechasePlayer(player, playerDecks.get(i), planes);
}

View File

@@ -20,7 +20,6 @@ import forge.game.GameType;
import forge.game.MatchController;
import forge.game.MatchStartHelper;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
import forge.gui.GuiDialog;
import forge.gui.SOverlayUtils;
import forge.gui.framework.ICDoc;
@@ -178,7 +177,7 @@ public enum CSubmenuVanguard implements ICDoc {
Lobby lobby = Singletons.getControl().getLobby();
MatchStartHelper helper = new MatchStartHelper();
for (int i = 0; i < view.getNumPlayers(); i++) {
LobbyPlayer player = lobby.findLocalPlayer(i == 0 ? PlayerType.HUMAN : PlayerType.COMPUTER);
LobbyPlayer player = i == 0 ? lobby.getGuiPlayer() : lobby.getAiPlayer();
helper.addVanguardPlayer(player, playerDecks.get(i), playerAvatars.get(i));
}

View File

@@ -17,7 +17,7 @@ public interface INetClient {
void send(IMessage message);
void setPlayer(LobbyPlayer lobbyPlayer);
void createPlayer(String playerName);
LobbyPlayer getPlayer();

View File

@@ -3,6 +3,7 @@ package forge.net.client;
import java.util.concurrent.BlockingDeque;
import java.util.concurrent.LinkedBlockingDeque;
import forge.Singletons;
import forge.game.player.LobbyPlayer;
import forge.net.IClientSocket;
import forge.net.IConnectionObserver;
@@ -35,6 +36,7 @@ public class NetClient implements IConnectionObserver, INetClient{
@Override
public void onConnectionClosed() {
// Tell the game, the client is gone.
if ( player != null ) Singletons.getControl().getLobby().disconnectPlayer(player);
}
@@ -63,8 +65,8 @@ public class NetClient implements IConnectionObserver, INetClient{
* @see forge.net.client.INetClient#setPlayer(forge.game.player.LobbyPlayer)
*/
@Override
public final void setPlayer(LobbyPlayer lobbyPlayer) {
player = lobbyPlayer;
public final void createPlayer(String name) {
player = Singletons.getControl().getLobby().findOrCreateRemotePlayer(name);
}
/* (non-Javadoc)

View File

@@ -1,7 +1,10 @@
package forge.net.client.state;
import forge.net.client.INetClient;
import forge.net.protocol.incoming.ChatPacket;
import forge.net.protocol.incoming.IPacket;
import forge.net.protocol.incoming.PacketOpcode;
import forge.net.protocol.outcoming.EchoMessage;
/**
* TODO: Write javadoc for this type.
@@ -16,6 +19,13 @@ public class InLobbyClientState implements IClientState {
@Override
public boolean processPacket(IPacket data) {
if( data.getOpCode() == PacketOpcode.Chat)
{
ChatPacket cp = (ChatPacket) data;
// should actually find all players in a lobby and send it to them
client.send(new EchoMessage("chat - " + cp.getMessage()));
return true;
}
return false;
}
}

View File

@@ -1,7 +1,5 @@
package forge.net.client.state;
import forge.game.player.LobbyPlayer;
import forge.game.player.PlayerType;
import forge.net.client.INetClient;
import forge.net.protocol.incoming.AuthorizePacket;
import forge.net.protocol.incoming.IPacket;
@@ -32,7 +30,7 @@ public class UnauthorizedClientState implements IClientState {
client.send(new AuthorizationSuccessfulMessage(p.getUsername()));
client.setPlayer(new LobbyPlayer(PlayerType.REMOTE, p.getUsername()));
client.createPlayer(p.getUsername());
client.replaceState(this, new InLobbyClientState(client));
return true;
}

View File

@@ -20,7 +20,7 @@ public class EchoMessage implements IMessage {
@Override
public String toNetString() {
return String.format("System: %s", message);
return String.format("Echo: %s", message);
}
}