Information about the game is now shown in lobby, when selecting a game.

Some GUI modifications, GUI update is working properly now if the dialog is shown the second time (after clearing items).
List of players for the game is still missing. With the new on-demand model for player id/player name, this is kind of hard to implement.
This commit is contained in:
lotodore
2007-08-27 09:57:51 +00:00
parent 56b24e09eb
commit fa8d7b14ec
14 changed files with 133 additions and 56 deletions
+11
View File
@@ -21,6 +21,8 @@
#ifndef _GAMEDATA_H_
#define _GAMEDATA_H_
#include <string>
enum GameMode
{
GAME_MODE_CREATED = 1,
@@ -41,6 +43,15 @@ struct GameData
int playerActionTimeoutSec;
};
struct GameInfo
{
GameInfo() : mode(GAME_MODE_CREATED), isPasswordProtected(false) {}
std::string name;
GameData data;
GameMode mode;
bool isPasswordProtected;
};
struct StartData
{
StartData() : startDealerPlayerId(0), numberOfPlayers(0) {}
@@ -22,6 +22,7 @@ gameLobbyDialogImpl::gameLobbyDialogImpl(QWidget *parent, ConfigFile *c)
connect( pushButton_CreateGame, SIGNAL( clicked() ), this, SLOT( createGame() ) );
connect( pushButton_JoinGame, SIGNAL( clicked() ), this, SLOT( joinGame() ) );
connect( treeWidget_GameList, SIGNAL( itemClicked ( QTreeWidgetItem*, int) ), this, SLOT( gameSelected(QTreeWidgetItem*, int) ) );
connect( treeWidget_GameList, SIGNAL( clear () ), this, SLOT( clearGames() ) );
pushButton_JoinGame->setEnabled(false);
@@ -98,8 +99,16 @@ void gameLobbyDialogImpl::gameSelected(QTreeWidgetItem* item, int)
currentGameName = item->text(0);
groupBox_GameInfo->setEnabled(TRUE);
groupBox_GameInfo->setTitle("Game Info - " + item->text(0));
groupBox_GameInfo->setEnabled(true);
groupBox_GameInfo->setTitle(tr("Game Info") + " - " + currentGameName);
assert(mySession);
GameInfo info = mySession->getClientGameInfo(currentGameName.toUtf8().constData());
label_SmallBlind->setText(QString::number(info.data.smallBlind));
label_StartCash->setText(QString::number(info.data.startMoney));
label_MaximumNumberOfPlayers->setText(QString::number(info.data.maxNumberOfPlayers));
label_HandsToRaiseSmallBlind->setText(QString::number(info.data.handsBeforeRaise));
label_TimeoutForPlayerAction->setText(QString::number(info.data.playerActionTimeoutSec));
}
void gameLobbyDialogImpl::addGame(QString gameName)
@@ -116,3 +125,17 @@ void gameLobbyDialogImpl::removeGame(QString gameName)
}
}
void gameLobbyDialogImpl::clearGames()
{
pushButton_JoinGame->setEnabled(false);
groupBox_GameInfo->setTitle(tr("Game Info"));
groupBox_GameInfo->setEnabled(false);
currentGameName = "";
label_SmallBlind->setText("");
label_StartCash->setText("");
label_MaximumNumberOfPlayers->setText("");
label_HandsToRaiseSmallBlind->setText("");
label_TimeoutForPlayerAction->setText("");
}
@@ -49,6 +49,8 @@ public slots:
void setCurrentGameName ( const QString& theValue ) { currentGameName = theValue; }
QString getCurrentGameName() const { return currentGameName; }
void clearGames();
private:
ConfigFile *myConfig;
+2 -1
View File
@@ -121,7 +121,8 @@ void GuiWrapper::SignalNetClientPlayerLeft(const string &playerName)
{
QString tmpName(QString::fromUtf8(playerName.c_str()));
myW->signalNetClientPlayerLeft(tmpName);
myLog->signalLogPlayerLeftMsg(tmpName);
if (!playerName.empty() && playerName[0] != '#')
myLog->signalLogPlayerLeftMsg(tmpName);
}
void GuiWrapper::SignalNetClientGameListNew(const string &gameName) { myW->signalNetClientGameListNew(QString::fromUtf8(gameName.c_str())); }
@@ -31,6 +31,7 @@ startNetworkGameDialogImpl::startNetworkGameDialogImpl(QWidget *parent, ConfigFi
connect( pushButton_startGame, SIGNAL( clicked() ), this, SLOT( startGame() ) );
connect( pushButton_Kick, SIGNAL( clicked() ), this, SLOT( kickPlayer() ) );
connect( treeWidget, SIGNAL( itemClicked ( QTreeWidgetItem*, int) ), this, SLOT( playerSelected(QTreeWidgetItem*, int) ) );
connect( treeWidget, SIGNAL( clear () ), this, SLOT( clearPlayers() ) );
pushButton_Kick->setEnabled(false);
pushButton_startGame->setEnabled(false);
@@ -114,20 +115,25 @@ void startNetworkGameDialogImpl::kickPlayer() {
mySession->kickPlayer(playerName.toUtf8().constData());
}
}
pushButton_Kick->setEnabled(FALSE);
pushButton_Kick->setEnabled(false);
}
void startNetworkGameDialogImpl::checkPlayerQuantity() {
if (treeWidget->topLevelItemCount() >= 2 && isAdmin) {
pushButton_startGame->setEnabled(TRUE);
pushButton_startGame->setEnabled(true);
}
else {
pushButton_startGame->setEnabled(FALSE);
pushButton_startGame->setEnabled(false);
}
}
void startNetworkGameDialogImpl::clearPlayers()
{
pushButton_Kick->setEnabled(false);
}
void startNetworkGameDialogImpl::setSession(Session *session)
{
mySession = session;
@@ -52,12 +52,13 @@ public slots:
void playerSelected(QTreeWidgetItem*, int);
void kickPlayer();
void checkPlayerQuantity();
void clearPlayers();
void keyPressEvent ( QKeyEvent*);
void setMaxPlayerNumber ( int theValue ) { maxPlayerNumber = theValue; label_maxPlayerNumber->setText(QString::number(theValue,10)); }
int getMaxPlayerNumber() const { return maxPlayerNumber; }
private:
+7 -5
View File
@@ -62,11 +62,13 @@ public:
void SendJoinGame(const std::string &name, const std::string &password);
void SendCreateGame(const GameData &gameData, const std::string &name, const std::string &password);
GameInfo GetGameInfo(const std::string &game) const;
ClientCallback &GetCallback();
GuiInterface &GetGui();
protected:
typedef std::map<unsigned, std::string> GameMap;
typedef std::map<unsigned, GameInfo> GameInfoMap;
typedef std::list<boost::shared_ptr<NetPacket> > NetPacketList;
typedef std::map<unsigned, PlayerInfo> PlayerInfoMap;
@@ -110,8 +112,8 @@ protected:
void RemoveDisconnectedPlayers();
unsigned GetGameIdByName(const std::string &name) const;
void AddGameInformation(unsigned id, const std::string &name);
void RemoveGameInformation(unsigned id);
void AddGameInfo(unsigned id, const GameInfo &info);
void RemoveGameInfo(unsigned id);
bool IsSessionEstablished() const;
void SetSessionEstablished(bool flag);
@@ -133,8 +135,8 @@ private:
StartData m_startData;
PlayerDataList m_playerDataList;
GameMap m_gameMap;
mutable boost::mutex m_gameMapMutex;
GameInfoMap m_gameInfoMap;
mutable boost::mutex m_gameInfoMapMutex;
boost::shared_ptr<Game> m_game;
PlayerInfoMap m_playerInfoMap;
+2 -2
View File
@@ -485,7 +485,7 @@ ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptr<Net
// A new game was created on the server.
NetPacketGameListNew::Data gameListNewData;
packet->ToNetPacketGameListNew()->GetData(gameListNewData);
client.AddGameInformation(gameListNewData.gameId, gameListNewData.gameName);
client.AddGameInfo(gameListNewData.gameId, gameListNewData.gameInfo);
}
else if (packet->ToNetPacketGameListUpdate())
{
@@ -493,7 +493,7 @@ ClientStateWaitJoin::InternalProcess(ClientThread &client, boost::shared_ptr<Net
NetPacketGameListUpdate::Data gameListUpdateData;
packet->ToNetPacketGameListUpdate()->GetData(gameListUpdateData);
if (gameListUpdateData.gameMode == GAME_MODE_CLOSED)
client.RemoveGameInformation(gameListUpdateData.gameId);
client.RemoveGameInfo(gameListUpdateData.gameId);
}
else if (packet->ToNetPacketJoinGameAck())
{
+40 -17
View File
@@ -216,6 +216,26 @@ ClientThread::SendCreateGame(const GameData &gameData, const std::string &name,
}
}
GameInfo
ClientThread::GetGameInfo(const string &game) const
{
GameInfo tmpInfo;
try
{
unsigned id = GetGameIdByName(game);
boost::mutex::scoped_lock lock(m_gameInfoMapMutex);
GameInfoMap::const_iterator pos = m_gameInfoMap.find(id);
if (pos != m_gameInfoMap.end())
{
tmpInfo = pos->second;
}
} catch (const NetException &)
{
}
return tmpInfo;
}
ClientCallback &
ClientThread::GetCallback()
{
@@ -469,7 +489,13 @@ ClientThread::RemovePlayerData(unsigned playerId)
}
if (!playerName.empty())
{
// Remove name and id string.
GetCallback().SignalNetClientPlayerLeft(playerName);
ostringstream name;
name << "#" << playerId;
GetCallback().SignalNetClientPlayerLeft(name.str());
}
}
void
@@ -581,12 +607,12 @@ unsigned
ClientThread::GetGameIdByName(const std::string &name) const
{
// Find the game.
boost::mutex::scoped_lock lock(m_gameMapMutex);
GameMap::const_iterator i = m_gameMap.begin();
GameMap::const_iterator end = m_gameMap.end();
boost::mutex::scoped_lock lock(m_gameInfoMapMutex);
GameInfoMap::const_iterator i = m_gameInfoMap.begin();
GameInfoMap::const_iterator end = m_gameInfoMap.end();
while (i != end)
{
if (i->second == name)
if (i->second.name == name)
break;
++i;
}
@@ -597,29 +623,26 @@ ClientThread::GetGameIdByName(const std::string &name) const
}
void
ClientThread::AddGameInformation(unsigned id, const std::string &name)
ClientThread::AddGameInfo(unsigned id, const GameInfo &info)
{
if (!name.empty())
{
{
boost::mutex::scoped_lock lock(m_gameMapMutex);
m_gameMap.insert(GameMap::value_type(id, name));
}
GetCallback().SignalNetClientGameListNew(name);
boost::mutex::scoped_lock lock(m_gameInfoMapMutex);
m_gameInfoMap.insert(GameInfoMap::value_type(id, info));
}
GetCallback().SignalNetClientGameListNew(info.name);
}
void
ClientThread::RemoveGameInformation(unsigned id)
ClientThread::RemoveGameInfo(unsigned id)
{
string name;
{
boost::mutex::scoped_lock lock(m_gameMapMutex);
GameMap::iterator pos = m_gameMap.find(id);
if (pos != m_gameMap.end())
boost::mutex::scoped_lock lock(m_gameInfoMapMutex);
GameInfoMap::iterator pos = m_gameInfoMap.find(id);
if (pos != m_gameInfoMap.end())
{
name = pos->second;
m_gameMap.erase(pos);
name = pos->second.name;
m_gameInfoMap.erase(pos);
}
}
if (!name.empty())
+19 -19
View File
@@ -1010,7 +1010,7 @@ NetPacketGameListNew::Clone() const
void
NetPacketGameListNew::SetData(const NetPacketGameListNew::Data &inData)
{
u_int16_t gameNameLen = (u_int16_t)inData.gameName.length();
u_int16_t gameNameLen = (u_int16_t)inData.gameInfo.name.length();
// Some basic checks, so we don't use up too much memory.
// The constructed packet will also be checked.
@@ -1025,17 +1025,17 @@ NetPacketGameListNew::SetData(const NetPacketGameListNew::Data &inData)
// Set the data.
tmpData->gameId = htonl(inData.gameId);
tmpData->gameMode = htons(inData.gameMode);
tmpData->gameMode = htons(inData.gameInfo.mode);
tmpData->gameNameLength = htons(gameNameLen);
tmpData->maxNumberOfPlayers = htons(inData.gameData.maxNumberOfPlayers);
tmpData->smallBlind = htons(inData.gameData.smallBlind);
tmpData->handsBeforeRaise = htons(inData.gameData.handsBeforeRaise);
tmpData->proposedGuiSpeed = htons(inData.gameData.guiSpeed);
tmpData->playerActionTimeout = htons(inData.gameData.playerActionTimeoutSec);
tmpData->startMoney = htonl(inData.gameData.startMoney);
tmpData->maxNumberOfPlayers = htons(inData.gameInfo.data.maxNumberOfPlayers);
tmpData->smallBlind = htons(inData.gameInfo.data.smallBlind);
tmpData->handsBeforeRaise = htons(inData.gameInfo.data.handsBeforeRaise);
tmpData->proposedGuiSpeed = htons(inData.gameInfo.data.guiSpeed);
tmpData->playerActionTimeout = htons(inData.gameInfo.data.playerActionTimeoutSec);
tmpData->startMoney = htonl(inData.gameInfo.data.startMoney);
char *gameNamePtr = (char *)tmpData + sizeof(NetPacketGameListNewData);
memcpy(gameNamePtr, inData.gameName.c_str(), gameNameLen);
memcpy(gameNamePtr, inData.gameInfo.name.c_str(), gameNameLen);
// Check the packet - just in case.
Check(GetRawData());
@@ -1047,18 +1047,18 @@ NetPacketGameListNew::GetData(NetPacketGameListNew::Data &outData) const
// We assume that the data is valid. Validity has already been checked.
NetPacketGameListNewData *tmpData = (NetPacketGameListNewData *)GetRawData();
outData.gameId = ntohl(tmpData->gameId);
outData.gameMode = static_cast<GameMode>(ntohs(tmpData->gameMode));
u_int16_t gameNameLen = ntohs(tmpData->gameNameLength);
outData.gameData.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameData.smallBlind = ntohs(tmpData->smallBlind);
outData.gameData.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise);
outData.gameData.guiSpeed = ntohs(tmpData->proposedGuiSpeed);
outData.gameData.playerActionTimeoutSec = ntohs(tmpData->playerActionTimeout);
outData.gameData.startMoney = ntohl(tmpData->startMoney);
outData.gameId = ntohl(tmpData->gameId);
outData.gameInfo.mode = static_cast<GameMode>(ntohs(tmpData->gameMode));
u_int16_t gameNameLen = ntohs(tmpData->gameNameLength);
outData.gameInfo.data.maxNumberOfPlayers = ntohs(tmpData->maxNumberOfPlayers);
outData.gameInfo.data.smallBlind = ntohs(tmpData->smallBlind);
outData.gameInfo.data.handsBeforeRaise = ntohs(tmpData->handsBeforeRaise);
outData.gameInfo.data.guiSpeed = ntohs(tmpData->proposedGuiSpeed);
outData.gameInfo.data.playerActionTimeoutSec= ntohs(tmpData->playerActionTimeout);
outData.gameInfo.data.startMoney = ntohl(tmpData->startMoney);
char *gameNamePtr = (char *)tmpData + sizeof(NetPacketGameListNewData);
outData.gameName = string(gameNamePtr, gameNameLen);
outData.gameInfo.name = string(gameNamePtr, gameNameLen);
}
const NetPacketGameListNew *
+4 -3
View File
@@ -225,6 +225,7 @@ ServerLobbyThread::HandleNetPacketInit(SessionWrapper session, const NetPacketIn
// Partly, this is also done in netpacket.
// However, some disallowed names are checked only here.
if (initData.playerName.empty() || initData.playerName.size() > MAX_NAME_SIZE
|| initData.playerName[0] == '#'
|| initData.playerName.substr(0, sizeof(SERVER_COMPUTER_PLAYER_NAME) - 1) == SERVER_COMPUTER_PLAYER_NAME)
{
SessionError(session, ERR_NET_INVALID_PLAYER_NAME);
@@ -552,9 +553,9 @@ ServerLobbyThread::CreateNetPacketGameListNew(const ServerGameThread &game)
boost::shared_ptr<NetPacket> packet(new NetPacketGameListNew);
NetPacketGameListNew::Data packetData;
packetData.gameId = game.GetId();
packetData.gameMode = GAME_MODE_CREATED;
packetData.gameName = game.GetName();
packetData.gameData = game.GetGameData();
packetData.gameInfo.mode = GAME_MODE_CREATED;
packetData.gameInfo.name = game.GetName();
packetData.gameInfo.data = game.GetGameData();
static_cast<NetPacketGameListNew *>(packet.get())->SetData(packetData);
return packet;
}
+1 -3
View File
@@ -191,9 +191,7 @@ public:
struct Data
{
u_int32_t gameId;
GameMode gameMode;
std::string gameName;
GameData gameData;
GameInfo gameInfo;
};
NetPacketGameListNew();
+7
View File
@@ -275,3 +275,10 @@ bool Session::isNetworkServerRunning() const
// TODO
return myNetServer != NULL;
}
GameInfo Session::getClientGameInfo(const string &game)
{
assert(myNetClient);
return myNetClient->GetGameInfo(game);
}
+2
View File
@@ -68,6 +68,8 @@ public:
bool isNetworkClientRunning() const; // TODO hack
bool isNetworkServerRunning() const; // TODO hack
GameInfo getClientGameInfo(const std::string &game);
private:
int currentGameID;