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:
lotodore
2007-05-20 00:16:29 +00:00
parent e7b31f2d44
commit 4a53678291
25 changed files with 285 additions and 133 deletions
+74 -26
View File
@@ -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;
}
+77 -13
View File
@@ -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;
}
+2 -2
View File
@@ -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 *
+8 -6
View File
@@ -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);
+16 -6
View File
@@ -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