Client engine factory needs to be free of configuration file (configuration provided by server). Separated specific start data from general game data. Sending client game object to GUI after creation. Client thread now manages player and game data.
This commit is contained in:
@@ -22,8 +22,9 @@
|
||||
#define _CLIENTCALLBACK_H_
|
||||
|
||||
#include <string>
|
||||
#include <boost/shared_ptr.hpp>
|
||||
|
||||
struct GameData;
|
||||
class Game;
|
||||
|
||||
class ClientCallback
|
||||
{
|
||||
@@ -34,7 +35,7 @@ public:
|
||||
virtual void SignalNetClientGameInfo(int actionID) = 0;
|
||||
virtual void SignalNetClientError(int errorID, int osErrorID) = 0;
|
||||
|
||||
virtual void SignalNetClientGameStart(const GameData &gameData) = 0;
|
||||
virtual void SignalNetClientGameStart(boost::shared_ptr<Game> game) = 0;
|
||||
virtual void SignalNetClientPlayerJoined(const std::string &playerName) = 0;
|
||||
virtual void SignalNetClientPlayerLeft(const std::string &playerName) = 0;
|
||||
};
|
||||
|
||||
@@ -191,6 +191,24 @@ protected:
|
||||
ClientStateWaitGame();
|
||||
};
|
||||
|
||||
// State: Wait for start of the next hand.
|
||||
class ClientStateWaitHand : public ClientState
|
||||
{
|
||||
public:
|
||||
// Access the state singleton.
|
||||
static ClientStateWaitHand &Instance();
|
||||
|
||||
virtual ~ClientStateWaitHand();
|
||||
|
||||
// select on socket.
|
||||
virtual int Process(ClientThread &client);
|
||||
|
||||
protected:
|
||||
|
||||
// Protected constructor - this is a singleton.
|
||||
ClientStateWaitHand();
|
||||
};
|
||||
|
||||
// State: Final (TODO).
|
||||
class ClientStateFinal : public ClientState
|
||||
{
|
||||
|
||||
+24
-8
@@ -22,22 +22,23 @@
|
||||
#define _CLIENTTHREAD_H_
|
||||
|
||||
#include <core/thread.h>
|
||||
#include <map>
|
||||
#include <guiinterface.h>
|
||||
#include <playerdata.h>
|
||||
#include <gamedata.h>
|
||||
#include <string>
|
||||
#include <memory>
|
||||
#include <net/clientcallback.h>
|
||||
|
||||
class ClientContext;
|
||||
class ClientState;
|
||||
class SenderThread;
|
||||
class ReceiverHelper;
|
||||
class ClientSenderCallback;
|
||||
struct GameData;
|
||||
class Game;
|
||||
|
||||
class ClientThread : public Thread
|
||||
{
|
||||
public:
|
||||
ClientThread(ClientCallback &gui);
|
||||
ClientThread(GuiInterface &gui);
|
||||
virtual ~ClientThread();
|
||||
|
||||
// Set the parameters. Does not do any error checking.
|
||||
@@ -51,6 +52,7 @@ public:
|
||||
const std::string &playerName);
|
||||
|
||||
ClientCallback &GetCallback();
|
||||
GuiInterface &GetGui();
|
||||
|
||||
protected:
|
||||
typedef std::map<unsigned, std::string> PlayerMap;
|
||||
@@ -69,23 +71,36 @@ protected:
|
||||
|
||||
const GameData &GetGameData() const;
|
||||
void SetGameData(const GameData &gameData);
|
||||
const StartData &GetStartData() const;
|
||||
void SetStartData(const StartData &startData);
|
||||
|
||||
boost::shared_ptr<Game> GetGame();
|
||||
|
||||
ClientSenderCallback &GetSenderCallback();
|
||||
|
||||
PlayerMap &GetPlayerMap();
|
||||
void AddPlayerData(boost::shared_ptr<PlayerData> playerData);
|
||||
void RemovePlayerData(unsigned playerId);
|
||||
const PlayerDataList &GetPlayerDataList() const;
|
||||
|
||||
int m_myPlayerNum; // TODO: Hack
|
||||
|
||||
private:
|
||||
|
||||
std::auto_ptr<ClientContext> m_context;
|
||||
std::auto_ptr<ClientSenderCallback> m_senderCallback;
|
||||
ClientState *m_curState;
|
||||
ClientCallback &m_callback;
|
||||
GuiInterface &m_gui;
|
||||
|
||||
std::auto_ptr<SenderThread> m_sender;
|
||||
std::auto_ptr<ReceiverHelper> m_receiver;
|
||||
|
||||
std::auto_ptr<GameData> m_gameData;
|
||||
PlayerMap m_playerMap;
|
||||
GameData m_gameData;
|
||||
StartData m_startData;
|
||||
PlayerDataList m_playerDataList;
|
||||
|
||||
boost::shared_ptr<Game> m_game;
|
||||
|
||||
unsigned m_curGameId;
|
||||
|
||||
friend class ClientStateInit;
|
||||
friend class ClientStateStartResolve;
|
||||
@@ -95,6 +110,7 @@ friend class ClientStateConnecting;
|
||||
friend class ClientStateStartSession;
|
||||
friend class ClientStateWaitSession;
|
||||
friend class ClientStateWaitGame;
|
||||
friend class ClientStateWaitHand;
|
||||
friend class ClientStateFinal;
|
||||
};
|
||||
|
||||
|
||||
@@ -28,6 +28,9 @@
|
||||
#include <net/socket_helper.h>
|
||||
#include <net/socket_msg.h>
|
||||
|
||||
#include <game.h>
|
||||
#include <playerinterface.h>
|
||||
|
||||
using namespace std;
|
||||
|
||||
#define CLIENT_WAIT_TIMEOUT_MSEC 50
|
||||
@@ -374,7 +377,14 @@ ClientStateWaitSession::Process(ClientThread &client)
|
||||
tmpPacket->ToNetPacketJoinGameAck()->GetData(joinGameAckData);
|
||||
client.SetGameData(joinGameAckData.gameData);
|
||||
|
||||
client.GetCallback().SignalNetClientPlayerJoined(context.GetPlayerName());
|
||||
// TODO: Hack
|
||||
client.m_myPlayerNum = joinGameAckData.playerNumber;
|
||||
|
||||
// TODO: Type Human is fixed here.
|
||||
boost::shared_ptr<PlayerData> playerData(
|
||||
new PlayerData(joinGameAckData.playerId, joinGameAckData.playerNumber, PLAYER_TYPE_HUMAN));
|
||||
playerData->SetName(context.GetPlayerName());
|
||||
client.AddPlayerData(playerData);
|
||||
|
||||
client.SetState(ClientStateWaitGame::Instance());
|
||||
retVal = MSG_SOCK_SESSION_DONE;
|
||||
@@ -422,23 +432,32 @@ ClientStateWaitGame::Process(ClientThread &client)
|
||||
{
|
||||
if (tmpPacket->ToNetPacketGameStart())
|
||||
{
|
||||
client.SetState(ClientStateFinal::Instance());
|
||||
// Start the network game as client.
|
||||
NetPacketGameStart::Data gameStartData;
|
||||
tmpPacket->ToNetPacketGameStart()->GetData(gameStartData);
|
||||
|
||||
client.SetStartData(gameStartData.startData);
|
||||
|
||||
client.SetState(ClientStateWaitHand::Instance());
|
||||
retVal = MSG_NET_GAME_CLIENT_START;
|
||||
}
|
||||
else if (tmpPacket->ToNetPacketPlayerJoined())
|
||||
{
|
||||
NetPacketPlayerJoined::Data playerData;
|
||||
tmpPacket->ToNetPacketPlayerJoined()->GetData(playerData);
|
||||
client.GetCallback().SignalNetClientPlayerJoined(playerData.playerName);
|
||||
client.GetPlayerMap()[playerData.playerId] = playerData.playerName;
|
||||
// Another player joined the network game.
|
||||
NetPacketPlayerJoined::Data netPlayerData;
|
||||
tmpPacket->ToNetPacketPlayerJoined()->GetData(netPlayerData);
|
||||
|
||||
boost::shared_ptr<PlayerData> playerData(
|
||||
new PlayerData(netPlayerData.playerId, netPlayerData.playerNumber, netPlayerData.ptype));
|
||||
playerData->SetName(netPlayerData.playerName);
|
||||
client.AddPlayerData(playerData);
|
||||
}
|
||||
else if (tmpPacket->ToNetPacketPlayerLeft())
|
||||
{
|
||||
// TODO hacked.
|
||||
NetPacketPlayerLeft::Data playerData;
|
||||
tmpPacket->ToNetPacketPlayerLeft()->GetData(playerData);
|
||||
client.GetCallback().SignalNetClientPlayerLeft(client.GetPlayerMap()[playerData.playerId]);
|
||||
client.GetPlayerMap().erase(playerData.playerId);
|
||||
// Another player left the network game.
|
||||
NetPacketPlayerLeft::Data netPlayerData;
|
||||
tmpPacket->ToNetPacketPlayerLeft()->GetData(netPlayerData);
|
||||
client.RemovePlayerData(netPlayerData.playerId);
|
||||
}
|
||||
}
|
||||
// TODO: handle error packet
|
||||
@@ -448,6 +467,49 @@ ClientStateWaitGame::Process(ClientThread &client)
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
ClientStateWaitHand &
|
||||
ClientStateWaitHand::Instance()
|
||||
{
|
||||
static ClientStateWaitHand state;
|
||||
return state;
|
||||
}
|
||||
|
||||
ClientStateWaitHand::ClientStateWaitHand()
|
||||
{
|
||||
}
|
||||
|
||||
ClientStateWaitHand::~ClientStateWaitHand()
|
||||
{
|
||||
}
|
||||
|
||||
int
|
||||
ClientStateWaitHand::Process(ClientThread &client)
|
||||
{
|
||||
ClientContext &context = client.GetContext();
|
||||
|
||||
// delegate to receiver helper class
|
||||
boost::shared_ptr<NetPacket> tmpPacket = client.GetReceiver().Recv(context.GetSocket());
|
||||
|
||||
if (tmpPacket.get())
|
||||
{
|
||||
if (tmpPacket->ToNetPacketHandStart())
|
||||
{
|
||||
NetPacketHandStart::Data tmpData;
|
||||
tmpPacket->ToNetPacketHandStart()->GetData(tmpData);
|
||||
// TODO: Hack
|
||||
int myCards[2];
|
||||
myCards[0] = (int)tmpData.yourCards[0];
|
||||
myCards[1] = (int)tmpData.yourCards[1];
|
||||
client.GetGame()->getPlayerArray()[client.m_myPlayerNum]->setMyCards(myCards);
|
||||
client.GetGui().dealHoleCards();
|
||||
}
|
||||
}
|
||||
|
||||
return MSG_SOCK_INTERNAL_PENDING;
|
||||
}
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
|
||||
ClientStateFinal &
|
||||
ClientStateFinal::Instance()
|
||||
{
|
||||
@@ -466,21 +528,7 @@ ClientStateFinal::~ClientStateFinal()
|
||||
int
|
||||
ClientStateFinal::Process(ClientThread &client)
|
||||
{
|
||||
ClientContext &context = client.GetContext();
|
||||
|
||||
// delegate to receiver helper class
|
||||
boost::shared_ptr<NetPacket> tmpPacket = client.GetReceiver().Recv(context.GetSocket());
|
||||
|
||||
if (tmpPacket.get())
|
||||
{
|
||||
if (tmpPacket->ToNetPacketHandStart())
|
||||
{
|
||||
// TODO
|
||||
NetPacketHandStart::Data tmpData;
|
||||
tmpPacket->ToNetPacketHandStart()->GetData(tmpData);
|
||||
int z = 1;
|
||||
}
|
||||
}
|
||||
Thread::Msleep(10);
|
||||
|
||||
return MSG_SOCK_INTERNAL_PENDING;
|
||||
}
|
||||
|
||||
@@ -24,8 +24,10 @@
|
||||
#include <net/receiverhelper.h>
|
||||
#include <net/clientexception.h>
|
||||
#include <net/socket_msg.h>
|
||||
#include <gamedata.h>
|
||||
#include <clientenginefactory.h>
|
||||
#include <game.h>
|
||||
|
||||
#include <boost/lambda/lambda.hpp>
|
||||
#include <cassert>
|
||||
|
||||
using namespace std;
|
||||
@@ -50,14 +52,13 @@ private:
|
||||
};
|
||||
|
||||
|
||||
ClientThread::ClientThread(ClientCallback &cb)
|
||||
: m_curState(NULL), m_callback(cb)
|
||||
ClientThread::ClientThread(GuiInterface &gui)
|
||||
: m_curState(NULL), m_gui(gui), m_curGameId(0)
|
||||
{
|
||||
m_context.reset(new ClientContext);
|
||||
m_senderCallback.reset(new ClientSenderCallback(*this));
|
||||
m_sender.reset(new SenderThread(GetSenderCallback()));
|
||||
m_receiver.reset(new ReceiverHelper);
|
||||
m_gameData.reset(new GameData);
|
||||
}
|
||||
|
||||
ClientThread::~ClientThread()
|
||||
@@ -83,7 +84,13 @@ ClientThread::Init(
|
||||
ClientCallback &
|
||||
ClientThread::GetCallback()
|
||||
{
|
||||
return m_callback;
|
||||
return m_gui;
|
||||
}
|
||||
|
||||
GuiInterface &
|
||||
ClientThread::GetGui()
|
||||
{
|
||||
return m_gui;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -107,7 +114,13 @@ ClientThread::Main()
|
||||
|
||||
// Additionally signal the start of the game.
|
||||
if (msg == MSG_NET_GAME_CLIENT_START)
|
||||
GetCallback().SignalNetClientGameStart(GetGameData());
|
||||
{
|
||||
// EngineFactory erstellen
|
||||
boost::shared_ptr<EngineFactory> factory(new ClientEngineFactory); // LocalEngine erstellen
|
||||
|
||||
m_game.reset(new Game(&m_gui, factory, GetPlayerDataList(), GetGameData(), GetStartData(), m_curGameId++));
|
||||
GetCallback().SignalNetClientGameStart(m_game);
|
||||
}
|
||||
}
|
||||
}
|
||||
} catch (const NetException &e)
|
||||
@@ -162,15 +175,31 @@ ClientThread::GetReceiver()
|
||||
const GameData &
|
||||
ClientThread::GetGameData() const
|
||||
{
|
||||
assert(m_gameData.get());
|
||||
return *m_gameData;
|
||||
return m_gameData;
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SetGameData(const GameData &gameData)
|
||||
{
|
||||
assert(m_gameData.get());
|
||||
*m_gameData = gameData;
|
||||
m_gameData = gameData;
|
||||
}
|
||||
|
||||
const StartData &
|
||||
ClientThread::GetStartData() const
|
||||
{
|
||||
return m_startData;
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::SetStartData(const StartData &startData)
|
||||
{
|
||||
m_startData = startData;
|
||||
}
|
||||
|
||||
boost::shared_ptr<Game>
|
||||
ClientThread::GetGame()
|
||||
{
|
||||
return m_game;
|
||||
}
|
||||
|
||||
ClientSenderCallback &
|
||||
@@ -180,9 +209,44 @@ ClientThread::GetSenderCallback()
|
||||
return *m_senderCallback;
|
||||
}
|
||||
|
||||
ClientThread::PlayerMap &
|
||||
ClientThread::GetPlayerMap()
|
||||
void
|
||||
ClientThread::AddPlayerData(boost::shared_ptr<PlayerData> playerData)
|
||||
{
|
||||
return m_playerMap;
|
||||
if (playerData.get() && !playerData->GetName().empty())
|
||||
{
|
||||
m_playerDataList.push_back(playerData);
|
||||
// Sort the list by player number.
|
||||
m_playerDataList.sort(*boost::lambda::_1 < *boost::lambda::_2);
|
||||
|
||||
GetCallback().SignalNetClientPlayerJoined(playerData->GetName());
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
ClientThread::RemovePlayerData(unsigned playerId)
|
||||
{
|
||||
string playerName;
|
||||
|
||||
PlayerDataList::iterator i = m_playerDataList.begin();
|
||||
PlayerDataList::iterator end = m_playerDataList.end();
|
||||
while (i != end)
|
||||
{
|
||||
if ((*i)->GetUniqueId() == playerId)
|
||||
{
|
||||
playerName = (*i)->GetName();
|
||||
m_playerDataList.erase(i);
|
||||
break;
|
||||
}
|
||||
++i;
|
||||
}
|
||||
|
||||
if (!playerName.empty())
|
||||
GetCallback().SignalNetClientPlayerLeft(playerName);
|
||||
}
|
||||
|
||||
const PlayerDataList &
|
||||
ClientThread::GetPlayerDataList() const
|
||||
{
|
||||
return m_playerDataList;
|
||||
}
|
||||
|
||||
|
||||
@@ -761,7 +761,7 @@ NetPacketGameStart::SetData(const NetPacketGameStart::Data &inData)
|
||||
NetPacketGameStartData *tmpData = (NetPacketGameStartData *)GetRawData();
|
||||
assert(tmpData);
|
||||
|
||||
tmpData->startDealerPos = htons(inData.startDealerPos);
|
||||
tmpData->startDealerPos = htons(inData.startData.startDealerPos);
|
||||
}
|
||||
|
||||
void
|
||||
@@ -770,7 +770,7 @@ NetPacketGameStart::GetData(NetPacketGameStart::Data &outData) const
|
||||
NetPacketGameStartData *tmpData = (NetPacketGameStartData *)GetRawData();
|
||||
assert(tmpData);
|
||||
|
||||
outData.startDealerPos = ntohs(tmpData->startDealerPos);
|
||||
outData.startData.startDealerPos = ntohs(tmpData->startDealerPos);
|
||||
}
|
||||
|
||||
const NetPacketGameStart *
|
||||
|
||||
@@ -224,16 +224,18 @@ ServerRecvStateStartGame::HandleNewConnection(ServerRecvThread &server, boost::s
|
||||
int
|
||||
ServerRecvStateStartGame::Process(ServerRecvThread &server)
|
||||
{
|
||||
GameData &gameData = server.GetGameData();
|
||||
|
||||
// Set dealer pos.
|
||||
Tools myTool;
|
||||
myTool.getRandNumber(0, gameData.numberOfPlayers-1, 1, &gameData.startDealerPos, 0);
|
||||
{
|
||||
// Set dealer pos.
|
||||
StartData startData;
|
||||
Tools myTool;
|
||||
myTool.getRandNumber(0, server.GetGameData().numberOfPlayers-1, 1, &startData.startDealerPos, 0);
|
||||
server.SetStartData(startData);
|
||||
}
|
||||
|
||||
boost::shared_ptr<NetPacket> answer(new NetPacketGameStart);
|
||||
|
||||
NetPacketGameStart::Data gameStartData;
|
||||
gameStartData.startDealerPos = gameData.startDealerPos;
|
||||
gameStartData.startData = server.GetStartData();
|
||||
static_cast<NetPacketGameStart *>(answer.get())->SetData(gameStartData);
|
||||
|
||||
server.SendToAllPlayers(answer);
|
||||
|
||||
@@ -58,7 +58,6 @@ ServerRecvThread::ServerRecvThread(GuiInterface &gui, ConfigFile *playerConfig)
|
||||
m_senderCallback.reset(new ServerSenderCallback(*this));
|
||||
m_sender.reset(new SenderThread(GetSenderCallback()));
|
||||
m_receiver.reset(new ReceiverHelper);
|
||||
m_gameData.reset(new GameData);
|
||||
}
|
||||
|
||||
ServerRecvThread::~ServerRecvThread()
|
||||
@@ -71,7 +70,7 @@ void
|
||||
ServerRecvThread::Init(const string &pwd, const GameData &gameData)
|
||||
{
|
||||
m_password = pwd;
|
||||
*m_gameData = gameData;
|
||||
m_gameData = gameData;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -252,7 +251,7 @@ ServerRecvThread::InternalStartGame()
|
||||
// EngineFactory erstellen
|
||||
boost::shared_ptr<EngineFactory> factory(new LocalEngineFactory(m_playerConfig)); // LocalEngine erstellen
|
||||
|
||||
m_game.reset(new Game(&gui, factory, playerData, GetGameData(), m_curGameId++));
|
||||
m_game.reset(new Game(&gui, factory, playerData, GetGameData(), GetStartData(), m_curGameId++));
|
||||
SetState(SERVER_START_GAME_STATE::Instance());
|
||||
}
|
||||
|
||||
@@ -498,11 +497,22 @@ ServerRecvThread::GetGame()
|
||||
return *m_game;
|
||||
}
|
||||
|
||||
GameData &
|
||||
const GameData &
|
||||
ServerRecvThread::GetGameData() const
|
||||
{
|
||||
assert(m_gameData.get());
|
||||
return *m_gameData;
|
||||
return m_gameData;
|
||||
}
|
||||
|
||||
const StartData &
|
||||
ServerRecvThread::GetStartData() const
|
||||
{
|
||||
return m_startData;
|
||||
}
|
||||
|
||||
void
|
||||
ServerRecvThread::SetStartData(const StartData &startData)
|
||||
{
|
||||
m_startData = startData;
|
||||
}
|
||||
|
||||
bool
|
||||
|
||||
+1
-1
@@ -194,7 +194,7 @@ class NetPacketGameStart : public NetPacket
|
||||
public:
|
||||
struct Data
|
||||
{
|
||||
u_int16_t startDealerPos;
|
||||
StartData startData;
|
||||
u_int16_t reserved;
|
||||
};
|
||||
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <net/connectdata.h>
|
||||
#include <net/sessiondata.h>
|
||||
#include <gui/guiinterface.h>
|
||||
#include <gamedata.h>
|
||||
|
||||
#include <deque>
|
||||
#include <map>
|
||||
@@ -121,7 +122,9 @@ protected:
|
||||
ReceiverHelper &GetReceiver();
|
||||
|
||||
Game &GetGame();
|
||||
GameData &GetGameData() const;
|
||||
const GameData &GetGameData() const;
|
||||
const StartData &GetStartData() const;
|
||||
void SetStartData(const StartData &startData);
|
||||
bool CheckPassword(const std::string &password) const;
|
||||
|
||||
ServerSenderCallback &GetSenderCallback();
|
||||
@@ -145,7 +148,8 @@ private:
|
||||
std::auto_ptr<SenderThread> m_sender;
|
||||
|
||||
std::auto_ptr<Game> m_game;
|
||||
std::auto_ptr<GameData> m_gameData;
|
||||
GameData m_gameData;
|
||||
StartData m_startData;
|
||||
unsigned m_curGameId;
|
||||
std::auto_ptr<ServerSenderCallback> m_senderCallback;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user