arrows can target players now

This commit is contained in:
Max-Wilhelm Bruker 2010-06-27 17:56:09 +02:00
parent cbf201ed9b
commit 61b82bd6f9
25 changed files with 802 additions and 489 deletions

View file

@ -16,6 +16,7 @@ HEADERS += src/counter.h \
src/window_main.h \ src/window_main.h \
src/cardzone.h \ src/cardzone.h \
src/player.h \ src/player.h \
src/playertarget.h \
src/cardlist.h \ src/cardlist.h \
src/abstractcarditem.h \ src/abstractcarditem.h \
src/carditem.h \ src/carditem.h \
@ -45,6 +46,7 @@ HEADERS += src/counter.h \
src/phasestoolbar.h \ src/phasestoolbar.h \
src/gamescene.h \ src/gamescene.h \
src/arrowitem.h \ src/arrowitem.h \
src/arrowtarget.h \
src/tab.h \ src/tab.h \
src/tab_server.h \ src/tab_server.h \
src/tab_chatchannel.h \ src/tab_chatchannel.h \
@ -71,6 +73,7 @@ SOURCES += src/counter.cpp \
src/window_main.cpp \ src/window_main.cpp \
src/gamesmodel.cpp \ src/gamesmodel.cpp \
src/player.cpp \ src/player.cpp \
src/playertarget.cpp \
src/cardzone.cpp \ src/cardzone.cpp \
src/cardlist.cpp \ src/cardlist.cpp \
src/abstractcarditem.cpp \ src/abstractcarditem.cpp \
@ -101,6 +104,7 @@ SOURCES += src/counter.cpp \
src/phasestoolbar.cpp \ src/phasestoolbar.cpp \
src/gamescene.cpp \ src/gamescene.cpp \
src/arrowitem.cpp \ src/arrowitem.cpp \
src/arrowtarget.cpp \
src/tab_server.cpp \ src/tab_server.cpp \
src/tab_chatchannel.cpp \ src/tab_chatchannel.cpp \
src/tab_game.cpp \ src/tab_game.cpp \

View file

@ -9,7 +9,7 @@
#include <QDebug> #include <QDebug>
AbstractCardItem::AbstractCardItem(const QString &_name, QGraphicsItem *parent) AbstractCardItem::AbstractCardItem(const QString &_name, QGraphicsItem *parent)
: AbstractGraphicsItem(parent), info(db->getCard(_name)), name(_name), tapped(false) : ArrowTarget(parent), info(db->getCard(_name)), name(_name), tapped(false)
{ {
setCursor(Qt::OpenHandCursor); setCursor(Qt::OpenHandCursor);
setFlag(ItemIsSelectable); setFlag(ItemIsSelectable);
@ -51,7 +51,7 @@ void AbstractCardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *
} }
painter->drawPixmap(translatedPixmap->rect(), *translatedPixmap, translatedPixmap->rect()); painter->drawPixmap(translatedPixmap->rect(), *translatedPixmap, translatedPixmap->rect());
} else { } else {
QFont f("Serif"); QFont f("Times");
f.setStyleHint(QFont::Serif); f.setStyleHint(QFont::Serif);
f.setPixelSize(12); f.setPixelSize(12);
painter->setFont(f); painter->setFont(f);

View file

@ -1,21 +1,14 @@
#ifndef ABSTRACTCARDITEM_H #ifndef ABSTRACTCARDITEM_H
#define ABSTRACTCARDITEM_H #define ABSTRACTCARDITEM_H
#include "abstractgraphicsitem.h" #include "arrowtarget.h"
class CardInfo; class CardInfo;
const int CARD_WIDTH = 72; const int CARD_WIDTH = 72;
const int CARD_HEIGHT = 102; const int CARD_HEIGHT = 102;
enum CardItemType { class AbstractCardItem : public QObject, public ArrowTarget {
typeCard = QGraphicsItem::UserType + 1,
typeCardDrag = QGraphicsItem::UserType + 2,
typeZone = QGraphicsItem::UserType + 3,
typeOther = QGraphicsItem::UserType + 5
};
class AbstractCardItem : public QObject, public AbstractGraphicsItem {
Q_OBJECT Q_OBJECT
protected: protected:
CardInfo *info; CardInfo *info;

View file

@ -3,6 +3,14 @@
#include <QGraphicsItem> #include <QGraphicsItem>
enum GraphicsItemType {
typeCard = QGraphicsItem::UserType + 1,
typeCardDrag = QGraphicsItem::UserType + 2,
typeZone = QGraphicsItem::UserType + 3,
typePlayerTarget = QGraphicsItem::UserType + 4,
typeOther = QGraphicsItem::UserType + 5
};
class AbstractGraphicsItem : public QGraphicsItem { class AbstractGraphicsItem : public QGraphicsItem {
protected: protected:
void paintNumberEllipse(int number, int radius, const QColor &color, int position, int count, QPainter *painter); void paintNumberEllipse(int number, int radius, const QColor &color, int position, int count, QPainter *painter);

View file

@ -1,4 +1,5 @@
#include "arrowitem.h" #include "arrowitem.h"
#include "playertarget.h"
#include "carditem.h" #include "carditem.h"
#include "cardzone.h" #include "cardzone.h"
#include "player.h" #include "player.h"
@ -8,7 +9,7 @@
#include <QGraphicsSceneMouseEvent> #include <QGraphicsSceneMouseEvent>
#include <QGraphicsScene> #include <QGraphicsScene>
ArrowItem::ArrowItem(Player *_player, int _id, CardItem *_startItem, CardItem *_targetItem, const QColor &_color) ArrowItem::ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTarget *_targetItem, const QColor &_color)
: QGraphicsItem(), player(_player), id(_id), startItem(_startItem), targetItem(_targetItem), color(_color), fullColor(true) : QGraphicsItem(), player(_player), id(_id), startItem(_startItem), targetItem(_targetItem), color(_color), fullColor(true)
{ {
setZValue(2000000005); setZValue(2000000005);
@ -96,7 +97,7 @@ void ArrowItem::mousePressEvent(QGraphicsSceneMouseEvent *event)
player->sendGameCommand(new Command_DeleteArrow(-1, id)); player->sendGameCommand(new Command_DeleteArrow(-1, id));
} }
ArrowDragItem::ArrowDragItem(CardItem *_startItem, const QColor &_color) ArrowDragItem::ArrowDragItem(ArrowTarget *_startItem, const QColor &_color)
: ArrowItem(static_cast<CardZone *>(_startItem->parentItem())->getPlayer(), -1, _startItem, 0, _color) : ArrowItem(static_cast<CardZone *>(_startItem->parentItem())->getPlayer(), -1, _startItem, 0, _color)
{ {
} }
@ -111,10 +112,12 @@ void ArrowDragItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
QPointF endPos = event->scenePos(); QPointF endPos = event->scenePos();
QList<QGraphicsItem *> colliding = scene()->items(endPos); QList<QGraphicsItem *> colliding = scene()->items(endPos);
CardItem *cursorItem = 0; ArrowTarget *cursorItem = 0;
for (int i = colliding.size() - 1; i >= 0; i--) for (int i = colliding.size() - 1; i >= 0; i--)
if ((cursorItem = qgraphicsitem_cast<CardItem *>(colliding.at(i)))) if (qgraphicsitem_cast<PlayerTarget *>(colliding.at(i)) || qgraphicsitem_cast<CardItem *>(colliding.at(i))) {
cursorItem = static_cast<ArrowTarget *>(colliding.at(i));
break; break;
}
if ((cursorItem != targetItem) && targetItem) if ((cursorItem != targetItem) && targetItem)
targetItem->setBeingPointedAt(false); targetItem->setBeingPointedAt(false);
if (!cursorItem) { if (!cursorItem) {
@ -139,17 +142,35 @@ void ArrowDragItem::mouseReleaseEvent(QGraphicsSceneMouseEvent *event)
if (targetItem && (targetItem != startItem)) { if (targetItem && (targetItem != startItem)) {
targetItem->setBeingPointedAt(false); targetItem->setBeingPointedAt(false);
CardZone *startZone = static_cast<CardZone *>(startItem->parentItem()); CardZone *startZone = static_cast<CardZone *>(startItem->parentItem());
CardZone *targetZone = static_cast<CardZone *>(targetItem->parentItem()); // For now, we can safely assume that the start item is always a card.
player->sendGameCommand(new Command_CreateArrow( // The target item can be a player as well.
-1, CardItem *startCard = qgraphicsitem_cast<CardItem *>(startItem);
startZone->getPlayer()->getId(), CardItem *targetCard = qgraphicsitem_cast<CardItem *>(targetItem);
startZone->getName(), if (targetCard) {
startItem->getId(), CardZone *targetZone = static_cast<CardZone *>(targetItem->parentItem());
targetZone->getPlayer()->getId(), player->sendGameCommand(new Command_CreateArrow(
targetZone->getName(), -1,
targetItem->getId(), startZone->getPlayer()->getId(),
color startZone->getName(),
)); startCard->getId(),
targetZone->getPlayer()->getId(),
targetZone->getName(),
targetCard->getId(),
color
));
} else {
PlayerTarget *targetPlayer = qgraphicsitem_cast<PlayerTarget *>(targetItem);
player->sendGameCommand(new Command_CreateArrow(
-1,
startZone->getPlayer()->getId(),
startZone->getName(),
startCard->getId(),
static_cast<Player *>(targetPlayer->parentItem())->getId(),
QString(),
-1,
color
));
}
} }
deleteLater(); deleteLater();

View file

@ -7,6 +7,7 @@ class CardItem;
class QGraphicsSceneMouseEvent; class QGraphicsSceneMouseEvent;
class QMenu; class QMenu;
class Player; class Player;
class ArrowTarget;
class ArrowItem : public QObject, public QGraphicsItem { class ArrowItem : public QObject, public QGraphicsItem {
Q_OBJECT Q_OBJECT
@ -16,12 +17,12 @@ private:
protected: protected:
Player *player; Player *player;
int id; int id;
CardItem *startItem, *targetItem; ArrowTarget *startItem, *targetItem;
QColor color; QColor color;
bool fullColor; bool fullColor;
void mousePressEvent(QGraphicsSceneMouseEvent *event); void mousePressEvent(QGraphicsSceneMouseEvent *event);
public: public:
ArrowItem(Player *_player, int _id, CardItem *_startItem, CardItem *_targetItem, const QColor &color); ArrowItem(Player *_player, int _id, ArrowTarget *_startItem, ArrowTarget *_targetItem, const QColor &color);
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
QRectF boundingRect() const { return path.boundingRect(); } QRectF boundingRect() const { return path.boundingRect(); }
QPainterPath shape() const { return path; } QPainterPath shape() const { return path; }
@ -29,10 +30,10 @@ public:
void updatePath(const QPointF &endPoint); void updatePath(const QPointF &endPoint);
int getId() const { return id; } int getId() const { return id; }
void setStartItem(CardItem *_item) { startItem = _item; } void setStartItem(ArrowTarget *_item) { startItem = _item; }
void setTargetItem(CardItem *_item) { targetItem = _item; } void setTargetItem(ArrowTarget *_item) { targetItem = _item; }
CardItem *getStartItem() const { return startItem; } ArrowTarget *getStartItem() const { return startItem; }
CardItem *getTargetItem() const { return targetItem; } ArrowTarget *getTargetItem() const { return targetItem; }
}; };
class ArrowDragItem : public ArrowItem { class ArrowDragItem : public ArrowItem {
@ -40,7 +41,7 @@ class ArrowDragItem : public ArrowItem {
private: private:
QList<ArrowDragItem *> childArrows; QList<ArrowDragItem *> childArrows;
public: public:
ArrowDragItem(CardItem *_startItem, const QColor &_color); ArrowDragItem(ArrowTarget *_startItem, const QColor &_color);
void addChildArrow(ArrowDragItem *childArrow); void addChildArrow(ArrowDragItem *childArrow);
protected: protected:
void mouseMoveEvent(QGraphicsSceneMouseEvent *event); void mouseMoveEvent(QGraphicsSceneMouseEvent *event);

View file

@ -0,0 +1,12 @@
#include "arrowtarget.h"
ArrowTarget::ArrowTarget(QGraphicsItem *parent)
: AbstractGraphicsItem(parent), beingPointedAt(false)
{
}
void ArrowTarget::setBeingPointedAt(bool _beingPointedAt)
{
beingPointedAt = _beingPointedAt;
update();
}

View file

@ -0,0 +1,15 @@
#ifndef ARROWTARGET_H
#define ARROWTARGET_H
#include "abstractgraphicsitem.h"
class ArrowTarget : public AbstractGraphicsItem {
private:
bool beingPointedAt;
public:
ArrowTarget(QGraphicsItem *parent = 0);
void setBeingPointedAt(bool _beingPointedAt);
bool getBeingPointedAt() const { return beingPointedAt; }
};
#endif

View file

@ -12,7 +12,7 @@
#include "settingscache.h" #include "settingscache.h"
CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsItem *parent) CardItem::CardItem(Player *_owner, const QString &_name, int _cardid, QGraphicsItem *parent)
: AbstractCardItem(_name, parent), owner(_owner), id(_cardid), attacking(false), facedown(false), destroyOnZoneChange(false), doesntUntap(false), beingPointedAt(false), dragItem(NULL) : AbstractCardItem(_name, parent), owner(_owner), id(_cardid), attacking(false), facedown(false), destroyOnZoneChange(false), doesntUntap(false), dragItem(NULL)
{ {
owner->addCard(this); owner->addCard(this);
@ -117,8 +117,8 @@ void CardItem::retranslateUi()
aDoesntUntap->setText(tr("Toggle &normal untapping")); aDoesntUntap->setText(tr("Toggle &normal untapping"));
aFlip->setText(tr("&Flip")); aFlip->setText(tr("&Flip"));
aClone->setText(tr("&Clone")); aClone->setText(tr("&Clone"));
aAttach->setText(tr("Attach to card...")); aAttach->setText(tr("&Attach to card..."));
aUnattach->setText(tr("Unattach")); aUnattach->setText(tr("Unattac&h"));
aSetPT->setText(tr("Set &P/T...")); aSetPT->setText(tr("Set &P/T..."));
aSetAnnotation->setText(tr("&Set annotation...")); aSetAnnotation->setText(tr("&Set annotation..."));
QStringList counterColors; QStringList counterColors;
@ -157,7 +157,7 @@ void CardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
++i; ++i;
} }
if (!pt.isEmpty()) { if (!pt.isEmpty()) {
QFont font("Serif"); QFont font("Times");
font.setPixelSize(16); font.setPixelSize(16);
painter->setFont(font); painter->setFont(font);
QPen pen(Qt::white); QPen pen(Qt::white);
@ -168,7 +168,7 @@ void CardItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
painter->drawText(QRectF(0, 0, boundingRect().width() - 5, boundingRect().height() - 5), Qt::AlignRight | Qt::AlignBottom, pt); painter->drawText(QRectF(0, 0, boundingRect().width() - 5, boundingRect().height() - 5), Qt::AlignRight | Qt::AlignBottom, pt);
} }
if (beingPointedAt) if (getBeingPointedAt())
painter->fillRect(boundingRect(), QBrush(QColor(255, 0, 0, 100))); painter->fillRect(boundingRect(), QBrush(QColor(255, 0, 0, 100)));
painter->restore(); painter->restore();
} }
@ -214,12 +214,6 @@ void CardItem::setPT(const QString &_pt)
update(); update();
} }
void CardItem::setBeingPointedAt(bool _beingPointedAt)
{
beingPointedAt = _beingPointedAt;
update();
}
void CardItem::resetState() void CardItem::resetState()
{ {
attacking = false; attacking = false;
@ -286,7 +280,7 @@ void CardItem::mouseMoveEvent(QGraphicsSceneMouseEvent *event)
QListIterator<QGraphicsItem *> itemIterator(scene()->selectedItems()); QListIterator<QGraphicsItem *> itemIterator(scene()->selectedItems());
while (itemIterator.hasNext()) { while (itemIterator.hasNext()) {
CardItem *c = qgraphicsitem_cast<CardItem *>(itemIterator.next()); CardItem *c = qgraphicsitem_cast<CardItem *>(itemIterator.next());
if (!c) if (!c || (c == this))
continue; continue;
if (c->parentItem() != parentItem()) if (c->parentItem() != parentItem())
continue; continue;

View file

@ -25,7 +25,6 @@ private:
bool destroyOnZoneChange; bool destroyOnZoneChange;
bool doesntUntap; bool doesntUntap;
QPoint gridPoint; QPoint gridPoint;
bool beingPointedAt;
CardDragItem *dragItem; CardDragItem *dragItem;
QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter; QList<QAction *> aAddCounter, aSetCounter, aRemoveCounter;
@ -62,7 +61,6 @@ public:
void setPT(const QString &_pt); void setPT(const QString &_pt);
bool getDestroyOnZoneChange() const { return destroyOnZoneChange; } bool getDestroyOnZoneChange() const { return destroyOnZoneChange; }
void setDestroyOnZoneChange(bool _destroy) { destroyOnZoneChange = _destroy; } void setDestroyOnZoneChange(bool _destroy) { destroyOnZoneChange = _destroy; }
void setBeingPointedAt(bool _beingPointedAt);
void resetState(); void resetState();
void processCardInfo(ServerInfo_Card *info); void processCardInfo(ServerInfo_Card *info);

View file

@ -212,15 +212,23 @@ void MessageLogWidget::logCreateToken(Player *player, QString cardName, QString
append(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt)))); append(tr("%1 creates token: %2%3.").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(pt.isEmpty() ? QString() : QString(" (%1)").arg(sanitizeHtml(pt))));
} }
void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard) void MessageLogWidget::logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool playerTarget)
{ {
append(tr("%1 points from %2's %3 to %4's %5.") if (playerTarget)
.arg(sanitizeHtml(player->getName())) append(tr("%1 points from %2's %3 to %4.")
.arg(sanitizeHtml(startPlayer->getName())) .arg(sanitizeHtml(player->getName()))
.arg(sanitizeHtml(startCard)) .arg(sanitizeHtml(startPlayer->getName()))
.arg(sanitizeHtml(targetPlayer->getName())) .arg(sanitizeHtml(startCard))
.arg(sanitizeHtml(targetCard)) .arg(sanitizeHtml(targetPlayer->getName()))
); );
else
append(tr("%1 points from %2's %3 to %4's %5.")
.arg(sanitizeHtml(player->getName()))
.arg(sanitizeHtml(startPlayer->getName()))
.arg(sanitizeHtml(startCard))
.arg(sanitizeHtml(targetPlayer->getName()))
.arg(sanitizeHtml(targetCard))
);
} }
void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue) void MessageLogWidget::logSetCardCounter(Player *player, QString cardName, int counterId, int value, int oldValue)
@ -323,7 +331,7 @@ void MessageLogWidget::connectToPlayer(Player *player)
connect(player, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString))); connect(player, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString)));
connect(player, SIGNAL(logShuffle(Player *)), this, SLOT(logShuffle(Player *))); connect(player, SIGNAL(logShuffle(Player *)), this, SLOT(logShuffle(Player *)));
connect(player, SIGNAL(logRollDie(Player *, int, int)), this, SLOT(logRollDie(Player *, int, int))); connect(player, SIGNAL(logRollDie(Player *, int, int)), this, SLOT(logRollDie(Player *, int, int)));
connect(player, SIGNAL(logCreateArrow(Player *, Player *, QString, Player *, QString)), this, SLOT(logCreateArrow(Player *, Player *, QString, Player *, QString))); connect(player, SIGNAL(logCreateArrow(Player *, Player *, QString, Player *, QString, bool)), this, SLOT(logCreateArrow(Player *, Player *, QString, Player *, QString, bool)));
connect(player, SIGNAL(logCreateToken(Player *, QString, QString)), this, SLOT(logCreateToken(Player *, QString, QString))); connect(player, SIGNAL(logCreateToken(Player *, QString, QString)), this, SLOT(logCreateToken(Player *, QString, QString)));
connect(player, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int))); connect(player, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int)));
connect(player, SIGNAL(logSetCardCounter(Player *, QString, int, int, int)), this, SLOT(logSetCardCounter(Player *, QString, int, int, int))); connect(player, SIGNAL(logSetCardCounter(Player *, QString, int, int, int)), this, SLOT(logSetCardCounter(Player *, QString, int, int, int)));

View file

@ -41,7 +41,7 @@ public slots:
void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX); void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX);
void logDestroyCard(Player *player, QString cardName); void logDestroyCard(Player *player, QString cardName);
void logCreateToken(Player *player, QString cardName, QString pt); void logCreateToken(Player *player, QString cardName, QString pt);
void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard); void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool playerTarget);
void logSetCardCounter(Player *player, QString cardName, int counterId, 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 logSetTapped(Player *player, QString cardName, bool tapped);
void logSetCounter(Player *player, QString counterName, int value, int oldValue); void logSetCounter(Player *player, QString counterName, int value, int oldValue);

View file

@ -1,6 +1,7 @@
#include "player.h" #include "player.h"
#include "client.h" #include "client.h"
#include "cardzone.h" #include "cardzone.h"
#include "playertarget.h"
#include "counter.h" #include "counter.h"
#include "arrowitem.h" #include "arrowitem.h"
#include "zoneviewzone.h" #include "zoneviewzone.h"
@ -28,6 +29,9 @@ Player::Player(const QString &_name, int _id, bool _local, Client *_client, TabG
connect(settingsCache, SIGNAL(playerBgPathChanged()), this, SLOT(updateBgPixmap())); connect(settingsCache, SIGNAL(playerBgPathChanged()), this, SLOT(updateBgPixmap()));
updateBgPixmap(); updateBgPixmap();
playerTarget = new PlayerTarget(name, CARD_WIDTH + counterAreaWidth + 5, this);
playerTarget->setPos(QPointF(0, 0));
QPointF base = QPointF(counterAreaWidth, 50); QPointF base = QPointF(counterAreaWidth, 50);
PileZone *deck = new PileZone(this, "deck", true, false, this); PileZone *deck = new PileZone(this, "deck", true, false, this);
@ -207,6 +211,7 @@ Player::Player(const QString &_name, int _id, bool _local, Client *_client, TabG
countersMenu = 0; countersMenu = 0;
sbMenu = 0; sbMenu = 0;
aCreateAnotherToken = 0; aCreateAnotherToken = 0;
aCardMenu = 0;
} }
rearrangeZones(); rearrangeZones();
@ -490,7 +495,13 @@ void Player::eventCreateArrows(Event_CreateArrows *event)
ArrowItem *arrow = addArrow(eventArrowList[i]); ArrowItem *arrow = addArrow(eventArrowList[i]);
if (!arrow) if (!arrow)
return; return;
emit logCreateArrow(this, arrow->getStartItem()->getOwner(), arrow->getStartItem()->getName(), arrow->getTargetItem()->getOwner(), arrow->getTargetItem()->getName());
CardItem *startCard = static_cast<CardItem *>(arrow->getStartItem());
CardItem *targetCard = qgraphicsitem_cast<CardItem *>(arrow->getTargetItem());
if (targetCard)
emit logCreateArrow(this, startCard->getOwner(), startCard->getName(), targetCard->getOwner(), targetCard->getName(), false);
else
emit logCreateArrow(this, startCard->getOwner(), startCard->getName(), static_cast<Player *>(arrow->getTargetItem()->parentItem()), QString(), true);
} }
} }
@ -722,20 +733,11 @@ QRectF Player::boundingRect() const
void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/) void Player::paint(QPainter *painter, const QStyleOptionGraphicsItem */*option*/, QWidget */*widget*/)
{ {
QString nameStr = getName();
QFont font("Times");
font.setPixelSize(20);
// font.setWeight(QFont::Bold);
int totalWidth = CARD_WIDTH + counterAreaWidth + 5; int totalWidth = CARD_WIDTH + counterAreaWidth + 5;
if (bgPixmap.isNull()) if (bgPixmap.isNull())
painter->fillRect(QRectF(0, 0, totalWidth, boundingRect().height()), QColor(200, 200, 200)); painter->fillRect(QRectF(0, 0, totalWidth, boundingRect().height()), QColor(200, 200, 200));
else else
painter->fillRect(QRectF(0, 0, totalWidth, boundingRect().height()), QBrush(bgPixmap)); painter->fillRect(QRectF(0, 0, totalWidth, boundingRect().height()), QBrush(bgPixmap));
painter->setFont(font);
painter->setPen(QPen(Qt::black));
painter->drawText(QRectF(0, 0, totalWidth, 40), Qt::AlignCenter, nameStr);
} }
void Player::processPlayerInfo(ServerInfo_Player *info) void Player::processPlayerInfo(ServerInfo_Player *info)
@ -827,20 +829,25 @@ ArrowItem *Player::addArrow(ServerInfo_Arrow *arrow)
CardZone *startZone = startPlayer->getZones().value(arrow->getStartZone(), 0); CardZone *startZone = startPlayer->getZones().value(arrow->getStartZone(), 0);
CardZone *targetZone = targetPlayer->getZones().value(arrow->getTargetZone(), 0); CardZone *targetZone = targetPlayer->getZones().value(arrow->getTargetZone(), 0);
if (!startZone || !targetZone) if (!startZone || (!targetZone && !arrow->getTargetZone().isEmpty()))
return 0; return 0;
CardItem *startCard = startZone->getCard(arrow->getStartCardId(), QString()); CardItem *startCard = startZone->getCard(arrow->getStartCardId(), QString());
CardItem *targetCard = targetZone->getCard(arrow->getTargetCardId(), QString()); CardItem *targetCard = 0;
if (!startCard || !targetCard) if (targetZone)
targetCard = targetZone->getCard(arrow->getTargetCardId(), QString());
if (!startCard || (!targetCard && !arrow->getTargetZone().isEmpty()))
return 0; return 0;
return addArrow(arrow->getId(), startCard, targetCard, arrow->getColor()); if (targetCard)
return addArrow(arrow->getId(), startCard, targetCard, arrow->getColor());
else
return addArrow(arrow->getId(), startCard, targetPlayer->getPlayerTarget(), arrow->getColor());
} }
ArrowItem *Player::addArrow(int arrowId, CardItem *startCard, CardItem *targetCard, const QColor &color) ArrowItem *Player::addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color)
{ {
ArrowItem *arrow = new ArrowItem(this, arrowId, startCard, targetCard, color); ArrowItem *arrow = new ArrowItem(this, arrowId, startCard, targetItem, color);
arrows.insert(arrowId, arrow); arrows.insert(arrowId, arrow);
scene()->addItem(arrow); scene()->addItem(arrow);
return arrow; return arrow;
@ -909,6 +916,7 @@ void Player::cardMenuAction()
{ {
QAction *a = static_cast<QAction *>(sender()); QAction *a = static_cast<QAction *>(sender());
QList<QGraphicsItem *> sel = scene()->selectedItems(); QList<QGraphicsItem *> sel = scene()->selectedItems();
QList<Command *> commandList;
while (!sel.isEmpty()) { while (!sel.isEmpty()) {
unsigned int i = (unsigned int) (((double) sel.size()) * qrand() / (RAND_MAX + 1.0)); unsigned int i = (unsigned int) (((double) sel.size()) * qrand() / (RAND_MAX + 1.0));
CardItem *card = qgraphicsitem_cast<CardItem *>(sel.takeAt(i)); CardItem *card = qgraphicsitem_cast<CardItem *>(sel.takeAt(i));
@ -916,38 +924,39 @@ void Player::cardMenuAction()
switch (a->data().toInt()) { switch (a->data().toInt()) {
case 0: case 0:
if (!card->getTapped()) if (!card->getTapped())
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "tapped", "1")); commandList.append(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "tapped", "1"));
break; break;
case 1: case 1:
if (card->getTapped()) if (card->getTapped())
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "tapped", "0")); commandList.append(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "tapped", "0"));
break; break;
case 2: case 2:
sendGameCommand(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "doesnt_untap", QString::number(!card->getDoesntUntap()))); commandList.append(new Command_SetCardAttr(-1, qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "doesnt_untap", QString::number(!card->getDoesntUntap())));
break; break;
case 3: { case 3: {
QString zone = qgraphicsitem_cast<CardZone *>(card->parentItem())->getName(); 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())); commandList.append(new Command_MoveCard(-1, zone, card->getId(), zone, card->getGridPoint().x(), card->getGridPoint().y(), !card->getFaceDown()));
break; break;
} }
case 4: case 4:
sendGameCommand(new Command_CreateToken(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getName(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), -1, card->getGridPoint().y())); commandList.append(new Command_CreateToken(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getName(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), -1, card->getGridPoint().y()));
break; break;
case 5: case 5:
sendGameCommand(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "deck", 0, 0, false)); commandList.append(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "deck", 0, 0, false));
break; break;
case 6: case 6:
sendGameCommand(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "deck", -1, 0, false)); commandList.append(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "deck", -1, 0, false));
break; break;
case 7: case 7:
sendGameCommand(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "grave", 0, 0, false)); commandList.append(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "grave", 0, 0, false));
break; break;
case 8: case 8:
sendGameCommand(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "rfg", 0, 0, false)); commandList.append(new Command_MoveCard(-1, static_cast<CardZone *>(card->parentItem())->getName(), card->getId(), "rfg", 0, 0, false));
break; break;
default: ; default: ;
} }
} }
sendCommandContainer(new CommandContainer(commandList));
} }
void Player::actSetPT() void Player::actSetPT()
@ -1045,12 +1054,15 @@ void Player::actCardCounterTrigger()
void Player::setCardMenu(QMenu *menu) void Player::setCardMenu(QMenu *menu)
{ {
aCardMenu->setMenu(menu); if (aCardMenu)
aCardMenu->setMenu(menu);
} }
QMenu *Player::getCardMenu() const QMenu *Player::getCardMenu() const
{ {
return aCardMenu->menu(); if (aCardMenu)
return aCardMenu->menu();
return 0;
} }
qreal Player::getMinimumWidth() const qreal Player::getMinimumWidth() const

View file

@ -17,6 +17,7 @@ class ArrowItem;
class CardZone; class CardZone;
class TableZone; class TableZone;
class HandZone; class HandZone;
class PlayerTarget;
class ServerInfo_Player; class ServerInfo_Player;
class ServerInfo_Arrow; class ServerInfo_Arrow;
class ServerInfo_Counter; class ServerInfo_Counter;
@ -49,7 +50,7 @@ signals:
void logSay(Player *player, QString message); void logSay(Player *player, QString message);
void logShuffle(Player *player); void logShuffle(Player *player);
void logRollDie(Player *player, int sides, int roll); void logRollDie(Player *player, int sides, int roll);
void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard); void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool _playerTarget);
void logCreateToken(Player *player, QString cardName, QString pt); void logCreateToken(Player *player, QString cardName, QString pt);
void logDrawCards(Player *player, int number); void logDrawCards(Player *player, int number);
void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX); void logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX);
@ -90,7 +91,6 @@ public slots:
void actCardCounterTrigger(); void actCardCounterTrigger();
private slots: private slots:
void updateBgPixmap(); void updateBgPixmap();
void updateBoundingRect(); void updateBoundingRect();
void rearrangeZones(); void rearrangeZones();
@ -104,9 +104,6 @@ private:
*aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken,
*aCardMenu; *aCardMenu;
typedef void (Player::*CardMenuHandler)(CardItem *card);
QHash<QAction *, CardMenuHandler> cardMenuHandlers;
int defaultNumberTopCards; int defaultNumberTopCards;
QString lastTokenName, lastTokenColor, lastTokenPT, lastTokenAnnotation; QString lastTokenName, lastTokenColor, lastTokenPT, lastTokenAnnotation;
bool lastTokenDestroy; bool lastTokenDestroy;
@ -119,6 +116,7 @@ private:
QMap<QString, CardZone *> zones; QMap<QString, CardZone *> zones;
TableZone *table; TableZone *table;
HandZone *hand; HandZone *hand;
PlayerTarget *playerTarget;
void setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards); void setCardAttrHelper(CardItem *card, const QString &aname, const QString &avalue, bool allCards);
@ -164,9 +162,10 @@ public:
void clearCounters(); void clearCounters();
ArrowItem *addArrow(ServerInfo_Arrow *arrow); ArrowItem *addArrow(ServerInfo_Arrow *arrow);
ArrowItem *addArrow(int arrowId, CardItem *startCard, CardItem *targetCard, const QColor &color); ArrowItem *addArrow(int arrowId, CardItem *startCard, ArrowTarget *targetItem, const QColor &color);
void delArrow(int arrowId); void delArrow(int arrowId);
void clearArrows(); void clearArrows();
PlayerTarget *getPlayerTarget() const { return playerTarget; }
Client *client; Client *client;
Player(const QString &_name, int _id, bool _local, Client *_client, TabGame *_parent); Player(const QString &_name, int _id, bool _local, Client *_client, TabGame *_parent);

View file

@ -0,0 +1,23 @@
#include "playertarget.h"
#include <QPainter>
PlayerTarget::PlayerTarget(const QString &_name, int _maxWidth, QGraphicsItem *parent)
: ArrowTarget(parent), name(_name), maxWidth(_maxWidth)
{
font = QFont("Times");
font.setStyleHint(QFont::Serif);
font.setPixelSize(20);
}
QRectF PlayerTarget::boundingRect() const
{
return QRectF(0, 0, maxWidth, 30);
}
void PlayerTarget::paint(QPainter *painter, const QStyleOptionGraphicsItem * /*option*/, QWidget * /*widget*/)
{
painter->fillRect(boundingRect(), QColor(255, 255, 255, 100));
painter->setFont(font);
painter->setPen(Qt::black);
painter->drawText(boundingRect(), Qt::AlignCenter, name);
}

View file

@ -0,0 +1,21 @@
#ifndef PLAYERTARGET_H
#define PLAYERTARGET_H
#include "arrowtarget.h"
#include <QFont>
class PlayerTarget : public ArrowTarget {
private:
QString name;
QFont font;
int maxWidth;
public:
enum { Type = typePlayerTarget };
int type() const { return Type; }
PlayerTarget(const QString &_name, int _maxWidth, QGraphicsItem *parent = 0);
QRectF boundingRect() const;
void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
};
#endif

View file

@ -152,115 +152,223 @@
<translation type="obsolete">Das Kartenhintergrundbild konnte nicht geladen werden.</translation> <translation type="obsolete">Das Kartenhintergrundbild konnte nicht geladen werden.</translation>
</message> </message>
</context> </context>
<context>
<name>CardItem</name>
<message>
<location filename="../src/carditem.cpp" line="115"/>
<source>&amp;Tap</source>
<translation>&amp;Tappen</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="116"/>
<source>&amp;Untap</source>
<translation>E&amp;nttappen</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="117"/>
<source>Toggle &amp;normal untapping</source>
<translation>N&amp;ormales Enttappen umschalten</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="118"/>
<source>&amp;Flip</source>
<translation>&amp;Umdrehen</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="119"/>
<source>&amp;Clone</source>
<translation>&amp;Kopieren</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="120"/>
<source>&amp;Attach to card...</source>
<translation>&amp;An Karte anlegen...</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="121"/>
<source>Unattac&amp;h</source>
<translation>&amp;Von Karte lösen</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="122"/>
<source>Set &amp;P/T...</source>
<translation>&amp;Kampfwerte setzen...</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="123"/>
<source>&amp;Set annotation...</source>
<translation>&amp;Hinweis setzen...</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="125"/>
<source>red</source>
<translation>rot</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="126"/>
<source>yellow</source>
<translation>gelb</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="127"/>
<source>green</source>
<translation>grün</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="129"/>
<source>&amp;Add counter (%1)</source>
<translation>Zählmarke &amp;hinzufügen (%1)</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="131"/>
<source>&amp;Remove counter (%1)</source>
<translation>Zählmarke &amp;entfernen (%1)</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="133"/>
<source>&amp;Set counters (%1)...</source>
<translation>Zählmarken &amp;setzen (%1)...</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="134"/>
<source>&amp;top of library</source>
<translation>&amp;auf die Bibliothek</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="135"/>
<source>&amp;bottom of library</source>
<translation>&amp;unter die Bibliothek</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="136"/>
<source>&amp;graveyard</source>
<translation>in den &amp;Friedhof</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="137"/>
<source>Ctrl+Del</source>
<translation>Ctrl+Del</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="138"/>
<source>&amp;exile</source>
<translation>ins &amp;Exil</translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="140"/>
<source>&amp;Move to</source>
<translation>&amp;Verschieben</translation>
</message>
</context>
<context> <context>
<name>CardZone</name> <name>CardZone</name>
<message> <message>
<location filename="../src/cardzone.cpp" line="35"/> <location filename="../src/cardzone.cpp" line="41"/>
<location filename="../src/cardzone.cpp" line="37"/> <location filename="../src/cardzone.cpp" line="43"/>
<source>his hand</source> <source>his hand</source>
<translation>seine Hand</translation> <translation>seine Hand</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="35"/> <location filename="../src/cardzone.cpp" line="41"/>
<location filename="../src/cardzone.cpp" line="37"/> <location filename="../src/cardzone.cpp" line="43"/>
<source>%1&apos;s hand</source> <source>%1&apos;s hand</source>
<translation>%1s Hand</translation> <translation>%1s Hand</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="36"/> <location filename="../src/cardzone.cpp" line="42"/>
<source>of his hand</source> <source>of his hand</source>
<translation>seiner Hand</translation> <translation>seiner Hand</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="36"/> <location filename="../src/cardzone.cpp" line="42"/>
<source>of %1&apos;s hand</source> <source>of %1&apos;s hand</source>
<translation>von %1s Hand</translation> <translation>von %1s Hand</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="41"/> <location filename="../src/cardzone.cpp" line="47"/>
<location filename="../src/cardzone.cpp" line="43"/> <location filename="../src/cardzone.cpp" line="49"/>
<source>his library</source> <source>his library</source>
<translation>seine Bibliothek</translation> <translation>seine Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="41"/> <location filename="../src/cardzone.cpp" line="47"/>
<location filename="../src/cardzone.cpp" line="43"/> <location filename="../src/cardzone.cpp" line="49"/>
<source>%1&apos;s library</source> <source>%1&apos;s library</source>
<translation>%1s Bibliothek</translation> <translation>%1s Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="42"/> <location filename="../src/cardzone.cpp" line="48"/>
<source>of his library</source> <source>of his library</source>
<translation>seiner Bibliothek</translation> <translation>seiner Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="42"/> <location filename="../src/cardzone.cpp" line="48"/>
<source>of %1&apos;s library</source> <source>of %1&apos;s library</source>
<translation>von %1s Bibliothek</translation> <translation>von %1s Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="47"/> <location filename="../src/cardzone.cpp" line="53"/>
<location filename="../src/cardzone.cpp" line="49"/> <location filename="../src/cardzone.cpp" line="55"/>
<source>his graveyard</source> <source>his graveyard</source>
<translation>sein Friedhof</translation> <translation>sein Friedhof</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="47"/> <location filename="../src/cardzone.cpp" line="53"/>
<location filename="../src/cardzone.cpp" line="49"/> <location filename="../src/cardzone.cpp" line="55"/>
<source>%1&apos;s graveyard</source> <source>%1&apos;s graveyard</source>
<translation>%1s Friedhof</translation> <translation>%1s Friedhof</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="48"/> <location filename="../src/cardzone.cpp" line="54"/>
<source>of his graveyard</source> <source>of his graveyard</source>
<translation>seines Friedhofs</translation> <translation>seines Friedhofs</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="48"/> <location filename="../src/cardzone.cpp" line="54"/>
<source>of %1&apos;s graveyard</source> <source>of %1&apos;s graveyard</source>
<translation>von %1s Friedhof</translation> <translation>von %1s Friedhof</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="53"/> <location filename="../src/cardzone.cpp" line="59"/>
<location filename="../src/cardzone.cpp" line="55"/> <location filename="../src/cardzone.cpp" line="61"/>
<source>his exile</source> <source>his exile</source>
<translation>sein Exil</translation> <translation>sein Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="53"/> <location filename="../src/cardzone.cpp" line="59"/>
<location filename="../src/cardzone.cpp" line="55"/> <location filename="../src/cardzone.cpp" line="61"/>
<source>%1&apos;s exile</source> <source>%1&apos;s exile</source>
<translation>%1s Exil</translation> <translation>%1s Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="54"/> <location filename="../src/cardzone.cpp" line="60"/>
<source>of his exile</source> <source>of his exile</source>
<translation>seines Exils</translation> <translation>seines Exils</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="54"/> <location filename="../src/cardzone.cpp" line="60"/>
<source>of %1&apos;s exile</source> <source>of %1&apos;s exile</source>
<translation>von %1s Exil</translation> <translation>von %1s Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="59"/> <location filename="../src/cardzone.cpp" line="65"/>
<location filename="../src/cardzone.cpp" line="61"/> <location filename="../src/cardzone.cpp" line="67"/>
<source>his sideboard</source> <source>his sideboard</source>
<translation>sein Sideboard</translation> <translation>sein Sideboard</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="59"/> <location filename="../src/cardzone.cpp" line="65"/>
<location filename="../src/cardzone.cpp" line="61"/> <location filename="../src/cardzone.cpp" line="67"/>
<source>%1&apos;s sideboard</source> <source>%1&apos;s sideboard</source>
<translation>%1s Sideboard</translation> <translation>%1s Sideboard</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="60"/> <location filename="../src/cardzone.cpp" line="66"/>
<source>of his sideboard</source> <source>of his sideboard</source>
<translation>seines Sideboards</translation> <translation>seines Sideboards</translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="60"/> <location filename="../src/cardzone.cpp" line="66"/>
<source>of %1&apos;s sideboard</source> <source>of %1&apos;s sideboard</source>
<translation>von %1s Sideboard</translation> <translation>von %1s Sideboard</translation>
</message> </message>
@ -607,16 +715,21 @@
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="30"/> <location filename="../src/dlg_create_token.cpp" line="30"/>
<source>&amp;Destroy token when it leaves the table</source>
<translation>Spielstein &amp;zerstören, wenn er das Spielfeld verlässt</translation>
</message>
<message>
<location filename="../src/dlg_create_token.cpp" line="33"/>
<source>&amp;OK</source> <source>&amp;OK</source>
<translation>&amp;OK</translation> <translation>&amp;OK</translation>
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="32"/> <location filename="../src/dlg_create_token.cpp" line="35"/>
<source>&amp;Cancel</source> <source>&amp;Cancel</source>
<translation>A&amp;bbrechen</translation> <translation>A&amp;bbrechen</translation>
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="54"/> <location filename="../src/dlg_create_token.cpp" line="58"/>
<source>Create token</source> <source>Create token</source>
<translation>Spielstein erstellen</translation> <translation>Spielstein erstellen</translation>
</message> </message>
@ -1644,16 +1757,30 @@
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="207"/> <location filename="../src/messagelogwidget.cpp" line="207"/>
<source>%1 creates token: %2 (%3).</source> <source>%1 destroys %2.</source>
<translation>%1 erstellt einen Spielstein: %2 (%3).</translation> <translation>%1 zerstört %2.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="212"/> <location filename="../src/messagelogwidget.cpp" line="212"/>
<source>%1 creates token: %2%3.</source>
<translation>%1 erstellt Token: %2%3.</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="218"/>
<source>%1 points from %2&apos;s %3 to %4.</source>
<translation>%1 zeigt von %2s %3 auf %4.</translation>
</message>
<message>
<source>%1 creates token: %2 (%3).</source>
<translation type="obsolete">%1 erstellt einen Spielstein: %2 (%3).</translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="225"/>
<source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source> <source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source>
<translation>%1 zeigt von %2s %3 auf %4s %5.</translation> <translation>%1 zeigt von %2s %3 auf %4s %5.</translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="227"/> <location filename="../src/messagelogwidget.cpp" line="240"/>
<source>%1 places %n counter(s) (%2) on %3 (now %4).</source> <source>%1 places %n counter(s) (%2) on %3 (now %4).</source>
<translation> <translation>
<numerusform>%1 legt eine Marke (%2) auf %3 (jetzt %4).</numerusform> <numerusform>%1 legt eine Marke (%2) auf %3 (jetzt %4).</numerusform>
@ -1661,7 +1788,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="229"/> <location filename="../src/messagelogwidget.cpp" line="242"/>
<source>%1 removes %n counter(s) (%2) from %3 (now %4).</source> <source>%1 removes %n counter(s) (%2) from %3 (now %4).</source>
<translation> <translation>
<numerusform>%1 entfernt eine Marke (%2) von %3 (jetzt %4).</numerusform> <numerusform>%1 entfernt eine Marke (%2) von %3 (jetzt %4).</numerusform>
@ -1669,37 +1796,37 @@
</translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="232"/> <location filename="../src/messagelogwidget.cpp" line="245"/>
<source>red</source> <source>red</source>
<translation>rot</translation> <translation>rot</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="233"/> <location filename="../src/messagelogwidget.cpp" line="246"/>
<source>yellow</source> <source>yellow</source>
<translation>gelb</translation> <translation>gelb</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="234"/> <location filename="../src/messagelogwidget.cpp" line="247"/>
<source>green</source> <source>green</source>
<translation>grün</translation> <translation>grün</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="253"/> <location filename="../src/messagelogwidget.cpp" line="266"/>
<source>%1 sets counter %2 to %3 (%4%5).</source> <source>%1 sets counter %2 to %3 (%4%5).</source>
<translation>%1 setzt Zähler %2 auf %3 (%4%5).</translation> <translation>%1 setzt Zähler %2 auf %3 (%4%5).</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="268"/> <location filename="../src/messagelogwidget.cpp" line="281"/>
<source>%1 sets PT of %2 to %3.</source> <source>%1 sets PT of %2 to %3.</source>
<translation>%1 setzt Kampfwerte von %2 auf %3.</translation> <translation>%1 setzt Kampfwerte von %2 auf %3.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="273"/> <location filename="../src/messagelogwidget.cpp" line="286"/>
<source>%1 sets annotation of %2 to %3.</source> <source>%1 sets annotation of %2 to %3.</source>
<translation>%1 versieht %2 mit dem Hinweis %3.</translation> <translation>%1 versieht %2 mit dem Hinweis %3.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="279"/> <location filename="../src/messagelogwidget.cpp" line="292"/>
<source>%1 is looking at the top %2 cards %3.</source> <source>%1 is looking at the top %2 cards %3.</source>
<translation>%1 sieht sich die obersten %2 Karten %3 an.</translation> <translation>%1 sieht sich die obersten %2 Karten %3 an.</translation>
</message> </message>
@ -1796,7 +1923,7 @@
<translation type="obsolete">%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>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="261"/>
<source>%1 %2 %3.</source> <source>%1 %2 %3.</source>
<translation>%1 %2 %3.</translation> <translation>%1 %2 %3.</translation>
</message> </message>
@ -1809,17 +1936,17 @@
<translation type="obsolete">%1 sieht sich die obersten %2 Karten %3 an.</translation> <translation type="obsolete">%1 sieht sich die obersten %2 Karten %3 an.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="281"/> <location filename="../src/messagelogwidget.cpp" line="294"/>
<source>%1 is looking at %2.</source> <source>%1 is looking at %2.</source>
<translation>%1 sieht sich %2 an.</translation> <translation>%1 sieht sich %2 an.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="287"/> <location filename="../src/messagelogwidget.cpp" line="300"/>
<source>%1 stops looking at %2.</source> <source>%1 stops looking at %2.</source>
<translation>%1 sieht sich %2 nicht mehr an.</translation> <translation>%1 sieht sich %2 nicht mehr an.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="311"/> <location filename="../src/messagelogwidget.cpp" line="324"/>
<source>ending phase</source> <source>ending phase</source>
<translation>die Zugendphase</translation> <translation>die Zugendphase</translation>
</message> </message>
@ -1848,57 +1975,57 @@
<translation type="obsolete">%1 sieht sich %2s %3 nicht mehr an</translation> <translation type="obsolete">%1 sieht sich %2s %3 nicht mehr an</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="293"/> <location filename="../src/messagelogwidget.cpp" line="306"/>
<source>It is now %1&apos;s turn.</source> <source>It is now %1&apos;s turn.</source>
<translation>%1 ist am Zug.</translation> <translation>%1 ist am Zug.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="301"/> <location filename="../src/messagelogwidget.cpp" line="314"/>
<source>untap step</source> <source>untap step</source>
<translation>das Enttappsegment</translation> <translation>das Enttappsegment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="302"/> <location filename="../src/messagelogwidget.cpp" line="315"/>
<source>upkeep step</source> <source>upkeep step</source>
<translation>das Versorgungssegment</translation> <translation>das Versorgungssegment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="303"/> <location filename="../src/messagelogwidget.cpp" line="316"/>
<source>draw step</source> <source>draw step</source>
<translation>das Ziehsegment</translation> <translation>das Ziehsegment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="304"/> <location filename="../src/messagelogwidget.cpp" line="317"/>
<source>first main phase</source> <source>first main phase</source>
<translation>die erste Hauptphase</translation> <translation>die erste Hauptphase</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="305"/> <location filename="../src/messagelogwidget.cpp" line="318"/>
<source>beginning of combat step</source> <source>beginning of combat step</source>
<translation>das Anfangssegment der Kampfphase</translation> <translation>das Anfangssegment der Kampfphase</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="306"/> <location filename="../src/messagelogwidget.cpp" line="319"/>
<source>declare attackers step</source> <source>declare attackers step</source>
<translation>das Angreifer-Deklarieren-Segment</translation> <translation>das Angreifer-Deklarieren-Segment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="307"/> <location filename="../src/messagelogwidget.cpp" line="320"/>
<source>declare blockers step</source> <source>declare blockers step</source>
<translation>das Blocker-Deklarieren-Segment</translation> <translation>das Blocker-Deklarieren-Segment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="308"/> <location filename="../src/messagelogwidget.cpp" line="321"/>
<source>combat damage step</source> <source>combat damage step</source>
<translation>das Kampfschadenssegment</translation> <translation>das Kampfschadenssegment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="309"/> <location filename="../src/messagelogwidget.cpp" line="322"/>
<source>end of combat step</source> <source>end of combat step</source>
<translation>das Endsegment der Kampfphase</translation> <translation>das Endsegment der Kampfphase</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="310"/> <location filename="../src/messagelogwidget.cpp" line="323"/>
<source>second main phase</source> <source>second main phase</source>
<translation>die zweite Hauptphase</translation> <translation>die zweite Hauptphase</translation>
</message> </message>
@ -1907,7 +2034,7 @@
<translation type="obsolete">das Ende-des-Zuges-Segment</translation> <translation type="obsolete">das Ende-des-Zuges-Segment</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="313"/> <location filename="../src/messagelogwidget.cpp" line="326"/>
<source>It is now the %1.</source> <source>It is now the %1.</source>
<translation>Es ist nun %1.</translation> <translation>Es ist nun %1.</translation>
</message> </message>
@ -1916,12 +2043,12 @@
<translation type="obsolete">%1 bewegt %2 %3 nach %4</translation> <translation type="obsolete">%1 bewegt %2 %3 nach %4</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="261"/>
<source>taps</source> <source>taps</source>
<translation>tappt</translation> <translation>tappt</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="261"/>
<source>untaps</source> <source>untaps</source>
<translation>enttappt</translation> <translation>enttappt</translation>
</message> </message>
@ -1946,7 +2073,7 @@
<translation type="obsolete">%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>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="245"/> <location filename="../src/messagelogwidget.cpp" line="258"/>
<source>his permanents</source> <source>his permanents</source>
<translation>seine bleibenden Karten</translation> <translation>seine bleibenden Karten</translation>
</message> </message>
@ -1959,12 +2086,12 @@
<translation type="obsolete">%1 setzt Zähler &quot;%2&quot; auf %3 (%4%5)</translation> <translation type="obsolete">%1 setzt Zähler &quot;%2&quot; auf %3 (%4%5)</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="260"/> <location filename="../src/messagelogwidget.cpp" line="273"/>
<source>%1 sets %2 to not untap normally.</source> <source>%1 sets %2 to not untap normally.</source>
<translation>%1 setzt %2 auf explizites Enttappen.</translation> <translation>%1 setzt %2 auf explizites Enttappen.</translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="262"/> <location filename="../src/messagelogwidget.cpp" line="275"/>
<source>%1 sets %2 to untap normally.</source> <source>%1 sets %2 to untap normally.</source>
<translation>%1 setzt %2 auf normales Enttappen.</translation> <translation>%1 setzt %2 auf normales Enttappen.</translation>
</message> </message>
@ -2069,41 +2196,41 @@
<context> <context>
<name>Player</name> <name>Player</name>
<message> <message>
<location filename="../src/player.cpp" line="348"/> <location filename="../src/player.cpp" line="288"/>
<location filename="../src/player.cpp" line="352"/> <location filename="../src/player.cpp" line="292"/>
<location filename="../src/player.cpp" line="356"/> <location filename="../src/player.cpp" line="296"/>
<source>Move to &amp;top of library</source> <source>Move to &amp;top of library</source>
<translation>Oben auf die Biblio&amp;thek legen</translation> <translation>Oben auf die Biblio&amp;thek legen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="349"/> <location filename="../src/player.cpp" line="289"/>
<location filename="../src/player.cpp" line="353"/> <location filename="../src/player.cpp" line="293"/>
<location filename="../src/player.cpp" line="357"/> <location filename="../src/player.cpp" line="297"/>
<source>Move to &amp;bottom of library</source> <source>Move to &amp;bottom of library</source>
<translation>Unter die &amp;Bibliothek legen</translation> <translation>Unter die &amp;Bibliothek legen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="360"/> <location filename="../src/player.cpp" line="300"/>
<source>&amp;View library</source> <source>&amp;View library</source>
<translation>&amp;Zeige Bibliothek</translation> <translation>&amp;Zeige Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="361"/> <location filename="../src/player.cpp" line="301"/>
<source>F3</source> <source>F3</source>
<translation>F3</translation> <translation>F3</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="362"/> <location filename="../src/player.cpp" line="302"/>
<source>View &amp;top cards of library...</source> <source>View &amp;top cards of library...</source>
<translation>Zeige die oberen Kar&amp;ten der Bibliothek...</translation> <translation>Zeige die oberen Kar&amp;ten der Bibliothek...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="341"/> <location filename="../src/player.cpp" line="281"/>
<source>&amp;View graveyard</source> <source>&amp;View graveyard</source>
<translation>&amp;Zeige Friedhof</translation> <translation>&amp;Zeige Friedhof</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="364"/> <location filename="../src/player.cpp" line="304"/>
<source>F4</source> <source>F4</source>
<translation>F4</translation> <translation>F4</translation>
</message> </message>
@ -2112,32 +2239,32 @@
<translation type="obsolete">Zeige ent&amp;fernte Karten</translation> <translation type="obsolete">Zeige ent&amp;fernte Karten</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="365"/> <location filename="../src/player.cpp" line="305"/>
<source>&amp;View sideboard</source> <source>&amp;View sideboard</source>
<translation>Zeige &amp;Sideboard</translation> <translation>Zeige &amp;Sideboard</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="343"/> <location filename="../src/player.cpp" line="283"/>
<source>Player &quot;%1&quot;</source> <source>Player &quot;%1&quot;</source>
<translation>Spieler &quot;%1&quot;</translation> <translation>Spieler &quot;%1&quot;</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="370"/> <location filename="../src/player.cpp" line="310"/>
<source>Take &amp;mulligan</source> <source>Take &amp;mulligan</source>
<translation>&amp;Mulligan nehmen</translation> <translation>&amp;Mulligan nehmen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="375"/> <location filename="../src/player.cpp" line="315"/>
<source>&amp;Hand</source> <source>&amp;Hand</source>
<translation>&amp;Hand</translation> <translation>&amp;Hand</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="377"/> <location filename="../src/player.cpp" line="317"/>
<source>&amp;Library</source> <source>&amp;Library</source>
<translation>Bib&amp;liothek</translation> <translation>Bib&amp;liothek</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="344"/> <location filename="../src/player.cpp" line="284"/>
<source>&amp;Graveyard</source> <source>&amp;Graveyard</source>
<translation>&amp;Friedhof</translation> <translation>&amp;Friedhof</translation>
</message> </message>
@ -2146,80 +2273,78 @@
<translation type="obsolete">Entfe&amp;rnte Karten</translation> <translation type="obsolete">Entfe&amp;rnte Karten</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="376"/> <location filename="../src/player.cpp" line="316"/>
<source>&amp;Sideboard</source> <source>&amp;Sideboard</source>
<translation>&amp;Sideboard</translation> <translation>&amp;Sideboard</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="398"/>
<source>Set &amp;P/T...</source> <source>Set &amp;P/T...</source>
<translation>&amp;Kampfwerte setzen...</translation> <translation type="obsolete">&amp;Kampfwerte setzen...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="399"/>
<source>&amp;Set annotation...</source> <source>&amp;Set annotation...</source>
<translation>&amp;Hinweis setzen...</translation> <translation type="obsolete">&amp;Hinweis setzen...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="444"/> <location filename="../src/player.cpp" line="366"/>
<source>View top cards of library</source> <source>View top cards of library</source>
<translation>Zeige die obersten Karten der Bibliothek</translation> <translation>Zeige die obersten Karten der Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="444"/> <location filename="../src/player.cpp" line="366"/>
<source>Number of cards:</source> <source>Number of cards:</source>
<translation>Anzahl der Karten:</translation> <translation>Anzahl der Karten:</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="366"/> <location filename="../src/player.cpp" line="306"/>
<source>&amp;Draw card</source> <source>&amp;Draw card</source>
<translation>Karte &amp;ziehen</translation> <translation>Karte &amp;ziehen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="342"/> <location filename="../src/player.cpp" line="282"/>
<source>&amp;View exile</source> <source>&amp;View exile</source>
<translation>&amp;Zeige Exil</translation> <translation>&amp;Zeige Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="345"/> <location filename="../src/player.cpp" line="285"/>
<source>&amp;Exile</source> <source>&amp;Exile</source>
<translation>&amp;Exil</translation> <translation>&amp;Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="354"/> <location filename="../src/player.cpp" line="294"/>
<location filename="../src/player.cpp" line="358"/> <location filename="../src/player.cpp" line="298"/>
<source>Move to &amp;hand</source> <source>Move to &amp;hand</source>
<translation>auf die &amp;Hand nehmen</translation> <translation>auf die &amp;Hand nehmen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="350"/> <location filename="../src/player.cpp" line="290"/>
<location filename="../src/player.cpp" line="359"/> <location filename="../src/player.cpp" line="299"/>
<source>Move to g&amp;raveyard</source> <source>Move to g&amp;raveyard</source>
<translation>auf den &amp;Friedhof legen</translation> <translation>auf den &amp;Friedhof legen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="351"/> <location filename="../src/player.cpp" line="291"/>
<location filename="../src/player.cpp" line="355"/> <location filename="../src/player.cpp" line="295"/>
<source>Move to &amp;exile</source> <source>Move to &amp;exile</source>
<translation>ins &amp;Exil schicken</translation> <translation>ins &amp;Exil schicken</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="363"/> <location filename="../src/player.cpp" line="303"/>
<source>Ctrl+W</source> <source>Ctrl+W</source>
<translation>Ctrl+W</translation> <translation>Ctrl+W</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="367"/> <location filename="../src/player.cpp" line="307"/>
<source>Ctrl+D</source> <source>Ctrl+D</source>
<translation>Ctrl+D</translation> <translation>Ctrl+D</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="368"/> <location filename="../src/player.cpp" line="308"/>
<source>D&amp;raw cards...</source> <source>D&amp;raw cards...</source>
<translation>Ka&amp;rten ziehen...</translation> <translation>Ka&amp;rten ziehen...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="369"/> <location filename="../src/player.cpp" line="309"/>
<source>Ctrl+E</source> <source>Ctrl+E</source>
<translation>Ctrl+E</translation> <translation>Ctrl+E</translation>
</message> </message>
@ -2228,32 +2353,32 @@
<translation type="obsolete">&amp;Mulligan nehmen...</translation> <translation type="obsolete">&amp;Mulligan nehmen...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="371"/> <location filename="../src/player.cpp" line="311"/>
<source>Ctrl+M</source> <source>Ctrl+M</source>
<translation>Ctrl+M</translation> <translation>Ctrl+M</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="372"/> <location filename="../src/player.cpp" line="312"/>
<source>&amp;Shuffle</source> <source>&amp;Shuffle</source>
<translation>Mi&amp;schen</translation> <translation>Mi&amp;schen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="373"/> <location filename="../src/player.cpp" line="313"/>
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation>Ctrl+S</translation> <translation>Ctrl+S</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="378"/> <location filename="../src/player.cpp" line="318"/>
<source>&amp;Counters</source> <source>&amp;Counters</source>
<translation>&amp;Zähler</translation> <translation>&amp;Zähler</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="380"/> <location filename="../src/player.cpp" line="320"/>
<source>&amp;Untap all permanents</source> <source>&amp;Untap all permanents</source>
<translation>&amp;Enttappe alle bleibenden Karten</translation> <translation>&amp;Enttappe alle bleibenden Karten</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="381"/> <location filename="../src/player.cpp" line="321"/>
<source>Ctrl+U</source> <source>Ctrl+U</source>
<translation>Ctrl+U</translation> <translation>Ctrl+U</translation>
</message> </message>
@ -2282,124 +2407,108 @@
<translation type="obsolete">Ctrl+L</translation> <translation type="obsolete">Ctrl+L</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="382"/> <location filename="../src/player.cpp" line="322"/>
<source>R&amp;oll die...</source> <source>R&amp;oll die...</source>
<translation>&amp;Würfeln...</translation> <translation>&amp;Würfeln...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="383"/> <location filename="../src/player.cpp" line="323"/>
<source>Ctrl+I</source> <source>Ctrl+I</source>
<translation>Ctrl+I</translation> <translation>Ctrl+I</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="384"/> <location filename="../src/player.cpp" line="324"/>
<source>&amp;Create token...</source> <source>&amp;Create token...</source>
<translation>Spiels&amp;tein erstellen...</translation> <translation>Spiels&amp;tein erstellen...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="385"/> <location filename="../src/player.cpp" line="325"/>
<source>Ctrl+T</source> <source>Ctrl+T</source>
<translation>Ctrl+T</translation> <translation>Ctrl+T</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="386"/> <location filename="../src/player.cpp" line="326"/>
<source>C&amp;reate another token</source> <source>C&amp;reate another token</source>
<translation>&amp;Noch einen Spielstein erstellen</translation> <translation>&amp;Noch einen Spielstein erstellen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="387"/> <location filename="../src/player.cpp" line="327"/>
<source>Ctrl+G</source> <source>Ctrl+G</source>
<translation>Ctrl+G</translation> <translation>Ctrl+G</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="388"/> <location filename="../src/player.cpp" line="328"/>
<source>S&amp;ay</source> <source>S&amp;ay</source>
<translation>S&amp;agen</translation> <translation>S&amp;agen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="394"/> <location filename="../src/player.cpp" line="334"/>
<source>C&amp;ard</source> <source>C&amp;ard</source>
<translation>&amp;Karte</translation> <translation>&amp;Karte</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="395"/>
<source>&amp;Tap</source> <source>&amp;Tap</source>
<translation>&amp;Tappen</translation> <translation type="obsolete">&amp;Tappen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="396"/>
<source>&amp;Untap</source> <source>&amp;Untap</source>
<translation>E&amp;nttappen</translation> <translation type="obsolete">E&amp;nttappen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="397"/>
<source>Toggle &amp;normal untapping</source> <source>Toggle &amp;normal untapping</source>
<translation>&amp;Normales Enttappen umschalten</translation> <translation type="obsolete">&amp;Normales Enttappen umschalten</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="400"/>
<source>&amp;Flip</source> <source>&amp;Flip</source>
<translation>&amp;Umdrehen</translation> <translation type="obsolete">&amp;Umdrehen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="401"/>
<source>Counters (red)</source> <source>Counters (red)</source>
<translation>Marken (rot)</translation> <translation type="obsolete">Marken (rot)</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="402"/>
<source>Counters (yellow)</source> <source>Counters (yellow)</source>
<translation>Marken (gelb)</translation> <translation type="obsolete">Marken (gelb)</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="403"/>
<source>Counters (green)</source> <source>Counters (green)</source>
<translation>Marken (grün)</translation> <translation type="obsolete">Marken (grün)</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="405"/>
<source>&amp;Add counter</source> <source>&amp;Add counter</source>
<translation>Zählm&amp;arke hinzufügen</translation> <translation type="obsolete">Zählm&amp;arke hinzufügen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="407"/>
<source>&amp;Remove counter</source> <source>&amp;Remove counter</source>
<translation>Zählma&amp;rke entfernen</translation> <translation type="obsolete">Zählma&amp;rke entfernen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="409"/>
<source>&amp;Set counters...</source> <source>&amp;Set counters...</source>
<translation>&amp;Setze Zählmarken...</translation> <translation type="obsolete">&amp;Setze Zählmarken...</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="410"/>
<source>&amp;top of library</source> <source>&amp;top of library</source>
<translation>&amp;auf die Bibliothek</translation> <translation type="obsolete">&amp;auf die Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="411"/>
<source>&amp;bottom of library</source> <source>&amp;bottom of library</source>
<translation>&amp;unter die Bibliothek</translation> <translation type="obsolete">&amp;unter die Bibliothek</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="412"/>
<source>&amp;graveyard</source> <source>&amp;graveyard</source>
<translation>in den &amp;Friedhof</translation> <translation type="obsolete">in den &amp;Friedhof</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="413"/>
<source>Ctrl+Del</source> <source>Ctrl+Del</source>
<translation>Ctrl+Del</translation> <translation type="obsolete">Ctrl+Del</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="414"/>
<source>&amp;exile</source> <source>&amp;exile</source>
<translation>ins &amp;Exil</translation> <translation type="obsolete">ins &amp;Exil</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="416"/>
<source>&amp;Move to</source> <source>&amp;Move to</source>
<translation>&amp;Verschieben</translation> <translation type="obsolete">&amp;Verschieben</translation>
</message> </message>
<message> <message>
<source>F5</source> <source>F5</source>
@ -2426,38 +2535,38 @@
<translation type="obsolete">F10</translation> <translation type="obsolete">F10</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="483"/> <location filename="../src/player.cpp" line="405"/>
<source>Draw cards</source> <source>Draw cards</source>
<translation>Karten ziehen</translation> <translation>Karten ziehen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="483"/> <location filename="../src/player.cpp" line="405"/>
<location filename="../src/player.cpp" line="1081"/> <location filename="../src/player.cpp" line="1040"/>
<source>Number:</source> <source>Number:</source>
<translation>Anzahl:</translation> <translation>Anzahl:</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1021"/> <location filename="../src/player.cpp" line="972"/>
<source>Set power/toughness</source> <source>Set power/toughness</source>
<translation>Kampfwerte setzen</translation> <translation>Kampfwerte setzen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1021"/> <location filename="../src/player.cpp" line="972"/>
<source>Please enter the new PT:</source> <source>Please enter the new PT:</source>
<translation>Bitte die neuen Kampfwerte eingeben:</translation> <translation>Bitte die neuen Kampfwerte eingeben:</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1043"/> <location filename="../src/player.cpp" line="994"/>
<source>Set annotation</source> <source>Set annotation</source>
<translation>Hinweis setzen</translation> <translation>Hinweis setzen</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1043"/> <location filename="../src/player.cpp" line="994"/>
<source>Please enter the new annotation:</source> <source>Please enter the new annotation:</source>
<translation>Bitte den Hinweis eingeben:</translation> <translation>Bitte den Hinweis eingeben:</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1081"/> <location filename="../src/player.cpp" line="1040"/>
<source>Set counters</source> <source>Set counters</source>
<translation>Setze Zählmarken</translation> <translation>Setze Zählmarken</translation>
</message> </message>
@ -2470,12 +2579,12 @@
<translation type="obsolete">Neue Lebenspunkte insgesamt:</translation> <translation type="obsolete">Neue Lebenspunkte insgesamt:</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="496"/> <location filename="../src/player.cpp" line="418"/>
<source>Roll die</source> <source>Roll die</source>
<translation>Würfeln</translation> <translation>Würfeln</translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="496"/> <location filename="../src/player.cpp" line="418"/>
<source>Number of sides:</source> <source>Number of sides:</source>
<translation>Anzahl der Seiten:</translation> <translation>Anzahl der Seiten:</translation>
</message> </message>

View file

@ -117,115 +117,223 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
</context> </context>
<context>
<name>CardItem</name>
<message>
<location filename="../src/carditem.cpp" line="115"/>
<source>&amp;Tap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="116"/>
<source>&amp;Untap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="117"/>
<source>Toggle &amp;normal untapping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="118"/>
<source>&amp;Flip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="119"/>
<source>&amp;Clone</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="120"/>
<source>&amp;Attach to card...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="121"/>
<source>Unattac&amp;h</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="122"/>
<source>Set &amp;P/T...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="123"/>
<source>&amp;Set annotation...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="125"/>
<source>red</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="126"/>
<source>yellow</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="127"/>
<source>green</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="129"/>
<source>&amp;Add counter (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="131"/>
<source>&amp;Remove counter (%1)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="133"/>
<source>&amp;Set counters (%1)...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="134"/>
<source>&amp;top of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="135"/>
<source>&amp;bottom of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="136"/>
<source>&amp;graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="137"/>
<source>Ctrl+Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="138"/>
<source>&amp;exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/carditem.cpp" line="140"/>
<source>&amp;Move to</source>
<translation type="unfinished"></translation>
</message>
</context>
<context> <context>
<name>CardZone</name> <name>CardZone</name>
<message> <message>
<location filename="../src/cardzone.cpp" line="35"/> <location filename="../src/cardzone.cpp" line="41"/>
<location filename="../src/cardzone.cpp" line="37"/> <location filename="../src/cardzone.cpp" line="43"/>
<source>his hand</source> <source>his hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="35"/> <location filename="../src/cardzone.cpp" line="41"/>
<location filename="../src/cardzone.cpp" line="37"/> <location filename="../src/cardzone.cpp" line="43"/>
<source>%1&apos;s hand</source> <source>%1&apos;s hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="36"/> <location filename="../src/cardzone.cpp" line="42"/>
<source>of his hand</source> <source>of his hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="36"/> <location filename="../src/cardzone.cpp" line="42"/>
<source>of %1&apos;s hand</source> <source>of %1&apos;s hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="41"/> <location filename="../src/cardzone.cpp" line="47"/>
<location filename="../src/cardzone.cpp" line="43"/> <location filename="../src/cardzone.cpp" line="49"/>
<source>his library</source> <source>his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="41"/> <location filename="../src/cardzone.cpp" line="47"/>
<location filename="../src/cardzone.cpp" line="43"/> <location filename="../src/cardzone.cpp" line="49"/>
<source>%1&apos;s library</source> <source>%1&apos;s library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="42"/> <location filename="../src/cardzone.cpp" line="48"/>
<source>of his library</source> <source>of his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="42"/> <location filename="../src/cardzone.cpp" line="48"/>
<source>of %1&apos;s library</source> <source>of %1&apos;s library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="47"/> <location filename="../src/cardzone.cpp" line="53"/>
<location filename="../src/cardzone.cpp" line="49"/> <location filename="../src/cardzone.cpp" line="55"/>
<source>his graveyard</source> <source>his graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="47"/> <location filename="../src/cardzone.cpp" line="53"/>
<location filename="../src/cardzone.cpp" line="49"/> <location filename="../src/cardzone.cpp" line="55"/>
<source>%1&apos;s graveyard</source> <source>%1&apos;s graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="48"/> <location filename="../src/cardzone.cpp" line="54"/>
<source>of his graveyard</source> <source>of his graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="48"/> <location filename="../src/cardzone.cpp" line="54"/>
<source>of %1&apos;s graveyard</source> <source>of %1&apos;s graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="53"/> <location filename="../src/cardzone.cpp" line="59"/>
<location filename="../src/cardzone.cpp" line="55"/> <location filename="../src/cardzone.cpp" line="61"/>
<source>his exile</source> <source>his exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="53"/> <location filename="../src/cardzone.cpp" line="59"/>
<location filename="../src/cardzone.cpp" line="55"/> <location filename="../src/cardzone.cpp" line="61"/>
<source>%1&apos;s exile</source> <source>%1&apos;s exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="54"/> <location filename="../src/cardzone.cpp" line="60"/>
<source>of his exile</source> <source>of his exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="54"/> <location filename="../src/cardzone.cpp" line="60"/>
<source>of %1&apos;s exile</source> <source>of %1&apos;s exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="59"/> <location filename="../src/cardzone.cpp" line="65"/>
<location filename="../src/cardzone.cpp" line="61"/> <location filename="../src/cardzone.cpp" line="67"/>
<source>his sideboard</source> <source>his sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="59"/> <location filename="../src/cardzone.cpp" line="65"/>
<location filename="../src/cardzone.cpp" line="61"/> <location filename="../src/cardzone.cpp" line="67"/>
<source>%1&apos;s sideboard</source> <source>%1&apos;s sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="60"/> <location filename="../src/cardzone.cpp" line="66"/>
<source>of his sideboard</source> <source>of his sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/cardzone.cpp" line="60"/> <location filename="../src/cardzone.cpp" line="66"/>
<source>of %1&apos;s sideboard</source> <source>of %1&apos;s sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -515,16 +623,21 @@
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="30"/> <location filename="../src/dlg_create_token.cpp" line="30"/>
<source>&amp;Destroy token when it leaves the table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/dlg_create_token.cpp" line="33"/>
<source>&amp;OK</source> <source>&amp;OK</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="32"/> <location filename="../src/dlg_create_token.cpp" line="35"/>
<source>&amp;Cancel</source> <source>&amp;Cancel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/dlg_create_token.cpp" line="54"/> <location filename="../src/dlg_create_token.cpp" line="58"/>
<source>Create token</source> <source>Create token</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1053,17 +1166,12 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="207"/> <location filename="../src/messagelogwidget.cpp" line="225"/>
<source>%1 creates token: %2 (%3).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="212"/>
<source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source> <source>%1 points from %2&apos;s %3 to %4&apos;s %5.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="227"/> <location filename="../src/messagelogwidget.cpp" line="240"/>
<source>%1 places %n counter(s) (%2) on %3 (now %4).</source> <source>%1 places %n counter(s) (%2) on %3 (now %4).</source>
<translation> <translation>
<numerusform>%1 places a counter (%2) on %3 (now %4).</numerusform> <numerusform>%1 places a counter (%2) on %3 (now %4).</numerusform>
@ -1071,7 +1179,7 @@
</translation> </translation>
</message> </message>
<message numerus="yes"> <message numerus="yes">
<location filename="../src/messagelogwidget.cpp" line="229"/> <location filename="../src/messagelogwidget.cpp" line="242"/>
<source>%1 removes %n counter(s) (%2) from %3 (now %4).</source> <source>%1 removes %n counter(s) (%2) from %3 (now %4).</source>
<translation> <translation>
<numerusform>%1 removes a counter (%2) from %3 (now %4).</numerusform> <numerusform>%1 removes a counter (%2) from %3 (now %4).</numerusform>
@ -1079,37 +1187,37 @@
</translation> </translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="232"/> <location filename="../src/messagelogwidget.cpp" line="245"/>
<source>red</source> <source>red</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="233"/> <location filename="../src/messagelogwidget.cpp" line="246"/>
<source>yellow</source> <source>yellow</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="234"/> <location filename="../src/messagelogwidget.cpp" line="247"/>
<source>green</source> <source>green</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="253"/> <location filename="../src/messagelogwidget.cpp" line="266"/>
<source>%1 sets counter %2 to %3 (%4%5).</source> <source>%1 sets counter %2 to %3 (%4%5).</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="268"/> <location filename="../src/messagelogwidget.cpp" line="281"/>
<source>%1 sets PT of %2 to %3.</source> <source>%1 sets PT of %2 to %3.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="273"/> <location filename="../src/messagelogwidget.cpp" line="286"/>
<source>%1 sets annotation of %2 to %3.</source> <source>%1 sets annotation of %2 to %3.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="279"/> <location filename="../src/messagelogwidget.cpp" line="292"/>
<source>%1 is looking at the top %2 cards %3.</source> <source>%1 is looking at the top %2 cards %3.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1174,27 +1282,42 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="207"/>
<source>%1 destroys %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="212"/>
<source>%1 creates token: %2%3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="218"/>
<source>%1 points from %2&apos;s %3 to %4.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="261"/>
<source>%1 %2 %3.</source> <source>%1 %2 %3.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="281"/> <location filename="../src/messagelogwidget.cpp" line="294"/>
<source>%1 is looking at %2.</source> <source>%1 is looking at %2.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="287"/> <location filename="../src/messagelogwidget.cpp" line="300"/>
<source>%1 stops looking at %2.</source> <source>%1 stops looking at %2.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="311"/> <location filename="../src/messagelogwidget.cpp" line="324"/>
<source>ending phase</source> <source>ending phase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="293"/> <location filename="../src/messagelogwidget.cpp" line="306"/>
<source>It is now %1&apos;s turn.</source> <source>It is now %1&apos;s turn.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1204,82 +1327,82 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="301"/> <location filename="../src/messagelogwidget.cpp" line="314"/>
<source>untap step</source> <source>untap step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="302"/> <location filename="../src/messagelogwidget.cpp" line="315"/>
<source>upkeep step</source> <source>upkeep step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="303"/> <location filename="../src/messagelogwidget.cpp" line="316"/>
<source>draw step</source> <source>draw step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="304"/> <location filename="../src/messagelogwidget.cpp" line="317"/>
<source>first main phase</source> <source>first main phase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="305"/> <location filename="../src/messagelogwidget.cpp" line="318"/>
<source>beginning of combat step</source> <source>beginning of combat step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="306"/> <location filename="../src/messagelogwidget.cpp" line="319"/>
<source>declare attackers step</source> <source>declare attackers step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="307"/> <location filename="../src/messagelogwidget.cpp" line="320"/>
<source>declare blockers step</source> <source>declare blockers step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="308"/> <location filename="../src/messagelogwidget.cpp" line="321"/>
<source>combat damage step</source> <source>combat damage step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="309"/> <location filename="../src/messagelogwidget.cpp" line="322"/>
<source>end of combat step</source> <source>end of combat step</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="310"/> <location filename="../src/messagelogwidget.cpp" line="323"/>
<source>second main phase</source> <source>second main phase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="313"/> <location filename="../src/messagelogwidget.cpp" line="326"/>
<source>It is now the %1.</source> <source>It is now the %1.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="261"/>
<source>taps</source> <source>taps</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="248"/> <location filename="../src/messagelogwidget.cpp" line="261"/>
<source>untaps</source> <source>untaps</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="260"/> <location filename="../src/messagelogwidget.cpp" line="273"/>
<source>%1 sets %2 to not untap normally.</source> <source>%1 sets %2 to not untap normally.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="262"/> <location filename="../src/messagelogwidget.cpp" line="275"/>
<source>%1 sets %2 to untap normally.</source> <source>%1 sets %2 to untap normally.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="245"/> <location filename="../src/messagelogwidget.cpp" line="258"/>
<source>his permanents</source> <source>his permanents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1368,345 +1491,255 @@
<context> <context>
<name>Player</name> <name>Player</name>
<message> <message>
<location filename="../src/player.cpp" line="348"/> <location filename="../src/player.cpp" line="288"/>
<location filename="../src/player.cpp" line="352"/> <location filename="../src/player.cpp" line="292"/>
<location filename="../src/player.cpp" line="356"/> <location filename="../src/player.cpp" line="296"/>
<source>Move to &amp;top of library</source> <source>Move to &amp;top of library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="349"/> <location filename="../src/player.cpp" line="289"/>
<location filename="../src/player.cpp" line="353"/> <location filename="../src/player.cpp" line="293"/>
<location filename="../src/player.cpp" line="357"/> <location filename="../src/player.cpp" line="297"/>
<source>Move to &amp;bottom of library</source> <source>Move to &amp;bottom of library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="360"/> <location filename="../src/player.cpp" line="300"/>
<source>&amp;View library</source> <source>&amp;View library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="361"/> <location filename="../src/player.cpp" line="301"/>
<source>F3</source> <source>F3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="362"/> <location filename="../src/player.cpp" line="302"/>
<source>View &amp;top cards of library...</source> <source>View &amp;top cards of library...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="341"/> <location filename="../src/player.cpp" line="281"/>
<source>&amp;View graveyard</source> <source>&amp;View graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="364"/> <location filename="../src/player.cpp" line="304"/>
<source>F4</source> <source>F4</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="365"/> <location filename="../src/player.cpp" line="305"/>
<source>&amp;View sideboard</source> <source>&amp;View sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="343"/> <location filename="../src/player.cpp" line="283"/>
<source>Player &quot;%1&quot;</source> <source>Player &quot;%1&quot;</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="375"/> <location filename="../src/player.cpp" line="315"/>
<source>&amp;Hand</source> <source>&amp;Hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="377"/> <location filename="../src/player.cpp" line="317"/>
<source>&amp;Library</source> <source>&amp;Library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="344"/> <location filename="../src/player.cpp" line="284"/>
<source>&amp;Graveyard</source> <source>&amp;Graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="376"/> <location filename="../src/player.cpp" line="316"/>
<source>&amp;Sideboard</source> <source>&amp;Sideboard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="398"/> <location filename="../src/player.cpp" line="366"/>
<source>Set &amp;P/T...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="399"/>
<source>&amp;Set annotation...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="444"/>
<source>View top cards of library</source> <source>View top cards of library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="444"/> <location filename="../src/player.cpp" line="366"/>
<source>Number of cards:</source> <source>Number of cards:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="366"/> <location filename="../src/player.cpp" line="306"/>
<source>&amp;Draw card</source> <source>&amp;Draw card</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="342"/> <location filename="../src/player.cpp" line="282"/>
<source>&amp;View exile</source> <source>&amp;View exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="345"/> <location filename="../src/player.cpp" line="285"/>
<source>&amp;Exile</source> <source>&amp;Exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="354"/> <location filename="../src/player.cpp" line="294"/>
<location filename="../src/player.cpp" line="358"/> <location filename="../src/player.cpp" line="298"/>
<source>Move to &amp;hand</source> <source>Move to &amp;hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="350"/> <location filename="../src/player.cpp" line="290"/>
<location filename="../src/player.cpp" line="359"/> <location filename="../src/player.cpp" line="299"/>
<source>Move to g&amp;raveyard</source> <source>Move to g&amp;raveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="351"/> <location filename="../src/player.cpp" line="291"/>
<location filename="../src/player.cpp" line="355"/> <location filename="../src/player.cpp" line="295"/>
<source>Move to &amp;exile</source> <source>Move to &amp;exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="363"/> <location filename="../src/player.cpp" line="303"/>
<source>Ctrl+W</source> <source>Ctrl+W</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="367"/> <location filename="../src/player.cpp" line="307"/>
<source>Ctrl+D</source> <source>Ctrl+D</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="368"/> <location filename="../src/player.cpp" line="308"/>
<source>D&amp;raw cards...</source> <source>D&amp;raw cards...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="369"/> <location filename="../src/player.cpp" line="309"/>
<source>Ctrl+E</source> <source>Ctrl+E</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="370"/> <location filename="../src/player.cpp" line="310"/>
<source>Take &amp;mulligan</source> <source>Take &amp;mulligan</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="371"/> <location filename="../src/player.cpp" line="311"/>
<source>Ctrl+M</source> <source>Ctrl+M</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="372"/> <location filename="../src/player.cpp" line="312"/>
<source>&amp;Shuffle</source> <source>&amp;Shuffle</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="373"/> <location filename="../src/player.cpp" line="313"/>
<source>Ctrl+S</source> <source>Ctrl+S</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="378"/> <location filename="../src/player.cpp" line="318"/>
<source>&amp;Counters</source> <source>&amp;Counters</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="380"/> <location filename="../src/player.cpp" line="320"/>
<source>&amp;Untap all permanents</source> <source>&amp;Untap all permanents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="381"/> <location filename="../src/player.cpp" line="321"/>
<source>Ctrl+U</source> <source>Ctrl+U</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="382"/> <location filename="../src/player.cpp" line="322"/>
<source>R&amp;oll die...</source> <source>R&amp;oll die...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="383"/> <location filename="../src/player.cpp" line="323"/>
<source>Ctrl+I</source> <source>Ctrl+I</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="384"/> <location filename="../src/player.cpp" line="324"/>
<source>&amp;Create token...</source> <source>&amp;Create token...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="385"/> <location filename="../src/player.cpp" line="325"/>
<source>Ctrl+T</source> <source>Ctrl+T</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="386"/> <location filename="../src/player.cpp" line="326"/>
<source>C&amp;reate another token</source> <source>C&amp;reate another token</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="387"/> <location filename="../src/player.cpp" line="327"/>
<source>Ctrl+G</source> <source>Ctrl+G</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="388"/> <location filename="../src/player.cpp" line="328"/>
<source>S&amp;ay</source> <source>S&amp;ay</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="394"/> <location filename="../src/player.cpp" line="334"/>
<source>C&amp;ard</source> <source>C&amp;ard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/player.cpp" line="395"/>
<source>&amp;Tap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="396"/>
<source>&amp;Untap</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="397"/>
<source>Toggle &amp;normal untapping</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="400"/>
<source>&amp;Flip</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="401"/>
<source>Counters (red)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="402"/>
<source>Counters (yellow)</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="403"/>
<source>Counters (green)</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/player.cpp" line="405"/> <location filename="../src/player.cpp" line="405"/>
<source>&amp;Add counter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="407"/>
<source>&amp;Remove counter</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="409"/>
<source>&amp;Set counters...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="410"/>
<source>&amp;top of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="411"/>
<source>&amp;bottom of library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="412"/>
<source>&amp;graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="413"/>
<source>Ctrl+Del</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="414"/>
<source>&amp;exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="416"/>
<source>&amp;Move to</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="483"/>
<source>Draw cards</source> <source>Draw cards</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="483"/> <location filename="../src/player.cpp" line="405"/>
<location filename="../src/player.cpp" line="1081"/> <location filename="../src/player.cpp" line="1040"/>
<source>Number:</source> <source>Number:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="496"/> <location filename="../src/player.cpp" line="418"/>
<source>Roll die</source> <source>Roll die</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="496"/> <location filename="../src/player.cpp" line="418"/>
<source>Number of sides:</source> <source>Number of sides:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1021"/> <location filename="../src/player.cpp" line="972"/>
<source>Set power/toughness</source> <source>Set power/toughness</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1021"/> <location filename="../src/player.cpp" line="972"/>
<source>Please enter the new PT:</source> <source>Please enter the new PT:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1043"/> <location filename="../src/player.cpp" line="994"/>
<source>Set annotation</source> <source>Set annotation</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1043"/> <location filename="../src/player.cpp" line="994"/>
<source>Please enter the new annotation:</source> <source>Please enter the new annotation:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="1081"/> <location filename="../src/player.cpp" line="1040"/>
<source>Set counters</source> <source>Set counters</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View file

@ -4,18 +4,20 @@
#include <QColor> #include <QColor>
class Server_Card; class Server_Card;
class Server_ArrowTarget;
class Server_Arrow { class Server_Arrow {
private: private:
int id; int id;
Server_Card *startCard, *targetCard; Server_Card *startCard;
Server_ArrowTarget *targetItem;
QColor color; QColor color;
public: public:
Server_Arrow(int _id, Server_Card *_startCard, Server_Card *_targetCard, const QColor &_color) Server_Arrow(int _id, Server_Card *_startCard, Server_ArrowTarget *_targetItem, const QColor &_color)
: id(_id), startCard(_startCard), targetCard(_targetCard), color(_color) { } : id(_id), startCard(_startCard), targetItem(_targetItem), color(_color) { }
int getId() const { return id; } int getId() const { return id; }
Server_Card *getStartCard() const { return startCard; } Server_Card *getStartCard() const { return startCard; }
Server_Card *getTargetCard() const { return targetCard; } Server_ArrowTarget *getTargetItem() const { return targetItem; }
QColor getColor() const { return color; } QColor getColor() const { return color; }
}; };

View file

@ -0,0 +1,10 @@
#ifndef SERVER_ARROWTARGET_H
#define SERVER_ARROWTARGET_H
#include <QObject>
class Server_ArrowTarget : public QObject {
Q_OBJECT
};
#endif

View file

@ -20,12 +20,14 @@
#ifndef SERVER_CARD_H #ifndef SERVER_CARD_H
#define SERVER_CARD_H #define SERVER_CARD_H
#include "server_arrowtarget.h"
#include <QString> #include <QString>
#include <QMap> #include <QMap>
class Server_CardZone; class Server_CardZone;
class Server_Card { class Server_Card : public Server_ArrowTarget {
Q_OBJECT
private: private:
Server_CardZone *zone; Server_CardZone *zone;
int id; int id;

View file

@ -197,6 +197,28 @@ Server_Player *Server_Game::addPlayer(Server_ProtocolHandler *handler, bool spec
void Server_Game::removePlayer(Server_Player *player) void Server_Game::removePlayer(Server_Player *player)
{ {
players.remove(player->getPlayerId()); players.remove(player->getPlayerId());
// Remove all arrows of other players pointing to the player being removed or to one of his cards.
QMapIterator<int, Server_Player *> playerIterator(players);
while (playerIterator.hasNext()) {
Server_Player *p = playerIterator.next().value();
QList<Server_Arrow *> arrows = p->getArrows().values();
QList<Server_Arrow *> toDelete;
for (int i = 0; i < arrows.size(); ++i) {
Server_Arrow *a = arrows[i];
Server_Card *targetCard = qobject_cast<Server_Card *>(a->getTargetItem());
if (targetCard) {
if (targetCard->getZone()->getPlayer() == player)
toDelete.append(a);
} else if ((static_cast<Server_Player *>(a->getTargetItem()) == player) || (a->getStartCard()->getZone()->getPlayer() == player))
toDelete.append(a);
}
for (int i = 0; i < toDelete.size(); ++i) {
sendGameEvent(new Event_DeleteArrow(p->getPlayerId(), toDelete[i]->getId()));
p->deleteArrow(toDelete[i]->getId());
}
}
sendGameEvent(new Event_Leave(player->getPlayerId())); sendGameEvent(new Event_Leave(player->getPlayerId()));
bool spectator = player->getSpectator(); bool spectator = player->getSpectator();
delete player; delete player;
@ -243,16 +265,29 @@ QList<ServerInfo_Player *> Server_Game::getGameState(Server_Player *playerWhosAs
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *arrow = arrowIterator.next().value(); Server_Arrow *arrow = arrowIterator.next().value();
arrowList.append(new ServerInfo_Arrow( Server_Card *targetCard = qobject_cast<Server_Card *>(arrow->getTargetItem());
arrow->getId(), if (targetCard)
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(), arrowList.append(new ServerInfo_Arrow(
arrow->getStartCard()->getZone()->getName(), arrow->getId(),
arrow->getStartCard()->getId(), arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
arrow->getTargetCard()->getZone()->getPlayer()->getPlayerId(), arrow->getStartCard()->getZone()->getName(),
arrow->getTargetCard()->getZone()->getName(), arrow->getStartCard()->getId(),
arrow->getTargetCard()->getId(), targetCard->getZone()->getPlayer()->getPlayerId(),
arrow->getColor() targetCard->getZone()->getName(),
)); targetCard->getId(),
arrow->getColor()
));
else
arrowList.append(new ServerInfo_Arrow(
arrow->getId(),
arrow->getStartCard()->getZone()->getPlayer()->getPlayerId(),
arrow->getStartCard()->getZone()->getName(),
arrow->getStartCard()->getId(),
qobject_cast<Server_Player *>(arrow->getTargetItem())->getPlayerId(),
QString(),
-1,
arrow->getColor()
));
} }
QList<ServerInfo_Counter *> counterList; QList<ServerInfo_Counter *> counterList;

View file

@ -1,7 +1,7 @@
#ifndef PLAYER_H #ifndef PLAYER_H
#define PLAYER_H #define PLAYER_H
#include <QObject> #include "server_arrowtarget.h"
#include <QString> #include <QString>
#include <QList> #include <QList>
#include <QMap> #include <QMap>
@ -15,7 +15,7 @@ class Server_ProtocolHandler;
class ProtocolItem; class ProtocolItem;
class ServerInfo_PlayerProperties; class ServerInfo_PlayerProperties;
class Server_Player : public QObject { class Server_Player : public Server_ArrowTarget {
Q_OBJECT Q_OBJECT
private: private:
Server_Game *game; Server_Game *game;

View file

@ -593,7 +593,7 @@ ResponseCode Server_ProtocolHandler::moveCard(Server_Game *game, Server_Player *
QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(players[i]->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *arrow = arrowIterator.next().value(); Server_Arrow *arrow = arrowIterator.next().value();
if ((arrow->getStartCard() == card) || (arrow->getTargetCard() == card)) if ((arrow->getStartCard() == card) || (arrow->getTargetItem() == card))
arrowsToDelete.append(arrow->getId()); arrowsToDelete.append(arrow->getId());
} }
for (int j = 0; j < arrowsToDelete.size(); ++j) for (int j = 0; j < arrowsToDelete.size(); ++j)
@ -689,21 +689,33 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
if (!startPlayer || !targetPlayer) if (!startPlayer || !targetPlayer)
return RespNameNotFound; return RespNameNotFound;
Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone()); Server_CardZone *startZone = startPlayer->getZones().value(cmd->getStartZone());
Server_CardZone *targetZone = targetPlayer->getZones().value(cmd->getTargetZone()); bool playerTarget = cmd->getTargetZone().isEmpty();
if (!startZone || !targetZone) Server_CardZone *targetZone = 0;
if (!playerTarget)
targetZone = targetPlayer->getZones().value(cmd->getTargetZone());
if (!startZone || (!targetZone && !playerTarget))
return RespNameNotFound; return RespNameNotFound;
Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false); Server_Card *startCard = startZone->getCard(cmd->getStartCardId(), false);
Server_Card *targetCard = targetZone->getCard(cmd->getTargetCardId(), false); Server_Card *targetCard = 0;
if (!startCard || !targetCard || (startCard == targetCard)) if (!playerTarget)
targetCard = targetZone->getCard(cmd->getTargetCardId(), false);
if (!startCard || (!targetCard && !playerTarget) || (startCard == targetCard))
return RespContextError; return RespContextError;
Server_ArrowTarget *targetItem;
if (playerTarget)
targetItem = targetPlayer;
else
targetItem = targetCard;
QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows()); QMapIterator<int, Server_Arrow *> arrowIterator(player->getArrows());
while (arrowIterator.hasNext()) { while (arrowIterator.hasNext()) {
Server_Arrow *temp = arrowIterator.next().value(); Server_Arrow *temp = arrowIterator.next().value();
if ((temp->getStartCard() == startCard) && (temp->getTargetCard() == targetCard)) if ((temp->getStartCard() == startCard) && (temp->getTargetItem() == targetItem))
return RespContextError; return RespContextError;
} }
Server_Arrow *arrow = new Server_Arrow(player->newArrowId(), startCard, targetCard, cmd->getColor()); Server_Arrow *arrow = new Server_Arrow(player->newArrowId(), startCard, targetItem, cmd->getColor());
player->addArrow(arrow); player->addArrow(arrow);
game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow( game->sendGameEvent(new Event_CreateArrows(player->getPlayerId(), QList<ServerInfo_Arrow *>() << new ServerInfo_Arrow(
arrow->getId(), arrow->getId(),
@ -711,8 +723,8 @@ ResponseCode Server_ProtocolHandler::cmdCreateArrow(Command_CreateArrow *cmd, Co
startZone->getName(), startZone->getName(),
startCard->getId(), startCard->getId(),
targetPlayer->getPlayerId(), targetPlayer->getPlayerId(),
targetZone->getName(), cmd->getTargetZone(),
targetCard->getId(), cmd->getTargetCardId(),
cmd->getColor() cmd->getColor()
))); )));
return RespOk; return RespOk;

View file

@ -29,7 +29,8 @@ HEADERS += src/servatrice.h \
../common/server_counter.h \ ../common/server_counter.h \
../common/server_game.h \ ../common/server_game.h \
../common/server_player.h \ ../common/server_player.h \
../common/server_protocolhandler.h ../common/server_protocolhandler.h \
../common/server_arrowtarget.h
SOURCES += src/main.cpp \ SOURCES += src/main.cpp \
src/servatrice.cpp \ src/servatrice.cpp \