From a429a4a00423b789545bb7d88ae28d6a8c848e35 Mon Sep 17 00:00:00 2001 From: Max-Wilhelm Bruker Date: Tue, 7 Apr 2009 21:37:57 +0200 Subject: [PATCH] minor changes, implemented 'doesn't untap' and facedown cards --- cockatrice/src/carddatabasemodel.cpp | 2 +- cockatrice/src/carddragitem.cpp | 16 ++++--- cockatrice/src/carddragitem.h | 3 +- cockatrice/src/carditem.cpp | 21 +++++++--- cockatrice/src/carditem.h | 9 ++-- cockatrice/src/cardzone.cpp | 7 +++- cockatrice/src/cardzone.h | 2 +- cockatrice/src/client.cpp | 4 +- cockatrice/src/client.h | 2 +- cockatrice/src/game.cpp | 19 +++++++-- cockatrice/src/game.h | 4 +- cockatrice/src/gravezone.cpp | 5 ++- cockatrice/src/gravezone.h | 2 +- cockatrice/src/handzone.cpp | 2 +- cockatrice/src/handzone.h | 2 +- cockatrice/src/libraryzone.cpp | 5 ++- cockatrice/src/libraryzone.h | 2 +- cockatrice/src/messagelogwidget.cpp | 9 ++++ cockatrice/src/messagelogwidget.h | 1 + cockatrice/src/player.cpp | 55 ++++++++++++++++-------- cockatrice/src/player.h | 2 + cockatrice/src/rfgzone.cpp | 5 ++- cockatrice/src/rfgzone.h | 2 +- cockatrice/src/sideboardzone.cpp | 2 +- cockatrice/src/sideboardzone.h | 2 +- cockatrice/src/tablezone.cpp | 7 ++-- cockatrice/src/tablezone.h | 2 +- cockatrice/src/window_deckeditor.cpp | 3 +- cockatrice/src/zoneviewzone.cpp | 2 +- cockatrice/src/zoneviewzone.h | 2 +- servatrice/src/playerzone.cpp | 4 +- servatrice/src/playerzone.h | 6 ++- servatrice/src/testcard.cpp | 13 ++++-- servatrice/src/testcard.h | 10 +++-- servatrice/src/testserversocket.cpp | 62 +++++++++++++++++++--------- servatrice/src/testserversocket.h | 1 + servatrice/src/version.h | 2 +- 37 files changed, 198 insertions(+), 101 deletions(-) diff --git a/cockatrice/src/carddatabasemodel.cpp b/cockatrice/src/carddatabasemodel.cpp index 451b3d1a..fc3cacc7 100644 --- a/cockatrice/src/carddatabasemodel.cpp +++ b/cockatrice/src/carddatabasemodel.cpp @@ -65,7 +65,7 @@ private: Qt::SortOrder order; public: CardInfoCompare(int _column, Qt::SortOrder _order) : column(_column), order(_order) { } - bool operator()(CardInfo *a, CardInfo *b) const + inline bool operator()(CardInfo *a, CardInfo *b) const { bool result; switch (column) { diff --git a/cockatrice/src/carddragitem.cpp b/cockatrice/src/carddragitem.cpp index 8aa56d9e..1fb56d96 100644 --- a/cockatrice/src/carddragitem.cpp +++ b/cockatrice/src/carddragitem.cpp @@ -2,8 +2,8 @@ #include "cardzone.h" #include -CardDragItem::CardDragItem(QGraphicsScene *scene, CardZone *_startZone, QPixmap *_image, int _id, const QPointF &_hotSpot, QGraphicsItem *parent) - : QGraphicsItem(parent), image(_image), id(_id), hotSpot(_hotSpot), startZone(_startZone) +CardDragItem::CardDragItem(QGraphicsScene *scene, CardZone *_startZone, QPixmap *_image, int _id, const QPointF &_hotSpot, bool _faceDown, QGraphicsItem *parent) + : QGraphicsItem(parent), image(_image), id(_id), hotSpot(_hotSpot), startZone(_startZone), faceDown(_faceDown) { if ((hotSpot.x() < 0) || (hotSpot.y() < 0)) { qDebug(QString("CardDragItem: coordinate overflow: x = %1, y = %2").arg(hotSpot.x()).arg(hotSpot.y()).toLatin1()); @@ -16,7 +16,8 @@ CardDragItem::CardDragItem(QGraphicsScene *scene, CardZone *_startZone, QPixmap setZValue(2000000000); setCacheMode(DeviceCoordinateCache); - scene->addItem(this); + if (!parent) + scene->addItem(this); } CardDragItem::~CardDragItem() @@ -82,16 +83,13 @@ void CardDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event) } if (dropZone) { - dropZone->handleDropEvent(id, startZone, (sp - dropZone->scenePos()).toPoint()); + dropZone->handleDropEvent(id, startZone, (sp - dropZone->scenePos()).toPoint(), faceDown); QList childList = childItems(); for (int i = 0; i < childList.size(); i++) { CardDragItem *c = qgraphicsitem_cast(childList.at(i)); - if (!c) - QMessageBox::critical(0, "fehler", "null"); - dropZone->handleDropEvent(c->id, startZone, (sp - dropZone->scenePos() + c->pos()).toPoint()); + dropZone->handleDropEvent(c->id, startZone, (sp - dropZone->scenePos() + c->pos()).toPoint(), faceDown); } - } else - QMessageBox::critical(0, "fehler", "fehler"); + } event->accept(); } diff --git a/cockatrice/src/carddragitem.h b/cockatrice/src/carddragitem.h index d6d5ca75..a2c6b985 100644 --- a/cockatrice/src/carddragitem.h +++ b/cockatrice/src/carddragitem.h @@ -12,10 +12,11 @@ private: int id; QPointF hotSpot; CardZone *startZone; + bool faceDown; public: enum { Type = typeCardDrag }; int type() const { return Type; } - CardDragItem(QGraphicsScene *scene, CardZone *_startZone, QPixmap *_image, int _id, const QPointF &_hotSpot, QGraphicsItem *parent = 0); + CardDragItem(QGraphicsScene *scene, CardZone *_startZone, QPixmap *_image, int _id, const QPointF &_hotSpot, bool _faceDown, QGraphicsItem *parent = 0); ~CardDragItem(); QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); diff --git a/cockatrice/src/carditem.cpp b/cockatrice/src/carditem.cpp index 82bde4fc..53876451 100644 --- a/cockatrice/src/carditem.cpp +++ b/cockatrice/src/carditem.cpp @@ -8,7 +8,7 @@ #include "player.h" CardItem::CardItem(CardDatabase *_db, const QString &_name, int _cardid, QGraphicsItem *parent) - : QGraphicsItem(parent), db(_db), name(_name), id(_cardid), tapped(false), attacking(false), facedown(false), counters(0), dragItem(NULL) + : QGraphicsItem(parent), db(_db), name(_name), id(_cardid), tapped(false), attacking(false), facedown(false), counters(0), doesntUntap(false), dragItem(NULL) { width = CARD_WIDTH; height = CARD_HEIGHT; @@ -21,6 +21,7 @@ CardItem::CardItem(CardDatabase *_db, const QString &_name, int _cardid, QGraphi CardItem::~CardItem() { + deleteDragItem(); qDebug(QString("CardItem destructor: %1").arg(name).toLatin1()); } @@ -80,7 +81,7 @@ void CardItem::setAttacking(bool _attacking) update(boundingRect()); } -void CardItem::setFacedown(bool _facedown) +void CardItem::setFaceDown(bool _facedown) { facedown = _facedown; update(boundingRect()); @@ -98,6 +99,11 @@ void CardItem::setAnnotation(const QString &_annotation) update(boundingRect()); } +void CardItem::setDoesntUntap(bool _doesntUntap) +{ + doesntUntap = _doesntUntap; +} + void CardItem::resetState() { attacking = false; @@ -105,12 +111,14 @@ void CardItem::resetState() counters = 0; annotation = QString(); setTapped(false); + setDoesntUntap(false); update(boundingRect()); } -CardDragItem *CardItem::createDragItem(CardZone *startZone, int _id, const QPointF &_pos, const QPointF &_scenePos) +CardDragItem *CardItem::createDragItem(CardZone *startZone, int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown) { - dragItem = new CardDragItem(scene(), startZone, image, _id, _pos); + deleteDragItem(); + dragItem = new CardDragItem(scene(), startZone, image, _id, _pos, faceDown); dragItem->setPos(_scenePos - dragItem->getHotSpot()); return dragItem; @@ -140,8 +148,9 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) { if ((event->screenPos() - event->buttonDownScreenPos(Qt::LeftButton)).manhattanLength() < QApplication::startDragDistance()) return; + bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier); - createDragItem((CardZone *) parentItem(), id, event->pos(), event->scenePos()); + createDragItem((CardZone *) parentItem(), id, event->pos(), event->scenePos(), faceDown); dragItem->grabMouse(); QList sel = scene()->selectedItems(); @@ -149,7 +158,7 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event) CardItem *c = (CardItem *) sel.at(i); if (c == this) continue; - CardDragItem *drag = new CardDragItem(scene(), (CardZone *) parentItem(), c->getImage(), c->getId(), QPointF(), dragItem); + CardDragItem *drag = new CardDragItem(scene(), (CardZone *) parentItem(), c->getImage(), c->getId(), QPointF(), false, dragItem); drag->setPos(c->pos() - pos()); } diff --git a/cockatrice/src/carditem.h b/cockatrice/src/carditem.h index 925368fc..4a2a8331 100644 --- a/cockatrice/src/carditem.h +++ b/cockatrice/src/carditem.h @@ -41,6 +41,7 @@ private: bool facedown; int counters; QString annotation; + bool doesntUntap; CardDragItem *dragItem; public: enum { Type = typeCard }; @@ -58,15 +59,17 @@ public: void setTapped(bool _tapped); bool getAttacking() const { return attacking; } void setAttacking(bool _attacking); - bool getFacedown() const { return facedown; } - void setFacedown(bool _facedown); + bool getFaceDown() const { return facedown; } + void setFaceDown(bool _facedown); int getCounters() const { return counters; } void setCounters(int _counters); QString getAnnotation() const { return annotation; } void setAnnotation(const QString &_annotation); + bool getDoesntUntap() const { return doesntUntap; } + void setDoesntUntap(bool _doesntUntap); void resetState(); - CardDragItem *createDragItem(CardZone *startZone, int _id, const QPointF &_pos, const QPointF &_scenePos); + CardDragItem *createDragItem(CardZone *startZone, int _id, const QPointF &_pos, const QPointF &_scenePos, bool faceDown); void deleteDragItem(); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index d1676744..4f3aa920 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -56,14 +56,17 @@ CardItem *CardZone::getCard(int cardId, const QString &cardName) CardItem *CardZone::takeCard(int position, int cardId, const QString &cardName) { + if (position >= cards->size()) + return NULL; + CardItem *c = cards->takeAt(position); for (int i = 0; i < views.size(); i++) views[i]->removeCard(position); - if (c->getId() == -1) { +// if (c->getId() == -1) { c->setId(cardId); c->setName(cardName); - } +// } reorganizeCards(); return c; } diff --git a/cockatrice/src/cardzone.h b/cockatrice/src/cardzone.h index 5738080c..b0064550 100644 --- a/cockatrice/src/cardzone.h +++ b/cockatrice/src/cardzone.h @@ -21,7 +21,7 @@ protected: public: enum { Type = typeZone }; int type() const { return Type; } - virtual void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) = 0; + virtual void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) = 0; CardZone(Player *_player, const QString &_name, QGraphicsItem *parent = 0, bool isView = false); ~CardZone(); void clearContents(); diff --git a/cockatrice/src/client.cpp b/cockatrice/src/client.cpp index 6fda0b9a..b6b71049 100644 --- a/cockatrice/src/client.cpp +++ b/cockatrice/src/client.cpp @@ -254,11 +254,11 @@ int Client::drawCards(unsigned int number) return cmd(QString("draw_cards|%1").arg(number)); } -int Client::moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y) +int Client::moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y, bool faceDown) { // if startzone is public: cardid is the card's id // else: cardid is the position of the card in the zone (e.g. deck) - return cmd(QString("move_card|%1|%2|%3|%4|%5").arg(cardid).arg(startzone).arg(targetzone).arg(x).arg(y)); + return cmd(QString("move_card|%1|%2|%3|%4|%5|%6").arg(cardid).arg(startzone).arg(targetzone).arg(x).arg(y).arg(faceDown ? 1 : 0)); } int Client::createToken(const QString &zone, const QString &name, const QString &powtough, int x, int y) diff --git a/cockatrice/src/client.h b/cockatrice/src/client.h index 578ea69b..18cae5a4 100644 --- a/cockatrice/src/client.h +++ b/cockatrice/src/client.h @@ -70,7 +70,7 @@ public: int shuffle(); int rollDice(unsigned int sides); int drawCards(unsigned int number); - int moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y = 0); + int moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y = 0, bool faceDown = false); int createToken(const QString &zone, const QString &name, const QString &powtough, int x, int y); int setCardAttr(const QString &zone, int cardid, const QString &aname, const QString &avalue); int readyStart(); diff --git a/cockatrice/src/game.cpp b/cockatrice/src/game.cpp index f3db3107..7234609d 100644 --- a/cockatrice/src/game.cpp +++ b/cockatrice/src/game.cpp @@ -66,6 +66,8 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a connect(aTap, SIGNAL(triggered()), this, SLOT(actTap())); aUntap = new QAction(tr("&Untap"), this); connect(aUntap, SIGNAL(triggered()), this, SLOT(actUntap())); + aDoesntUntap = new QAction(tr("Toggle &normal untapping"), this); + connect(aDoesntUntap, SIGNAL(triggered()), this, SLOT(actDoesntUntap())); aAddCounter = new QAction(tr("&Add counter"), this); connect(aAddCounter, SIGNAL(triggered()), this, SLOT(actAddCounter())); aRemoveCounter = new QAction(tr("&Remove counter"), this); @@ -77,6 +79,8 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a cardMenu->addAction(aTap); cardMenu->addAction(aUntap); + cardMenu->addAction(aDoesntUntap); + cardMenu->addSeparator(); cardMenu->addAction(aAddCounter); cardMenu->addAction(aRemoveCounter); cardMenu->addAction(aSetCounters); @@ -108,6 +112,7 @@ Player *Game::addPlayer(int playerId, const QString &playerName, QPointF base, b connect(newPlayer, SIGNAL(logSetCardCounters(QString, QString, int, int)), this, SIGNAL(logSetCardCounters(QString, QString, int, int))); connect(newPlayer, SIGNAL(logSetTapped(QString, QString, bool)), this, SIGNAL(logSetTapped(QString, QString, bool))); connect(newPlayer, SIGNAL(logSetCounter(QString, QString, int, int)), this, SIGNAL(logSetCounter(QString, QString, int, int))); + connect(newPlayer, SIGNAL(logSetDoesntUntap(QString, QString, bool)), this, SIGNAL(logSetDoesntUntap(QString, QString, bool))); players << newPlayer; emit playerAdded(newPlayer); @@ -147,6 +152,7 @@ void Game::restartGameDialog() void Game::gameEvent(ServerEventData *msg) { + qDebug(QString("game::gameEvent: public=%1, player=%2, name=%3, type=%4, data=%5").arg(msg->getPublic()).arg(msg->getPlayerId()).arg(msg->getPlayerName()).arg(msg->getEventType()).arg(msg->getEventData().join("/")).toLatin1()); if (!msg->getPublic()) localPlayer->gameEvent(msg); else { @@ -231,9 +237,7 @@ void Game::gameEvent(ServerEventData *msg) void Game::actUntapAll() { - CardList *const cards = localPlayer->getZones()->findZone("table")->getCards(); - for (int i = 0; i < cards->size(); i++) - client->setCardAttr("table", cards->at(i)->getId(), "tapped", "false"); + client->setCardAttr("table", -1, "tapped", "false"); } void Game::actIncLife() @@ -308,6 +312,15 @@ void Game::actUntap() } } +void Game::actDoesntUntap() +{ + QListIterator i(scene->selectedItems()); + while (i.hasNext()) { + CardItem *temp = (CardItem *) i.next(); + client->setCardAttr(qgraphicsitem_cast(temp->parentItem())->getName(), temp->getId(), "doesnt_untap", QString::number(!temp->getDoesntUntap())); + } +} + void Game::actAddCounter() { QListIterator i(scene->selectedItems()); diff --git a/cockatrice/src/game.h b/cockatrice/src/game.h index 9afc7662..2f564a2f 100644 --- a/cockatrice/src/game.h +++ b/cockatrice/src/game.h @@ -15,7 +15,7 @@ class Game : public QObject { Q_OBJECT private: QMenu *actionsMenu, *cardMenu; - QAction *aTap, *aUntap, *aAddCounter, *aRemoveCounter, *aSetCounters, *aRearrange, + QAction *aTap, *aUntap, *aDoesntUntap, *aAddCounter, *aRemoveCounter, *aSetCounters, *aRearrange, *aUntapAll, *aDecLife, *aIncLife, *aSetLife, *aShuffle, *aDraw, *aDrawCards, *aRollDice, *aCreateToken; DlgStartGame *dlgStartGame; @@ -40,6 +40,7 @@ private slots: void showCardMenu(QPoint p); void actTap(); void actUntap(); + void actDoesntUntap(); void actAddCounter(); void actRemoveCounter(); void actSetCounters(); @@ -69,6 +70,7 @@ signals: void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetCounter(QString playerName, QString counterName, int value, int oldValue); + void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); void logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards); public slots: void restartGameDialog(); diff --git a/cockatrice/src/gravezone.cpp b/cockatrice/src/gravezone.cpp index 0107cda3..12c7a956 100644 --- a/cockatrice/src/gravezone.cpp +++ b/cockatrice/src/gravezone.cpp @@ -48,7 +48,7 @@ void GraveZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void GraveZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void GraveZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { player->client->moveCard(cardId, startZone->getName(), getName(), 0, 0); } @@ -79,8 +79,9 @@ void GraveZone::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (cards->empty()) return; + bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier); CardItem *card = cards->at(0); - CardDragItem *drag = card->createDragItem(this, card->getId(), event->pos(), event->scenePos()); + CardDragItem *drag = card->createDragItem(this, card->getId(), event->pos(), event->scenePos(), faceDown); drag->grabMouse(); setCursor(Qt::OpenHandCursor); } diff --git a/cockatrice/src/gravezone.h b/cockatrice/src/gravezone.h index 81cfa58f..b64b9c86 100644 --- a/cockatrice/src/gravezone.h +++ b/cockatrice/src/gravezone.h @@ -11,7 +11,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void addCard(CardItem *card, bool reorganize = true, int x = 0, int y = -1); void reorganizeCards(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/handzone.cpp b/cockatrice/src/handzone.cpp index abc43d41..1e6609d2 100644 --- a/cockatrice/src/handzone.cpp +++ b/cockatrice/src/handzone.cpp @@ -66,7 +66,7 @@ void HandZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void HandZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void HandZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { Q_UNUSED(dropPoint); player->client->moveCard(cardId, startZone->getName(), getName(), cards->size(), 0); diff --git a/cockatrice/src/handzone.h b/cockatrice/src/handzone.h index 1284c7fe..a09574a2 100644 --- a/cockatrice/src/handzone.h +++ b/cockatrice/src/handzone.h @@ -11,7 +11,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void addCard(CardItem *card, bool reorganize = true, int x = -1, int y = -1); void reorganizeCards(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); }; #endif diff --git a/cockatrice/src/libraryzone.cpp b/cockatrice/src/libraryzone.cpp index 65ea657d..672f4519 100644 --- a/cockatrice/src/libraryzone.cpp +++ b/cockatrice/src/libraryzone.cpp @@ -57,7 +57,7 @@ void LibraryZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void LibraryZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void LibraryZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { player->client->moveCard(cardId, startZone->getName(), getName(), 0, 0); } @@ -88,8 +88,9 @@ void LibraryZone::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (cards->empty()) return; + bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier); CardItem *card = cards->at(0); - CardDragItem *drag = card->createDragItem(this, 0, event->pos(), event->scenePos()); + CardDragItem *drag = card->createDragItem(this, 0, event->pos(), event->scenePos(), faceDown); drag->grabMouse(); setCursor(Qt::OpenHandCursor); } diff --git a/cockatrice/src/libraryzone.h b/cockatrice/src/libraryzone.h index bdac5a32..89e0ff1c 100644 --- a/cockatrice/src/libraryzone.h +++ b/cockatrice/src/libraryzone.h @@ -11,7 +11,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void addCard(CardItem *card, bool reorganize = true, int x = 0, int y = -1); void reorganizeCards(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index 4a36cff9..539e5419 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -112,6 +112,14 @@ void MessageLogWidget::logSetCounter(QString playerName, QString counterName, in appendAndScroll(tr("%1 sets counter \"%2\" to %3 (%4%5)").arg(playerName).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue)); } +void MessageLogWidget::logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap) +{ + if (doesntUntap) + appendAndScroll(tr("%1 sets %2 to not untap normally.").arg(playerName).arg(cardName)); + else + appendAndScroll(tr("%1 sets %2 to untap normally.").arg(playerName).arg(cardName)); +} + void MessageLogWidget::logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards) { if (numberCards) @@ -137,6 +145,7 @@ void MessageLogWidget::connectToGame(Game *game) connect(game, SIGNAL(logSetCardCounters(QString, QString, int, int)), this, SLOT(logSetCardCounters(QString, QString, int, int))); connect(game, SIGNAL(logSetTapped(QString, QString, bool)), this, SLOT(logSetTapped(QString, QString, bool))); connect(game, SIGNAL(logSetCounter(QString, QString, int, int)), this, SLOT(logSetCounter(QString, QString, int, int))); + connect(game, SIGNAL(logSetDoesntUntap(QString, QString, bool)), this, SLOT(logSetDoesntUntap(QString, QString, bool))); connect(game, SIGNAL(logDumpZone(QString, QString, QString, int)), this, SLOT(logDumpZone(QString, QString, QString, int))); } diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index 29e5936d..8fdad186 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -28,6 +28,7 @@ private slots: void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetCounter(QString playerName, QString counterName, int value, int oldValue); + void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); void logDumpZone(QString playerName, QString zoneName, QString zoneOwner, int numberCards); private: void appendAndScroll(const QString &s); diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 1c8dee03..b274b572 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -128,6 +128,31 @@ void Player::addCounter(Counter *c) counters << c; } +void Player::setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards) +{ + if (aname == "tapped") { + bool tapped = avalue == "1"; + if (!(!tapped && card->getDoesntUntap() && allCards)) { + emit logSetTapped(name, card->getName(), tapped); + card->setTapped(tapped); + } + } else if (aname == "attacking") + card->setAttacking(avalue == "1"); + else if (aname == "facedown") + card->setFaceDown(avalue == "1"); + else if (aname == "counters") { + int value = avalue.toInt(); + emit logSetCardCounters(name, card->getName(), value, card->getCounters()); + card->setCounters(value); + } else if (aname == "annotation") + card->setAnnotation(avalue); + else if (aname == "doesnt_untap") { + bool value = (avalue == "1"); + emit logSetDoesntUntap(name, card->getName(), value); + card->setDoesntUntap(value); + } +} + void Player::gameEvent(ServerEventData *event) { QStringList data = event->getEventData(); @@ -171,7 +196,7 @@ void Player::gameEvent(ServerEventData *event) break; } case eventMoveCard: { - if (data.size() != 7) { + if (data.size() != 8) { qDebug("error"); // XXX } @@ -186,13 +211,16 @@ void Player::gameEvent(ServerEventData *event) qDebug(QString("target zone invalid: %1").arg(data[4]).toLatin1()); int x = data[5].toInt(); int y = data[6].toInt(); + bool facedown = data[7].toInt(); // XXX Mehr Fehlerbehandlung CardItem *card = startZone->takeCard(position, cardId, cardName); if (!card) // XXX - qDebug("null"); + qDebug("moveCard: card not found"); card->deleteDragItem(); + + card->setFaceDown(facedown); // The log event has to be sent before the card is added to the target zone // because the addCard function can modify the card object. @@ -227,25 +255,18 @@ void Player::gameEvent(ServerEventData *event) } CardZone *zone = zones.findZone(data[0]); int cardId = data[1].toInt(); - CardItem *card = zone->getCard(cardId, ""); QString aname = data[2]; QString avalue = data[3]; // XXX Fehlerbehandlung - if (aname == "tapped") { - bool tapped = avalue == "1"; - emit logSetTapped(name, card->getName(), tapped); - card->setTapped(tapped); - } else if (aname == "attacking") - card->setAttacking(avalue == "1"); - else if (aname == "facedown") - card->setFacedown(avalue == "1"); - else if (aname == "counters") { - int value = avalue.toInt(); - emit logSetCardCounters(name, card->getName(), value, card->getCounters()); - card->setCounters(value); - } else if (aname == "annotation") - card->setAnnotation(avalue); + if (cardId == -1) { + CardList *const cards = zone->getCards(); + for (int i = 0; i < cards->size(); i++) + setCardAttrHelper(cards->at(i), aname, avalue, true); + } else { + CardItem *card = zone->getCard(cardId, ""); + setCardAttrHelper(card, aname, avalue, false); + } break; } case eventSetCounter: { diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 9c02e9d4..54a53e79 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -26,6 +26,7 @@ signals: void logSetCardCounters(QString playerName, QString cardName, int value, int oldValue); void logSetTapped(QString playerName, QString cardName, bool tapped); void logSetCounter(QString playerName, QString counterName, int value, int oldValue); + void logSetDoesntUntap(QString playerName, QString cardName, bool doesntUntap); private slots: void actMoveHandToTopLibrary(); void actMoveHandToBottomLibrary(); @@ -53,6 +54,7 @@ private: ZoneList zones; CounterList counters; CardDatabase *db; + void setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards); public: Client *client; void addZone(CardZone *z); diff --git a/cockatrice/src/rfgzone.cpp b/cockatrice/src/rfgzone.cpp index 11edd4d7..c276bf8d 100644 --- a/cockatrice/src/rfgzone.cpp +++ b/cockatrice/src/rfgzone.cpp @@ -48,7 +48,7 @@ void RfgZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void RfgZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void RfgZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { player->client->moveCard(cardId, startZone->getName(), getName(), 0, 0); } @@ -79,8 +79,9 @@ void RfgZone::mouseMoveEvent(QGraphicsSceneMouseEvent *event) if (cards->empty()) return; + bool faceDown = event->modifiers().testFlag(Qt::ShiftModifier); CardItem *card = cards->at(0); - CardDragItem *drag = card->createDragItem(this, card->getId(), event->pos(), event->scenePos()); + CardDragItem *drag = card->createDragItem(this, card->getId(), event->pos(), event->scenePos(), faceDown); drag->grabMouse(); setCursor(Qt::OpenHandCursor); } diff --git a/cockatrice/src/rfgzone.h b/cockatrice/src/rfgzone.h index be07194f..96433fed 100644 --- a/cockatrice/src/rfgzone.h +++ b/cockatrice/src/rfgzone.h @@ -11,7 +11,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void addCard(CardItem *card, bool reorganize = true, int x = 0, int y = -1); void reorganizeCards(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); protected: void mousePressEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event); diff --git a/cockatrice/src/sideboardzone.cpp b/cockatrice/src/sideboardzone.cpp index f60e4e27..8a613889 100644 --- a/cockatrice/src/sideboardzone.cpp +++ b/cockatrice/src/sideboardzone.cpp @@ -42,7 +42,7 @@ void SideboardZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void SideboardZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void SideboardZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { player->client->moveCard(cardId, startZone->getName(), getName(), 0, 0); } diff --git a/cockatrice/src/sideboardzone.h b/cockatrice/src/sideboardzone.h index 22296c25..f7983532 100644 --- a/cockatrice/src/sideboardzone.h +++ b/cockatrice/src/sideboardzone.h @@ -11,7 +11,7 @@ public: void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void addCard(CardItem *card, bool reorganize = true, int x = 0, int y = -1); void reorganizeCards(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); }; #endif diff --git a/cockatrice/src/tablezone.cpp b/cockatrice/src/tablezone.cpp index 2b732515..0281b74b 100644 --- a/cockatrice/src/tablezone.cpp +++ b/cockatrice/src/tablezone.cpp @@ -31,17 +31,16 @@ void TableZone::addCard(CardItem *card, bool reorganize, int x, int y) y = height - CARD_HEIGHT - y; card->setPos(x, y); } - qDebug(QString("zValue = %1, x = %2, y = %3").arg((y + CARD_HEIGHT) * width + x + 1000).arg(x).arg(y).toLatin1()); card->setZValue((y + CARD_HEIGHT) * width + x + 1000); + qDebug(QString("table: appended %1 at pos %2: zValue = %3, x = %4, y = %5").arg(card->getName()).arg(cards->size() - 1).arg(card->zValue()).arg(x).arg(y).toLatin1()); card->setParentItem(this); card->setVisible(true); card->update(card->boundingRect()); - } -void TableZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void TableZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { - player->client->moveCard(cardId, startZone->getName(), getName(), dropPoint.x(), dropPoint.y()); + player->client->moveCard(cardId, startZone->getName(), getName(), dropPoint.x(), dropPoint.y(), faceDown); } void TableZone::reorganizeCards() diff --git a/cockatrice/src/tablezone.h b/cockatrice/src/tablezone.h index d0f9b3d6..e610f0da 100644 --- a/cockatrice/src/tablezone.h +++ b/cockatrice/src/tablezone.h @@ -16,7 +16,7 @@ public: void addCard(CardItem *card, bool reorganize = true, int x = -1, int y = -1); void reorganizeCards(); void toggleTapped(); - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); }; #endif diff --git a/cockatrice/src/window_deckeditor.cpp b/cockatrice/src/window_deckeditor.cpp index 827be55a..2acb8340 100644 --- a/cockatrice/src/window_deckeditor.cpp +++ b/cockatrice/src/window_deckeditor.cpp @@ -17,7 +17,6 @@ WndDeckEditor::WndDeckEditor(CardDatabase *_db, QWidget *parent) deckModel = new DeckListModel(db, this); deckView = new QTreeView(); deckView->setModel(deckModel); -// deckView->setSortingEnabled(true); connect(deckView->selectionModel(), SIGNAL(currentRowChanged(const QModelIndex &, const QModelIndex &)), this, SLOT(updateCardInfoRight(const QModelIndex &, const QModelIndex &))); cardInfo = new CardInfoWidget(db); @@ -99,6 +98,8 @@ void WndDeckEditor::actSaveDeck() void WndDeckEditor::actSaveDeckAs() { QString fileName = QFileDialog::getSaveFileName(this, tr("Save deck as"), QString(), tr("Deck files (*.dec)")); + if (fileName.isEmpty()) + return; if (!fileName.endsWith(".dec")) fileName.append(".dec"); if (deckModel->saveToFile(fileName)) diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index ca45dd52..f2e37f60 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -85,7 +85,7 @@ void ZoneViewZone::addCard(CardItem *card, bool reorganize, int x, int y) reorganizeCards(); } -void ZoneViewZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint) +void ZoneViewZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown) { Q_UNUSED(dropPoint); qDebug(QString("handleDropEvent id=%1").arg(cardId).toLatin1()); diff --git a/cockatrice/src/zoneviewzone.h b/cockatrice/src/zoneviewzone.h index 57c380fb..cdf6732f 100644 --- a/cockatrice/src/zoneviewzone.h +++ b/cockatrice/src/zoneviewzone.h @@ -9,7 +9,7 @@ class ZoneViewWidget; class ZoneViewZone : public CardZone { private: int numberCards; - void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint); + void handleDropEvent(int cardId, CardZone *startZone, const QPoint &dropPoint, bool faceDown); CardZone *origZone; signals: void removeZoneViewWidget(ZoneViewWidget *zv); diff --git a/servatrice/src/playerzone.cpp b/servatrice/src/playerzone.cpp index 1d645a6c..d58d26da 100644 --- a/servatrice/src/playerzone.cpp +++ b/servatrice/src/playerzone.cpp @@ -19,8 +19,8 @@ ***************************************************************************/ #include "playerzone.h" -PlayerZone::PlayerZone(QString _name, bool _has_coords, bool _is_public, bool _id_access) - : name(_name), has_coords(_has_coords), is_public(_is_public), id_access(_id_access) +PlayerZone::PlayerZone(QString _name, bool _has_coords, bool _is_public, bool _is_private, bool _id_access) + : name(_name), has_coords(_has_coords), is_public(_is_public), is_private(_is_private), id_access(_id_access) { } diff --git a/servatrice/src/playerzone.h b/servatrice/src/playerzone.h index 5d6bb45c..17214e81 100644 --- a/servatrice/src/playerzone.h +++ b/servatrice/src/playerzone.h @@ -28,7 +28,8 @@ class PlayerZone { private: QString name; bool has_coords; - bool is_public; // Contents of the zone are visible for anyone + bool is_public; // Contents of the zone are always visible to anyone + bool is_private; // Contents of the zone are always visible to the owner bool id_access; // getCard() finds by id, not by list index // Example: When moving a card from the library to the table, // the card has to be found by list index because the client @@ -36,12 +37,13 @@ private: // to the table, the card can be found by id because the client // knows the id and the hand does not need to have a specific order. public: - PlayerZone(QString _name, bool _has_coords, bool _is_public, bool _id_access); + PlayerZone(QString _name, bool _has_coords, bool _is_public, bool _is_private, bool _id_access); ~PlayerZone(); TestCard *getCard(int id, bool remove, int *position = NULL); bool isPublic() { return is_public; } + bool isPrivate() { return is_private; } bool hasCoords() { return has_coords; } bool hasIdAccess() { return id_access; } QString getName() { return name; } diff --git a/servatrice/src/testcard.cpp b/servatrice/src/testcard.cpp index 17424126..48fdaea0 100644 --- a/servatrice/src/testcard.cpp +++ b/servatrice/src/testcard.cpp @@ -20,7 +20,7 @@ #include "testcard.h" TestCard::TestCard(QString _name, int _id, int _coord_x, int _coord_y) - : id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), counters(0), tapped(false), attacking(false) + : id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), counters(0), tapped(false), attacking(false), facedown(false), annotation(QString()), doesntUntap(false) { } @@ -36,10 +36,11 @@ void TestCard::resetState() setTapped(false); setAttacking(false); setFaceDown(false); - setAnnotation(""); + setAnnotation(QString()); + setDoesntUntap(false); } -bool TestCard::setAttribute(const QString &aname, const QString &avalue) +bool TestCard::setAttribute(const QString &aname, const QString &avalue, bool allCards) { if (!aname.compare("counters")) { bool ok; @@ -48,13 +49,17 @@ bool TestCard::setAttribute(const QString &aname, const QString &avalue) return false; setCounters(tmp_int); } else if (!aname.compare("tapped")) { - setTapped(!avalue.compare("1")); + bool value = !avalue.compare("1"); + if (!(!value && allCards && doesntUntap)) + setTapped(value); } else if (!aname.compare("attacking")) { setAttacking(!avalue.compare("1")); } else if (!aname.compare("facedown")) { setFaceDown(!avalue.compare("1")); } else if (!aname.compare("annotation")) { setAnnotation(avalue); + } else if (!aname.compare("doesnt_untap")) { + setDoesntUntap(!avalue.compare("1")); } else return false; diff --git a/servatrice/src/testcard.h b/servatrice/src/testcard.h index 23b45976..e1a0f6d3 100644 --- a/servatrice/src/testcard.h +++ b/servatrice/src/testcard.h @@ -21,9 +21,7 @@ #define TESTCARD_H #include -/** - @author Max-Wilhelm Bruker -*/ + class TestCard { private: int id; @@ -34,6 +32,7 @@ private: bool attacking; bool facedown; QString annotation; + bool doesntUntap; public: TestCard(QString _name, int _id, int _coord_x, int _coord_y); ~TestCard(); @@ -47,7 +46,9 @@ public: bool getAttacking() { return attacking; } bool getFaceDown() { return facedown; } QString getAnnotation() { return annotation; } + bool getDoesntUntap() { return doesntUntap; } + void setId(int _id) { id = _id; } void setCoords(int x, int y) { coord_x = x; coord_y = y; } void setName(const QString &_name) { name = _name; } void setCounters(int _counters) { counters = _counters; } @@ -55,9 +56,10 @@ public: void setAttacking(bool _attacking) { attacking = _attacking; } void setFaceDown(bool _facedown) { facedown = _facedown; } void setAnnotation(const QString &_annotation) { annotation = _annotation; } + void setDoesntUntap(bool _doesntUntap) { doesntUntap = _doesntUntap; } void resetState(); - bool setAttribute(const QString &aname, const QString &avalue); + bool setAttribute(const QString &aname, const QString &avalue, bool allCards); }; #endif diff --git a/servatrice/src/testserversocket.cpp b/servatrice/src/testserversocket.cpp index b517c9ee..80940017 100644 --- a/servatrice/src/testserversocket.cpp +++ b/servatrice/src/testserversocket.cpp @@ -42,6 +42,11 @@ TestServerSocket::~TestServerSocket() game->removePlayer(this); } +int TestServerSocket::newCardId() +{ + return nextCardId++; +} + void TestServerSocket::setName(const QString &name) { emit broadcastEvent(QString("name|%1|%2").arg(PlayerName).arg(name), this); @@ -79,14 +84,14 @@ void TestServerSocket::setupZones() // ------------------------------------------------------------------ // Create zones - PlayerZone *deck = new PlayerZone("deck", false, false, false); + PlayerZone *deck = new PlayerZone("deck", false, false, false, false); zones << deck; - PlayerZone *sb = new PlayerZone("sb", false, false, false); + PlayerZone *sb = new PlayerZone("sb", false, false, false, false); zones << sb; - zones << new PlayerZone("table", true, true, true); - zones << new PlayerZone("hand", false, false, true); - zones << new PlayerZone("grave", false, true, true); - zones << new PlayerZone("rfg", false, true, true); + zones << new PlayerZone("table", true, true, false, true); + zones << new PlayerZone("hand", false, false, true, true); + zones << new PlayerZone("grave", false, true, false, true); + zones << new PlayerZone("rfg", false, true, false, true); // Create life counter Counter *life = new Counter("life", 20); @@ -301,8 +306,8 @@ bool TestServerSocket::parseCommand(QString line) emit broadcastEvent(QString("draw|%1").arg(number), this); } else if (!cmd.compare("move_card", Qt::CaseInsensitive)) { - // ID Karte, Startzone, Zielzone, Koordinaten X, Y - if (params.size() != 5) + // ID Karte, Startzone, Zielzone, Koordinaten X, Y, Facedown + if (params.size() != 6) return remsg->send("syntax", false); bool ok; int cardid = params[0].toInt(&ok); @@ -326,26 +331,43 @@ bool TestServerSocket::parseCommand(QString line) if (!ok) return remsg->send("syntax", false); } - targetzone->insertCard(card, x, y); + bool facedown = params[5].toInt(&ok); + if (!ok) + return remsg->send("syntax", false); remsg->send(); - msg(QString("private|||move_card|%1|%2|%3|%4|%5|%6|%7").arg(card->getId()) - .arg(card->getName()) + targetzone->insertCard(card, x, y); + + QString privateCardName, publicCardName; + if (facedown) + card->setId(newCardId()); + if ((!facedown && !card->getFaceDown()) + || (card->getFaceDown() && !facedown && startzone->isPublic() && targetzone->isPublic())) + publicCardName = card->getName(); + if ((!facedown && !card->getFaceDown()) + || (card->getFaceDown() && !facedown && startzone->isPublic() && targetzone->isPublic()) + || (!facedown && targetzone->isPrivate())) + privateCardName = card->getName(); + + card->setFaceDown(facedown); + msg(QString("private|||move_card|%1|%2|%3|%4|%5|%6|%7|%8").arg(card->getId()) + .arg(privateCardName) .arg(startzone->getName()) .arg(position) .arg(targetzone->getName()) .arg(x) - .arg(y)); - // Was ist mit Facedown-Karten? + .arg(y) + .arg(facedown ? 1 : 0)); if ((startzone->isPublic()) || (targetzone->isPublic())) - emit broadcastEvent(QString("move_card|%1|%2|%3|%4|%5|%6|%7").arg(card->getId()) - .arg(card->getName()) + emit broadcastEvent(QString("move_card|%1|%2|%3|%4|%5|%6|%7|%8").arg(card->getId()) + .arg(publicCardName) .arg(startzone->getName()) .arg(position) .arg(targetzone->getName()) .arg(x) - .arg(y), this); + .arg(y) + .arg(facedown ? 1 : 0), this); else - emit broadcastEvent(QString("move_card|||%1|%2|%3|%4|%5").arg(startzone->getName()) + emit broadcastEvent(QString("move_card|||%1|%2|%3|%4|%5|0").arg(startzone->getName()) .arg(position) .arg(targetzone->getName()) .arg(x) @@ -361,7 +383,7 @@ bool TestServerSocket::parseCommand(QString line) QString cardname = params[1]; int x = params[3].toInt(); int y = params[4].toInt(); - int cardid = nextCardId++; + int cardid = newCardId(); QString powtough = params[2]; remsg->send(); @@ -389,13 +411,13 @@ bool TestServerSocket::parseCommand(QString line) if (cardid == -1) { QListIterator CardIterator(zone->cards); while (CardIterator.hasNext()) - if (!CardIterator.next()->setAttribute(params[2], params[3])) + if (!CardIterator.next()->setAttribute(params[2], params[3], true)) return remsg->send("syntax", false); } else { TestCard *card = zone->getCard(cardid, false); if (!card) return remsg->send("game_state", false); - if (!card->setAttribute(params[2], params[3])) + if (!card->setAttribute(params[2], params[3], false)) return remsg->send("syntax", false); } remsg->send(); diff --git a/servatrice/src/testserversocket.h b/servatrice/src/testserversocket.h index 39e273dd..73cb6f19 100644 --- a/servatrice/src/testserversocket.h +++ b/servatrice/src/testserversocket.h @@ -54,6 +54,7 @@ private: QList counters; int PlayerId; int nextCardId; + int newCardId(); PlayerZone *getZone(const QString &name); Counter *getCounter(const QString &name); void setName(const QString &name); diff --git a/servatrice/src/version.h b/servatrice/src/version.h index c2be944e..b17ba9d0 100644 --- a/servatrice/src/version.h +++ b/servatrice/src/version.h @@ -18,4 +18,4 @@ * 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. * ***************************************************************************/ -const char *VERSION_STRING = "Testserver 0.20090304"; +const char *VERSION_STRING = "Testserver 0.20090407";