Commit df7bcf17 authored by Max-Wilhelm Bruker's avatar Max-Wilhelm Bruker
Browse files

set p/t, set annotation, multiple counters per card

parent 7553251b
#include "abstractgraphicsitem.h"
#include <QPainter>
void AbstractGraphicsItem::paintNumberEllipse(int number, QPainter *painter)
void AbstractGraphicsItem::paintNumberEllipse(int number, int fontSize, const QColor &color, int position, QPainter *painter)
{
painter->save();
QString numStr = QString::number(number);
QFont font("Serif");
font.setPixelSize(32);
font.setPixelSize(fontSize);
font.setWeight(QFont::Bold);
QFontMetrics fm(font);
double w = fm.width(numStr) * 1.5;
double h = fm.height() * 1.5;
double w = fm.width(numStr) * 1.3;
double h = fm.height() * 1.3;
if (w < h)
w = h;
painter->setPen(QColor(255, 255, 255, 0));
QRadialGradient grad(QPointF(0.5, 0.5), 0.5);
grad.setCoordinateMode(QGradient::ObjectBoundingMode);
grad.setColorAt(0, QColor(255, 255, 255, 200));
grad.setColorAt(0.7, QColor(255, 255, 255, 200));
grad.setColorAt(1, QColor(255, 255, 255, 0));
QColor color1(color), color2(color);
color1.setAlpha(255);
color2.setAlpha(0);
grad.setColorAt(0, color1);
grad.setColorAt(0.8, color1);
grad.setColorAt(1, color2);
painter->setBrush(QBrush(grad));
painter->drawEllipse(QRectF((boundingRect().width() - w) / 2.0, (boundingRect().height() - h) / 2.0, w, h));
QRectF textRect;
if (position == -1)
textRect = QRectF((boundingRect().width() - w) / 2.0, (boundingRect().height() - h) / 2.0, w, h);
else {
qreal offset = boundingRect().width() / 20.0;
textRect = QRectF(offset, offset * (position + 1) + h * position, w, h);
}
painter->drawEllipse(textRect);
painter->setPen(Qt::black);
painter->setFont(font);
painter->drawText(boundingRect(), Qt::AlignCenter, numStr);
painter->drawText(textRect, Qt::AlignCenter, numStr);
painter->restore();
}
......@@ -5,7 +5,7 @@
class AbstractGraphicsItem : public QGraphicsItem {
protected:
void paintNumberEllipse(int number, QPainter *painter);
void paintNumberEllipse(int number, int radius, const QColor &color, int position, QPainter *painter);
public:
AbstractGraphicsItem(QGraphicsItem *parent = 0) : QGraphicsItem(parent) { }
};
......
......@@ -12,7 +12,7 @@
#include "settingscache.h"
CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsItem *parent)
: AbstractCardItem(_name, parent), owner(_owner), id(_cardid), attacking(false), facedown(false), counters(0), doesntUntap(false), beingPointedAt(false), dragItem(NULL)
: AbstractCardItem(_name, parent), owner(_owner), id(_cardid), attacking(false), facedown(false), doesntUntap(false), beingPointedAt(false), dragItem(NULL)
{
owner->addCard(this);
}
......@@ -26,8 +26,29 @@ void CardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
{
painter->save();
AbstractCardItem::paint(painter, option, widget);
if (counters)
paintNumberEllipse(counters, painter);
int i = 0;
QMapIterator<int, int> counterIterator(counters);
while (counterIterator.hasNext()) {
counterIterator.next();
QColor color;
color.setHsv(counterIterator.key() * 60, 150, 255);
paintNumberEllipse(counterIterator.value(), 14, color, i, painter);
++i;
}
if (!pt.isEmpty()) {
QFont font("Serif");
font.setPixelSize(16);
painter->setFont(font);
QPen pen(Qt::white);
QBrush brush(Qt::black);
painter->setBackground(brush);
painter->setBackgroundMode(Qt::OpaqueMode);
painter->setPen(pen);
painter->drawText(QRectF(0, 0, boundingRect().width() - 5, boundingRect().height() - 5), Qt::AlignRight | Qt::AlignBottom, pt);
}
if (beingPointedAt)
painter->fillRect(boundingRect(), QBrush(QColor(255, 0, 0, 100)));
painter->restore();
......@@ -47,15 +68,19 @@ void CardItem::setFaceDown(bool _facedown)
update();
}
void CardItem::setCounters(int _counters)
void CardItem::setCounter(int _id, int _value)
{
counters = _counters;
if (_value)
counters.insert(_id, _value);
else
counters.remove(_id);
update();
}
void CardItem::setAnnotation(const QString &_annotation)
{
annotation = _annotation;
setToolTip(annotation);
update();
}
......@@ -64,6 +89,12 @@ void CardItem::setDoesntUntap(bool _doesntUntap)
doesntUntap = _doesntUntap;
}
void CardItem::setPT(const QString &_pt)
{
pt = _pt;
update();
}
void CardItem::setBeingPointedAt(bool _beingPointedAt)
{
beingPointedAt = _beingPointedAt;
......@@ -74,8 +105,9 @@ void CardItem::resetState()
{
attacking = false;
facedown = false;
counters = 0;
annotation = QString();
counters.clear();
pt.clear();
annotation.clear();
setTapped(false);
setDoesntUntap(false);
update();
......@@ -83,10 +115,15 @@ void CardItem::resetState()
void CardItem::processCardInfo(ServerInfo_Card *info)
{
counters.clear();
const QList<ServerInfo_CardCounter *> &_counterList = info->getCounters();
for (int i = 0; i < _counterList.size(); ++i)
counters.insert(_counterList[i]->getId(), _counterList[i]->getValue());
setId(info->getId());
setName(info->getName());
setAttacking(info->getAttacking());
setCounters(info->getCounters());
setPT(info->getPT());
setAnnotation(info->getAnnotation());
setTapped(info->getTapped());
}
......
......@@ -18,8 +18,9 @@ private:
int id;
bool attacking;
bool facedown;
int counters;
QMap<int, int> counters;
QString annotation;
QString pt;
bool doesntUntap;
QPoint gridPoint;
bool beingPointedAt;
......@@ -42,12 +43,14 @@ public:
void setAttacking(bool _attacking);
bool getFaceDown() const { return facedown; }
void setFaceDown(bool _facedown);
int getCounters() const { return counters; }
void setCounters(int _counters);
const QMap<int, int> &getCounters() const { return counters; }
void setCounter(int _id, int _value);
QString getAnnotation() const { return annotation; }
void setAnnotation(const QString &_annotation);
bool getDoesntUntap() const { return doesntUntap; }
void setDoesntUntap(bool _doesntUntap);
QString getPT() const { return pt; }
void setPT(const QString &_pt);
void setBeingPointedAt(bool _beingPointedAt);
void resetState();
void processCardInfo(ServerInfo_Card *info);
......
......@@ -34,5 +34,5 @@ QRectF HandCounter::boundingRect() const
void HandCounter::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{
painter->drawPixmap(handImage->rect(), *handImage, handImage->rect());
paintNumberEllipse(number, painter);
paintNumberEllipse(number, 24, Qt::white, -1, painter);
}
......@@ -218,14 +218,24 @@ void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QStri
);
}
void MessageLogWidget::logSetCardCounters(Player *player, QString cardName, int value, int oldValue)
void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue)
{
QString finalStr;
QString finalStr, colorStr;
int delta = abs(oldValue - value);
if (value > oldValue)
finalStr = tr("%1 places %2 counters on %3 (now %4).");
finalStr = tr("%1 places %n counter(s) (%2) on %3 (now %4).", "", delta);
else
finalStr = tr("%1 removes %2 counters from %3 (now %4).");
append(finalStr.arg(sanitizeHtml(player->getName())).arg(abs(oldValue - value)).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(value));
finalStr = tr("%1 removes %n counter(s) (%2) from %3 (now %4).", "", delta);
switch (counterId) {
case 0: colorStr = tr("red"); break;
case 1: colorStr = tr("yellow"); break;
case 2: colorStr = tr("green"); break;
default: ;
}
append(finalStr.arg(sanitizeHtml(player->getName())).arg(colorStr).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(value));
}
void MessageLogWidget::logSetTapped(Player *player, QString cardName, bool tapped)
......@@ -240,7 +250,7 @@ void MessageLogWidget::logSetTapped(Player *player, QString cardName, bool tappe
void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue)
{
append(tr("%1 sets counter \"%2\" to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue));
append(tr("%1 sets counter %2 to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(counterName))).arg(QString("<font color=\"blue\">%1</font>").arg(value)).arg(value > oldValue ? "+" : "").arg(value - oldValue));
}
void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap)
......@@ -253,6 +263,16 @@ void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool
append(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))));
}
void MessageLogWidget::logSetPT(Player *player, QString cardName, QString newPT)
{
append(tr("%1 sets PT of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(newPT))));
}
void MessageLogWidget::logSetAnnotation(Player *player, QString cardName, QString newAnnotation)
{
append(tr("%1 sets annotation of %2 to %3.").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(newAnnotation))));
}
void MessageLogWidget::logDumpZone(Player *player, CardZone *zone, int numberCards)
{
if (numberCards != -1)
......@@ -301,9 +321,11 @@ void MessageLogWidget::connectToPlayer(Player *player)
connect(player, SIGNAL(logCreateArrow(Player *, Player *, QString, Player *, QString)), this, SLOT(logCreateArrow(Player *, Player *, QString, Player *, QString)));
connect(player, SIGNAL(logCreateToken(Player *, QString)), this, SLOT(logCreateToken(Player *, QString)));
connect(player, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int)));
connect(player, SIGNAL(logSetCardCounters(Player *, QString, int, int)), this, SLOT(logSetCardCounters(Player *, QString, int, int)));
connect(player, SIGNAL(logSetCardCounter(Player *, QString, int, int, int)), this, SLOT(logSetCardCounter(Player *, QString, int, int, int)));
connect(player, SIGNAL(logSetTapped(Player *, QString, bool)), this, SLOT(logSetTapped(Player *, QString, bool)));
connect(player, SIGNAL(logSetDoesntUntap(Player *, QString, bool)), this, SLOT(logSetDoesntUntap(Player *, QString, bool)));
connect(player, SIGNAL(logSetPT(Player *, QString, QString)), this, SLOT(logSetPT(Player *, QString, QString)));
connect(player, SIGNAL(logSetAnnotation(Player *, QString, QString)), this, SLOT(logSetAnnotation(Player *, QString, QString)));
connect(player, SIGNAL(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int)), this, SLOT(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int)));
connect(player, SIGNAL(logDumpZone(Player *, CardZone *, int)), this, SLOT(logDumpZone(Player *, CardZone *, int)));
connect(player, SIGNAL(logStopDumpZone(Player *, CardZone *)), this, SLOT(logStopDumpZone(Player *, CardZone *)));
......
......@@ -41,10 +41,12 @@ public slots:
void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX);
void logCreateToken(Player *player, QString cardName);
void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard);
void logSetCardCounters(Player *player, QString cardName, int value, int oldValue);
void logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue);
void logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(Player *player, QString counterName, int value, int oldValue);
void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logSetPT(Player *player, QString cardName, QString newPT);
void logSetAnnotation(Player *player, QString cardName, QString newAnnotation);
void logDumpZone(Player *player, CardZone *zone, int numberCards);
void logStopDumpZone(Player *player, CardZone *zone);
void logSetActivePlayer(Player *player);
......
......@@ -28,7 +28,7 @@ void PileZone::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
painter->restore();
}
paintNumberEllipse(cards.size(), painter);
paintNumberEllipse(cards.size(), 32, Qt::white, -1, painter);
painter->drawRect(QRectF(0.5, 0.5, CARD_WIDTH - 1, CARD_HEIGHT - 1));
}
......
......@@ -198,26 +198,43 @@ Player::Player(const QString &_name, int _id, bool _local, Client *_client, TabG
aTap = new QAction(this);
aUntap = new QAction(this);
aDoesntUntap = new QAction(this);
aSetPT = new QAction(this);
connect(aSetPT, SIGNAL(triggered()), this, SLOT(actSetPT()));
aSetAnnotation = new QAction(this);
connect(aSetAnnotation, SIGNAL(triggered()), this, SLOT(actSetAnnotation()));
aFlip = new QAction(this);
aAddCounter = new QAction(this);
aRemoveCounter = new QAction(this);
aSetCounters = new QAction(this);
connect(aSetCounters, SIGNAL(triggered()), this, SLOT(actSetCounters()));
aMoveToTopLibrary = new QAction(this);
aMoveToBottomLibrary = new QAction(this);
aMoveToGraveyard = new QAction(this);
aMoveToExile = new QAction(this);
for (int i = 0; i < 3; ++i) {
QMenu *menu = new QMenu;
QAction *tempAddCounter = new QAction(this);
QAction *tempRemoveCounter = new QAction(this);
QAction *tempSetCounter = new QAction(this);
menu->addAction(tempAddCounter);
menu->addAction(tempRemoveCounter);
menu->addAction(tempSetCounter);
aAddCounter.append(tempAddCounter);
aRemoveCounter.append(tempRemoveCounter);
aSetCounter.append(tempSetCounter);
connect(menu, SIGNAL(triggered(QAction *)), this, SLOT(actCardCounterTrigger(QAction *)));
cardCounterMenus.append(menu);
}
cardMenu = new QMenu;
cardMenu->addAction(aTap);
cardMenu->addAction(aUntap);
cardMenu->addAction(aDoesntUntap);
cardMenu->addSeparator();
cardMenu->addAction(aSetPT);
cardMenu->addAction(aSetAnnotation);
cardMenu->addSeparator();
cardMenu->addAction(aFlip);
cardMenu->addSeparator();
cardMenu->addAction(aAddCounter);
cardMenu->addAction(aRemoveCounter);
cardMenu->addAction(aSetCounters);
for (int i = 0; i < cardCounterMenus.size(); ++i)
cardMenu->addMenu(cardCounterMenus[i]);
cardMenu->addSeparator();
moveMenu = cardMenu->addMenu(QString());
......@@ -233,8 +250,6 @@ Player::Player(const QString &_name, int _id, bool _local, Client *_client, TabG
cardMenuHandlers.insert(aUntap, &Player::actUntap);
cardMenuHandlers.insert(aDoesntUntap, &Player::actDoesntUntap);
cardMenuHandlers.insert(aFlip, &Player::actFlip);
cardMenuHandlers.insert(aAddCounter, &Player::actAddCounter);
cardMenuHandlers.insert(aRemoveCounter, &Player::actRemoveCounter);
cardMenuHandlers.insert(aMoveToTopLibrary, &Player::actMoveToTopLibrary);
cardMenuHandlers.insert(aMoveToBottomLibrary, &Player::actMoveToBottomLibrary);
cardMenuHandlers.insert(aMoveToGraveyard, &Player::actMoveToGraveyard);
......@@ -371,10 +386,18 @@ void Player::retranslateUi()
aTap->setText(tr("&Tap"));
aUntap->setText(tr("&Untap"));
aDoesntUntap->setText(tr("Toggle &normal untapping"));
aSetPT->setText(tr("Set &P/T..."));
aSetAnnotation->setText(tr("&Set annotation..."));
aFlip->setText(tr("&Flip"));
aAddCounter->setText(tr("&Add counter"));
aRemoveCounter->setText(tr("&Remove counter"));
aSetCounters->setText(tr("&Set counters..."));
cardCounterMenus[0]->setTitle(tr("Counters (red)"));
cardCounterMenus[1]->setTitle(tr("Counters (yellow)"));
cardCounterMenus[2]->setTitle(tr("Counters (green)"));
for (int i = 0; i < aAddCounter.size(); ++i)
aAddCounter[i]->setText(tr("&Add counter"));
for (int i = 0; i < aRemoveCounter.size(); ++i)
aRemoveCounter[i]->setText(tr("&Remove counter"));
for (int i = 0; i < aSetCounter.size(); ++i)
aSetCounter[i]->setText(tr("&Set counters..."));
aMoveToTopLibrary->setText(tr("&top of library"));
aMoveToBottomLibrary->setText(tr("&bottom of library"));
aMoveToGraveyard->setText(tr("&graveyard"));
......@@ -492,16 +515,16 @@ void Player::setCardAttrHelper(CardItem *card, const QString &aname, const QStri
card->setAttacking(avalue == "1");
else if (aname == "facedown")
card->setFaceDown(avalue == "1");
else if (aname == "counters") {
int value = avalue.toInt();
emit logSetCardCounters(this, card->getName(), value, card->getCounters());
card->setCounters(value);
} else if (aname == "annotation")
else if (aname == "annotation") {
emit logSetAnnotation(this, card->getName(), avalue);
card->setAnnotation(avalue);
else if (aname == "doesnt_untap") {
} else if (aname == "doesnt_untap") {
bool value = (avalue == "1");
emit logSetDoesntUntap(this, card->getName(), value);
card->setDoesntUntap(value);
} else if (aname == "pt") {
emit logSetPT(this, card->getName(), avalue);
card->setPT(avalue);
}
}
......@@ -571,6 +594,21 @@ void Player::eventSetCardAttr(Event_SetCardAttr *event)
}
}
void Player::eventSetCardCounter(Event_SetCardCounter *event)
{
CardZone *zone = zones.value(event->getZone(), 0);
if (!zone)
return;
CardItem *card = zone->getCard(event->getCardId(), QString());
if (!card)
return;
int oldValue = card->getCounters().value(event->getCounterId(), 0);
card->setCounter(event->getCounterId(), event->getCounterValue());
emit logSetCardCounter(this, card->getName(), event->getCounterId(), event->getCounterValue(), oldValue);
}
void Player::eventCreateCounters(Event_CreateCounters *event)
{
const QList<ServerInfo_Counter *> &eventCounterList = event->getCounterList();
......@@ -696,6 +734,7 @@ void Player::processGameEvent(GameEvent *event, GameEventContext *context)
case ItemId_Event_DeleteArrow: eventDeleteArrow(qobject_cast<Event_DeleteArrow *>(event)); break;
case ItemId_Event_CreateToken: eventCreateToken(qobject_cast<Event_CreateToken *>(event)); break;
case ItemId_Event_SetCardAttr: eventSetCardAttr(qobject_cast<Event_SetCardAttr *>(event)); break;
case ItemId_Event_SetCardCounter: eventSetCardCounter(qobject_cast<Event_SetCardCounter *>(event)); break;
case ItemId_Event_CreateCounters: eventCreateCounters(qobject_cast<Event_CreateCounters *>(event)); break;
case ItemId_Event_SetCounter: eventSetCounter(qobject_cast<Event_SetCounter *>(event)); break;
case ItemId_Event_DelCounter: eventDelCounter(qobject_cast<Event_DelCounter *>(event)); break;
......@@ -944,26 +983,75 @@ void Player::actDoesntUntap(CardItem *card)
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "doesnt_untap", QString::number(!card->getDoesntUntap())));
}
void Player::actFlip(CardItem *card)
void Player::actSetPT()
{
QString zone = qgraphicsitem_cast<CardZone *>(card->parentItem())->getName();
sendGameCommand(new Command_MoveCard(-1, zone, card->getId(), zone, card->getGridPoint().x(), card->getGridPoint().y(), !card->getFaceDown()));
QString oldPT;
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
if (!card->getPT().isEmpty())
oldPT = card->getPT();
}
bool ok;
QString pt = QInputDialog::getText(0, tr("Set power/toughness"), tr("Please enter the new PT:"), QLineEdit::Normal, oldPT, &ok);
if (!ok)
return;
i.toFront();
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "pt", pt));
}
}
void Player::actAddCounter(CardItem *card)
void Player::actSetAnnotation()
{
if (card->getCounters() < MAX_COUNTERS_ON_CARD)
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "counters", QString::number(card->getCounters() + 1)));
QString oldAnnotation;
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
if (!card->getAnnotation().isEmpty())
oldAnnotation = card->getAnnotation();
}
bool ok;
QString annotation = QInputDialog::getText(0, tr("Set annotation"), tr("Please enter the new annotation:"), QLineEdit::Normal, oldAnnotation, &ok);
if (!ok)
return;
i.toFront();
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "annotation", annotation));
}
}
void Player::actRemoveCounter(CardItem *card)
void Player::actFlip(CardItem *card)
{
if (card->getCounters())
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "counters", QString::number(card->getCounters() - 1)));
QString zone = qgraphicsitem_cast<CardZone *>(card->parentItem())->getName();
sendGameCommand(new Command_MoveCard(-1, zone, card->getId(), zone, card->getGridPoint().x(), card->getGridPoint().y(), !card->getFaceDown()));
}
void Player::actSetCounters()
void Player::actCardCounterTrigger(QAction *a)
{
QMenu *menu = static_cast<QMenu *>(sender());
int counterId = cardCounterMenus.indexOf(menu);
if (aAddCounter.contains(a)) {
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
if (card->getCounters().value(counterId, 0) < MAX_COUNTERS_ON_CARD)
sendGameCommand(new Command_SetCardCounter(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), counterId, card->getCounters().value(counterId, 0) + 1));
}
} else if (aRemoveCounter.contains(a)) {
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
if (card->getCounters().value(counterId, 0))
sendGameCommand(new Command_SetCardCounter(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), counterId, card->getCounters().value(counterId, 0) - 1));
}
} else if (aSetCounter.contains(a)) {
bool ok;
int number = QInputDialog::getInteger(0, tr("Set counters"), tr("Number:"), 0, 0, MAX_COUNTERS_ON_CARD, 1, &ok);
if (!ok)
......@@ -971,8 +1059,9 @@ void Player::actSetCounters()
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *temp = (CardItem *) i.next();
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(temp->parentItem())->getName(), temp->getId(), "counters", QString::number(number)));
CardItem *card = static_cast<CardItem *>(i.next());
sendGameCommand(new Command_SetCardCounter(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), counterId, number));
}
}
}
......
......@@ -31,6 +31,7 @@ class Event_CreateArrows;
class Event_DeleteArrow;
class Event_CreateToken;
class Event_SetCardAttr;
class Event_SetCardCounter;
class Event_CreateCounters;
class Event_SetCounter;
class Event_DelCounter;
......@@ -51,10 +52,12 @@ signals:
void logCreateToken(Player *player, QString cardName);
void logDrawCards(Player *player, int number);
void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX);
void logSetCardCounters(Player *player, QString cardName, int value, int oldValue);
void logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue);
void logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(Player *player, QString counterName, int value, int oldValue);
void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logSetPT(Player *player, QString cardName, QString newPT);
void logSetAnnotation(Player *player, QString cardName, QString newAnnotation);
void logDumpZone(Player *player, CardZone *zone, int numberCards);
void logStopDumpZone(Player *player, CardZone *zone);
......@@ -76,12 +79,17 @@ public slots:
void actSayMessage();
private slots:
void actSetPT();
void actSetAnnotation();
void updateBgPixmap();
void updateBoundingRect();
void cardMenuAction();
void actSetCounters();
void actCardCounterTrigger(QAction *a);
void rearrangeZones();
private:
QList<QMenu *> cardCounterMenus;
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu, *countersMenu, *sayMenu;
QAction *aMoveHandToTopLibrary, *aMoveHandToBottomLibrary, *aMoveHandToGrave, *aMoveHandToRfg,
*aMoveGraveToTopLibrary, *aMoveGraveToBottomLibrary, *aMoveGraveToHand, *aMoveGraveToRfg,
......@@ -94,15 +102,13 @@ private:
QHash<QAction *, CardMenuHandler> cardMenuHandlers;
QMenu *cardMenu, *moveMenu;
QAction *aTap, *aUntap, *aDoesntUntap, *aFlip, *aAddCounter, *aRemoveCounter, *aSetCounters,
QAction *aTap, *aUntap, *aDoesntUntap, *aSetPT, *aSetAnnotation, *aFlip,
*aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile;
void actTap(CardItem *card);
void actUntap(CardItem *card);
void actDoesntUntap(CardItem *card);
void actFlip(CardItem *card);
void actAddCounter(CardItem *card);
void actRemoveCounter(CardItem *card);
void actMoveToTopLibrary(CardItem *card);
void actMoveToBottomLibrary(CardItem *card);
void actMoveToGraveyard(CardItem *card);
......@@ -137,6 +143,7 @@ private:
void eventDeleteArrow(Event_DeleteArrow *event);
void eventCreateToken(Event_CreateToken *event);
void eventSetCardAttr(Event_SetCardAttr *event);
void eventSetCardCounter(Event_SetCardCounter *event);
void eventCreateCounters(Event_CreateCounters *event);
void eventSetCounter(Event_SetCounter *event);
void eventDelCounter(Event_DelCounter *event);
......
......@@ -132,7 +132,7 @@ WndDeckEditor::WndDeckEditor(QWidget *parent)
aLoadDeckFromClipboard = new QAction(tr("Load deck from cl&ipboard..."), this);
connect(aLoadDeckFromClipboard, SIGNAL(triggered()), this, SLOT(actLoadDeckFromClipboard()));
aLoadDeckFromClipboard->setShortcuts(QKeySequence::Paste);
aSaveDeckToClipboard = new QAction(tr("Save deck to cl&ipboard"), this);
aSaveDeckToClipboard = new QAction(tr("Save deck to clip&board"), this);
connect(aSaveDeckToClipboard, SIGNAL(triggered()), this, SLOT(actSaveDeckToClipboard()));
aSaveDeckToClipboard->setShortcuts(QKeySequence::Copy);
aPrintDeck = new QAction(tr("&Print deck..."), this);
......
This diff is collapsed.
This diff is collapsed.
......@@ -18,6 +18,7 @@ void ProtocolItem::initializeHash()
registerSerializableItem("chat_channel", ServerInfo_ChatChannel::newItem);
registerSerializableItem("chat_user", ServerInfo_ChatUser::newItem);
registerSerializableItem("game", ServerInfo_Game::newItem);
registerSerializableItem("card_counter", ServerInfo_CardCounter::newItem);
registerSerializableItem("card", ServerInfo_Card::newItem);
registerSerializableItem("zone", ServerInfo_Zone::newItem);
registerSerializableItem("counter", ServerInfo_Counter::newItem);
......
......@@ -32,17 +32,27 @@ ServerInfo_Game::ServerInfo_Game(int _gameId, const QString &_description, bool
insertItem(new SerializableItem_Int("spectator_count", _spectatorCount));
}
ServerInfo_Card::ServerInfo_Card(int _id, const QString &_name, int _x, int _y, int _counters, bool _tapped, bool _attacking, const QString &_annotation)
ServerInfo_CardCounter::ServerInfo_CardCounter(int _id, int _value)
: SerializableItem_Map("card_counter")
{
insertItem(new SerializableItem_Int("id", _id));
insertItem(new SerializableItem_Int("value", _value));
}
ServerInfo_Card::ServerInfo_Card(int _id, const QString &_name, int _x, int _y, bool _tapped, bool _attacking, const QString &_pt, const QString &_annotation, const QList<ServerInfo_CardCounter *> &_counters)
: SerializableItem_Map("card")
{
insertItem(new SerializableItem_Int("id", _id));
insertItem(new SerializableItem_String("name", _name));
insertItem(new SerializableItem_Int("x", _x));
insertItem(new SerializableItem_Int("y", _y));
insertItem(new SerializableItem_Int("counters", _counters));
insertItem(new SerializableItem_Bool("tapped", _tapped));
insertItem(new SerializableItem_Bool("attacking", _attacking));
insertItem(new SerializableItem_String("pt", _pt));
insertItem(new SerializableItem_String("annotation", _annotation));
for (int i = 0; i < _counters.size(); ++i)
itemList.append(_counters[i]);
}
ServerInfo_Zone::ServerInfo_Zone(const QString &_name, ZoneType _type, bool _hasCoords, int _cardCount, const QList<ServerInfo_Card *> &_cardList)
......
......@@ -52,18 +52,27 @@ public:
int getSpectatorCount() const { return static_cast<SerializableItem_Int *>(itemMap.value("spectator_count"))->getData(); }
};
class ServerInfo_CardCounter : public SerializableItem_Map {
public:
ServerInfo_CardCounter(int _id = -1, int _value = 0);
static SerializableItem *newItem() { return new ServerInfo_CardCounter; }
int getId() const { return static_cast<SerializableItem_Int *>(itemMap.value("id"))->getData(); }
int getValue() const { return static_cast<SerializableItem_Int *>(itemMap.value("value"))->getData(); }
};
class ServerInfo_Card : public SerializableItem_Map {
public:
ServerInfo_Card(int _id = -1, const QString &_name = QString(), int _x = -1, int _y = -1, int _counters = -1, bool _tapped = false, bool _attacking = false, const QString &_annotation = QString());
ServerInfo_Card(int _id = -1, const QString &_name = QString(), int _x = -1, int _y = -1, bool _tapped = false, bool _attacking = false, const QString &_pt = QString(), const QString &_annotation = QString(), const QList<ServerInfo_CardCounter *> &_counterList = QList<ServerInfo_CardCounter *>());
static SerializableItem *newItem() { return new ServerInfo_Card; }
int getId() const { return static_cast<SerializableItem_Int *>(itemMap.value("id"))->getData(); }
QString getName() const { return static_cast<SerializableItem_String *>(itemMap.value("name"))->getData(); }
int getX() const { return static_cast<SerializableItem_Int *>(itemMap.value("x"))->getData(); }
int getY() const { return static_cast<SerializableItem_Int *>(itemMap.value("y"))->getData(); }
int getCounters() const { return static_cast<SerializableItem_Int *>(itemMap.value("counters"))->getData(); }
bool getTapped() const { return static_cast<SerializableItem_Bool *>(itemMap.value("tapped"))->getData(); }
bool getAttacking() const { return static_cast<SerializableItem_Bool *>(itemMap.value("attacking"))->getData(); }
QString getPT() const { return static_cast<SerializableItem_String *>(itemMap.value("pt"))->getData(); }
QString getAnnotation() const { return static_cast<SerializableItem_String *>(itemMap.value("annotation"))->getData(); }
QList<ServerInfo_CardCounter *> getCounters() const { return typecastItemList<ServerInfo_CardCounter *>(); }
};
class ServerInfo_Zone : public SerializableItem_Map {
......
......@@ -24,38 +24,41 @@ ItemId_Command_CreateToken = 1022,
ItemId_Command_CreateArrow = 1023,
ItemId_Command_DeleteArrow = 1024,
ItemId_Command_SetCardAttr = 1025,
ItemId_Command_ReadyStart = 1026,
ItemId_Command_Concede = 1027,
ItemId_Command_IncCounter = 1028,
ItemId_Command_CreateCounter = 1029,
ItemId_Command_SetCounter = 1030,
ItemId_Command_DelCounter = 1031,
ItemId_Command_NextTurn = 1032,
ItemId_Command_SetActivePhase = 1033,
ItemId_Command_DumpZone = 1034,
ItemId_Command_StopDumpZone = 1035,
ItemId_Event_Say = 1036,
ItemId_Event_Leave = 1037,
ItemId_Event_GameClosed = 1038,
ItemId_Event_Shuffle = 1039,
ItemId_Event_RollDie = 1040,
ItemId_Event_MoveCard = 1041,
ItemId_Event_CreateToken = 1042,
ItemId_Event_DeleteArrow = 1043,
ItemId_Event_SetCardAttr = 1044,
ItemId_Event_SetCounter = 1045,
ItemId_Event_DelCounter = 1046,
ItemId_Event_SetActivePlayer = 1047,
ItemId_Event_SetActivePhase = 1048,
ItemId_Event_DumpZone = 1049,
ItemId_Event_StopDumpZone = 1050,
ItemId_Event_ServerMessage = 1051,
ItemId_Event_GameJoined = 1052,
ItemId_Event_ChatJoinChannel = 1053,
ItemId_Event_ChatLeaveChannel = 1054,
ItemId_Event_ChatSay = 1055,
ItemId_Context_ReadyStart = 1056,
ItemId_Context_Concede = 1057,
ItemId_Context_DeckSelect = 1058,
ItemId_Other = 1059
ItemId_Command_SetCardCounter = 1026,
ItemId_Command_IncCardCounter = 1027,
ItemId_Command_ReadyStart = 1028,
ItemId_Command_Concede = 1029,
ItemId_Command_IncCounter = 1030,
ItemId_Command_CreateCounter = 1031,
ItemId_Command_SetCounter = 1032,
ItemId_Command_DelCounter = 1033,
ItemId_Command_NextTurn = 1034,
ItemId_Command_SetActivePhase = 1035,
ItemId_Command_DumpZone = 1036,
ItemId_Command_StopDumpZone = 1037,
ItemId_Event_Say = 1038,
ItemId_Event_Leave = 1039,
ItemId_Event_GameClosed = 1040,
ItemId_Event_Shuffle = 1041,
ItemId_Event_RollDie = 1042,
ItemId_Event_MoveCard = 1043,
ItemId_Event_CreateToken = 1044,
ItemId_Event_DeleteArrow = 1045,
ItemId_Event_SetCardAttr = 1046,
ItemId_Event_SetCardCounter = 1047,
ItemId_Event_SetCounter = 1048,
ItemId_Event_DelCounter = 1049,
ItemId_Event_SetActivePlayer = 1050,
ItemId_Event_SetActivePhase = 1051,
ItemId_Event_DumpZone = 1052,
ItemId_Event_StopDumpZone = 1053,
ItemId_Event_ServerMessage = 1054,
ItemId_Event_GameJoined = 1055,
ItemId_Event_ChatJoinChannel = 1056,
ItemId_Event_ChatLeaveChannel = 1057,
ItemId_Event_ChatSay = 1058,
ItemId_Context_ReadyStart = 1059,
ItemId_Context_Concede = 1060,
ItemId_Context_DeckSelect = 1061,
ItemId_Other = 1062
};
......@@ -147,6 +147,22 @@ Command_SetCardAttr::Command_SetCardAttr(int _gameId, const QString &_zone, int
insertItem(new SerializableItem_String("attr_name", _attrName));
insertItem(new SerializableItem_String("attr_value", _attrValue));
}
Command_SetCardCounter::Command_SetCardCounter(int _gameId, const QString &_zone, int _cardId, int _counterId, int _counterValue)
: GameCommand("set_card_counter", _gameId)
{
insertItem(new SerializableItem_String("zone", _zone));
insertItem(new SerializableItem_Int("card_id", _cardId));
insertItem(new SerializableItem_Int("counter_id", _counterId));
insertItem(new SerializableItem_Int("counter_value", _counterValue));
}
Command_IncCardCounter::Command_IncCardCounter(int _gameId, const QString &_zone, int _cardId, int _counterId, int _counterDelta)
: GameCommand("inc_card_counter", _gameId)
{
insertItem(new SerializableItem_String("zone", _zone));
insertItem(new SerializableItem_Int("card_id", _cardId));
insertItem(new SerializableItem_Int("counter_id", _counterId));
insertItem(new SerializableItem_Int("counter_delta", _counterDelta));
}
Command_ReadyStart::Command_ReadyStart(int _gameId, bool _ready)
: GameCommand("ready_start", _gameId)
{
......@@ -262,6 +278,14 @@ Event_SetCardAttr::Event_SetCardAttr(int _playerId, const QString &_zone, int _c
insertItem(new SerializableItem_String("attr_name", _attrName));
insertItem(new SerializableItem_String("attr_value", _attrValue));
}
Event_SetCardCounter::Event_SetCardCounter(int _playerId, const QString &_zone, int _cardId, int _counterId, int _counterValue)
: GameEvent("set_card_counter", _playerId)
{
insertItem(new SerializableItem_String("zone", _zone));
insertItem(new SerializableItem_Int("card_id", _cardId));
insertItem(new SerializableItem_Int("counter_id", _counterId));
insertItem(new SerializableItem_Int("counter_value", _counterValue));
}
Event_SetCounter::Event_SetCounter(int _playerId, int _counterId, int _value)
: GameEvent("set_counter", _playerId)
{
......@@ -368,6 +392,8 @@ void ProtocolItem::initializeHashAuto()
itemNameHash.insert("cmdcreate_arrow", Command_CreateArrow::newItem);
itemNameHash.insert("cmddelete_arrow", Command_DeleteArrow::newItem);
itemNameHash.insert("cmdset_card_attr", Command_SetCardAttr::newItem);
itemNameHash.insert("cmdset_card_counter", Command_SetCardCounter::newItem);
itemNameHash.insert("cmdinc_card_counter", Command_IncCardCounter::newItem);
itemNameHash.insert("cmdready_start", Command_ReadyStart::newItem);
itemNameHash.insert("cmdconcede", Command_Concede::newItem);
itemNameHash.insert("cmdinc_counter", Command_IncCounter::newItem);
......@@ -387,6 +413,7 @@ void ProtocolItem::initializeHashAuto()
itemNameHash.insert("game_eventcreate_token", Event_CreateToken::newItem);
itemNameHash.insert("game_eventdelete_arrow", Event_DeleteArrow::newItem);
itemNameHash.insert("game_eventset_card_attr", Event_SetCardAttr::newItem);
itemNameHash.insert("game_eventset_card_counter", Event_SetCardCounter::newItem);
itemNameHash.insert("game_eventset_counter", Event_SetCounter::newItem);
itemNameHash.insert("game_eventdel_counter", Event_DelCounter::newItem);
itemNameHash.insert("game_eventset_active_player", Event_SetActivePlayer::newItem);
......
......@@ -23,6 +23,8 @@
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:set_card_attr:s,zone:i,card_id:s,attr_name:s,attr_value
2:set_card_counter:s,zone:i,card_id:i,counter_id:i,counter_value
2:inc_card_counter:s,zone:i,card_id:i,counter_id:i,counter_delta
2:ready_start:b,ready
2:concede
2:inc_counter:i,counter_id:i,delta
......@@ -42,6 +44,7 @@
3:create_token:s,zone:i,card_id:s,card_name:s,pt:i,x:i,y
3:delete_arrow:i,arrow_id
3:set_card_attr:s,zone:i,card_id:s,attr_name:s,attr_value
3:set_card_counter:s,zone:i,card_id:i,counter_id:i,counter_value
3:set_counter:i,counter_id:i,value
3:del_counter:i,counter_id
3:set_active_player:i,active_player_id
......
......@@ -224,6 +224,28 @@ public:
static SerializableItem *newItem() { return new Command_SetCardAttr; }
int getItemId() const { return ItemId_Command_SetCardAttr; }
};
class Command_SetCardCounter : public GameCommand {
Q_OBJECT
public:
Command_SetCardCounter(int _gameId = -1, const QString &_zone = QString(), int _cardId = -1, int _counterId = -1, int _counterValue = -1);
QString getZone() const { return static_cast<SerializableItem_String *>(itemMap.value("zone"))->getData(); };
int getCardId() const { return static_cast<SerializableItem_Int *>(itemMap.value("card_id"))->getData(); };
int getCounterId() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_id"))->getData(); };
int getCounterValue() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_value"))->getData(); };
static SerializableItem *newItem() { return new Command_SetCardCounter; }
int getItemId() const { return ItemId_Command_SetCardCounter; }
};
class Command_IncCardCounter : public GameCommand {
Q_OBJECT
public:
Command_IncCardCounter(int _gameId = -1, const QString &_zone = QString(), int _cardId = -1, int _counterId = -1, int _counterDelta = -1);
QString getZone() const { return static_cast<SerializableItem_String *>(itemMap.value("zone"))->getData(); };
int getCardId() const { return static_cast<SerializableItem_Int *>(itemMap.value("card_id"))->getData(); };
int getCounterId() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_id"))->getData(); };
int getCounterDelta() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_delta"))->getData(); };
static SerializableItem *newItem() { return new Command_IncCardCounter; }
int getItemId() const { return ItemId_Command_IncCardCounter; }
};
class Command_ReadyStart : public GameCommand {
Q_OBJECT
public:
......@@ -396,6 +418,17 @@ public:
static SerializableItem *newItem() { return new Event_SetCardAttr; }
int getItemId() const { return ItemId_Event_SetCardAttr; }
};
class Event_SetCardCounter : public GameEvent {
Q_OBJECT
public:
Event_SetCardCounter(int _playerId = -1, const QString &_zone = QString(), int _cardId = -1, int _counterId = -1, int _counterValue = -1);
QString getZone() const { return static_cast<SerializableItem_String *>(itemMap.value("zone"))->getData(); };
int getCardId() const { return static_cast<SerializableItem_Int *>(itemMap.value("card_id"))->getData(); };
int getCounterId() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_id"))->getData(); };
int getCounterValue() const { return static_cast<SerializableItem_Int *>(itemMap.value("counter_value"))->getData(); };
static SerializableItem *newItem() { return new Event_SetCardCounter; }
int getItemId() const { return ItemId_Event_SetCardCounter; }
};
class Event_SetCounter : public GameEvent {
Q_OBJECT
public:
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment