This commit is contained in:
Max-Wilhelm Bruker 2009-11-30 19:33:45 +01:00
parent 55482246dd
commit 59e9416f57
29 changed files with 332 additions and 187 deletions

View file

@ -74,14 +74,12 @@ void CardItem::resetState()
void CardItem::processCardInfo(ServerInfo_Card *info) void CardItem::processCardInfo(ServerInfo_Card *info)
{ {
id = info->getId(); setId(info->getId());
name = info->getName(); setName(info->getName());
attacking = info->getAttacking(); setAttacking(info->getAttacking());
counters = info->getCounters(); setCounters(info->getCounters());
annotation = info->getAnnotation(); setAnnotation(info->getAnnotation());
tapped = info->getTapped(); setTapped(info->getTapped());
update();
} }
CardDragItem *CardItem::createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown) CardDragItem *CardItem::createDragItem(int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown)

View file

@ -82,6 +82,7 @@ void CardZone::mousePressEvent(QGraphicsSceneMouseEvent *event)
void CardZone::addCard(CardItem *card, bool reorganize, int x, int y) void CardZone::addCard(CardItem *card, bool reorganize, int x, int y)
{ {
dumpObjectInfo();
if (view) if (view)
if ((x <= view->getCards().size()) || (view->getNumberCards() == -1)) if ((x <= view->getCards().size()) || (view->getNumberCards() == -1))
view->addCard(new CardItem(player, card->getName(), card->getId()), reorganize, x, y); view->addCard(new CardItem(player, card->getName(), card->getId()), reorganize, x, y);
@ -90,7 +91,6 @@ void CardZone::addCard(CardItem *card, bool reorganize, int x, int y)
if (reorganize) { if (reorganize) {
qDebug("------------ emitting"); qDebug("------------ emitting");
dumpObjectInfo();
emit contentsChanged(); emit contentsChanged();
reorganizeCards(); reorganizeCards();
} }
@ -111,6 +111,15 @@ CardItem *CardZone::getCard(int cardId, const QString &cardName)
CardItem *CardZone::takeCard(int position, int cardId, const QString &cardName, bool /*canResize*/) CardItem *CardZone::takeCard(int position, int cardId, const QString &cardName, bool /*canResize*/)
{ {
if (position == -1) {
for (int i = 0; i < cards.size(); ++i)
if (cards[i]->getId() == cardId) {
position = i;
break;
}
if (position == -1)
return 0;
}
Q_ASSERT(position < cards.size()); Q_ASSERT(position < cards.size());
CardItem *c = cards.takeAt(position); CardItem *c = cards.takeAt(position);

View file

@ -32,7 +32,7 @@ Client::~Client()
void Client::slotSocketError(QAbstractSocket::SocketError /*error*/) void Client::slotSocketError(QAbstractSocket::SocketError /*error*/)
{ {
emit logSocketError(socket->errorString()); emit socketError(socket->errorString());
disconnectFromServer(); disconnectFromServer();
} }
@ -48,7 +48,7 @@ void Client::loginResponse(ResponseCode response)
setStatus(StatusLoggedIn); setStatus(StatusLoggedIn);
else { else {
emit serverError(response); emit serverError(response);
disconnectFromServer(); setStatus(StatusDisconnecting);
} }
} }
@ -82,10 +82,13 @@ void Client::readData()
connect(cmdLogin, SIGNAL(finished(ResponseCode)), this, SLOT(loginResponse(ResponseCode))); connect(cmdLogin, SIGNAL(finished(ResponseCode)), this, SLOT(loginResponse(ResponseCode)));
sendCommand(cmdLogin); sendCommand(cmdLogin);
topLevelItem->read(xmlReader); if (topLevelItem)
topLevelItem->read(xmlReader);
} }
} }
} }
if (status == StatusDisconnecting)
disconnectFromServer();
} }
void Client::processProtocolItem(ProtocolItem *item) void Client::processProtocolItem(ProtocolItem *item)
@ -96,10 +99,9 @@ void Client::processProtocolItem(ProtocolItem *item)
if (!cmd) if (!cmd)
return; return;
pendingCommands.remove(cmd->getCmdId());
cmd->processResponse(response); cmd->processResponse(response);
delete response; delete response;
pendingCommands.remove(cmd->getCmdId());
delete cmd; delete cmd;
return; return;

View file

@ -24,6 +24,7 @@ class Event_GameJoined;
enum ClientStatus { enum ClientStatus {
StatusDisconnected, StatusDisconnected,
StatusDisconnecting,
StatusConnecting, StatusConnecting,
StatusAwaitingWelcome, StatusAwaitingWelcome,
StatusLoggingIn, StatusLoggingIn,
@ -36,7 +37,7 @@ signals:
void statusChanged(ClientStatus _status); void statusChanged(ClientStatus _status);
void maxPingTime(int seconds, int maxSeconds); void maxPingTime(int seconds, int maxSeconds);
void serverTimeout(); void serverTimeout();
void logSocketError(const QString &errorString); void socketError(const QString &errorString);
void serverError(ResponseCode resp); void serverError(ResponseCode resp);
void protocolVersionMismatch(int clientVersion, int serverVersion); void protocolVersionMismatch(int clientVersion, int serverVersion);
void protocolError(); void protocolError();

View file

@ -50,6 +50,7 @@ DlgConnect::DlgConnect(QWidget *parent)
setWindowTitle(tr("Connect to server")); setWindowTitle(tr("Connect to server"));
setFixedHeight(sizeHint().height()); setFixedHeight(sizeHint().height());
setMinimumWidth(300);
connect(okButton, SIGNAL(clicked()), this, SLOT(actOk())); connect(okButton, SIGNAL(clicked()), this, SLOT(actOk()));
connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject())); connect(cancelButton, SIGNAL(clicked()), this, SLOT(reject()));

View file

@ -546,14 +546,18 @@ void Player::eventMoveCard(Event_MoveCard *event)
if (!startZone || !targetZone) if (!startZone || !targetZone)
return; return;
qDebug("Player::eventMoveCard --- startZone");
startZone->dumpObjectInfo();
qDebug("Player::eventMoveCard --- targetZone");
targetZone->dumpObjectInfo();
qDebug("---");
int position = event->getPosition(); int position = event->getPosition();
int x = event->getX(); int x = event->getX();
int y = event->getY(); int y = event->getY();
int logPosition = position; int logPosition = position;
int logX = x; int logX = x;
if (position == -1)
position = 0;
if (x == -1) if (x == -1)
x = 0; x = 0;
CardItem *card = startZone->takeCard(position, event->getCardId(), event->getCardName(), startZone != targetZone); CardItem *card = startZone->takeCard(position, event->getCardId(), event->getCardName(), startZone != targetZone);
@ -702,8 +706,8 @@ void Player::processPlayerInfo(ServerInfo_Player *info)
} else { } else {
for (int j = 0; j < cardList.size(); ++j) { for (int j = 0; j < cardList.size(); ++j) {
CardItem *card = new CardItem(this); CardItem *card = new CardItem(this);
card->processCardInfo(cardList[i]); card->processCardInfo(cardList[j]);
zone->addCard(card, false, cardList[i]->getX(), cardList[i]->getY()); zone->addCard(card, false, cardList[j]->getX(), cardList[j]->getY());
} }
} }
zone->reorganizeCards(); zone->reorganizeCards();

View file

@ -22,11 +22,25 @@ TabChatChannel::TabChatChannel(Client *_client, const QString &_channelName)
hbox->addLayout(vbox); hbox->addLayout(vbox);
hbox->addWidget(playerList); hbox->addWidget(playerList);
aLeaveChannel = new QAction(this);
connect(aLeaveChannel, SIGNAL(triggered()), this, SLOT(actLeaveChannel()));
tabMenu = new QMenu(this);
tabMenu->addAction(aLeaveChannel);
retranslateUi();
setLayout(hbox); setLayout(hbox);
} }
TabChatChannel::~TabChatChannel()
{
emit channelClosing(this);
}
void TabChatChannel::retranslateUi() void TabChatChannel::retranslateUi()
{ {
tabMenu->setTitle(tr("C&hat channel"));
aLeaveChannel->setText(tr("&Leave channel"));
} }
void TabChatChannel::sendMessage() void TabChatChannel::sendMessage()
@ -38,6 +52,12 @@ void TabChatChannel::sendMessage()
sayEdit->clear(); sayEdit->clear();
} }
void TabChatChannel::actLeaveChannel()
{
client->sendCommand(new Command_ChatLeaveChannel(channelName));
deleteLater();
}
void TabChatChannel::processChatEvent(ChatEvent *event) void TabChatChannel::processChatEvent(ChatEvent *event)
{ {
switch (event->getItemId()) { switch (event->getItemId()) {

View file

@ -22,8 +22,13 @@ private:
QListWidget *playerList; QListWidget *playerList;
QTextEdit *textEdit; QTextEdit *textEdit;
QLineEdit *sayEdit; QLineEdit *sayEdit;
QAction *aLeaveChannel;
signals:
void channelClosing(TabChatChannel *tab);
private slots: private slots:
void sendMessage(); void sendMessage();
void actLeaveChannel();
void processListPlayersEvent(Event_ChatListPlayers *event); void processListPlayersEvent(Event_ChatListPlayers *event);
void processJoinChannelEvent(Event_ChatJoinChannel *event); void processJoinChannelEvent(Event_ChatJoinChannel *event);
@ -31,8 +36,10 @@ private slots:
void processSayEvent(Event_ChatSay *event); void processSayEvent(Event_ChatSay *event);
public: public:
TabChatChannel(Client *_client, const QString &_channelName); TabChatChannel(Client *_client, const QString &_channelName);
~TabChatChannel();
void retranslateUi(); void retranslateUi();
void processChatEvent(ChatEvent *event); void processChatEvent(ChatEvent *event);
QString getChannelName() const { return channelName; }
}; };
#endif #endif

View file

@ -88,6 +88,8 @@ TabGame::TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectat
connect(aNextTurn, SIGNAL(triggered()), this, SLOT(actNextTurn())); connect(aNextTurn, SIGNAL(triggered()), this, SLOT(actNextTurn()));
aRemoveLocalArrows = new QAction(this); aRemoveLocalArrows = new QAction(this);
connect(aRemoveLocalArrows, SIGNAL(triggered()), this, SLOT(actRemoveLocalArrows())); connect(aRemoveLocalArrows, SIGNAL(triggered()), this, SLOT(actRemoveLocalArrows()));
aLeaveGame = new QAction(this);
connect(aLeaveGame, SIGNAL(triggered()), this, SLOT(actLeaveGame()));
tabMenu = new QMenu(this); tabMenu = new QMenu(this);
playersSeparator = tabMenu->addSeparator(); playersSeparator = tabMenu->addSeparator();
@ -95,6 +97,8 @@ TabGame::TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectat
tabMenu->addAction(aNextTurn); tabMenu->addAction(aNextTurn);
tabMenu->addSeparator(); tabMenu->addSeparator();
tabMenu->addAction(aRemoveLocalArrows); tabMenu->addAction(aRemoveLocalArrows);
tabMenu->addSeparator();
tabMenu->addAction(aLeaveGame);
retranslateUi(); retranslateUi();
setLayout(mainLayout); setLayout(mainLayout);
@ -102,6 +106,11 @@ TabGame::TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectat
messageLog->logGameJoined(gameId); messageLog->logGameJoined(gameId);
} }
TabGame::~TabGame()
{
emit gameClosing(this);
}
void TabGame::retranslateUi() void TabGame::retranslateUi()
{ {
tabMenu->setTitle(tr("&Game")); tabMenu->setTitle(tr("&Game"));
@ -111,6 +120,7 @@ void TabGame::retranslateUi()
aNextTurn->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter"))); aNextTurn->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter")));
aRemoveLocalArrows->setText(tr("&Remove all local arrows")); aRemoveLocalArrows->setText(tr("&Remove all local arrows"));
aRemoveLocalArrows->setShortcut(tr("Ctrl+R")); aRemoveLocalArrows->setShortcut(tr("Ctrl+R"));
aLeaveGame->setText(tr("&Leave game"));
loadLocalButton->setText(tr("Load &local deck")); loadLocalButton->setText(tr("Load &local deck"));
loadRemoteButton->setText(tr("Load deck from &server")); loadRemoteButton->setText(tr("Load deck from &server"));
@ -126,6 +136,15 @@ void TabGame::retranslateUi()
i.next().value()->retranslateUi(); i.next().value()->retranslateUi();
} }
void TabGame::actLeaveGame()
{
if (QMessageBox::question(this, tr("Leave game"), tr("Are you sure you want to leave this game?"), QMessageBox::Yes | QMessageBox::No, QMessageBox::No) != QMessageBox::Yes)
return;
sendGameCommand(new Command_LeaveGame);
deleteLater();
}
void TabGame::actSay() void TabGame::actSay()
{ {
if (!sayEdit->text().isEmpty()) { if (!sayEdit->text().isEmpty()) {
@ -175,7 +194,6 @@ Player *TabGame::addPlayer(int playerId, const QString &playerName)
tabMenu->insertMenu(playersSeparator, newPlayer->getPlayerMenu()); tabMenu->insertMenu(playersSeparator, newPlayer->getPlayerMenu());
players.insert(playerId, newPlayer); players.insert(playerId, newPlayer);
emit playerAdded(newPlayer);
return newPlayer; return newPlayer;
} }
@ -207,15 +225,21 @@ void TabGame::sendGameCommand(GameCommand *command)
client->sendCommand(command); client->sendCommand(command);
} }
void TabGame::eventGameStart(Event_GameStart * /*event*/) void TabGame::startGame()
{ {
currentPhase = -1; currentPhase = -1;
started = true;
deckViewContainer->hide(); deckViewContainer->hide();
gameView->show(); gameView->show();
phasesToolbar->show(); phasesToolbar->show();
}
void TabGame::eventGameStart(Event_GameStart * /*event*/)
{
startGame();
messageLog->logGameStart(); messageLog->logGameStart();
QMapIterator<int, Player *> i(players); QMapIterator<int, Player *> i(players);
while (i.hasNext()) while (i.hasNext())
i.next().value()->prepareForGame(); i.next().value()->prepareForGame();
@ -233,26 +257,35 @@ void TabGame::eventGameStateChanged(Event_GameStateChanged *event)
} }
player->processPlayerInfo(pl); player->processPlayerInfo(pl);
} }
if (event->getGameStarted() && !started) {
startGame();
setActivePlayer(event->getActivePlayer());
setActivePhase(event->getActivePhase());
}
} }
void TabGame::eventJoin(Event_Join *event) void TabGame::eventJoin(Event_Join *event)
{ {
if (event->getSpectator()) { ServerInfo_Player *playerInfo = event->getPlayer();
spectatorList.append(event->getPlayerName()); if (playerInfo->getSpectator()) {
messageLog->logJoinSpectator(event->getPlayerName()); spectatorList.append(playerInfo->getName());
messageLog->logJoinSpectator(playerInfo->getName());
} else { } else {
Player *newPlayer = addPlayer(event->getPlayerId(), event->getPlayerName()); Player *newPlayer = addPlayer(playerInfo->getPlayerId(), playerInfo->getName());
messageLog->logJoin(newPlayer); messageLog->logJoin(newPlayer);
playerListWidget->addPlayer(playerInfo);
} }
} }
void TabGame::eventLeave(Event_Leave *event) void TabGame::eventLeave(Event_Leave *event)
{ {
Player *player = players.value(event->getPlayerId(), 0); int playerId = event->getPlayerId();
Player *player = players.value(playerId, 0);
if (!player) if (!player)
return; return;
messageLog->logLeave(player); messageLog->logLeave(player);
playerListWidget->removePlayer(playerId);
} }
void TabGame::eventGameClosed(Event_GameClosed * /*event*/) void TabGame::eventGameClosed(Event_GameClosed * /*event*/)
@ -261,29 +294,43 @@ void TabGame::eventGameClosed(Event_GameClosed * /*event*/)
messageLog->logGameClosed(); messageLog->logGameClosed();
} }
void TabGame::eventSetActivePlayer(Event_SetActivePlayer *event) Player *TabGame::setActivePlayer(int id)
{ {
Player *player = players.value(event->getActivePlayerId(), 0); Player *player = players.value(id, 0);
if (!player) if (!player)
return; return 0;
playerListWidget->setActivePlayer(event->getActivePlayerId()); playerListWidget->setActivePlayer(id);
QMapIterator<int, Player *> i(players); QMapIterator<int, Player *> i(players);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
i.value()->setActive(i.value() == player); i.value()->setActive(i.value() == player);
} }
messageLog->logSetActivePlayer(player);
currentPhase = -1; currentPhase = -1;
return player;
}
void TabGame::eventSetActivePlayer(Event_SetActivePlayer *event)
{
Player *player = setActivePlayer(event->getActivePlayerId());
if (!player)
return;
messageLog->logSetActivePlayer(player);
}
void TabGame::setActivePhase(int phase)
{
if (currentPhase != phase) {
currentPhase = phase;
phasesToolbar->setActivePhase(phase);
}
} }
void TabGame::eventSetActivePhase(Event_SetActivePhase *event) void TabGame::eventSetActivePhase(Event_SetActivePhase *event)
{ {
const int phase = event->getPhase(); int phase = event->getPhase();
if (currentPhase != phase) { if (currentPhase != phase)
currentPhase = phase;
phasesToolbar->setActivePhase(phase);
messageLog->logSetActivePhase(phase); messageLog->logSetActivePhase(phase);
} setActivePhase(phase);
} }
void TabGame::loadLocalDeck() void TabGame::loadLocalDeck()

View file

@ -61,22 +61,22 @@ private:
QAction *playersSeparator; QAction *playersSeparator;
QMenu *playersMenu; QMenu *playersMenu;
QAction *aCloseMostRecentZoneView, QAction *aCloseMostRecentZoneView,
*aNextPhase, *aNextTurn, *aRemoveLocalArrows; *aLeaveGame, *aNextPhase, *aNextTurn, *aRemoveLocalArrows;
Player *addPlayer(int playerId, const QString &playerName); Player *addPlayer(int playerId, const QString &playerName);
void startGame();
void eventGameStart(Event_GameStart *event); void eventGameStart(Event_GameStart *event);
void eventGameStateChanged(Event_GameStateChanged *event); void eventGameStateChanged(Event_GameStateChanged *event);
void eventJoin(Event_Join *event); void eventJoin(Event_Join *event);
void eventLeave(Event_Leave *event); void eventLeave(Event_Leave *event);
void eventGameClosed(Event_GameClosed *event); void eventGameClosed(Event_GameClosed *event);
Player *setActivePlayer(int id);
void eventSetActivePlayer(Event_SetActivePlayer *event); void eventSetActivePlayer(Event_SetActivePlayer *event);
void setActivePhase(int phase);
void eventSetActivePhase(Event_SetActivePhase *event); void eventSetActivePhase(Event_SetActivePhase *event);
signals: signals:
// -- XXX -- void gameClosing(TabGame *tab);
void playerAdded(Player *player);
void playerRemoved(Player *player);
// -- XXX --
private slots: private slots:
void loadLocalDeck(); void loadLocalDeck();
void loadRemoteDeck(); void loadRemoteDeck();
@ -84,14 +84,17 @@ private slots:
void deckSelectFinished(ProtocolResponse *r); void deckSelectFinished(ProtocolResponse *r);
void newCardAdded(CardItem *card); void newCardAdded(CardItem *card);
void actLeaveGame();
void actRemoveLocalArrows(); void actRemoveLocalArrows();
void actSay(); void actSay();
void actNextPhase(); void actNextPhase();
void actNextTurn(); void actNextTurn();
public: public:
TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectator); TabGame(Client *_client, int _gameId, int _localPlayerId, bool _spectator);
~TabGame();
void retranslateUi(); void retranslateUi();
const QMap<int, Player *> &getPlayers() const { return players; } const QMap<int, Player *> &getPlayers() const { return players; }
int getGameId() const { return gameId; }
void processGameEvent(GameEvent *event); void processGameEvent(GameEvent *event);
public slots: public slots:

View file

@ -103,19 +103,37 @@ void TabSupervisor::updatePingTime(int value, int max)
void TabSupervisor::gameJoined(Event_GameJoined *event) void TabSupervisor::gameJoined(Event_GameJoined *event)
{ {
TabGame *tab = new TabGame(client, event->getGameId(), event->getPlayerId(), event->getSpectator()); TabGame *tab = new TabGame(client, event->getGameId(), event->getPlayerId(), event->getSpectator());
connect(tab, SIGNAL(gameClosing(TabGame *)), this, SLOT(gameLeft(TabGame *)));
addTab(tab, tr("Game %1").arg(event->getGameId())); addTab(tab, tr("Game %1").arg(event->getGameId()));
gameTabs.insert(event->getGameId(), tab); gameTabs.insert(event->getGameId(), tab);
setCurrentWidget(tab); setCurrentWidget(tab);
} }
void TabSupervisor::gameLeft(TabGame *tab)
{
emit setMenu(0);
gameTabs.remove(tab->getGameId());
removeTab(indexOf(tab));
}
void TabSupervisor::addChatChannelTab(const QString &channelName) void TabSupervisor::addChatChannelTab(const QString &channelName)
{ {
TabChatChannel *tab = new TabChatChannel(client, channelName); TabChatChannel *tab = new TabChatChannel(client, channelName);
connect(tab, SIGNAL(channelClosing(TabChatChannel *)), this, SLOT(chatChannelLeft(TabChatChannel *)));
addTab(tab, channelName); addTab(tab, channelName);
chatChannelTabs.insert(channelName, tab); chatChannelTabs.insert(channelName, tab);
setCurrentWidget(tab); setCurrentWidget(tab);
} }
void TabSupervisor::chatChannelLeft(TabChatChannel *tab)
{
emit setMenu(0);
chatChannelTabs.remove(tab->getChannelName());
removeTab(indexOf(tab));
}
void TabSupervisor::processChatEvent(ChatEvent *event) void TabSupervisor::processChatEvent(ChatEvent *event)
{ {
TabChatChannel *tab = chatChannelTabs.value(event->getChannel(), 0); TabChatChannel *tab = chatChannelTabs.value(event->getChannel(), 0);

View file

@ -33,9 +33,11 @@ private slots:
void updateMenu(int index); void updateMenu(int index);
void updatePingTime(int value, int max); void updatePingTime(int value, int max);
void gameJoined(Event_GameJoined *event); void gameJoined(Event_GameJoined *event);
void gameLeft(TabGame *tab);
void addChatChannelTab(const QString &channelName); void addChatChannelTab(const QString &channelName);
void chatChannelLeft(TabChatChannel *tab);
void processChatEvent(ChatEvent *event); void processChatEvent(ChatEvent *event);
void processGameEvent(GameEvent *event); void processGameEvent(GameEvent *event);
}; };
#endif #endif

View file

@ -25,6 +25,8 @@
#include "window_deckeditor.h" #include "window_deckeditor.h"
#include "tab_supervisor.h" #include "tab_supervisor.h"
const QString MainWindow::appName = "Cockatrice";
void MainWindow::updateTabMenu(QMenu *menu) void MainWindow::updateTabMenu(QMenu *menu)
{ {
if (tabMenu) if (tabMenu)
@ -36,60 +38,24 @@ void MainWindow::updateTabMenu(QMenu *menu)
void MainWindow::statusChanged(ClientStatus _status) void MainWindow::statusChanged(ClientStatus _status)
{ {
setClientStatusTitle();
switch (_status) { switch (_status) {
case StatusConnecting: case StatusConnecting:
emit logConnecting(client->peerName());
break; break;
case StatusDisconnected: case StatusDisconnected:
tabSupervisor->stop(); tabSupervisor->stop();
// if (game) {
// zoneLayout->clear();
// delete game;
// game = 0;
// }
aConnect->setEnabled(true); aConnect->setEnabled(true);
aDisconnect->setEnabled(false); aDisconnect->setEnabled(false);
// aRestartGame->setEnabled(false);
// aLeaveGame->setEnabled(false);
// phasesToolbar->setActivePhase(-1);
// phasesToolbar->hide();
emit logDisconnected();
break; break;
case StatusLoggingIn: case StatusLoggingIn:
emit logConnected();
aConnect->setEnabled(false); aConnect->setEnabled(false);
aDisconnect->setEnabled(true); aDisconnect->setEnabled(true);
break; break;
case StatusLoggedIn: { case StatusLoggedIn: {
tabSupervisor->start(client); tabSupervisor->start(client);
/* if (game) {
zoneLayout->clear();
delete game;
game = 0;
}
aRestartGame->setEnabled(false);
aLeaveGame->setEnabled(false);
phasesToolbar->setActivePhase(-1);
phasesToolbar->hide();
view->hide();
gameSelector->enableGameList();
chatWidget->enableChat();
*/ break;
}
// case StatusPlaying: {
/* chatWidget->disableChat();
aRestartGame->setEnabled(true);
aLeaveGame->setEnabled(true);
phasesToolbar->show();
view->show();
break; break;
} }
*/ default: default:
break; break;
} }
} }
@ -107,18 +73,7 @@ void MainWindow::actDisconnect()
{ {
client->disconnectFromServer(); client->disconnectFromServer();
} }
/*
void MainWindow::actRestartGame()
{
zoneLayout->clear();
game->restartGameDialog();
}
void MainWindow::actLeaveGame()
{
client->leaveGame();
}
*/
void MainWindow::actDeckEditor() void MainWindow::actDeckEditor()
{ {
WndDeckEditor *deckEditor = new WndDeckEditor(this); WndDeckEditor *deckEditor = new WndDeckEditor(this);
@ -149,15 +104,40 @@ void MainWindow::serverTimeout()
QMessageBox::critical(this, tr("Error"), tr("Server timeout")); QMessageBox::critical(this, tr("Error"), tr("Server timeout"));
} }
void MainWindow::serverError(ResponseCode r)
{
switch (r) {
case RespWrongPassword: QMessageBox::critical(this, tr("Error"), tr("Invalid login data.")); break;
default: ;
}
}
void MainWindow::socketError(const QString &errorStr)
{
QMessageBox::critical(this, tr("Error"), tr("Socket error: %1").arg(errorStr));
}
void MainWindow::protocolVersionMismatch(int localVersion, int remoteVersion)
{
QMessageBox::critical(this, tr("Error"), tr("Protocol version mismatch. Local version: %1, remote version: %2.").arg(localVersion).arg(remoteVersion));
}
void MainWindow::setClientStatusTitle()
{
switch (client->getStatus()) {
case StatusConnecting: setWindowTitle(appName + " - " + tr("Connecting to %1...").arg(client->peerName())); break;
case StatusDisconnected: setWindowTitle(appName + " - " + tr("Disconnected")); break;
case StatusLoggedIn: setWindowTitle(appName + " - " + tr("Logged in at %1").arg(client->peerName())); break;
default: setWindowTitle(appName);
}
}
void MainWindow::retranslateUi() void MainWindow::retranslateUi()
{ {
setWindowTitle(tr("Cockatrice")); setClientStatusTitle();
aConnect->setText(tr("&Connect...")); aConnect->setText(tr("&Connect..."));
aDisconnect->setText(tr("&Disconnect")); aDisconnect->setText(tr("&Disconnect"));
// aRestartGame->setText(tr("&Restart game..."));
// aRestartGame->setShortcut(tr("F2"));
// aLeaveGame->setText(tr("&Leave game"));
aDeckEditor->setText(tr("&Deck editor")); aDeckEditor->setText(tr("&Deck editor"));
aFullScreen->setText(tr("&Full screen")); aFullScreen->setText(tr("&Full screen"));
aFullScreen->setShortcut(tr("Ctrl+F")); aFullScreen->setShortcut(tr("Ctrl+F"));
@ -174,13 +154,7 @@ void MainWindow::createActions()
aDisconnect = new QAction(this); aDisconnect = new QAction(this);
aDisconnect->setEnabled(false); aDisconnect->setEnabled(false);
connect(aDisconnect, SIGNAL(triggered()), this, SLOT(actDisconnect())); connect(aDisconnect, SIGNAL(triggered()), this, SLOT(actDisconnect()));
/* aRestartGame = new QAction(this); aDeckEditor = new QAction(this);
aRestartGame->setEnabled(false);
connect(aRestartGame, SIGNAL(triggered()), this, SLOT(actRestartGame()));
aLeaveGame = new QAction(this);
aLeaveGame->setEnabled(false);
connect(aLeaveGame, SIGNAL(triggered()), this, SLOT(actLeaveGame()));
*/ aDeckEditor = new QAction(this);
connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor())); connect(aDeckEditor, SIGNAL(triggered()), this, SLOT(actDeckEditor()));
aFullScreen = new QAction(this); aFullScreen = new QAction(this);
aFullScreen->setCheckable(true); aFullScreen->setCheckable(true);
@ -212,22 +186,16 @@ MainWindow::MainWindow(QWidget *parent)
QPixmapCache::setCacheLimit(200000); QPixmapCache::setCacheLimit(200000);
client = new Client(this); client = new Client(this);
connect(client, SIGNAL(serverError(ResponseCode)), this, SLOT(serverError(ResponseCode)));
connect(client, SIGNAL(socketError(const QString &)), this, SLOT(socketError(const QString &)));
connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout()));
connect(client, SIGNAL(statusChanged(ClientStatus)), this, SLOT(statusChanged(ClientStatus)));
connect(client, SIGNAL(protocolVersionMismatch(int, int)), this, SLOT(protocolVersionMismatch(int, int)));
tabSupervisor = new TabSupervisor; tabSupervisor = new TabSupervisor;
connect(tabSupervisor, SIGNAL(setMenu(QMenu *)), this, SLOT(updateTabMenu(QMenu *))); connect(tabSupervisor, SIGNAL(setMenu(QMenu *)), this, SLOT(updateTabMenu(QMenu *)));
setCentralWidget(tabSupervisor); setCentralWidget(tabSupervisor);
/*
connect(this, SIGNAL(logConnecting(QString)), messageLog, SLOT(logConnecting(QString)));
connect(this, SIGNAL(logConnected()), messageLog, SLOT(logConnected()));
connect(this, SIGNAL(logDisconnected()), messageLog, SLOT(logDisconnected()));
connect(client, SIGNAL(logSocketError(const QString &)), messageLog, SLOT(logSocketError(const QString &)));
connect(client, SIGNAL(serverError(ResponseCode)), messageLog, SLOT(logServerError(ResponseCode)));
connect(client, SIGNAL(protocolVersionMismatch(int, int)), messageLog, SLOT(logProtocolVersionMismatch(int, int)));
connect(client, SIGNAL(protocolError()), messageLog, SLOT(logProtocolError()));
*/
connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout()));
connect(client, SIGNAL(statusChanged(ClientStatus)), this, SLOT(statusChanged(ClientStatus)));
createActions(); createActions();
createMenus(); createMenus();

View file

@ -22,6 +22,7 @@
#include <QMainWindow> #include <QMainWindow>
#include "client.h" #include "client.h"
#include "protocol_datastructures.h"
class TabSupervisor; class TabSupervisor;
@ -31,6 +32,9 @@ private slots:
void updateTabMenu(QMenu *menu); void updateTabMenu(QMenu *menu);
void statusChanged(ClientStatus _status); void statusChanged(ClientStatus _status);
void serverTimeout(); void serverTimeout();
void serverError(ResponseCode r);
void socketError(const QString &errorStr);
void protocolVersionMismatch(int localVersion, int remoteVersion);
void actConnect(); void actConnect();
void actDisconnect(); void actDisconnect();
@ -38,11 +42,9 @@ private slots:
void actFullScreen(bool checked); void actFullScreen(bool checked);
void actSettings(); void actSettings();
void actExit(); void actExit();
signals:
void logConnecting(QString hostname);
void logConnected();
void logDisconnected();
private: private:
static const QString appName;
void setClientStatusTitle();
void retranslateUi(); void retranslateUi();
void createActions(); void createActions();
void createMenus(); void createMenus();

View file

@ -80,8 +80,8 @@ void ZoneViewWidget::resizeToZoneContents()
int cardCount = zone->getCards().size(); int cardCount = zone->getCards().size();
const QRectF &playersRect = static_cast<GameScene *>(scene())->getPlayersRect(); const QRectF &playersRect = static_cast<GameScene *>(scene())->getPlayersRect();
int h = 0; int h = 0;
if (cardCount * CARD_HEIGHT / 5 < playersRect.height() * 1.5) if (cardCount * CARD_HEIGHT / 3 < playersRect.height() * 1.5)
h = cardCount * CARD_HEIGHT / 5; h = cardCount * CARD_HEIGHT / 3;
else else
h = playersRect.height() * 1.5; h = playersRect.height() * 1.5;
qDebug(QString("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx resizing to %1").arg(h).toLatin1()); qDebug(QString("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXx resizing to %1").arg(h).toLatin1());

View file

@ -37,6 +37,7 @@ void ProtocolItem::initializeHash()
registerSerializableItem("generic_eventlist_games", Event_ListGames::newItem); registerSerializableItem("generic_eventlist_games", Event_ListGames::newItem);
registerSerializableItem("generic_eventlist_chat_channels", Event_ListChatChannels::newItem); registerSerializableItem("generic_eventlist_chat_channels", Event_ListChatChannels::newItem);
registerSerializableItem("game_eventjoin", Event_Join::newItem);
registerSerializableItem("game_eventgame_state_changed", Event_GameStateChanged::newItem); registerSerializableItem("game_eventgame_state_changed", Event_GameStateChanged::newItem);
registerSerializableItem("game_eventcreate_arrows", Event_CreateArrows::newItem); registerSerializableItem("game_eventcreate_arrows", Event_CreateArrows::newItem);
registerSerializableItem("game_eventcreate_counters", Event_CreateCounters::newItem); registerSerializableItem("game_eventcreate_counters", Event_CreateCounters::newItem);
@ -214,9 +215,20 @@ Event_ListGames::Event_ListGames(const QList<ServerInfo_Game *> &_gameList)
itemList.append(_gameList[i]); itemList.append(_gameList[i]);
} }
Event_GameStateChanged::Event_GameStateChanged(int _gameId, const QList<ServerInfo_Player *> &_playerList) Event_Join::Event_Join(int _gameId, ServerInfo_Player *player)
: GameEvent("join", _gameId, -1)
{
if (!player)
player = new ServerInfo_Player;
insertItem(player);
}
Event_GameStateChanged::Event_GameStateChanged(int _gameId, bool _gameStarted, int _activePlayer, int _activePhase, const QList<ServerInfo_Player *> &_playerList)
: GameEvent("game_state_changed", _gameId, -1) : GameEvent("game_state_changed", _gameId, -1)
{ {
insertItem(new SerializableItem_Bool("game_started", _gameStarted));
insertItem(new SerializableItem_Int("active_player", _activePlayer));
insertItem(new SerializableItem_Int("active_phase", _activePhase));
for (int i = 0; i < _playerList.size(); ++i) for (int i = 0; i < _playerList.size(); ++i)
itemList.append(_playerList[i]); itemList.append(_playerList[i]);
} }

View file

@ -26,6 +26,7 @@ enum ItemId {
ItemId_Event_CreateArrows = ItemId_Other + 204, ItemId_Event_CreateArrows = ItemId_Other + 204,
ItemId_Event_CreateCounters = ItemId_Other + 205, ItemId_Event_CreateCounters = ItemId_Other + 205,
ItemId_Event_DrawCards = ItemId_Other + 206, ItemId_Event_DrawCards = ItemId_Other + 206,
ItemId_Event_Join = ItemId_Other + 207,
ItemId_Response_DeckList = ItemId_Other + 300, ItemId_Response_DeckList = ItemId_Other + 300,
ItemId_Response_DeckDownload = ItemId_Other + 301, ItemId_Response_DeckDownload = ItemId_Other + 301,
ItemId_Response_DeckUpload = ItemId_Other + 302, ItemId_Response_DeckUpload = ItemId_Other + 302,
@ -236,13 +237,25 @@ public:
QList<ServerInfo_Game *> getGameList() const { return typecastItemList<ServerInfo_Game *>(); } QList<ServerInfo_Game *> getGameList() const { return typecastItemList<ServerInfo_Game *>(); }
}; };
class Event_Join : public GameEvent {
Q_OBJECT
public:
Event_Join(int _gameId = -1, ServerInfo_Player * player = 0);
static SerializableItem *newItem() { return new Event_Join; }
int getItemId() const { return ItemId_Event_Join; }
ServerInfo_Player *getPlayer() const { return static_cast<ServerInfo_Player *>(itemMap.value("player")); }
};
class Event_GameStateChanged : public GameEvent { class Event_GameStateChanged : public GameEvent {
Q_OBJECT Q_OBJECT
public: public:
Event_GameStateChanged(int _gameId = -1, const QList<ServerInfo_Player *> &_playerList = QList<ServerInfo_Player *>()); Event_GameStateChanged(int _gameId = -1, bool _gameStarted = false, int _activePlayer = -1, int _activePhase = -1, const QList<ServerInfo_Player *> &_playerList = QList<ServerInfo_Player *>());
static SerializableItem *newItem() { return new Event_GameStateChanged; } static SerializableItem *newItem() { return new Event_GameStateChanged; }
int getItemId() const { return ItemId_Event_GameStateChanged; } int getItemId() const { return ItemId_Event_GameStateChanged; }
QList<ServerInfo_Player *> getPlayerList() const { return typecastItemList<ServerInfo_Player *>(); } QList<ServerInfo_Player *> getPlayerList() const { return typecastItemList<ServerInfo_Player *>(); }
bool getGameStarted() const { return static_cast<SerializableItem_Bool *>(itemMap.value("game_started"))->getData(); }
int getActivePlayer() const { return static_cast<SerializableItem_Int *>(itemMap.value("active_player"))->getData(); }
int getActivePhase() const { return static_cast<SerializableItem_Int *>(itemMap.value("active_phase"))->getData(); }
}; };
class Event_CreateArrows : public GameEvent { class Event_CreateArrows : public GameEvent {

View file

@ -1,4 +1,5 @@
#include "protocol_datastructures.h" #include "protocol_datastructures.h"
#include "decklist.h"
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
@ -107,11 +108,16 @@ ServerInfo_Arrow::ServerInfo_Arrow(int _id, int _startPlayerId, const QString &_
insertItem(new SerializableItem_Color("color", _color)); insertItem(new SerializableItem_Color("color", _color));
} }
ServerInfo_Player::ServerInfo_Player(int _playerId, const QString &_name, const QList<ServerInfo_Zone *> &_zoneList, const QList<ServerInfo_Counter *> &_counterList, const QList<ServerInfo_Arrow *> &_arrowList) ServerInfo_Player::ServerInfo_Player(int _playerId, const QString &_name, bool _spectator, DeckList *_deck, const QList<ServerInfo_Zone *> &_zoneList, const QList<ServerInfo_Counter *> &_counterList, const QList<ServerInfo_Arrow *> &_arrowList)
: SerializableItem_Map("player"), zoneList(_zoneList), counterList(_counterList), arrowList(_arrowList) : SerializableItem_Map("player"), zoneList(_zoneList), counterList(_counterList), arrowList(_arrowList)
{ {
insertItem(new SerializableItem_Int("player_id", _playerId)); insertItem(new SerializableItem_Int("player_id", _playerId));
insertItem(new SerializableItem_String("name", _name)); insertItem(new SerializableItem_String("name", _name));
insertItem(new SerializableItem_Bool("spectator", _spectator));
if (!_deck)
insertItem(new DeckList);
else
insertItem(new DeckList(_deck));
for (int i = 0; i < _zoneList.size(); ++i) for (int i = 0; i < _zoneList.size(); ++i)
itemList.append(_zoneList[i]); itemList.append(_zoneList[i]);
@ -136,6 +142,11 @@ void ServerInfo_Player::extractData()
} }
} }
DeckList *ServerInfo_Player::getDeck() const
{
return static_cast<DeckList *>(itemMap.value("cockatrice_deck"));
}
DeckList_TreeItem::DeckList_TreeItem(const QString &_itemType, const QString &_name, int _id) DeckList_TreeItem::DeckList_TreeItem(const QString &_itemType, const QString &_name, int _id)
: SerializableItem_Map(_itemType) : SerializableItem_Map(_itemType)
{ {

View file

@ -6,6 +6,8 @@
#include <QDateTime> #include <QDateTime>
#include "serializable_item.h" #include "serializable_item.h"
class DeckList;
enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed }; enum ResponseCode { RespNothing, RespOk, RespInvalidCommand, RespInvalidData, RespNameNotFound, RespLoginNeeded, RespContextError, RespWrongPassword, RespSpectatorsNotAllowed };
// PrivateZone: Contents of the zone are always visible to the owner, // PrivateZone: Contents of the zone are always visible to the owner,
@ -110,10 +112,12 @@ private:
protected: protected:
void extractData(); void extractData();
public: public:
ServerInfo_Player(int _playerId = -1, const QString &_name = QString(), const QList<ServerInfo_Zone *> &_zoneList = QList<ServerInfo_Zone *>(), const QList<ServerInfo_Counter *> &_counterList = QList<ServerInfo_Counter *>(), const QList<ServerInfo_Arrow *> &_arrowList = QList<ServerInfo_Arrow *>()); ServerInfo_Player(int _playerId = -1, const QString &_name = QString(), bool _spectator = false, DeckList *_deck = 0, const QList<ServerInfo_Zone *> &_zoneList = QList<ServerInfo_Zone *>(), const QList<ServerInfo_Counter *> &_counterList = QList<ServerInfo_Counter *>(), const QList<ServerInfo_Arrow *> &_arrowList = QList<ServerInfo_Arrow *>());
static SerializableItem *newItem() { return new ServerInfo_Player; } static SerializableItem *newItem() { return new ServerInfo_Player; }
int getPlayerId() const { return static_cast<SerializableItem_Int *>(itemMap.value("player_id"))->getData(); } int getPlayerId() const { return static_cast<SerializableItem_Int *>(itemMap.value("player_id"))->getData(); }
QString getName() const { return static_cast<SerializableItem_String *>(itemMap.value("name"))->getData(); } QString getName() const { return static_cast<SerializableItem_String *>(itemMap.value("name"))->getData(); }
bool getSpectator() const { return static_cast<SerializableItem_Bool *>(itemMap.value("spectator"))->getData(); }
DeckList *getDeck() const;
const QList<ServerInfo_Zone *> &getZoneList() const { return zoneList; } const QList<ServerInfo_Zone *> &getZoneList() const { return zoneList; }
const QList<ServerInfo_Counter *> &getCounterList() const { return counterList; } const QList<ServerInfo_Counter *> &getCounterList() const { return counterList; }
const QList<ServerInfo_Arrow *> &getArrowList() const { return arrowList; } const QList<ServerInfo_Arrow *> &getArrowList() const { return arrowList; }

View file

@ -33,28 +33,27 @@ ItemId_Command_SetActivePhase = 1031,
ItemId_Command_DumpZone = 1032, ItemId_Command_DumpZone = 1032,
ItemId_Command_StopDumpZone = 1033, ItemId_Command_StopDumpZone = 1033,
ItemId_Event_Say = 1034, ItemId_Event_Say = 1034,
ItemId_Event_Join = 1035, ItemId_Event_Leave = 1035,
ItemId_Event_Leave = 1036, ItemId_Event_DeckSelect = 1036,
ItemId_Event_DeckSelect = 1037, ItemId_Event_GameClosed = 1037,
ItemId_Event_GameClosed = 1038, ItemId_Event_ReadyStart = 1038,
ItemId_Event_ReadyStart = 1039, ItemId_Event_GameStart = 1039,
ItemId_Event_GameStart = 1040, ItemId_Event_Shuffle = 1040,
ItemId_Event_Shuffle = 1041, ItemId_Event_RollDie = 1041,
ItemId_Event_RollDie = 1042, ItemId_Event_MoveCard = 1042,
ItemId_Event_MoveCard = 1043, ItemId_Event_CreateToken = 1043,
ItemId_Event_CreateToken = 1044, ItemId_Event_DeleteArrow = 1044,
ItemId_Event_DeleteArrow = 1045, ItemId_Event_SetCardAttr = 1045,
ItemId_Event_SetCardAttr = 1046, ItemId_Event_SetCounter = 1046,
ItemId_Event_SetCounter = 1047, ItemId_Event_DelCounter = 1047,
ItemId_Event_DelCounter = 1048, ItemId_Event_SetActivePlayer = 1048,
ItemId_Event_SetActivePlayer = 1049, ItemId_Event_SetActivePhase = 1049,
ItemId_Event_SetActivePhase = 1050, ItemId_Event_DumpZone = 1050,
ItemId_Event_DumpZone = 1051, ItemId_Event_StopDumpZone = 1051,
ItemId_Event_StopDumpZone = 1052, ItemId_Event_ServerMessage = 1052,
ItemId_Event_ServerMessage = 1053, ItemId_Event_GameJoined = 1053,
ItemId_Event_GameJoined = 1054, ItemId_Event_ChatJoinChannel = 1054,
ItemId_Event_ChatJoinChannel = 1055, ItemId_Event_ChatLeaveChannel = 1055,
ItemId_Event_ChatLeaveChannel = 1056, ItemId_Event_ChatSay = 1056,
ItemId_Event_ChatSay = 1057, ItemId_Other = 1057
ItemId_Other = 1058
}; };

View file

@ -195,12 +195,6 @@ Event_Say::Event_Say(int _gameId, int _playerId, const QString &_message)
{ {
insertItem(new SerializableItem_String("message", _message)); insertItem(new SerializableItem_String("message", _message));
} }
Event_Join::Event_Join(int _gameId, int _playerId, const QString &_playerName, bool _spectator)
: GameEvent("join", _gameId, _playerId)
{
insertItem(new SerializableItem_String("player_name", _playerName));
insertItem(new SerializableItem_Bool("spectator", _spectator));
}
Event_Leave::Event_Leave(int _gameId, int _playerId) Event_Leave::Event_Leave(int _gameId, int _playerId)
: GameEvent("leave", _gameId, _playerId) : GameEvent("leave", _gameId, _playerId)
{ {
@ -365,7 +359,6 @@ void ProtocolItem::initializeHashAuto()
itemNameHash.insert("cmddump_zone", Command_DumpZone::newItem); itemNameHash.insert("cmddump_zone", Command_DumpZone::newItem);
itemNameHash.insert("cmdstop_dump_zone", Command_StopDumpZone::newItem); itemNameHash.insert("cmdstop_dump_zone", Command_StopDumpZone::newItem);
itemNameHash.insert("game_eventsay", Event_Say::newItem); itemNameHash.insert("game_eventsay", Event_Say::newItem);
itemNameHash.insert("game_eventjoin", Event_Join::newItem);
itemNameHash.insert("game_eventleave", Event_Leave::newItem); itemNameHash.insert("game_eventleave", Event_Leave::newItem);
itemNameHash.insert("game_eventdeck_select", Event_DeckSelect::newItem); itemNameHash.insert("game_eventdeck_select", Event_DeckSelect::newItem);
itemNameHash.insert("game_eventgame_closed", Event_GameClosed::newItem); itemNameHash.insert("game_eventgame_closed", Event_GameClosed::newItem);

View file

@ -32,7 +32,6 @@
2:dump_zone:i,player_id:s,zone_name:i,number_cards 2:dump_zone:i,player_id:s,zone_name:i,number_cards
2:stop_dump_zone:i,player_id:s,zone_name 2:stop_dump_zone:i,player_id:s,zone_name
3:say:s,message 3:say:s,message
3:join:s,player_name:b,spectator
3:leave 3:leave
3:deck_select:i,deck_id 3:deck_select:i,deck_id
3:game_closed 3:game_closed

View file

@ -299,15 +299,6 @@ public:
static SerializableItem *newItem() { return new Event_Say; } static SerializableItem *newItem() { return new Event_Say; }
int getItemId() const { return ItemId_Event_Say; } int getItemId() const { return ItemId_Event_Say; }
}; };
class Event_Join : public GameEvent {
Q_OBJECT
public:
Event_Join(int _gameId = -1, int _playerId = -1, const QString &_playerName = QString(), bool _spectator = false);
QString getPlayerName() const { return static_cast<SerializableItem_String *>(itemMap.value("player_name"))->getData(); };
bool getSpectator() const { return static_cast<SerializableItem_Bool *>(itemMap.value("spectator"))->getData(); };
static SerializableItem *newItem() { return new Event_Join; }
int getItemId() const { return ItemId_Event_Join; }
};
class Event_Leave : public GameEvent { class Event_Leave : public GameEvent {
Q_OBJECT Q_OBJECT
public: public:

View file

@ -56,16 +56,12 @@ void SerializableItem_Map::readElement(QXmlStreamReader *xml)
else if (xml->isStartElement()) { else if (xml->isStartElement()) {
QString childName = xml->name().toString(); QString childName = xml->name().toString();
QString childSubType = xml->attributes().value("type").toString(); QString childSubType = xml->attributes().value("type").toString();
qDebug() << "Map: started new item, name=" << childName << "subtype=" << childSubType;
currentItem = itemMap.value(childName); currentItem = itemMap.value(childName);
if (!currentItem) { if (!currentItem) {
qDebug() << "Item not found in map";
currentItem = getNewItem(childName + childSubType); currentItem = getNewItem(childName + childSubType);
itemList.append(currentItem); itemList.append(currentItem);
if (!currentItem) { if (!currentItem)
qDebug() << "Item still not found";
currentItem = new SerializableItem_Invalid(childName); currentItem = new SerializableItem_Invalid(childName);
}
} }
if (currentItem->read(xml)) if (currentItem->read(xml))
currentItem = 0; currentItem = 0;

View file

@ -22,7 +22,7 @@
#include "server_counter.h" #include "server_counter.h"
#include "server_chatchannel.h" #include "server_chatchannel.h"
#include "server_protocolhandler.h" #include "server_protocolhandler.h"
#include <QDebug>
Server::Server(QObject *parent) Server::Server(QObject *parent)
: QObject(parent), nextGameId(0) : QObject(parent), nextGameId(0)
{ {
@ -54,6 +54,22 @@ void Server::removeClient(Server_ProtocolHandler *client)
qDebug(QString("Server::removeClient: %1 clients left").arg(clients.size()).toLatin1()); qDebug(QString("Server::removeClient: %1 clients left").arg(clients.size()).toLatin1());
} }
void Server::closeOldSession(const QString &playerName)
{
qDebug() << "closing old";
Server_ProtocolHandler *session = 0;
for (int i = 0; i < clients.size(); ++i)
if (clients[i]->getPlayerName() == playerName) {
session = clients[i];
break;
}
if (session) {
qDebug() << "found";
removeClient(session);
delete session;
}
}
Server_Game *Server::getGame(int gameId) const Server_Game *Server::getGame(int gameId) const
{ {
return games.value(gameId); return games.value(gameId);

View file

@ -28,6 +28,7 @@ public:
void addClient(Server_ProtocolHandler *player); void addClient(Server_ProtocolHandler *player);
void removeClient(Server_ProtocolHandler *player); void removeClient(Server_ProtocolHandler *player);
void closeOldSession(const QString &playerName);
virtual QString getLoginMessage() const = 0; virtual QString getLoginMessage() const = 0;
Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, Server_ProtocolHandler *creator); Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, Server_ProtocolHandler *creator);
private: private:

View file

@ -59,10 +59,12 @@ void Server_Game::startGameIfReady()
playerIterator.toFront(); playerIterator.toFront();
while (playerIterator.hasNext()) while (playerIterator.hasNext())
playerIterator.next().value()->setupZones(); playerIterator.next().value()->setupZones();
gameStarted = true;
playerIterator.toFront(); playerIterator.toFront();
while (playerIterator.hasNext()) { while (playerIterator.hasNext()) {
Server_Player *player = playerIterator.next().value(); Server_Player *player = playerIterator.next().value();
player->sendProtocolItem(new Event_GameStateChanged(gameId, getGameState(player))); player->sendProtocolItem(new Event_GameStateChanged(gameId, gameStarted, 0, 0, getGameState(player)));
} }
/* QSqlQuery query; /* QSqlQuery query;
@ -81,7 +83,6 @@ void Server_Game::startGameIfReady()
query.exec(); query.exec();
} }
*/ */
gameStarted = true;
sendGameEvent(new Event_GameStart); sendGameEvent(new Event_GameStart);
setActivePlayer(0); setActivePlayer(0);
} }
@ -115,7 +116,7 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
playerId = -1; playerId = -1;
Server_Player *newPlayer = new Server_Player(this, playerId, handler->getPlayerName(), spectator, handler); Server_Player *newPlayer = new Server_Player(this, playerId, handler->getPlayerName(), spectator, handler);
sendGameEvent(new Event_Join(-1, playerId, handler->getPlayerName(), spectator)); sendGameEvent(new Event_Join(-1, new ServerInfo_Player(playerId, handler->getPlayerName(), spectator)));
if (spectator) if (spectator)
spectators << newPlayer; spectators << newPlayer;
@ -214,7 +215,7 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
zoneList.append(new ServerInfo_Zone(zone->getName(), zone->getType(), zone->hasCoords(), zone->cards.size(), cardList)); zoneList.append(new ServerInfo_Zone(zone->getName(), zone->getType(), zone->hasCoords(), zone->cards.size(), cardList));
} }
result.append(new ServerInfo_Player(player->getPlayerId(), player->getPlayerName(), zoneList, counterList, arrowList)); result.append(new ServerInfo_Player(player->getPlayerId(), player->getPlayerName(), player->getSpectator(), player->getDeck(), zoneList, counterList, arrowList));
} }
return result; return result;
} }

View file

@ -22,8 +22,12 @@ Server_ProtocolHandler::~Server_ProtocolHandler()
// The socket has to be removed from the server's list before it is removed from the game's list // The socket has to be removed from the server's list before it is removed from the game's list
// so it will not receive the game update event. // so it will not receive the game update event.
server->removeClient(this); server->removeClient(this);
// if (game)
// game->removePlayer(this); QMapIterator<int, QPair<Server_Game *, Server_Player *> > gameIterator(games);
while (gameIterator.hasNext()) {
Server_Player *p = gameIterator.next().value().second;
p->setProtocolHandler(0);
}
QMapIterator<QString, Server_ChatChannel *> chatChannelIterator(chatChannels); QMapIterator<QString, Server_ChatChannel *> chatChannelIterator(chatChannels);
while (chatChannelIterator.hasNext()) while (chatChannelIterator.hasNext())
@ -135,12 +139,29 @@ ResponseCode Server_ProtocolHandler::cmdPing(Command_Ping * /*cmd*/)
ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd) ResponseCode Server_ProtocolHandler::cmdLogin(Command_Login *cmd)
{ {
authState = server->checkUserPassword(cmd->getUsername(), cmd->getPassword()); QString userName = cmd->getUsername();
authState = server->checkUserPassword(userName, cmd->getPassword());
if (authState == PasswordWrong) if (authState == PasswordWrong)
return RespWrongPassword; return RespWrongPassword;
playerName = cmd->getUsername(); if (authState == PasswordRight)
server->closeOldSession(userName);
playerName = userName;
enqueueProtocolItem(new Event_ServerMessage(server->getLoginMessage())); enqueueProtocolItem(new Event_ServerMessage(server->getLoginMessage()));
// This might not scale very well. Use an extra QMap if it becomes a problem.
const QList<Server_Game *> &serverGames = server->getGames();
for (int i = 0; i < serverGames.size(); ++i) {
const QList<Server_Player *> &gamePlayers = serverGames[i]->getPlayers();
for (int j = 0; j < gamePlayers.size(); ++j)
if (gamePlayers[j]->getPlayerName() == playerName) {
gamePlayers[j]->setProtocolHandler(this);
games.insert(serverGames[i]->getGameId(), QPair<Server_Game *, Server_Player *>(serverGames[i], gamePlayers[j]));
enqueueProtocolItem(new Event_GameJoined(serverGames[i]->getGameId(), gamePlayers[j]->getPlayerId(), gamePlayers[j]->getSpectator()));
enqueueProtocolItem(new Event_GameStateChanged(serverGames[i]->getGameId(), serverGames[i]->getGameStarted(), serverGames[i]->getActivePlayer(), serverGames[i]->getActivePhase(), serverGames[i]->getGameState(gamePlayers[j])));
}
}
return RespOk; return RespOk;
} }
@ -222,7 +243,7 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd)
games.insert(game->getGameId(), QPair<Server_Game *, Server_Player *>(game, creator)); games.insert(game->getGameId(), QPair<Server_Game *, Server_Player *>(game, creator));
enqueueProtocolItem(new Event_GameJoined(game->getGameId(), creator->getPlayerId(), false)); enqueueProtocolItem(new Event_GameJoined(game->getGameId(), creator->getPlayerId(), false));
enqueueProtocolItem(new Event_GameStateChanged(game->getGameId(), game->getGameState(creator))); enqueueProtocolItem(new Event_GameStateChanged(game->getGameId(), game->getGameStarted(), game->getActivePlayer(), game->getActivePhase(), game->getGameState(creator)));
return RespOk; return RespOk;
} }
@ -237,7 +258,7 @@ ResponseCode Server_ProtocolHandler::cmdJoinGame(Command_JoinGame *cmd)
Server_Player *player = g->addPlayer(this, cmd->getSpectator()); Server_Player *player = g->addPlayer(this, cmd->getSpectator());
games.insert(cmd->getGameId(), QPair<Server_Game *, Server_Player *>(g, player)); games.insert(cmd->getGameId(), QPair<Server_Game *, Server_Player *>(g, player));
enqueueProtocolItem(new Event_GameJoined(cmd->getGameId(), player->getPlayerId(), cmd->getSpectator())); enqueueProtocolItem(new Event_GameJoined(cmd->getGameId(), player->getPlayerId(), cmd->getSpectator()));
enqueueProtocolItem(new Event_GameStateChanged(cmd->getGameId(), g->getGameState(player))); enqueueProtocolItem(new Event_GameStateChanged(cmd->getGameId(), g->getGameStarted(), g->getActivePlayer(), g->getActivePhase(), g->getGameState(player)));
} }
return result; return result;
} }
@ -357,7 +378,10 @@ ResponseCode Server_ProtocolHandler::cmdMoveCard(Command_MoveCard *cmd, Server_G
privateCardId = -1; privateCardId = -1;
privateCardName = QString(); privateCardName = QString();
} }
player->sendProtocolItem(new Event_MoveCard(game->getGameId(), player->getPlayerId(), privateCardId, privateCardName, startzone->getName(), position, targetzone->getName(), x, y, facedown)); int privatePosition = -1;
if (startzone->getType() == HiddenZone)
privatePosition = position;
player->sendProtocolItem(new Event_MoveCard(game->getGameId(), player->getPlayerId(), privateCardId, privateCardName, startzone->getName(), privatePosition, targetzone->getName(), x, y, facedown));
// Other players do not get to see the start and/or target position of the card if the respective // Other players do not get to see the start and/or target position of the card if the respective
// part of the zone is being looked at. The information is not needed anyway because in hidden zones, // part of the zone is being looked at. The information is not needed anyway because in hidden zones,

View file

@ -21,6 +21,7 @@
#include <QXmlStreamReader> #include <QXmlStreamReader>
#include <QXmlStreamWriter> #include <QXmlStreamWriter>
#include <QtSql> #include <QtSql>
#include <QDebug>
#include "serversocketinterface.h" #include "serversocketinterface.h"
#include "servatrice.h" #include "servatrice.h"
#include "protocol.h" #include "protocol.h"
@ -68,7 +69,9 @@ void ServerSocketInterface::processProtocolItem(ProtocolItem *item)
void ServerSocketInterface::readClient() void ServerSocketInterface::readClient()
{ {
xmlReader->addData(socket->readAll()); QByteArray data = socket->readAll();
qDebug() << data;
xmlReader->addData(data);
if (topLevelItem) if (topLevelItem)
topLevelItem->read(xmlReader); topLevelItem->read(xmlReader);