This closes feature request 0000020. Attention, this breaks protocol compatibility.

This commit is contained in:
Max-Wilhelm Bruker 2010-06-03 02:29:48 +02:00
parent cfd715cce9
commit 41c4603fe9
12 changed files with 87 additions and 13 deletions

View file

@ -64,6 +64,11 @@ DeckViewCard::DeckViewCard(const QString &_name, const QString &_originZone, QGr
{ {
} }
DeckViewCard::~DeckViewCard()
{
delete dragItem;
}
void DeckViewCard::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget) void DeckViewCard::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{ {
AbstractCardItem::paint(painter, option, widget); AbstractCardItem::paint(painter, option, widget);
@ -85,6 +90,9 @@ void DeckViewCard::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance()) if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < 2 * QApplication::startDragDistance())
return; return;
if (static_cast<DeckViewScene *>(scene())->getLocked())
return;
delete dragItem; delete dragItem;
dragItem = new DeckViewCardDragItem(this, event->pos()); dragItem = new DeckViewCardDragItem(this, event->pos());
scene()->addItem(dragItem); scene()->addItem(dragItem);
@ -185,7 +193,7 @@ void DeckViewCardContainer::setWidth(qreal _width)
} }
DeckViewScene::DeckViewScene(QObject *parent) DeckViewScene::DeckViewScene(QObject *parent)
: QGraphicsScene(parent), deck(0) : QGraphicsScene(parent), locked(false), deck(0)
{ {
} }

View file

@ -21,6 +21,7 @@ private:
DeckViewCardDragItem *dragItem; DeckViewCardDragItem *dragItem;
public: public:
DeckViewCard(const QString &_name = QString(), const QString &_originZone = QString(), QGraphicsItem *parent = 0); DeckViewCard(const QString &_name = QString(), const QString &_originZone = QString(), QGraphicsItem *parent = 0);
~DeckViewCard();
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
const QString &getOriginZone() const { return originZone; } const QString &getOriginZone() const { return originZone; }
protected: protected:
@ -65,6 +66,7 @@ signals:
void newCardAdded(AbstractCardItem *card); void newCardAdded(AbstractCardItem *card);
void sideboardPlanChanged(); void sideboardPlanChanged();
private: private:
bool locked;
DeckList *deck; DeckList *deck;
QMap<QString, DeckViewCardContainer *> cardContainers; QMap<QString, DeckViewCardContainer *> cardContainers;
void rebuildTree(); void rebuildTree();
@ -73,6 +75,8 @@ private:
public: public:
DeckViewScene(QObject *parent = 0); DeckViewScene(QObject *parent = 0);
~DeckViewScene(); ~DeckViewScene();
void setLocked(bool _locked) { locked = _locked; }
bool getLocked() const { return locked; }
void setDeck(DeckList *_deck); void setDeck(DeckList *_deck);
void updateContents(); void updateContents();
QList<MoveCardToZone *> getSideboardPlan() const; QList<MoveCardToZone *> getSideboardPlan() const;
@ -92,6 +96,7 @@ signals:
public: public:
DeckView(QWidget *parent = 0); DeckView(QWidget *parent = 0);
void setDeck(DeckList *_deck); void setDeck(DeckList *_deck);
void setLocked(bool _locked) { deckViewScene->setLocked(_locked); }
QList<MoveCardToZone *> getSideboardPlan() const { return deckViewScene->getSideboardPlan(); } QList<MoveCardToZone *> getSideboardPlan() const { return deckViewScene->getSideboardPlan(); }
}; };

View file

@ -92,6 +92,11 @@ void MessageLogWidget::logReadyStart(Player *player)
append(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName()))); append(tr("%1 is ready to start the game.").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logNotReadyStart(Player *player)
{
append(tr("%1 is not ready to start the game any more.").arg(sanitizeHtml(player->getName())));
}
void MessageLogWidget::logConcede(Player *player) void MessageLogWidget::logConcede(Player *player)
{ {
append(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName()))); append(tr("%1 has conceded the game.").arg(sanitizeHtml(player->getName())));

View file

@ -30,6 +30,7 @@ public slots:
void logLeaveSpectator(QString name); void logLeaveSpectator(QString name);
void logDeckSelect(Player *player, int deckId); void logDeckSelect(Player *player, int deckId);
void logReadyStart(Player *player); void logReadyStart(Player *player);
void logNotReadyStart(Player *player);
void logConcede(Player *player); void logConcede(Player *player);
void logGameStart(); void logGameStart();
void logSay(Player *player, QString message); void logSay(Player *player, QString message);

View file

@ -19,6 +19,29 @@
#include "arrowitem.h" #include "arrowitem.h"
#include "main.h" #include "main.h"
ReadyStartButton::ReadyStartButton(QWidget *parent)
: QPushButton(parent), readyStart(false)
{
}
void ReadyStartButton::paintEvent(QPaintEvent *event)
{
QPushButton::paintEvent(event);
QPainter painter(this);
if (readyStart)
painter.setPen(QPen(Qt::green, 3));
else
painter.setPen(QPen(Qt::red, 3));
painter.drawRect(1.5, 1.5, width() - 3, height() - 3);
}
void ReadyStartButton::setReadyStart(bool _readyStart)
{
readyStart = _readyStart;
update();
}
TabGame::TabGame(Client *_client, int _gameId, const QString &_gameDescription, int _localPlayerId, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming) TabGame::TabGame(Client *_client, int _gameId, const QString &_gameDescription, int _localPlayerId, bool _spectator, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, bool _resuming)
: Tab(), client(_client), gameId(_gameId), gameDescription(_gameDescription), localPlayerId(_localPlayerId), spectator(_spectator), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), started(false), resuming(_resuming), currentPhase(-1) : Tab(), client(_client), gameId(_gameId), gameDescription(_gameDescription), localPlayerId(_localPlayerId), spectator(_spectator), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), started(false), resuming(_resuming), currentPhase(-1)
{ {
@ -28,7 +51,7 @@ TabGame::TabGame(Client *_client, int _gameId, const QString &_gameDescription,
loadLocalButton = new QPushButton; loadLocalButton = new QPushButton;
loadRemoteButton = new QPushButton; loadRemoteButton = new QPushButton;
readyStartButton = new QPushButton; readyStartButton = new ReadyStartButton;
readyStartButton->setEnabled(false); readyStartButton->setEnabled(false);
QHBoxLayout *buttonHBox = new QHBoxLayout; QHBoxLayout *buttonHBox = new QHBoxLayout;
@ -142,7 +165,7 @@ void TabGame::retranslateUi()
loadLocalButton->setText(tr("Load &local deck")); loadLocalButton->setText(tr("Load &local deck"));
loadRemoteButton->setText(tr("Load d&eck from server")); loadRemoteButton->setText(tr("Load d&eck from server"));
readyStartButton->setText(tr("S&tart game")); readyStartButton->setText(tr("Ready to s&tart"));
sayLabel->setText(tr("&Say:")); sayLabel->setText(tr("&Say:"));
cardInfo->retranslateUi(); cardInfo->retranslateUi();
@ -360,7 +383,18 @@ void TabGame::eventPlayerPropertiesChanged(Event_PlayerPropertiesChanged *event,
return; return;
playerListWidget->updatePlayerProperties(event->getProperties()); playerListWidget->updatePlayerProperties(event->getProperties());
if (context) switch (context->getItemId()) { if (context) switch (context->getItemId()) {
case ItemId_Context_ReadyStart: messageLog->logReadyStart(player); break; case ItemId_Context_ReadyStart: {
bool ready = event->getProperties()->getReadyStart();
if (player->getLocal()) {
readyStartButton->setReadyStart(ready);
deckView->setLocked(ready);
}
if (ready)
messageLog->logReadyStart(player);
else
messageLog->logNotReadyStart(player);
break;
}
case ItemId_Context_Concede: messageLog->logConcede(player); break; case ItemId_Context_Concede: messageLog->logConcede(player); break;
case ItemId_Context_DeckSelect: messageLog->logDeckSelect(player, static_cast<Context_DeckSelect *>(context)->getDeckId()); break; case ItemId_Context_DeckSelect: messageLog->logDeckSelect(player, static_cast<Context_DeckSelect *>(context)->getDeckId()); break;
default: ; default: ;
@ -498,7 +532,7 @@ void TabGame::deckSelectFinished(ProtocolResponse *r)
void TabGame::readyStart() void TabGame::readyStart()
{ {
client->sendCommand(new Command_ReadyStart(gameId)); client->sendCommand(new Command_ReadyStart(gameId, !readyStartButton->getReadyStart()));
} }
void TabGame::newCardAdded(AbstractCardItem *card) void TabGame::newCardAdded(AbstractCardItem *card)

View file

@ -2,6 +2,7 @@
#define TAB_GAME_H #define TAB_GAME_H
#include <QMap> #include <QMap>
#include <QPushButton>
#include "tab.h" #include "tab.h"
class Client; class Client;
@ -39,6 +40,18 @@ class CardZone;
class AbstractCardItem; class AbstractCardItem;
class CardItem; class CardItem;
class ReadyStartButton : public QPushButton {
Q_OBJECT
private:
bool readyStart;
public:
ReadyStartButton(QWidget *parent = 0);
bool getReadyStart() const { return readyStart; }
void setReadyStart(bool _readyStart);
protected:
void paintEvent(QPaintEvent *event);
};
class TabGame : public Tab { class TabGame : public Tab {
Q_OBJECT Q_OBJECT
private: private:
@ -54,7 +67,8 @@ private:
bool resuming; bool resuming;
int currentPhase; int currentPhase;
QPushButton *loadLocalButton, *loadRemoteButton, *readyStartButton; QPushButton *loadLocalButton, *loadRemoteButton;
ReadyStartButton *readyStartButton;
CardInfoWidget *cardInfo; CardInfoWidget *cardInfo;
PlayerListWidget *playerListWidget; PlayerListWidget *playerListWidget;
MessageLogWidget *messageLog; MessageLogWidget *messageLog;

View file

@ -47,7 +47,7 @@ class ProtocolItem : public SerializableItem_Map {
private: private:
static void initializeHashAuto(); static void initializeHashAuto();
public: public:
static const int protocolVersion = 6; static const int protocolVersion = 7;
static void initializeHash(); static void initializeHash();
virtual int getItemId() const = 0; virtual int getItemId() const = 0;
ProtocolItem(const QString &_itemType, const QString &_itemSubType); ProtocolItem(const QString &_itemType, const QString &_itemSubType);

View file

@ -147,9 +147,10 @@ Command_SetCardAttr::Command_SetCardAttr(int _gameId, const QString &_zone, int
insertItem(new SerializableItem_String("attr_name", _attrName)); insertItem(new SerializableItem_String("attr_name", _attrName));
insertItem(new SerializableItem_String("attr_value", _attrValue)); insertItem(new SerializableItem_String("attr_value", _attrValue));
} }
Command_ReadyStart::Command_ReadyStart(int _gameId) Command_ReadyStart::Command_ReadyStart(int _gameId, bool _ready)
: GameCommand("ready_start", _gameId) : GameCommand("ready_start", _gameId)
{ {
insertItem(new SerializableItem_Bool("ready", _ready));
} }
Command_Concede::Command_Concede(int _gameId) Command_Concede::Command_Concede(int _gameId)
: GameCommand("concede", _gameId) : GameCommand("concede", _gameId)

View file

@ -23,7 +23,7 @@
2:create_arrow:i,start_player_id:s,start_zone:i,start_card_id:i,target_player_id:s,target_zone:i,target_card_id:c,color 2:create_arrow:i,start_player_id:s,start_zone:i,start_card_id:i,target_player_id:s,target_zone:i,target_card_id:c,color
2:delete_arrow:i,arrow_id 2:delete_arrow:i,arrow_id
2:set_card_attr:s,zone:i,card_id:s,attr_name:s,attr_value 2:set_card_attr:s,zone:i,card_id:s,attr_name:s,attr_value
2:ready_start 2:ready_start:b,ready
2:concede 2:concede
2:inc_counter:i,counter_id:i,delta 2:inc_counter:i,counter_id:i,delta
2:create_counter:s,counter_name:c,color:i,radius:i,value 2:create_counter:s,counter_name:c,color:i,radius:i,value

View file

@ -227,7 +227,8 @@ public:
class Command_ReadyStart : public GameCommand { class Command_ReadyStart : public GameCommand {
Q_OBJECT Q_OBJECT
public: public:
Command_ReadyStart(int _gameId = -1); Command_ReadyStart(int _gameId = -1, bool _ready = false);
bool getReady() const { return static_cast<SerializableItem_Bool *>(itemMap.value("ready"))->getData(); };
static SerializableItem *newItem() { return new Command_ReadyStart; } static SerializableItem *newItem() { return new Command_ReadyStart; }
int getItemId() const { return ItemId_Command_ReadyStart; } int getItemId() const { return ItemId_Command_ReadyStart; }
}; };

View file

@ -365,6 +365,8 @@ ResponseCode Server_ProtocolHandler::cmdSetSideboardPlan(Command_SetSideboardPla
{ {
if (player->getSpectator()) if (player->getSpectator())
return RespFunctionNotAllowed; return RespFunctionNotAllowed;
if (player->getReadyStart())
return RespContextError;
DeckList *deck = player->getDeck(); DeckList *deck = player->getDeck();
if (!deck) if (!deck)
@ -385,7 +387,7 @@ ResponseCode Server_ProtocolHandler::cmdConcede(Command_Concede * /*cmd*/, Comma
return RespOk; return RespOk;
} }
ResponseCode Server_ProtocolHandler::cmdReadyStart(Command_ReadyStart * /*cmd*/, CommandContainer *cont, Server_Game *game, Server_Player *player) ResponseCode Server_ProtocolHandler::cmdReadyStart(Command_ReadyStart *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player)
{ {
if (player->getSpectator()) if (player->getSpectator())
return RespFunctionNotAllowed; return RespFunctionNotAllowed;
@ -393,7 +395,10 @@ ResponseCode Server_ProtocolHandler::cmdReadyStart(Command_ReadyStart * /*cmd*/,
if (!player->getDeck()) if (!player->getDeck())
return RespContextError; return RespContextError;
player->setReadyStart(true); if (player->getReadyStart() == cmd->getReady())
return RespContextError;
player->setReadyStart(cmd->getReady());
game->sendGameEvent(new Event_PlayerPropertiesChanged(player->getProperties()), new Context_ReadyStart); game->sendGameEvent(new Event_PlayerPropertiesChanged(player->getProperties()), new Context_ReadyStart);
game->startGameIfReady(); game->startGameIfReady();
return RespOk; return RespOk;

View file

@ -135,4 +135,4 @@ AuthenticationResult Servatrice::checkUserPassword(const QString &user, const QS
return UnknownUser; return UnknownUser;
} }
const QString Servatrice::versionString = "Servatrice 0.20100526"; const QString Servatrice::versionString = "Servatrice 0.20100603";