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

This commit is contained in:
Max-Wilhelm Bruker 2010-06-17 20:13:27 +02:00
parent 7553251baf
commit df7bcf179d
25 changed files with 891 additions and 385 deletions

View file

@ -1,33 +1,45 @@
#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();
}

View file

@ -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) { }
};

View file

@ -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());
}

View file

@ -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);

View file

@ -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);
}

View file

@ -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 *)));

View file

@ -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);

View file

@ -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));
}

View file

@ -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,35 +983,85 @@ 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::actSetPT()
{
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::actSetAnnotation()
{
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::actFlip(CardItem *card)
{
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::actAddCounter(CardItem *card)
void Player::actCardCounterTrigger(QAction *a)
{
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)));
}
void Player::actRemoveCounter(CardItem *card)
{
if (card->getCounters())
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "counters", QString::number(card->getCounters() - 1)));
}
void Player::actSetCounters()
{
bool ok;
int number = QInputDialog::getInteger(0, tr("Set counters"), tr("Number:"), 0, 0, MAX_COUNTERS_ON_CARD, 1, &ok);
if (!ok)
return;
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)));
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)
return;
QListIterator<QGraphicsItem *> i(scene()->selectedItems());
while (i.hasNext()) {
CardItem *card = static_cast<CardItem *>(i.next());
sendGameCommand(new Command_SetCardCounter(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), counterId, number));
}
}
}

View file

@ -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);

View file

@ -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);

View file

@ -1574,8 +1574,54 @@
<source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source>
<translation>%1 zeigt von %2s %3 auf %4s %5.</translation>
</message>
<message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="227"/>
<source>%1 places %n counter(s) (%2) on %3 (now %4).</source>
<translation>
<numerusform>%1 legt eine Marke (%2) auf %3 (jetzt %4).</numerusform>
<numerusform>%1 legt %n Marken (%2) auf %3 (jetzt %4).</numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="229"/>
<source>%1 removes %n counter(s) (%2) from %3 (now %4).</source>
<translation>
<numerusform>%1 entfernt eine Marke (%2) von %3 (jetzt %4).</numerusform>
<numerusform>%1 entfernt %n Marken (%2) von %3 (jetzt %4).</numerusform>
</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="259"/>
<location filename="../src/messagelogwidget.cpp" line="232"/>
<source>red</source>
<translation>rot</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="233"/>
<source>yellow</source>
<translation>gelb</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="234"/>
<source>green</source>
<translation>grün</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="253"/>
<source>%1 sets counter %2 to %3 (%4%5).</source>
<translation>%1 setzt Zähler %2 auf %3 (%4%5).</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="268"/>
<source>%1 sets PT of %2 to %3.</source>
<translation>%1 setzt Kampfwerte von %2 auf %3.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="273"/>
<source>%1 sets annotation of %2 to %3.</source>
<translation>%1 versieht %2 mit dem Hinweis %3.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="279"/>
<source>%1 is looking at the top %2 cards %3.</source>
<translation>%1 sieht sich die obersten %2 Karten %3 an.</translation>
</message>
@ -1665,41 +1711,38 @@
<translation>%1 erstellt Token: %2.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="225"/>
<source>%1 places %2 counters on %3 (now %4).</source>
<translation>%1 legt %2 Zählmarken auf %3 (jetzt %4).</translation>
<translation type="obsolete">%1 legt %2 Zählmarken auf %3 (jetzt %4).</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="227"/>
<source>%1 removes %2 counters from %3 (now %4).</source>
<translation>%1 entfernt %2 Zählmarken von %3 (jetzt %4).</translation>
<translation type="obsolete">%1 entfernt %2 Zählmarken von %3 (jetzt %4).</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>%1 %2 %3.</source>
<translation>%1 %2 %3.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="243"/>
<source>%1 sets counter &quot;%2&quot; to %3 (%4%5).</source>
<translation>%1 setzt Zählmarke &quot;%2&quot; auf %3 (%4%5).</translation>
<translation type="obsolete">%1 setzt Zählmarke &quot;%2&quot; auf %3 (%4%5).</translation>
</message>
<message>
<source>%1 is looking at the top %2 cards of %3.</source>
<translation type="obsolete">%1 sieht sich die obersten %2 Karten %3 an.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="261"/>
<location filename="../src/messagelogwidget.cpp" line="281"/>
<source>%1 is looking at %2.</source>
<translation>%1 sieht sich %2 an.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="267"/>
<location filename="../src/messagelogwidget.cpp" line="287"/>
<source>%1 stops looking at %2.</source>
<translation>%1 sieht sich %2 nicht mehr an.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="291"/>
<location filename="../src/messagelogwidget.cpp" line="311"/>
<source>ending phase</source>
<translation>die Zugendphase</translation>
</message>
@ -1728,57 +1771,57 @@
<translation type="obsolete">%1 sieht sich %2s %3 nicht mehr an</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="273"/>
<location filename="../src/messagelogwidget.cpp" line="293"/>
<source>It is now %1&apos;s turn.</source>
<translation>%1 ist am Zug.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="281"/>
<location filename="../src/messagelogwidget.cpp" line="301"/>
<source>untap step</source>
<translation>das Enttappsegment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="282"/>
<location filename="../src/messagelogwidget.cpp" line="302"/>
<source>upkeep step</source>
<translation>das Versorgungssegment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="283"/>
<location filename="../src/messagelogwidget.cpp" line="303"/>
<source>draw step</source>
<translation>das Ziehsegment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="284"/>
<location filename="../src/messagelogwidget.cpp" line="304"/>
<source>first main phase</source>
<translation>die erste Hauptphase</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="285"/>
<location filename="../src/messagelogwidget.cpp" line="305"/>
<source>beginning of combat step</source>
<translation>das Anfangssegment der Kampfphase</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="286"/>
<location filename="../src/messagelogwidget.cpp" line="306"/>
<source>declare attackers step</source>
<translation>das Angreifer-Deklarieren-Segment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="287"/>
<location filename="../src/messagelogwidget.cpp" line="307"/>
<source>declare blockers step</source>
<translation>das Blocker-Deklarieren-Segment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="288"/>
<location filename="../src/messagelogwidget.cpp" line="308"/>
<source>combat damage step</source>
<translation>das Kampfschadenssegment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="289"/>
<location filename="../src/messagelogwidget.cpp" line="309"/>
<source>end of combat step</source>
<translation>das Endsegment der Kampfphase</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="290"/>
<location filename="../src/messagelogwidget.cpp" line="310"/>
<source>second main phase</source>
<translation>die zweite Hauptphase</translation>
</message>
@ -1787,7 +1830,7 @@
<translation type="obsolete">das Ende-des-Zuges-Segment</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="293"/>
<location filename="../src/messagelogwidget.cpp" line="313"/>
<source>It is now the %1.</source>
<translation>Es ist nun %1.</translation>
</message>
@ -1796,12 +1839,12 @@
<translation type="obsolete">%1 bewegt %2 %3 nach %4</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>taps</source>
<translation>tappt</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>untaps</source>
<translation>enttappt</translation>
</message>
@ -1826,7 +1869,7 @@
<translation type="obsolete">%1 entfernt %2 Zählmarken von %3 (jetzt %4)</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="235"/>
<location filename="../src/messagelogwidget.cpp" line="245"/>
<source>his permanents</source>
<translation>seine bleibenden Karten</translation>
</message>
@ -1839,12 +1882,12 @@
<translation type="obsolete">%1 setzt Zähler &quot;%2&quot; auf %3 (%4%5)</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="250"/>
<location filename="../src/messagelogwidget.cpp" line="260"/>
<source>%1 sets %2 to not untap normally.</source>
<translation>%1 setzt %2 auf explizites Enttappen.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="252"/>
<location filename="../src/messagelogwidget.cpp" line="262"/>
<source>%1 sets %2 to untap normally.</source>
<translation>%1 setzt %2 auf normales Enttappen.</translation>
</message>
@ -1949,41 +1992,41 @@
<context>
<name>Player</name>
<message>
<location filename="../src/player.cpp" line="326"/>
<location filename="../src/player.cpp" line="330"/>
<location filename="../src/player.cpp" line="334"/>
<location filename="../src/player.cpp" line="341"/>
<location filename="../src/player.cpp" line="345"/>
<location filename="../src/player.cpp" line="349"/>
<source>Move to &amp;top of library</source>
<translation>Oben auf die Biblio&amp;thek legen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="327"/>
<location filename="../src/player.cpp" line="331"/>
<location filename="../src/player.cpp" line="335"/>
<location filename="../src/player.cpp" line="342"/>
<location filename="../src/player.cpp" line="346"/>
<location filename="../src/player.cpp" line="350"/>
<source>Move to &amp;bottom of library</source>
<translation>Unter die &amp;Bibliothek legen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="338"/>
<location filename="../src/player.cpp" line="353"/>
<source>&amp;View library</source>
<translation>&amp;Zeige Bibliothek</translation>
</message>
<message>
<location filename="../src/player.cpp" line="339"/>
<location filename="../src/player.cpp" line="354"/>
<source>F3</source>
<translation>F3</translation>
</message>
<message>
<location filename="../src/player.cpp" line="340"/>
<location filename="../src/player.cpp" line="355"/>
<source>View &amp;top cards of library...</source>
<translation>Zeige die oberen Kar&amp;ten der Bibliothek...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="319"/>
<location filename="../src/player.cpp" line="334"/>
<source>&amp;View graveyard</source>
<translation>&amp;Zeige Friedhof</translation>
</message>
<message>
<location filename="../src/player.cpp" line="342"/>
<location filename="../src/player.cpp" line="357"/>
<source>F4</source>
<translation>F4</translation>
</message>
@ -1992,32 +2035,32 @@
<translation type="obsolete">Zeige ent&amp;fernte Karten</translation>
</message>
<message>
<location filename="../src/player.cpp" line="343"/>
<location filename="../src/player.cpp" line="358"/>
<source>&amp;View sideboard</source>
<translation>Zeige &amp;Sideboard</translation>
</message>
<message>
<location filename="../src/player.cpp" line="321"/>
<location filename="../src/player.cpp" line="336"/>
<source>Player &quot;%1&quot;</source>
<translation>Spieler &quot;%1&quot;</translation>
</message>
<message>
<location filename="../src/player.cpp" line="348"/>
<location filename="../src/player.cpp" line="363"/>
<source>Take &amp;mulligan</source>
<translation>&amp;Mulligan nehmen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="353"/>
<location filename="../src/player.cpp" line="368"/>
<source>&amp;Hand</source>
<translation>&amp;Hand</translation>
</message>
<message>
<location filename="../src/player.cpp" line="355"/>
<location filename="../src/player.cpp" line="370"/>
<source>&amp;Library</source>
<translation>Bib&amp;liothek</translation>
</message>
<message>
<location filename="../src/player.cpp" line="322"/>
<location filename="../src/player.cpp" line="337"/>
<source>&amp;Graveyard</source>
<translation>&amp;Friedhof</translation>
</message>
@ -2026,70 +2069,80 @@
<translation type="obsolete">Entfe&amp;rnte Karten</translation>
</message>
<message>
<location filename="../src/player.cpp" line="354"/>
<location filename="../src/player.cpp" line="369"/>
<source>&amp;Sideboard</source>
<translation>&amp;Sideboard</translation>
</message>
<message>
<location filename="../src/player.cpp" line="412"/>
<location filename="../src/player.cpp" line="389"/>
<source>Set &amp;P/T...</source>
<translation>&amp;Kampfwerte setzen...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="390"/>
<source>&amp;Set annotation...</source>
<translation>&amp;Hinweis setzen...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="435"/>
<source>View top cards of library</source>
<translation>Zeige die obersten Karten der Bibliothek</translation>
</message>
<message>
<location filename="../src/player.cpp" line="412"/>
<location filename="../src/player.cpp" line="435"/>
<source>Number of cards:</source>
<translation>Anzahl der Karten:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="344"/>
<location filename="../src/player.cpp" line="359"/>
<source>&amp;Draw card</source>
<translation>Karte &amp;ziehen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="320"/>
<location filename="../src/player.cpp" line="335"/>
<source>&amp;View exile</source>
<translation>&amp;Zeige Exil</translation>
</message>
<message>
<location filename="../src/player.cpp" line="323"/>
<location filename="../src/player.cpp" line="338"/>
<source>&amp;Exile</source>
<translation>&amp;Exil</translation>
</message>
<message>
<location filename="../src/player.cpp" line="332"/>
<location filename="../src/player.cpp" line="336"/>
<location filename="../src/player.cpp" line="347"/>
<location filename="../src/player.cpp" line="351"/>
<source>Move to &amp;hand</source>
<translation>auf die &amp;Hand nehmen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="328"/>
<location filename="../src/player.cpp" line="337"/>
<location filename="../src/player.cpp" line="343"/>
<location filename="../src/player.cpp" line="352"/>
<source>Move to g&amp;raveyard</source>
<translation>auf den &amp;Friedhof legen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="329"/>
<location filename="../src/player.cpp" line="333"/>
<location filename="../src/player.cpp" line="344"/>
<location filename="../src/player.cpp" line="348"/>
<source>Move to &amp;exile</source>
<translation>ins &amp;Exil schicken</translation>
</message>
<message>
<location filename="../src/player.cpp" line="341"/>
<location filename="../src/player.cpp" line="356"/>
<source>Ctrl+W</source>
<translation>Ctrl+W</translation>
</message>
<message>
<location filename="../src/player.cpp" line="345"/>
<location filename="../src/player.cpp" line="360"/>
<source>Ctrl+D</source>
<translation>Ctrl+D</translation>
</message>
<message>
<location filename="../src/player.cpp" line="346"/>
<location filename="../src/player.cpp" line="361"/>
<source>D&amp;raw cards...</source>
<translation>Ka&amp;rten ziehen...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="347"/>
<location filename="../src/player.cpp" line="362"/>
<source>Ctrl+E</source>
<translation>Ctrl+E</translation>
</message>
@ -2098,32 +2151,32 @@
<translation type="obsolete">&amp;Mulligan nehmen...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="349"/>
<location filename="../src/player.cpp" line="364"/>
<source>Ctrl+M</source>
<translation>Ctrl+M</translation>
</message>
<message>
<location filename="../src/player.cpp" line="350"/>
<location filename="../src/player.cpp" line="365"/>
<source>&amp;Shuffle</source>
<translation>Mi&amp;schen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="351"/>
<location filename="../src/player.cpp" line="366"/>
<source>Ctrl+S</source>
<translation>Ctrl+S</translation>
</message>
<message>
<location filename="../src/player.cpp" line="356"/>
<location filename="../src/player.cpp" line="371"/>
<source>&amp;Counters</source>
<translation>&amp;Zähler</translation>
</message>
<message>
<location filename="../src/player.cpp" line="358"/>
<location filename="../src/player.cpp" line="373"/>
<source>&amp;Untap all permanents</source>
<translation>&amp;Enttappe alle bleibenden Karten</translation>
</message>
<message>
<location filename="../src/player.cpp" line="359"/>
<location filename="../src/player.cpp" line="374"/>
<source>Ctrl+U</source>
<translation>Ctrl+U</translation>
</message>
@ -2152,97 +2205,112 @@
<translation type="obsolete">Ctrl+L</translation>
</message>
<message>
<location filename="../src/player.cpp" line="360"/>
<location filename="../src/player.cpp" line="375"/>
<source>R&amp;oll die...</source>
<translation>&amp;Würfeln...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="361"/>
<location filename="../src/player.cpp" line="376"/>
<source>Ctrl+I</source>
<translation>Ctrl+I</translation>
</message>
<message>
<location filename="../src/player.cpp" line="362"/>
<location filename="../src/player.cpp" line="377"/>
<source>&amp;Create token...</source>
<translation>&amp;Token erstellen...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="363"/>
<location filename="../src/player.cpp" line="378"/>
<source>Ctrl+T</source>
<translation>Ctrl+T</translation>
</message>
<message>
<location filename="../src/player.cpp" line="364"/>
<location filename="../src/player.cpp" line="379"/>
<source>S&amp;ay</source>
<translation>&amp;Sagen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="370"/>
<location filename="../src/player.cpp" line="385"/>
<source>C&amp;ard</source>
<translation>&amp;Karte</translation>
</message>
<message>
<location filename="../src/player.cpp" line="371"/>
<location filename="../src/player.cpp" line="386"/>
<source>&amp;Tap</source>
<translation>&amp;Tappen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="372"/>
<location filename="../src/player.cpp" line="387"/>
<source>&amp;Untap</source>
<translation>E&amp;nttappen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="373"/>
<location filename="../src/player.cpp" line="388"/>
<source>Toggle &amp;normal untapping</source>
<translation>&amp;Normales Enttappen umschalten</translation>
</message>
<message>
<location filename="../src/player.cpp" line="374"/>
<location filename="../src/player.cpp" line="391"/>
<source>&amp;Flip</source>
<translation>&amp;Umdrehen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="375"/>
<location filename="../src/player.cpp" line="392"/>
<source>Counters (red)</source>
<translation>Marken (rot)</translation>
</message>
<message>
<location filename="../src/player.cpp" line="393"/>
<source>Counters (yellow)</source>
<translation>Marken (gelb)</translation>
</message>
<message>
<location filename="../src/player.cpp" line="394"/>
<source>Counters (green)</source>
<translation>Marken (grün)</translation>
</message>
<message>
<location filename="../src/player.cpp" line="396"/>
<source>&amp;Add counter</source>
<translation>Zählm&amp;arke hinzufügen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="376"/>
<location filename="../src/player.cpp" line="398"/>
<source>&amp;Remove counter</source>
<translation>Zählma&amp;rke entfernen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="377"/>
<location filename="../src/player.cpp" line="400"/>
<source>&amp;Set counters...</source>
<translation>&amp;Setze Zählmarken...</translation>
</message>
<message>
<location filename="../src/player.cpp" line="378"/>
<location filename="../src/player.cpp" line="401"/>
<source>&amp;top of library</source>
<translation>&amp;auf die Bibliothek</translation>
</message>
<message>
<location filename="../src/player.cpp" line="379"/>
<location filename="../src/player.cpp" line="402"/>
<source>&amp;bottom of library</source>
<translation>&amp;unter die Bibliothek</translation>
</message>
<message>
<location filename="../src/player.cpp" line="380"/>
<location filename="../src/player.cpp" line="403"/>
<source>&amp;graveyard</source>
<translation>in den &amp;Friedhof</translation>
</message>
<message>
<location filename="../src/player.cpp" line="381"/>
<location filename="../src/player.cpp" line="404"/>
<source>Ctrl+Del</source>
<translation>Ctrl+Del</translation>
</message>
<message>
<location filename="../src/player.cpp" line="382"/>
<location filename="../src/player.cpp" line="405"/>
<source>&amp;exile</source>
<translation>ins &amp;Exil</translation>
</message>
<message>
<location filename="../src/player.cpp" line="384"/>
<location filename="../src/player.cpp" line="407"/>
<source>&amp;Move to</source>
<translation>&amp;Verschieben</translation>
</message>
@ -2271,18 +2339,38 @@
<translation type="obsolete">F10</translation>
</message>
<message>
<location filename="../src/player.cpp" line="451"/>
<location filename="../src/player.cpp" line="474"/>
<source>Draw cards</source>
<translation>Karten ziehen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="451"/>
<location filename="../src/player.cpp" line="968"/>
<location filename="../src/player.cpp" line="474"/>
<location filename="../src/player.cpp" line="1056"/>
<source>Number:</source>
<translation>Anzahl:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="968"/>
<location filename="../src/player.cpp" line="996"/>
<source>Set power/toughness</source>
<translation>Kampfwerte setzen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="996"/>
<source>Please enter the new PT:</source>
<translation>Bitte die neuen Kampfwerte eingeben:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="1018"/>
<source>Set annotation</source>
<translation>Hinweis setzen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="1018"/>
<source>Please enter the new annotation:</source>
<translation>Bitte den Hinweis eingeben:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="1056"/>
<source>Set counters</source>
<translation>Setze Zählmarken</translation>
</message>
@ -2295,22 +2383,22 @@
<translation type="obsolete">Neue Lebenspunkte insgesamt:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="464"/>
<location filename="../src/player.cpp" line="487"/>
<source>Roll die</source>
<translation>Würfeln</translation>
</message>
<message>
<location filename="../src/player.cpp" line="464"/>
<location filename="../src/player.cpp" line="487"/>
<source>Number of sides:</source>
<translation>Anzahl der Seiten:</translation>
</message>
<message>
<location filename="../src/player.cpp" line="471"/>
<location filename="../src/player.cpp" line="494"/>
<source>Create token</source>
<translation>Token erstellen</translation>
</message>
<message>
<location filename="../src/player.cpp" line="471"/>
<location filename="../src/player.cpp" line="494"/>
<source>Name:</source>
<translation>Name:</translation>
</message>
@ -2623,7 +2711,7 @@ Bitte geben Sie einen Namen ein:</translation>
<translation>Sind Sie sicher, dass Sie das Spiel verlassen möchten?</translation>
</message>
<message>
<location filename="../src/tab_game.cpp" line="491"/>
<location filename="../src/tab_game.cpp" line="493"/>
<source>Load deck</source>
<translation>Deck laden</translation>
</message>
@ -2702,7 +2790,7 @@ Bitte geben Sie einen Namen ein:</translation>
<translation>Deck &amp;laden...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="128"/>
<location filename="../src/window_deckeditor.cpp" line="126"/>
<source>&amp;Save deck</source>
<translation>Deck &amp;speichern</translation>
</message>
@ -2711,32 +2799,37 @@ Bitte geben Sie einen Namen ein:</translation>
<translation type="obsolete">Deck &amp;speichern unter...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="131"/>
<location filename="../src/window_deckeditor.cpp" line="129"/>
<source>Save deck &amp;as...</source>
<translation>Deck s&amp;peichern unter...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="134"/>
<location filename="../src/window_deckeditor.cpp" line="135"/>
<source>Save deck to clip&amp;board</source>
<translation>Deck in Z&amp;wischenablage speichern</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="138"/>
<source>&amp;Print deck...</source>
<translation>Deck &amp;drucken...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="137"/>
<location filename="../src/window_deckeditor.cpp" line="141"/>
<source>&amp;Close</source>
<translation>S&amp;chließen</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="138"/>
<location filename="../src/window_deckeditor.cpp" line="142"/>
<source>Ctrl+Q</source>
<translation>Ctrl+Q</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="141"/>
<location filename="../src/window_deckeditor.cpp" line="145"/>
<source>&amp;Edit sets...</source>
<translation>&amp;Editionen bearbeiten...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="144"/>
<location filename="../src/window_deckeditor.cpp" line="148"/>
<source>&amp;Deck</source>
<translation>&amp;Deck</translation>
</message>
@ -2745,27 +2838,27 @@ Bitte geben Sie einen Namen ein:</translation>
<translation type="obsolete">&amp;Editionen</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="161"/>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<source>Add card to &amp;maindeck</source>
<translation>Karte zu&amp;m Hauptdeck hinzufügen</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="162"/>
<location filename="../src/window_deckeditor.cpp" line="168"/>
<source>Return</source>
<translation>Return</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="162"/>
<location filename="../src/window_deckeditor.cpp" line="168"/>
<source>Enter</source>
<translation>Enter</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<source>Ctrl+Return</source>
<translation>Ctrl+Return</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<source>Ctrl+Enter</source>
<translation>Ctrl+Enter</translation>
</message>
@ -2774,7 +2867,7 @@ Bitte geben Sie einen Namen ein:</translation>
<translation type="obsolete">Ctrl+M</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="165"/>
<location filename="../src/window_deckeditor.cpp" line="171"/>
<source>Add card to &amp;sideboard</source>
<translation>Karte zum &amp;Sideboard hinzufügen</translation>
</message>
@ -2793,64 +2886,64 @@ Bitte geben Sie einen Namen ein:</translation>
<translation>Suche a&amp;ufheben</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="126"/>
<location filename="../src/window_deckeditor.cpp" line="132"/>
<source>Load deck from cl&amp;ipboard...</source>
<translation>Deck aus &amp;Zwischenablage laden...</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="155"/>
<location filename="../src/window_deckeditor.cpp" line="161"/>
<source>&amp;Card database</source>
<translation>&amp;Kartendatenbank</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="169"/>
<location filename="../src/window_deckeditor.cpp" line="175"/>
<source>&amp;Remove row</source>
<translation>Zeile entfe&amp;rnen</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="170"/>
<location filename="../src/window_deckeditor.cpp" line="176"/>
<source>Del</source>
<translation>Entf</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<location filename="../src/window_deckeditor.cpp" line="179"/>
<source>&amp;Increment number</source>
<translation>Anzahl er&amp;höhen</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="174"/>
<location filename="../src/window_deckeditor.cpp" line="180"/>
<source>+</source>
<translation>+</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="177"/>
<location filename="../src/window_deckeditor.cpp" line="183"/>
<source>&amp;Decrement number</source>
<translation>Anzahl v&amp;erringern</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="179"/>
<location filename="../src/window_deckeditor.cpp" line="185"/>
<source>-</source>
<translation>-</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="230"/>
<location filename="../src/window_deckeditor.cpp" line="236"/>
<source>Are you sure?</source>
<translation>Bist du sicher?</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="231"/>
<location filename="../src/window_deckeditor.cpp" line="237"/>
<source>The decklist has been modified.
Do you want to save the changes?</source>
<translation>Die Deckliste wurde verändert.
Willst du die Änderungen speichern?</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="266"/>
<location filename="../src/window_deckeditor.cpp" line="272"/>
<source>Load deck</source>
<translation>Deck laden</translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="308"/>
<location filename="../src/window_deckeditor.cpp" line="301"/>
<source>Save deck</source>
<translation>Deck speichern</translation>
</message>

View file

@ -984,8 +984,54 @@
<source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source>
<translation type="unfinished"></translation>
</message>
<message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="227"/>
<source>%1 places %n counter(s) (%2) on %3 (now %4).</source>
<translation>
<numerusform>%1 places a counter (%2) on %3 (now %4).</numerusform>
<numerusform>%1 places %n counters (%2) on %3 (now %4).</numerusform>
</translation>
</message>
<message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="229"/>
<source>%1 removes %n counter(s) (%2) from %3 (now %4).</source>
<translation>
<numerusform>%1 removes a counter (%2) from %3 (now %4).</numerusform>
<numerusform>%1 removes %n counters (%2) from %3 (now %4).</numerusform>
</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="259"/>
<location filename="../src/messagelogwidget.cpp" line="232"/>
<source>red</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="233"/>
<source>yellow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="234"/>
<source>green</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="253"/>
<source>%1 sets counter %2 to %3 (%4%5).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="268"/>
<source>%1 sets PT of %2 to %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="273"/>
<source>%1 sets annotation of %2 to %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="279"/>
<source>%1 is looking at the top %2 cards %3.</source>
<translation type="unfinished"></translation>
</message>
@ -1055,42 +1101,27 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="225"/>
<source>%1 places %2 counters on %3 (now %4).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="227"/>
<source>%1 removes %2 counters from %3 (now %4).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>%1 %2 %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="243"/>
<source>%1 sets counter &quot;%2&quot; to %3 (%4%5).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="261"/>
<location filename="../src/messagelogwidget.cpp" line="281"/>
<source>%1 is looking at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="267"/>
<location filename="../src/messagelogwidget.cpp" line="287"/>
<source>%1 stops looking at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="291"/>
<location filename="../src/messagelogwidget.cpp" line="311"/>
<source>ending phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="273"/>
<location filename="../src/messagelogwidget.cpp" line="293"/>
<source>It is now %1&apos;s turn.</source>
<translation type="unfinished"></translation>
</message>
@ -1100,82 +1131,82 @@
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="281"/>
<location filename="../src/messagelogwidget.cpp" line="301"/>
<source>untap step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="282"/>
<location filename="../src/messagelogwidget.cpp" line="302"/>
<source>upkeep step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="283"/>
<location filename="../src/messagelogwidget.cpp" line="303"/>
<source>draw step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="284"/>
<location filename="../src/messagelogwidget.cpp" line="304"/>
<source>first main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="285"/>
<location filename="../src/messagelogwidget.cpp" line="305"/>
<source>beginning of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="286"/>
<location filename="../src/messagelogwidget.cpp" line="306"/>
<source>declare attackers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="287"/>
<location filename="../src/messagelogwidget.cpp" line="307"/>
<source>declare blockers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="288"/>
<location filename="../src/messagelogwidget.cpp" line="308"/>
<source>combat damage step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="289"/>
<location filename="../src/messagelogwidget.cpp" line="309"/>
<source>end of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="290"/>
<location filename="../src/messagelogwidget.cpp" line="310"/>
<source>second main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="293"/>
<location filename="../src/messagelogwidget.cpp" line="313"/>
<source>It is now the %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>taps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="238"/>
<location filename="../src/messagelogwidget.cpp" line="248"/>
<source>untaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="250"/>
<location filename="../src/messagelogwidget.cpp" line="260"/>
<source>%1 sets %2 to not untap normally.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="252"/>
<location filename="../src/messagelogwidget.cpp" line="262"/>
<source>%1 sets %2 to untap normally.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="235"/>
<location filename="../src/messagelogwidget.cpp" line="245"/>
<source>his permanents</source>
<translation type="unfinished"></translation>
</message>
@ -1264,300 +1295,345 @@
<context>
<name>Player</name>
<message>
<location filename="../src/player.cpp" line="326"/>
<location filename="../src/player.cpp" line="330"/>
<location filename="../src/player.cpp" line="334"/>
<location filename="../src/player.cpp" line="341"/>
<location filename="../src/player.cpp" line="345"/>
<location filename="../src/player.cpp" line="349"/>
<source>Move to &amp;top of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="327"/>
<location filename="../src/player.cpp" line="331"/>
<location filename="../src/player.cpp" line="335"/>
<location filename="../src/player.cpp" line="342"/>
<location filename="../src/player.cpp" line="346"/>
<location filename="../src/player.cpp" line="350"/>
<source>Move to &amp;bottom of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="338"/>
<location filename="../src/player.cpp" line="353"/>
<source>&amp;View library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="339"/>
<location filename="../src/player.cpp" line="354"/>
<source>F3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="340"/>
<location filename="../src/player.cpp" line="355"/>
<source>View &amp;top cards of library...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="319"/>
<location filename="../src/player.cpp" line="334"/>
<source>&amp;View graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="342"/>
<location filename="../src/player.cpp" line="357"/>
<source>F4</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="343"/>
<location filename="../src/player.cpp" line="358"/>
<source>&amp;View sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="321"/>
<location filename="../src/player.cpp" line="336"/>
<source>Player &quot;%1&quot;</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="353"/>
<location filename="../src/player.cpp" line="368"/>
<source>&amp;Hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="355"/>
<location filename="../src/player.cpp" line="370"/>
<source>&amp;Library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="322"/>
<location filename="../src/player.cpp" line="337"/>
<source>&amp;Graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="354"/>
<location filename="../src/player.cpp" line="369"/>
<source>&amp;Sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="412"/>
<location filename="../src/player.cpp" line="389"/>
<source>Set &amp;P/T...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="390"/>
<source>&amp;Set annotation...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="435"/>
<source>View top cards of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="412"/>
<location filename="../src/player.cpp" line="435"/>
<source>Number of cards:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="344"/>
<location filename="../src/player.cpp" line="359"/>
<source>&amp;Draw card</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="320"/>
<location filename="../src/player.cpp" line="335"/>
<source>&amp;View exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="323"/>
<location filename="../src/player.cpp" line="338"/>
<source>&amp;Exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="332"/>
<location filename="../src/player.cpp" line="336"/>
<location filename="../src/player.cpp" line="347"/>
<location filename="../src/player.cpp" line="351"/>
<source>Move to &amp;hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="328"/>
<location filename="../src/player.cpp" line="337"/>
<location filename="../src/player.cpp" line="343"/>
<location filename="../src/player.cpp" line="352"/>
<source>Move to g&amp;raveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="329"/>
<location filename="../src/player.cpp" line="333"/>
<location filename="../src/player.cpp" line="344"/>
<location filename="../src/player.cpp" line="348"/>
<source>Move to &amp;exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="341"/>
<location filename="../src/player.cpp" line="356"/>
<source>Ctrl+W</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="345"/>
<location filename="../src/player.cpp" line="360"/>
<source>Ctrl+D</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="346"/>
<location filename="../src/player.cpp" line="361"/>
<source>D&amp;raw cards...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="347"/>
<location filename="../src/player.cpp" line="362"/>
<source>Ctrl+E</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="348"/>
<location filename="../src/player.cpp" line="363"/>
<source>Take &amp;mulligan</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="349"/>
<location filename="../src/player.cpp" line="364"/>
<source>Ctrl+M</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="350"/>
<location filename="../src/player.cpp" line="365"/>
<source>&amp;Shuffle</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="351"/>
<location filename="../src/player.cpp" line="366"/>
<source>Ctrl+S</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="356"/>
<location filename="../src/player.cpp" line="371"/>
<source>&amp;Counters</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="358"/>
<location filename="../src/player.cpp" line="373"/>
<source>&amp;Untap all permanents</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="359"/>
<location filename="../src/player.cpp" line="374"/>
<source>Ctrl+U</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="360"/>
<location filename="../src/player.cpp" line="375"/>
<source>R&amp;oll die...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="361"/>
<location filename="../src/player.cpp" line="376"/>
<source>Ctrl+I</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="362"/>
<location filename="../src/player.cpp" line="377"/>
<source>&amp;Create token...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="363"/>
<location filename="../src/player.cpp" line="378"/>
<source>Ctrl+T</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="364"/>
<location filename="../src/player.cpp" line="379"/>
<source>S&amp;ay</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="370"/>
<location filename="../src/player.cpp" line="385"/>
<source>C&amp;ard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="371"/>
<location filename="../src/player.cpp" line="386"/>
<source>&amp;Tap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="372"/>
<location filename="../src/player.cpp" line="387"/>
<source>&amp;Untap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="373"/>
<location filename="../src/player.cpp" line="388"/>
<source>Toggle &amp;normal untapping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="374"/>
<location filename="../src/player.cpp" line="391"/>
<source>&amp;Flip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="375"/>
<location filename="../src/player.cpp" line="392"/>
<source>Counters (red)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="393"/>
<source>Counters (yellow)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="394"/>
<source>Counters (green)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="396"/>
<source>&amp;Add counter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="376"/>
<location filename="../src/player.cpp" line="398"/>
<source>&amp;Remove counter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="377"/>
<location filename="../src/player.cpp" line="400"/>
<source>&amp;Set counters...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="378"/>
<location filename="../src/player.cpp" line="401"/>
<source>&amp;top of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="379"/>
<location filename="../src/player.cpp" line="402"/>
<source>&amp;bottom of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="380"/>
<location filename="../src/player.cpp" line="403"/>
<source>&amp;graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="381"/>
<location filename="../src/player.cpp" line="404"/>
<source>Ctrl+Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="382"/>
<location filename="../src/player.cpp" line="405"/>
<source>&amp;exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="384"/>
<location filename="../src/player.cpp" line="407"/>
<source>&amp;Move to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="451"/>
<location filename="../src/player.cpp" line="474"/>
<source>Draw cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="451"/>
<location filename="../src/player.cpp" line="968"/>
<location filename="../src/player.cpp" line="474"/>
<location filename="../src/player.cpp" line="1056"/>
<source>Number:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="464"/>
<location filename="../src/player.cpp" line="487"/>
<source>Roll die</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="464"/>
<location filename="../src/player.cpp" line="487"/>
<source>Number of sides:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="471"/>
<location filename="../src/player.cpp" line="494"/>
<source>Create token</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="471"/>
<location filename="../src/player.cpp" line="494"/>
<source>Name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="968"/>
<location filename="../src/player.cpp" line="996"/>
<source>Set power/toughness</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="996"/>
<source>Please enter the new PT:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="1018"/>
<source>Set annotation</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="1018"/>
<source>Please enter the new annotation:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="1056"/>
<source>Set counters</source>
<translation type="unfinished"></translation>
</message>
@ -1845,7 +1921,7 @@ Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/tab_game.cpp" line="491"/>
<location filename="../src/tab_game.cpp" line="493"/>
<source>Load deck</source>
<translation type="unfinished"></translation>
</message>
@ -1909,82 +1985,87 @@ Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="126"/>
<location filename="../src/window_deckeditor.cpp" line="132"/>
<source>Load deck from cl&amp;ipboard...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="128"/>
<location filename="../src/window_deckeditor.cpp" line="126"/>
<source>&amp;Save deck</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="131"/>
<location filename="../src/window_deckeditor.cpp" line="129"/>
<source>Save deck &amp;as...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="134"/>
<source>&amp;Print deck...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="137"/>
<source>&amp;Close</source>
<location filename="../src/window_deckeditor.cpp" line="135"/>
<source>Save deck to clip&amp;board</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="138"/>
<source>Ctrl+Q</source>
<source>&amp;Print deck...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="141"/>
<source>&amp;Close</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="142"/>
<source>Ctrl+Q</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="145"/>
<source>&amp;Edit sets...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="144"/>
<location filename="../src/window_deckeditor.cpp" line="148"/>
<source>&amp;Deck</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="266"/>
<location filename="../src/window_deckeditor.cpp" line="272"/>
<source>Load deck</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="308"/>
<location filename="../src/window_deckeditor.cpp" line="301"/>
<source>Save deck</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="161"/>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<source>Add card to &amp;maindeck</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="162"/>
<location filename="../src/window_deckeditor.cpp" line="168"/>
<source>Return</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="162"/>
<location filename="../src/window_deckeditor.cpp" line="168"/>
<source>Enter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<source>Ctrl+Return</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="167"/>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<source>Ctrl+Enter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="165"/>
<location filename="../src/window_deckeditor.cpp" line="171"/>
<source>Add card to &amp;sideboard</source>
<translation type="unfinished"></translation>
</message>
@ -1999,47 +2080,47 @@ Please enter a name:</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="155"/>
<location filename="../src/window_deckeditor.cpp" line="161"/>
<source>&amp;Card database</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="169"/>
<location filename="../src/window_deckeditor.cpp" line="175"/>
<source>&amp;Remove row</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="170"/>
<location filename="../src/window_deckeditor.cpp" line="176"/>
<source>Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="173"/>
<location filename="../src/window_deckeditor.cpp" line="179"/>
<source>&amp;Increment number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="174"/>
<location filename="../src/window_deckeditor.cpp" line="180"/>
<source>+</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="177"/>
<location filename="../src/window_deckeditor.cpp" line="183"/>
<source>&amp;Decrement number</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="179"/>
<location filename="../src/window_deckeditor.cpp" line="185"/>
<source>-</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="230"/>
<location filename="../src/window_deckeditor.cpp" line="236"/>
<source>Are you sure?</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/window_deckeditor.cpp" line="231"/>
<location filename="../src/window_deckeditor.cpp" line="237"/>
<source>The decklist has been modified.
Do you want to save the changes?</source>
<translation type="unfinished"></translation>

View file

@ -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);

View file

@ -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)

View file

@ -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 {

View file

@ -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
};

View file

@ -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);

View file

@ -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

View file

@ -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:

View file

@ -20,7 +20,7 @@
#include "server_card.h"
Server_Card::Server_Card(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), facedown(false), annotation(QString()), doesntUntap(false)
: id(_id), coord_x(_coord_x), coord_y(_coord_y), name(_name), tapped(false), attacking(false), facedown(false), pt(QString()), annotation(QString()), doesntUntap(false)
{
}
@ -32,23 +32,18 @@ Server_Card::~Server_Card()
void Server_Card::resetState()
{
setCoords(0, 0);
setCounters(0);
counters.clear();
setTapped(false);
setAttacking(false);
setFaceDown(false);
setPT(QString());
setAnnotation(QString());
setDoesntUntap(false);
}
bool Server_Card::setAttribute(const QString &aname, const QString &avalue, bool allCards)
{
if (aname == "counters") {
bool ok;
int tmp_int = avalue.toInt(&ok);
if (!ok)
return false;
setCounters(tmp_int);
} else if (aname == "tapped") {
if (aname == "tapped") {
bool value = avalue == "1";
if (!(!value && allCards && doesntUntap))
setTapped(value);
@ -56,6 +51,8 @@ bool Server_Card::setAttribute(const QString &aname, const QString &avalue, bool
setAttacking(avalue == "1");
} else if (aname == "facedown") {
setFaceDown(avalue == "1");
} else if (aname == "pt") {
setPT(avalue);
} else if (aname == "annotation") {
setAnnotation(avalue);
} else if (aname == "doesnt_untap") {
@ -65,3 +62,11 @@ bool Server_Card::setAttribute(const QString &aname, const QString &avalue, bool
return true;
}
void Server_Card::setCounter(int id, int value)
{
if (value)
counters.insert(id, value);
else
counters.remove(id);
}

View file

@ -21,6 +21,7 @@
#define SERVER_CARD_H
#include <QString>
#include <QMap>
class Server_CardZone;
@ -30,10 +31,11 @@ private:
int id;
int coord_x, coord_y;
QString name;
int counters;
QMap<int, int> counters;
bool tapped;
bool attacking;
bool facedown;
QString pt;
QString annotation;
bool doesntUntap;
public:
@ -47,20 +49,23 @@ public:
int getX() const { return coord_x; }
int getY() const { return coord_y; }
QString getName() const { return name; }
int getCounters() const { return counters; }
const QMap<int, int> &getCounters() const { return counters; }
int getCounter(int id) const { return counters.value(id, 0); }
bool getTapped() const { return tapped; }
bool getAttacking() const { return attacking; }
bool getFaceDown() const { return facedown; }
QString getPT() const { return pt; }
QString getAnnotation() const { return annotation; }
bool getDoesntUntap() const { 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; }
void setCounter(int id, int value);
void setTapped(bool _tapped) { tapped = _tapped; }
void setAttacking(bool _attacking) { attacking = _attacking; }
void setFaceDown(bool _facedown) { facedown = _facedown; }
void setPT(const QString &_pt) { pt = _pt; }
void setAnnotation(const QString &_annotation) { annotation = _annotation; }
void setDoesntUntap(bool _doesntUntap) { doesntUntap = _doesntUntap; }

View file

@ -275,7 +275,15 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
while (cardIterator.hasNext()) {
Server_Card *card = cardIterator.next();
QString displayedName = card->getFaceDown() ? QString() : card->getName();
cardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getCounters(), card->getTapped(), card->getAttacking(), card->getAnnotation()));
QList<ServerInfo_CardCounter *> cardCounterList;
QMapIterator<int, int> cardCounterIterator(card->getCounters());
while (cardCounterIterator.hasNext()) {
cardCounterIterator.next();
cardCounterList.append(new ServerInfo_CardCounter(cardCounterIterator.key(), cardCounterIterator.value()));
}
cardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getPT(), card->getAnnotation(), cardCounterList));
}
}
zoneList.append(new ServerInfo_Zone(zone->getName(), zone->getType(), zone->hasCoords(), zone->cards.size(), cardList));

View file

@ -99,6 +99,8 @@ ResponseCode Server_ProtocolHandler::processCommandHelper(Command *command, Comm
case ItemId_Command_CreateArrow: return cmdCreateArrow(qobject_cast<Command_CreateArrow *>(command), cont, game, player);
case ItemId_Command_DeleteArrow: return cmdDeleteArrow(qobject_cast<Command_DeleteArrow *>(command), cont, game, player);
case ItemId_Command_SetCardAttr: return cmdSetCardAttr(qobject_cast<Command_SetCardAttr *>(command), cont, game, player);
case ItemId_Command_SetCardCounter: return cmdSetCardCounter(qobject_cast<Command_SetCardCounter *>(command), cont, game, player);
case ItemId_Command_IncCardCounter: return cmdIncCardCounter(qobject_cast<Command_IncCardCounter *>(command), cont, game, player);
case ItemId_Command_IncCounter: return cmdIncCounter(qobject_cast<Command_IncCounter *>(command), cont, game, player);
case ItemId_Command_CreateCounter: return cmdCreateCounter(qobject_cast<Command_CreateCounter *>(command), cont, game, player);
case ItemId_Command_SetCounter: return cmdSetCounter(qobject_cast<Command_SetCounter *>(command), cont, game, player);
@ -682,8 +684,6 @@ ResponseCode Server_ProtocolHandler::setCardAttrHelper(CommandContainer *cont, S
if (!game->getGameStarted())
return RespGameNotStarted;
// zone, card id, attr name, attr value
// card id = -1 => affects all cards in the specified zone
Server_CardZone *zone = player->getZones().value(zoneName);
if (!zone)
return RespNameNotFound;
@ -710,6 +710,53 @@ ResponseCode Server_ProtocolHandler::cmdSetCardAttr(Command_SetCardAttr *cmd, Co
return setCardAttrHelper(cont, game, player, cmd->getZone(), cmd->getCardId(), cmd->getAttrName(), cmd->getAttrValue());
}
ResponseCode Server_ProtocolHandler::cmdSetCardCounter(Command_SetCardCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player)
{
if (player->getSpectator())
return RespFunctionNotAllowed;
if (!game->getGameStarted())
return RespGameNotStarted;
Server_CardZone *zone = player->getZones().value(cmd->getZone());
if (!zone)
return RespNameNotFound;
Server_Card *card = zone->getCard(cmd->getCardId(), false);
if (!card)
return RespNameNotFound;
card->setCounter(cmd->getCounterId(), cmd->getCounterValue());
cont->enqueueGameEventPrivate(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), cmd->getCounterValue()), game->getGameId());
cont->enqueueGameEventPublic(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), cmd->getCounterValue()), game->getGameId());
return RespOk;
}
ResponseCode Server_ProtocolHandler::cmdIncCardCounter(Command_IncCardCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player)
{
if (player->getSpectator())
return RespFunctionNotAllowed;
if (!game->getGameStarted())
return RespGameNotStarted;
Server_CardZone *zone = player->getZones().value(cmd->getZone());
if (!zone)
return RespNameNotFound;
Server_Card *card = zone->getCard(cmd->getCardId(), false);
if (!card)
return RespNameNotFound;
int newValue = card->getCounter(cmd->getCounterId()) + cmd->getCounterDelta();
card->setCounter(cmd->getCounterId(), newValue);
cont->enqueueGameEventPrivate(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), newValue), game->getGameId());
cont->enqueueGameEventPublic(new Event_SetCardCounter(player->getPlayerId(), zone->getName(), card->getId(), cmd->getCounterId(), newValue), game->getGameId());
return RespOk;
}
ResponseCode Server_ProtocolHandler::cmdIncCounter(Command_IncCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player)
{
if (player->getSpectator())
@ -833,8 +880,15 @@ ResponseCode Server_ProtocolHandler::cmdDumpZone(Command_DumpZone *cmd, CommandC
QString displayedName = card->getFaceDown() ? QString() : card->getName();
if (zone->getType() == HiddenZone)
respCardList.append(new ServerInfo_Card(i, displayedName));
else
respCardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getCounters(), card->getTapped(), card->getAttacking(), card->getAnnotation()));
else {
QList<ServerInfo_CardCounter *> cardCounterList;
QMapIterator<int, int> cardCounterIterator(card->getCounters());
while (cardCounterIterator.hasNext()) {
cardCounterIterator.next();
cardCounterList.append(new ServerInfo_CardCounter(cardCounterIterator.key(), cardCounterIterator.value()));
}
respCardList.append(new ServerInfo_Card(card->getId(), displayedName, card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getPT(), card->getAnnotation(), cardCounterList));
}
}
if (zone->getType() == HiddenZone) {
zone->setCardsBeingLookedAt(numberCards);

View file

@ -66,6 +66,8 @@ private:
ResponseCode cmdDeleteArrow(Command_DeleteArrow *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode setCardAttrHelper(CommandContainer *cont, Server_Game *game, Server_Player *player, const QString &zone, int cardId, const QString &attrName, const QString &attrValue);
ResponseCode cmdSetCardAttr(Command_SetCardAttr *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode cmdSetCardCounter(Command_SetCardCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode cmdIncCardCounter(Command_IncCardCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode cmdIncCounter(Command_IncCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode cmdCreateCounter(Command_CreateCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);
ResponseCode cmdSetCounter(Command_SetCounter *cmd, CommandContainer *cont, Server_Game *game, Server_Player *player);