language fix

This commit is contained in:
Max-Wilhelm Bruker 2009-08-27 15:28:19 +02:00
parent 5324012582
commit a5280946c2
16 changed files with 1026 additions and 581 deletions

View file

@ -103,7 +103,6 @@ void ChatWidget::retranslateUi()
joinButton->setText(tr("Joi&n")); joinButton->setText(tr("Joi&n"));
QTreeWidgetItem *header = channelList->headerItem(); QTreeWidgetItem *header = channelList->headerItem();
Q_ASSERT(header != 0);
header->setText(0, tr("Channel")); header->setText(0, tr("Channel"));
header->setText(1, tr("Players")); header->setText(1, tr("Players"));
header->setTextAlignment(1, Qt::AlignRight); header->setTextAlignment(1, Qt::AlignRight);

View file

@ -301,9 +301,9 @@ PendingCommand *Client::shuffle()
return cmd("shuffle"); return cmd("shuffle");
} }
PendingCommand *Client::rollDice(unsigned int sides) PendingCommand *Client::rollDie(unsigned int sides)
{ {
return cmd(QString("roll_dice|%1").arg(sides)); return cmd(QString("roll_die|%1").arg(sides));
} }
PendingCommand *Client::drawCards(unsigned int number) PendingCommand *Client::drawCards(unsigned int number)

View file

@ -106,7 +106,7 @@ public slots:
PendingCommand *login(const QString &name, const QString &pass); PendingCommand *login(const QString &name, const QString &pass);
PendingCommand *say(const QString &s); PendingCommand *say(const QString &s);
PendingCommand *shuffle(); PendingCommand *shuffle();
PendingCommand *rollDice(unsigned int sides); PendingCommand *rollDie(unsigned int sides);
PendingCommand *drawCards(unsigned int number); PendingCommand *drawCards(unsigned int number);
PendingCommand *moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y = 0, bool faceDown = false); PendingCommand *moveCard(int cardid, const QString &startzone, const QString &targetzone, int x, int y = 0, bool faceDown = false);
PendingCommand *createToken(const QString &zone, const QString &name, const QString &powtough, int x, int y); PendingCommand *createToken(const QString &zone, const QString &name, const QString &powtough, int x, int y);

View file

@ -23,33 +23,25 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a
connect(client, SIGNAL(gameEvent(const ServerEventData &)), this, SLOT(gameEvent(const ServerEventData &))); connect(client, SIGNAL(gameEvent(const ServerEventData &)), this, SLOT(gameEvent(const ServerEventData &)));
connect(client, SIGNAL(playerListReceived(QList<ServerPlayer *>)), this, SLOT(playerListReceived(QList<ServerPlayer *>))); connect(client, SIGNAL(playerListReceived(QList<ServerPlayer *>)), this, SLOT(playerListReceived(QList<ServerPlayer *>)));
aUntapAll = new QAction(tr("&Untap all permanents"), this); aUntapAll = new QAction(this);
aUntapAll->setShortcut(tr("Ctrl+U"));
connect(aUntapAll, SIGNAL(triggered()), this, SLOT(actUntapAll())); connect(aUntapAll, SIGNAL(triggered()), this, SLOT(actUntapAll()));
aDecLife = new QAction(tr("&Decrement life"), this); aDecLife = new QAction(this);
aDecLife->setShortcut(tr("F11"));
connect(aDecLife, SIGNAL(triggered()), this, SLOT(actDecLife())); connect(aDecLife, SIGNAL(triggered()), this, SLOT(actDecLife()));
aIncLife = new QAction(tr("&Increment life"), this); aIncLife = new QAction(this);
aIncLife->setShortcut(tr("F12"));
connect(aIncLife, SIGNAL(triggered()), this, SLOT(actIncLife())); connect(aIncLife, SIGNAL(triggered()), this, SLOT(actIncLife()));
aSetLife = new QAction(tr("&Set life"), this); aSetLife = new QAction(this);
aSetLife->setShortcut(tr("Ctrl+L"));
connect(aSetLife, SIGNAL(triggered()), this, SLOT(actSetLife())); connect(aSetLife, SIGNAL(triggered()), this, SLOT(actSetLife()));
aRollDice = new QAction(tr("R&oll dice..."), this); aRollDie = new QAction(this);
aRollDice->setShortcut(tr("Ctrl+I")); connect(aRollDie, SIGNAL(triggered()), this, SLOT(actRollDie()));
connect(aRollDice, SIGNAL(triggered()), this, SLOT(actRollDice()));
aCreateToken = new QAction(tr("&Create token..."), this); aCreateToken = new QAction(this);
aCreateToken->setShortcut(tr("Ctrl+T"));
connect(aCreateToken, SIGNAL(triggered()), this, SLOT(actCreateToken())); connect(aCreateToken, SIGNAL(triggered()), this, SLOT(actCreateToken()));
aNextPhase = new QAction(tr("Next &phase"), this); aNextPhase = new QAction(this);
aNextPhase->setShortcut(tr("Ctrl+Space"));
connect(aNextPhase, SIGNAL(triggered()), this, SLOT(actNextPhase())); connect(aNextPhase, SIGNAL(triggered()), this, SLOT(actNextPhase()));
aNextTurn = new QAction(tr("Next &turn"), this); aNextTurn = new QAction(this);
aNextTurn->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter")));
connect(aNextTurn, SIGNAL(triggered()), this, SLOT(actNextTurn())); connect(aNextTurn, SIGNAL(triggered()), this, SLOT(actNextTurn()));
actionsMenu->addAction(aNextPhase); actionsMenu->addAction(aNextPhase);
@ -61,25 +53,25 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a
actionsMenu->addAction(aIncLife); actionsMenu->addAction(aIncLife);
actionsMenu->addAction(aSetLife); actionsMenu->addAction(aSetLife);
actionsMenu->addSeparator(); actionsMenu->addSeparator();
actionsMenu->addAction(aRollDice); actionsMenu->addAction(aRollDie);
actionsMenu->addSeparator(); actionsMenu->addSeparator();
actionsMenu->addAction(aCreateToken); actionsMenu->addAction(aCreateToken);
actionsMenu->addSeparator(); actionsMenu->addSeparator();
sayMenu = actionsMenu->addMenu(tr("S&ay")); sayMenu = actionsMenu->addMenu(QString());
initSayMenu(); initSayMenu();
aTap = new QAction(tr("&Tap"), this); aTap = new QAction(this);
aUntap = new QAction(tr("&Untap"), this); aUntap = new QAction(this);
aDoesntUntap = new QAction(tr("Toggle &normal untapping"), this); aDoesntUntap = new QAction(this);
aFlip = new QAction(tr("&Flip"), this); aFlip = new QAction(this);
aAddCounter = new QAction(tr("&Add counter"), this); aAddCounter = new QAction(this);
aRemoveCounter = new QAction(tr("&Remove counter"), this); aRemoveCounter = new QAction(this);
aSetCounters = new QAction(tr("&Set counters..."), this); aSetCounters = new QAction(this);
connect(aSetCounters, SIGNAL(triggered()), this, SLOT(actSetCounters())); connect(aSetCounters, SIGNAL(triggered()), this, SLOT(actSetCounters()));
aMoveToTopLibrary = new QAction(tr("&top of library"), this); aMoveToTopLibrary = new QAction(this);
aMoveToBottomLibrary = new QAction(tr("&bottom of library"), this); aMoveToBottomLibrary = new QAction(this);
aMoveToGraveyard = new QAction(tr("&graveyard"), this); aMoveToGraveyard = new QAction(this);
aMoveToExile = new QAction(tr("&exile"), this); aMoveToExile = new QAction(this);
cardMenu->addAction(aTap); cardMenu->addAction(aTap);
cardMenu->addAction(aUntap); cardMenu->addAction(aUntap);
@ -91,7 +83,7 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a
cardMenu->addAction(aRemoveCounter); cardMenu->addAction(aRemoveCounter);
cardMenu->addAction(aSetCounters); cardMenu->addAction(aSetCounters);
cardMenu->addSeparator(); cardMenu->addSeparator();
moveMenu = cardMenu->addMenu(tr("&Move to")); moveMenu = cardMenu->addMenu(QString());
moveMenu->addAction(aMoveToTopLibrary); moveMenu->addAction(aMoveToTopLibrary);
moveMenu->addAction(aMoveToBottomLibrary); moveMenu->addAction(aMoveToBottomLibrary);
@ -118,6 +110,8 @@ Game::Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_a
dlgStartGame = new DlgStartGame(db); dlgStartGame = new DlgStartGame(db);
connect(dlgStartGame, SIGNAL(newDeckLoaded(const QStringList &)), client, SLOT(submitDeck(const QStringList &))); connect(dlgStartGame, SIGNAL(newDeckLoaded(const QStringList &)), client, SLOT(submitDeck(const QStringList &)));
connect(dlgStartGame, SIGNAL(finished(int)), this, SLOT(readyStart())); connect(dlgStartGame, SIGNAL(finished(int)), this, SLOT(readyStart()));
retranslateUi();
} }
Game::~Game() Game::~Game()
@ -129,6 +123,45 @@ Game::~Game()
} }
} }
void Game::retranslateUi()
{
aUntapAll->setText(tr("&Untap all permanents"));
aUntapAll->setShortcut(tr("Ctrl+U"));
aDecLife->setText(tr("&Decrement life"));
aDecLife->setShortcut(tr("F11"));
aIncLife->setText(tr("&Increment life"));
aIncLife->setShortcut(tr("F12"));
aSetLife->setText(tr("&Set life"));
aSetLife->setShortcut(tr("Ctrl+L"));
aRollDie->setText(tr("R&oll die..."));
aRollDie->setShortcut(tr("Ctrl+I"));
aCreateToken->setText(tr("&Create token..."));
aCreateToken->setShortcut(tr("Ctrl+T"));
aNextPhase->setText(tr("Next &phase"));
aNextPhase->setShortcut(tr("Ctrl+Space"));
aNextTurn->setText(tr("Next &turn"));
aNextTurn->setShortcuts(QList<QKeySequence>() << QKeySequence(tr("Ctrl+Return")) << QKeySequence(tr("Ctrl+Enter")));
sayMenu->setTitle(tr("S&ay"));
aTap->setText(tr("&Tap"));
aUntap->setText(tr("&Untap"));
aDoesntUntap->setText(tr("Toggle &normal untapping"));
aFlip->setText(tr("&Flip"));
aAddCounter->setText(tr("&Add counter"));
aRemoveCounter->setText(tr("&Remove counter"));
aSetCounters->setText(tr("&Set counters..."));
aMoveToTopLibrary->setText(tr("&top of library"));
aMoveToBottomLibrary->setText(tr("&bottom of library"));
aMoveToGraveyard->setText(tr("&graveyard"));
aMoveToExile->setText(tr("&exile"));
moveMenu->setTitle(tr("&Move to"));
for (int i = 0; i < players.size(); ++i)
players[i]->retranslateUi();
}
void Game::initSayMenu() void Game::initSayMenu()
{ {
sayMenu->clear(); sayMenu->clear();
@ -238,11 +271,11 @@ void Game::gameEvent(const ServerEventData &msg)
case eventShuffle: case eventShuffle:
emit logShuffle(p); emit logShuffle(p);
break; break;
case eventRollDice: { case eventRollDie: {
QStringList data = msg.getEventData(); QStringList data = msg.getEventData();
int sides = data[0].toInt(); int sides = data[0].toInt();
int roll = data[1].toInt(); int roll = data[1].toInt();
emit logRollDice(p, sides, roll); emit logRollDie(p, sides, roll);
break; break;
} }
case eventSetActivePlayer: { case eventSetActivePlayer: {
@ -279,12 +312,24 @@ void Game::gameEvent(const ServerEventData &msg)
} }
case eventDumpZone: { case eventDumpZone: {
QStringList data = msg.getEventData(); QStringList data = msg.getEventData();
emit logDumpZone(p, data[1], players.findPlayer(data[0].toInt())->getName(), data[2].toInt()); Player *zoneOwner = players.findPlayer(data[0].toInt());
if (!zoneOwner)
break;
CardZone *zone = zoneOwner->getZones()->findZone(data[1]);
if (!zone)
break;
emit logDumpZone(p, zone, zoneOwner, data[2].toInt());
break; break;
} }
case eventStopDumpZone: { case eventStopDumpZone: {
QStringList data = msg.getEventData(); QStringList data = msg.getEventData();
emit logStopDumpZone(p, data[1], players.findPlayer(data[0].toInt())->getName()); Player *zoneOwner = players.findPlayer(data[0].toInt());
if (!zoneOwner)
break;
CardZone *zone = zoneOwner->getZones()->findZone(data[1]);
if (!zone)
break;
emit logStopDumpZone(p, zone, zoneOwner);
break; break;
} }
case eventMoveCard: { case eventMoveCard: {
@ -345,12 +390,12 @@ void Game::actSetLife()
client->setCounter("life", life); client->setCounter("life", life);
} }
void Game::actRollDice() void Game::actRollDie()
{ {
bool ok; bool ok;
int sides = QInputDialog::getInteger(0, tr("Roll dice"), tr("Number of sides:"), 20, 2, 1000, 1, &ok); int sides = QInputDialog::getInteger(0, tr("Roll die"), tr("Number of sides:"), 20, 2, 1000, 1, &ok);
if (ok) if (ok)
client->rollDice(sides); client->rollDie(sides);
} }
void Game::actCreateToken() void Game::actCreateToken()

View file

@ -24,7 +24,7 @@ private:
QMenu *actionsMenu, *sayMenu, *cardMenu, *moveMenu; QMenu *actionsMenu, *sayMenu, *cardMenu, *moveMenu;
QAction *aTap, *aUntap, *aDoesntUntap, *aFlip, *aAddCounter, *aRemoveCounter, *aSetCounters, QAction *aTap, *aUntap, *aDoesntUntap, *aFlip, *aAddCounter, *aRemoveCounter, *aSetCounters,
*aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile, *aMoveToTopLibrary, *aMoveToBottomLibrary, *aMoveToGraveyard, *aMoveToExile,
*aNextPhase, *aNextTurn, *aUntapAll, *aDecLife, *aIncLife, *aSetLife, *aRollDice, *aCreateToken; *aNextPhase, *aNextTurn, *aUntapAll, *aDecLife, *aIncLife, *aSetLife, *aRollDie, *aCreateToken;
DlgStartGame *dlgStartGame; DlgStartGame *dlgStartGame;
CardDatabase *db; CardDatabase *db;
@ -45,7 +45,7 @@ private slots:
void actIncLife(); void actIncLife();
void actDecLife(); void actDecLife();
void actSetLife(); void actSetLife();
void actRollDice(); void actRollDie();
void actCreateToken(); void actCreateToken();
void showCardMenu(QPoint p); void showCardMenu(QPoint p);
@ -80,7 +80,7 @@ signals:
void logGameStart(); void logGameStart();
void logSay(Player *player, QString text); void logSay(Player *player, QString text);
void logShuffle(Player *player); void logShuffle(Player *player);
void logRollDice(Player *player, int sides, int roll); void logRollDie(Player *player, int sides, int roll);
void logDraw(Player *player, int number); void logDraw(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);
void logCreateToken(Player *player, QString cardName); void logCreateToken(Player *player, QString cardName);
@ -88,14 +88,15 @@ signals:
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);
void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap); void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards); void logDumpZone(Player *player, CardZone *zone, Player *zoneOwner, int numberCards);
void logStopDumpZone(Player *player, QString zoneName, QString zoneOwner); void logStopDumpZone(Player *player, CardZone *zone, Player *zoneOwner);
void logSetActivePlayer(Player *player); void logSetActivePlayer(Player *player);
void setActivePhase(int phase); void setActivePhase(int phase);
public: public:
Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_actionsMenu, QMenu *_cardMenu, int playerId, const QString &playerName, QObject *parent = 0); Game(CardDatabase *_db, Client *_client, QGraphicsScene *_scene, QMenu *_actionsMenu, QMenu *_cardMenu, int playerId, const QString &playerName, QObject *parent = 0);
~Game(); ~Game();
Player *getLocalPlayer() const { return localPlayer; } Player *getLocalPlayer() const { return localPlayer; }
void retranslateUi();
void restartGameDialog(); void restartGameDialog();
void hoverCardEvent(CardItem *card); void hoverCardEvent(CardItem *card);
}; };

View file

@ -3,7 +3,7 @@
#include "player.h" #include "player.h"
#include "cardzone.h" #include "cardzone.h"
QString MessageLogWidget::sanitizeHtml(QString dirty) QString MessageLogWidget::sanitizeHtml(QString dirty) const
{ {
return dirty return dirty
.replace("&", "&amp;") .replace("&", "&amp;")
@ -11,6 +11,29 @@ QString MessageLogWidget::sanitizeHtml(QString dirty)
.replace(">", "&gt;"); .replace(">", "&gt;");
} }
QString MessageLogWidget::trZoneName(CardZone *zone, Player *owner, bool hisOwn, GrammaticalCase gc) const
{
if (zone->getName() == "hand")
switch (gc) {
// case CaseNominative: return hisOwn ? tr("his hand") : tr("%1's hand").arg(owner->getName());
case CaseGenitive: return hisOwn ? tr("of his hand") : tr("of %1's hand").arg(owner->getName());
case CaseAccusative: return hisOwn ? tr("his hand") : tr("%1's hand").arg(owner->getName());
}
else if (zone->getName() == "deck")
switch (gc) {
// case CaseNominative: return hisOwn ? tr("his library") : tr("%1's library").arg(owner->getName());
case CaseGenitive: return hisOwn ? tr("of his library") : tr("of %1's library").arg(owner->getName());
case CaseAccusative: return hisOwn ? tr("his library") : tr("%1's library").arg(owner->getName());
}
else if (zone->getName() == "sb")
switch (gc) {
// case CaseNominative: return hisOwn ? tr("his sideboard") : tr("%1's sideboard").arg(owner->getName());
case CaseGenitive: return hisOwn ? tr("of his sideboard") : tr("of %1's sideboard").arg(owner->getName());
case CaseAccusative: return hisOwn ? tr("his sideboard") : tr("%1's sideboard").arg(owner->getName());
}
return QString();
}
void MessageLogWidget::logConnecting(QString hostname) void MessageLogWidget::logConnecting(QString hostname)
{ {
append(tr("Connecting to %1...").arg(sanitizeHtml(hostname))); append(tr("Connecting to %1...").arg(sanitizeHtml(hostname)));
@ -69,7 +92,7 @@ void MessageLogWidget::logReadyStart(Player *player)
void MessageLogWidget::logGameStart() void MessageLogWidget::logGameStart()
{ {
append(tr("Game has started.")); append(tr("The game has started."));
} }
void MessageLogWidget::logSay(Player *player, QString message) void MessageLogWidget::logSay(Player *player, QString message)
@ -79,20 +102,20 @@ void MessageLogWidget::logSay(Player *player, QString message)
void MessageLogWidget::logShuffle(Player *player) void MessageLogWidget::logShuffle(Player *player)
{ {
append(tr("%1 shuffles his/her library").arg(sanitizeHtml(player->getName()))); append(tr("%1 shuffles his library.").arg(sanitizeHtml(player->getName())));
} }
void MessageLogWidget::logRollDice(Player *player, int sides, int roll) void MessageLogWidget::logRollDie(Player *player, int sides, int roll)
{ {
append(tr("%1 rolled a %2 with a %3-sided dice").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides)); append(tr("%1 rolls a %2 with a %3-sided die.").arg(sanitizeHtml(player->getName())).arg(roll).arg(sides));
} }
void MessageLogWidget::logDraw(Player *player, int number) void MessageLogWidget::logDraw(Player *player, int number)
{ {
if (number == 1) if (number == 1)
append(tr("%1 draws a card").arg(sanitizeHtml(player->getName()))); append(tr("%1 draws a card.").arg(sanitizeHtml(player->getName())));
else else
append(tr("%1 draws %2 cards").arg(sanitizeHtml(player->getName())).arg(number)); append(tr("%1 draws %2 cards.").arg(sanitizeHtml(player->getName())).arg(number));
} }
void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX) void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX)
@ -102,60 +125,78 @@ void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *s
if (((startName == "table") && (targetName == "table")) || ((startName == "hand") && (targetName == "hand"))) if (((startName == "table") && (targetName == "table")) || ((startName == "hand") && (targetName == "hand")))
return; return;
QString fromStr; QString fromStr;
bool cardNameContainsStartZone = false;
if (startName == "table") if (startName == "table")
fromStr = tr("from table"); fromStr = tr(" from table");
else if (startName == "grave") else if (startName == "grave")
fromStr = tr("from graveyard"); fromStr = tr(" from graveyard");
else if (startName == "rfg") else if (startName == "rfg")
fromStr = tr("from exile"); fromStr = tr(" from exile");
else if (startName == "hand") else if (startName == "hand")
fromStr = tr("from hand"); fromStr = tr(" from hand");
else if (startName == "deck") { else if (startName == "deck") {
if (oldX == startZone->getCards().size() - 1) if (oldX == startZone->getCards().size() - 1) {
fromStr = tr("from the bottom of his library"); if (cardName.isEmpty()) {
else if (oldX == 0) cardName = tr("the bottom card of his library");
fromStr = tr("from the top of his library"); cardNameContainsStartZone = true;
else } else
fromStr = tr("from library"); fromStr = tr(" from the bottom of his library");
} else if (oldX == 0) {
if (cardName.isEmpty()) {
cardName = tr("the top card of his library");
cardNameContainsStartZone = true;
} else
fromStr = tr(" from the top of his library");
} else
fromStr = tr(" from library");
} else if (startName == "sb") } else if (startName == "sb")
fromStr = tr("from sideboard"); fromStr = tr(" from sideboard");
QString finalStr; QString finalStr;
if (targetName == "table") if (targetName == "table")
finalStr = tr("%1 puts %2 into play %3"); finalStr = tr("%1 puts %2 into play%3.");
else if (targetName == "grave") else if (targetName == "grave")
finalStr = tr("%1 puts %2 %3 into graveyard"); finalStr = tr("%1 puts %2%3 into graveyard.");
else if (targetName == "rfg") else if (targetName == "rfg")
finalStr = tr("%1 exiles %2 %3"); finalStr = tr("%1 exiles %2%3.");
else if (targetName == "hand") else if (targetName == "hand")
finalStr = tr("%1 moves %2 %3 to hand"); finalStr = tr("%1 moves %2%3 to hand.");
else if (targetName == "deck") { else if (targetName == "deck") {
if (newX == -1) if (newX == -1)
finalStr = tr("%1 puts %2 %3 into his library"); finalStr = tr("%1 puts %2%3 into his library.");
else if (newX == targetZone->getCards().size()) else if (newX == targetZone->getCards().size())
finalStr = tr("%1 puts %2 %3 on bottom of his library"); finalStr = tr("%1 puts %2%3 on bottom of his library.");
else if (newX == 0) else if (newX == 0)
finalStr = tr("%1 puts %2 %3 on top of his library"); finalStr = tr("%1 puts %2%3 on top of his library.");
else else
finalStr = tr("%1 puts %2 %3 into his library at position %4"); finalStr = tr("%1 puts %2%3 into his library at position %4.");
} else if (targetName == "sb") } else if (targetName == "sb")
finalStr = tr("%1 moves %2 %3 to sideboard"); finalStr = tr("%1 moves %2%3 to sideboard.");
append(finalStr.arg(sanitizeHtml(player->getName())).arg(cardName.isEmpty() ? tr("a card") : QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(fromStr).arg(newX)); QString cardStr;
if (cardNameContainsStartZone)
cardStr = cardName;
else if (cardName.isEmpty())
cardStr = tr("a card");
else
cardStr = QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName));
append(finalStr.arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(newX));
} }
void MessageLogWidget::logCreateToken(Player *player, QString cardName) void MessageLogWidget::logCreateToken(Player *player, QString cardName)
{ {
append(tr("%1 creates token: %2").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName)))); append(tr("%1 creates token: %2.").arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))));
} }
void MessageLogWidget::logSetCardCounters(Player *player, QString cardName, int value, int oldValue) void MessageLogWidget::logSetCardCounters(Player *player, QString cardName, int value, int oldValue)
{ {
QString finalStr; QString finalStr;
if (value > oldValue) if (value > oldValue)
finalStr = tr("%1 places %2 counters on %3 (now %4)"); finalStr = tr("%1 places %2 counters on %3 (now %4).");
else else
finalStr = tr("%1 removes %2 counters from %3 (now %4)"); finalStr = tr("%1 removes %2 counters from %3 (now %4).");
append(finalStr.arg(sanitizeHtml(player->getName())).arg(abs(oldValue - value)).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(value)); append(finalStr.arg(sanitizeHtml(player->getName())).arg(abs(oldValue - value)).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))).arg(value));
} }
@ -166,12 +207,12 @@ void MessageLogWidget::logSetTapped(Player *player, QString cardName, bool tappe
cardStr = tr("his permanents"); cardStr = tr("his permanents");
else else
cardStr = QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName)); cardStr = QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName));
append(tr("%1 %2 %3").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr)); append(tr("%1 %2 %3.").arg(sanitizeHtml(player->getName())).arg(tapped ? tr("taps") : tr("untaps")).arg(cardStr));
} }
void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue) void MessageLogWidget::logSetCounter(Player *player, QString counterName, int value, int oldValue)
{ {
append(tr("%1 sets counter \"%2\" to %3 (%4%5)").arg(sanitizeHtml(player->getName())).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue)); append(tr("%1 sets counter \"%2\" to %3 (%4%5).").arg(sanitizeHtml(player->getName())).arg(counterName).arg(value).arg(value > oldValue ? "+" : "").arg(value - oldValue));
} }
void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap) void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap)
@ -184,17 +225,18 @@ void MessageLogWidget::logSetDoesntUntap(Player *player, QString cardName, bool
append(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName)))); append(finalStr.arg(sanitizeHtml(player->getName())).arg(QString("<font color=\"blue\">%1</font>").arg(sanitizeHtml(cardName))));
} }
void MessageLogWidget::logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards) void MessageLogWidget::logDumpZone(Player *player, CardZone *zone, Player *zoneOwner, int numberCards)
{ {
if (numberCards != -1) if (numberCards != -1)
append(tr("%1 is looking at the top %2 cards of %3's %4").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(zoneOwner).arg(zoneName)); append(tr("%1 is looking at the top %2 cards %3.").arg(sanitizeHtml(player->getName())).arg(numberCards).arg(trZoneName(zone, zoneOwner, zoneOwner == player, CaseGenitive)));
else else
append(tr("%1 is looking at %2's %3").arg(sanitizeHtml(player->getName())).arg(zoneOwner).arg(zoneName)); append(tr("%1 is looking at %2.").arg(sanitizeHtml(player->getName())).arg(trZoneName(zone, zoneOwner, zoneOwner == player, CaseAccusative)));
} }
void MessageLogWidget::logStopDumpZone(Player *player, QString zoneName, QString zoneOwner) void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone, Player *zoneOwner)
{ {
append(tr("%1 stops looking at %2's %3").arg(sanitizeHtml(player->getName())).arg(zoneOwner).arg(zoneName)); QString zoneName = trZoneName(zone, zoneOwner, zoneOwner == player, CaseAccusative);
append(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName));
} }
void MessageLogWidget::logSetActivePlayer(Player *player) void MessageLogWidget::logSetActivePlayer(Player *player)
@ -218,7 +260,7 @@ void MessageLogWidget::logSetActivePhase(int phase)
case 7: phaseName = tr("combat damage step"); break; case 7: phaseName = tr("combat damage step"); break;
case 8: phaseName = tr("end of combat step"); break; case 8: phaseName = tr("end of combat step"); break;
case 9: phaseName = tr("second main phase"); break; case 9: phaseName = tr("second main phase"); break;
case 10: phaseName = tr("end of turn step"); break; case 10: phaseName = tr("ending phase"); break;
} }
append("<font color=\"green\">" + tr("It is now the %1.").arg(phaseName) + "</font>"); append("<font color=\"green\">" + tr("It is now the %1.").arg(phaseName) + "</font>");
} }
@ -232,7 +274,7 @@ void MessageLogWidget::connectToGame(Game *game)
connect(game, SIGNAL(logGameStart()), this, SLOT(logGameStart())); connect(game, SIGNAL(logGameStart()), this, SLOT(logGameStart()));
connect(game, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString))); connect(game, SIGNAL(logSay(Player *, QString)), this, SLOT(logSay(Player *, QString)));
connect(game, SIGNAL(logShuffle(Player *)), this, SLOT(logShuffle(Player *))); connect(game, SIGNAL(logShuffle(Player *)), this, SLOT(logShuffle(Player *)));
connect(game, SIGNAL(logRollDice(Player *, int, int)), this, SLOT(logRollDice(Player *, int, int))); connect(game, SIGNAL(logRollDie(Player *, int, int)), this, SLOT(logRollDie(Player *, int, int)));
connect(game, SIGNAL(logDraw(Player *, int)), this, SLOT(logDraw(Player *, int))); connect(game, SIGNAL(logDraw(Player *, int)), this, SLOT(logDraw(Player *, int)));
connect(game, SIGNAL(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int)), this, SLOT(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int))); connect(game, SIGNAL(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int)), this, SLOT(logMoveCard(Player *, QString, CardZone *, int, CardZone *, int)));
connect(game, SIGNAL(logCreateToken(Player *, QString)), this, SLOT(logCreateToken(Player *, QString))); connect(game, SIGNAL(logCreateToken(Player *, QString)), this, SLOT(logCreateToken(Player *, QString)));
@ -240,8 +282,8 @@ void MessageLogWidget::connectToGame(Game *game)
connect(game, SIGNAL(logSetTapped(Player *, QString, bool)), this, SLOT(logSetTapped(Player *, QString, bool))); connect(game, SIGNAL(logSetTapped(Player *, QString, bool)), this, SLOT(logSetTapped(Player *, QString, bool)));
connect(game, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int))); connect(game, SIGNAL(logSetCounter(Player *, QString, int, int)), this, SLOT(logSetCounter(Player *, QString, int, int)));
connect(game, SIGNAL(logSetDoesntUntap(Player *, QString, bool)), this, SLOT(logSetDoesntUntap(Player *, QString, bool))); connect(game, SIGNAL(logSetDoesntUntap(Player *, QString, bool)), this, SLOT(logSetDoesntUntap(Player *, QString, bool)));
connect(game, SIGNAL(logDumpZone(Player *, QString, QString, int)), this, SLOT(logDumpZone(Player *, QString, QString, int))); connect(game, SIGNAL(logDumpZone(Player *, CardZone *, Player *, int)), this, SLOT(logDumpZone(Player *, CardZone *, Player *, int)));
connect(game, SIGNAL(logStopDumpZone(Player *, QString, QString)), this, SLOT(logStopDumpZone(Player *, QString, QString))); connect(game, SIGNAL(logStopDumpZone(Player *, CardZone *, Player *)), this, SLOT(logStopDumpZone(Player *, CardZone *, Player *)));
connect(game, SIGNAL(logSetActivePlayer(Player *)), this, SLOT(logSetActivePlayer(Player *))); connect(game, SIGNAL(logSetActivePlayer(Player *)), this, SLOT(logSetActivePlayer(Player *)));
connect(game, SIGNAL(setActivePhase(int)), this, SLOT(logSetActivePhase(int))); connect(game, SIGNAL(setActivePhase(int)), this, SLOT(logSetActivePhase(int)));
} }

View file

@ -12,7 +12,9 @@ class CardZone;
class MessageLogWidget : public QTextEdit { class MessageLogWidget : public QTextEdit {
Q_OBJECT Q_OBJECT
private: private:
QString sanitizeHtml(QString dirty); enum GrammaticalCase { /*CaseNominative, */CaseGenitive, CaseAccusative };
QString sanitizeHtml(QString dirty) const;
QString trZoneName(CardZone *zone, Player *player, bool hisOwn, GrammaticalCase gc) const;
public slots: public slots:
void logConnecting(QString hostname); void logConnecting(QString hostname);
void logConnected(const QStringList WelcomeMsg); void logConnected(const QStringList WelcomeMsg);
@ -27,7 +29,7 @@ private slots:
void logGameStart(); void logGameStart();
void logSay(Player *player, QString message); void logSay(Player *player, QString message);
void logShuffle(Player *player); void logShuffle(Player *player);
void logRollDice(Player *player, int sides, int roll); void logRollDie(Player *player, int sides, int roll);
void logDraw(Player *player, int number); void logDraw(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);
void logCreateToken(Player *player, QString cardName); void logCreateToken(Player *player, QString cardName);
@ -35,8 +37,8 @@ private slots:
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);
void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap); void logSetDoesntUntap(Player *player, QString cardName, bool doesntUntap);
void logDumpZone(Player *player, QString zoneName, QString zoneOwner, int numberCards); void logDumpZone(Player *player, CardZone *zone, Player *zoneOwner, int numberCards);
void logStopDumpZone(Player *player, QString zoneName, QString zoneOwner); void logStopDumpZone(Player *player, CardZone *zone, Player *zoneOwner);
void logSetActivePlayer(Player *player); void logSetActivePlayer(Player *player);
void logSetActivePhase(int phase); void logSetActivePhase(int phase);
public: public:

View file

@ -17,50 +17,44 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa
_scene->addItem(area); _scene->addItem(area);
if (local) { if (local) {
aMoveHandToTopLibrary = new QAction(tr("Move to &top of library"), this); aMoveHandToTopLibrary = new QAction(this);
connect(aMoveHandToTopLibrary, SIGNAL(triggered()), this, SLOT(actMoveHandToTopLibrary())); connect(aMoveHandToTopLibrary, SIGNAL(triggered()), this, SLOT(actMoveHandToTopLibrary()));
aMoveHandToBottomLibrary = new QAction(tr("Move to &bottom of library"), this); aMoveHandToBottomLibrary = new QAction(this);
connect(aMoveHandToBottomLibrary, SIGNAL(triggered()), this, SLOT(actMoveHandToBottomLibrary())); connect(aMoveHandToBottomLibrary, SIGNAL(triggered()), this, SLOT(actMoveHandToBottomLibrary()));
aViewLibrary = new QAction(tr("&View library"), this); aViewLibrary = new QAction(this);
aViewLibrary->setShortcut(tr("F3"));
connect(aViewLibrary, SIGNAL(triggered()), this, SLOT(actViewLibrary())); connect(aViewLibrary, SIGNAL(triggered()), this, SLOT(actViewLibrary()));
aViewTopCards = new QAction(tr("View &top cards of library..."), this); aViewTopCards = new QAction(this);
connect(aViewTopCards, SIGNAL(triggered()), this, SLOT(actViewTopCards())); connect(aViewTopCards, SIGNAL(triggered()), this, SLOT(actViewTopCards()));
} }
aViewGraveyard = new QAction(tr("&View graveyard"), this); aViewGraveyard = new QAction(this);
if (local)
aViewGraveyard->setShortcut(tr("F4"));
connect(aViewGraveyard, SIGNAL(triggered()), this, SLOT(actViewGraveyard())); connect(aViewGraveyard, SIGNAL(triggered()), this, SLOT(actViewGraveyard()));
aViewRfg = new QAction(tr("&View removed cards"), this); aViewRfg = new QAction(this);
connect(aViewRfg, SIGNAL(triggered()), this, SLOT(actViewRfg())); connect(aViewRfg, SIGNAL(triggered()), this, SLOT(actViewRfg()));
if (local) { if (local) {
aViewSideboard = new QAction(tr("&View sideboard"), this); aViewSideboard = new QAction(this);
connect(aViewSideboard, SIGNAL(triggered()), this, SLOT(actViewSideboard())); connect(aViewSideboard, SIGNAL(triggered()), this, SLOT(actViewSideboard()));
aDrawCard = new QAction(tr("&Draw card"), this); aDrawCard = new QAction(this);
connect(aDrawCard, SIGNAL(triggered()), this, SLOT(actDrawCard())); connect(aDrawCard, SIGNAL(triggered()), this, SLOT(actDrawCard()));
aDrawCard->setShortcut(tr("Ctrl+D")); aDrawCards = new QAction(this);
aDrawCards = new QAction(tr("D&raw cards..."), this);
connect(aDrawCards, SIGNAL(triggered()), this, SLOT(actDrawCards())); connect(aDrawCards, SIGNAL(triggered()), this, SLOT(actDrawCards()));
aDrawCards->setShortcut(tr("Ctrl+E")); aShuffle = new QAction(this);
aShuffle = new QAction(tr("&Shuffle"), this);
connect(aShuffle, SIGNAL(triggered()), this, SLOT(actShuffle())); connect(aShuffle, SIGNAL(triggered()), this, SLOT(actShuffle()));
aShuffle->setShortcut(tr("Ctrl+S"));
} }
playerMenu = new QMenu(tr("Player \"%1\"").arg(name)); playerMenu = new QMenu(QString());
if (local) { if (local) {
QMenu *handMenu = playerMenu->addMenu(tr("&Hand")); handMenu = playerMenu->addMenu(QString());
handMenu->addAction(aMoveHandToTopLibrary); handMenu->addAction(aMoveHandToTopLibrary);
handMenu->addAction(aMoveHandToBottomLibrary); handMenu->addAction(aMoveHandToBottomLibrary);
zones.findZone("hand")->setMenu(handMenu); zones.findZone("hand")->setMenu(handMenu);
QMenu *libraryMenu = playerMenu->addMenu(tr("&Library")); libraryMenu = playerMenu->addMenu(QString());
libraryMenu->addAction(aDrawCard); libraryMenu->addAction(aDrawCard);
libraryMenu->addAction(aDrawCards); libraryMenu->addAction(aDrawCards);
libraryMenu->addSeparator(); libraryMenu->addSeparator();
@ -69,21 +63,27 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa
libraryMenu->addAction(aViewLibrary); libraryMenu->addAction(aViewLibrary);
libraryMenu->addAction(aViewTopCards); libraryMenu->addAction(aViewTopCards);
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard); zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
} else {
handMenu = 0;
libraryMenu = 0;
} }
QMenu *graveMenu = playerMenu->addMenu(tr("&Graveyard")); graveMenu = playerMenu->addMenu(QString());
graveMenu->addAction(aViewGraveyard); graveMenu->addAction(aViewGraveyard);
zones.findZone("grave")->setMenu(graveMenu, aViewGraveyard); zones.findZone("grave")->setMenu(graveMenu, aViewGraveyard);
QMenu *rfgMenu = playerMenu->addMenu(tr("&Removed cards")); rfgMenu = playerMenu->addMenu(QString());
rfgMenu->addAction(aViewRfg); rfgMenu->addAction(aViewRfg);
zones.findZone("rfg")->setMenu(rfgMenu, aViewRfg); zones.findZone("rfg")->setMenu(rfgMenu, aViewRfg);
if (local) { if (local) {
QMenu *sbMenu = playerMenu->addMenu(tr("&Sideboard")); sbMenu = playerMenu->addMenu(QString());
sbMenu->addAction(aViewSideboard); sbMenu->addAction(aViewSideboard);
zones.findZone("sb")->setMenu(sbMenu, aViewSideboard); zones.findZone("sb")->setMenu(sbMenu, aViewSideboard);
} } else
sbMenu = 0;
retranslateUi();
} }
Player::~Player() Player::~Player()
@ -96,6 +96,35 @@ Player::~Player()
delete area; delete area;
} }
void Player::retranslateUi()
{
aViewGraveyard->setText(tr("&View graveyard"));
aViewRfg->setText(tr("&View exile"));
playerMenu->setTitle(tr("Player \"%1\"").arg(name));
graveMenu->setTitle(tr("&Graveyard"));
rfgMenu->setTitle(tr("&Exile"));
if (local) {
aMoveHandToTopLibrary->setText(tr("Move to &top of library"));
aMoveHandToBottomLibrary->setText(tr("Move to &bottom of library"));
aViewLibrary->setText(tr("&View library"));
aViewLibrary->setShortcut(tr("F3"));
aViewTopCards->setText(tr("View &top cards of library..."));
aViewGraveyard->setShortcut(tr("F4"));
aViewSideboard->setText(tr("&View sideboard"));
aDrawCard->setText(tr("&Draw card"));
aDrawCard->setShortcut(tr("Ctrl+D"));
aDrawCards->setText(tr("D&raw cards..."));
aDrawCards->setShortcut(tr("Ctrl+E"));
aShuffle->setText(tr("&Shuffle"));
aShuffle->setShortcut(tr("Ctrl+S"));
handMenu->setTitle(tr("&Hand"));
sbMenu->setTitle(tr("&Sideboard"));
libraryMenu->setTitle(tr("&Library"));
}
}
void Player::actMoveHandToTopLibrary() void Player::actMoveHandToTopLibrary()
{ {
zones.findZone("hand")->moveAllToZone("deck", 0); zones.findZone("hand")->moveAllToZone("deck", 0);

View file

@ -43,7 +43,7 @@ private slots:
void actViewRfg(); void actViewRfg();
void actViewSideboard(); void actViewSideboard();
private: private:
QMenu *playerMenu; QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu;
QAction *aMoveHandToTopLibrary, *aMoveHandToBottomLibrary, QAction *aMoveHandToTopLibrary, *aMoveHandToBottomLibrary,
*aViewLibrary, *aViewTopCards, *aViewGraveyard, *aViewRfg, *aViewSideboard, *aViewLibrary, *aViewTopCards, *aViewGraveyard, *aViewRfg, *aViewSideboard,
*aDrawCard, *aDrawCards, *aShuffle; *aDrawCard, *aDrawCards, *aShuffle;
@ -63,6 +63,7 @@ public:
void addZone(CardZone *z); void addZone(CardZone *z);
Player(const QString &_name, int _id, QPointF _base, bool _local, CardDatabase *_db, Client *_client, QGraphicsScene *_scene, Game *_parent); Player(const QString &_name, int _id, QPointF _base, bool _local, CardDatabase *_db, Client *_client, QGraphicsScene *_scene, Game *_parent);
~Player(); ~Player();
void retranslateUi();
QMenu *getPlayerMenu() const { return playerMenu; } QMenu *getPlayerMenu() const { return playerMenu; }
int getId() const { return id; } int getId() const { return id; }
QString getName() const { return name; } QString getName() const { return name; }

View file

@ -17,7 +17,7 @@ ServerEventData::ServerEventData(const QString &line)
eventHash.insert("setup_zones", eventSetupZones); eventHash.insert("setup_zones", eventSetupZones);
eventHash.insert("game_start", eventGameStart); eventHash.insert("game_start", eventGameStart);
eventHash.insert("shuffle", eventShuffle); eventHash.insert("shuffle", eventShuffle);
eventHash.insert("roll_dice", eventRollDice); eventHash.insert("roll_die", eventRollDie);
eventHash.insert("draw", eventDraw); eventHash.insert("draw", eventDraw);
eventHash.insert("move_card", eventMoveCard); eventHash.insert("move_card", eventMoveCard);
eventHash.insert("create_token", eventCreateToken); eventHash.insert("create_token", eventCreateToken);

View file

@ -15,7 +15,7 @@ enum ServerEventType {
eventSetupZones, eventSetupZones,
eventGameStart, eventGameStart,
eventShuffle, eventShuffle,
eventRollDice, eventRollDie,
eventDraw, eventDraw,
eventMoveCard, eventMoveCard,
eventCreateToken, eventCreateToken,

View file

@ -219,6 +219,8 @@ void MainWindow::retranslateUi()
cardInfo->retranslateUi(); cardInfo->retranslateUi();
chatWidget->retranslateUi(); chatWidget->retranslateUi();
gameSelector->retranslateUi(); gameSelector->retranslateUi();
if (game)
game->retranslateUi();
} }
void MainWindow::createActions() void MainWindow::createActions()

File diff suppressed because it is too large Load diff

View file

@ -73,12 +73,12 @@
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/chatwidget.cpp" line="107"/> <location filename="../src/chatwidget.cpp" line="106"/>
<source>Channel</source> <source>Channel</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/chatwidget.cpp" line="108"/> <location filename="../src/chatwidget.cpp" line="107"/>
<source>Players</source> <source>Players</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -250,222 +250,222 @@
<context> <context>
<name>Game</name> <name>Game</name>
<message> <message>
<location filename="../src/game.cpp" line="26"/> <location filename="../src/game.cpp" line="128"/>
<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/game.cpp" line="27"/> <location filename="../src/game.cpp" line="129"/>
<source>Ctrl+U</source> <source>Ctrl+U</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="30"/> <location filename="../src/game.cpp" line="130"/>
<source>&amp;Decrement life</source> <source>&amp;Decrement life</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="31"/> <location filename="../src/game.cpp" line="131"/>
<source>F11</source> <source>F11</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="33"/> <location filename="../src/game.cpp" line="132"/>
<source>&amp;Increment life</source> <source>&amp;Increment life</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="34"/> <location filename="../src/game.cpp" line="133"/>
<source>F12</source> <source>F12</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="36"/> <location filename="../src/game.cpp" line="134"/>
<source>&amp;Set life</source> <source>&amp;Set life</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="37"/> <location filename="../src/game.cpp" line="135"/>
<source>Ctrl+L</source> <source>Ctrl+L</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="40"/> <location filename="../src/game.cpp" line="137"/>
<source>R&amp;oll dice...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/game.cpp" line="41"/>
<source>Ctrl+I</source> <source>Ctrl+I</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="44"/> <location filename="../src/game.cpp" line="138"/>
<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/game.cpp" line="45"/> <location filename="../src/game.cpp" line="139"/>
<source>Ctrl+T</source> <source>Ctrl+T</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="48"/> <location filename="../src/game.cpp" line="140"/>
<source>Next &amp;phase</source> <source>Next &amp;phase</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="49"/> <location filename="../src/game.cpp" line="141"/>
<source>Ctrl+Space</source> <source>Ctrl+Space</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="51"/> <location filename="../src/game.cpp" line="142"/>
<source>Next &amp;turn</source> <source>Next &amp;turn</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="52"/> <location filename="../src/game.cpp" line="143"/>
<source>Ctrl+Enter</source> <source>Ctrl+Enter</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="52"/> <location filename="../src/game.cpp" line="143"/>
<source>Ctrl+Return</source> <source>Ctrl+Return</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="68"/> <location filename="../src/game.cpp" line="145"/>
<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/game.cpp" line="71"/> <location filename="../src/game.cpp" line="147"/>
<source>&amp;Tap</source> <source>&amp;Tap</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="72"/> <location filename="../src/game.cpp" line="148"/>
<source>&amp;Untap</source> <source>&amp;Untap</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="73"/> <location filename="../src/game.cpp" line="149"/>
<source>Toggle &amp;normal untapping</source> <source>Toggle &amp;normal untapping</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="74"/> <location filename="../src/game.cpp" line="150"/>
<source>&amp;Flip</source> <source>&amp;Flip</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="75"/> <location filename="../src/game.cpp" line="151"/>
<source>&amp;Add counter</source> <source>&amp;Add counter</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="76"/> <location filename="../src/game.cpp" line="152"/>
<source>&amp;Remove counter</source> <source>&amp;Remove counter</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="77"/> <location filename="../src/game.cpp" line="153"/>
<source>&amp;Set counters...</source> <source>&amp;Set counters...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="79"/> <location filename="../src/game.cpp" line="154"/>
<source>&amp;top of library</source> <source>&amp;top of library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="80"/> <location filename="../src/game.cpp" line="155"/>
<source>&amp;bottom of library</source> <source>&amp;bottom of library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="81"/> <location filename="../src/game.cpp" line="156"/>
<source>&amp;graveyard</source> <source>&amp;graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="82"/> <location filename="../src/game.cpp" line="157"/>
<source>&amp;exile</source> <source>&amp;exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="94"/> <location filename="../src/game.cpp" line="159"/>
<source>&amp;Move to</source> <source>&amp;Move to</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="143"/> <location filename="../src/game.cpp" line="176"/>
<source>F5</source> <source>F5</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="144"/> <location filename="../src/game.cpp" line="177"/>
<source>F6</source> <source>F6</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="145"/> <location filename="../src/game.cpp" line="178"/>
<source>F7</source> <source>F7</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="146"/> <location filename="../src/game.cpp" line="179"/>
<source>F8</source> <source>F8</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="147"/> <location filename="../src/game.cpp" line="180"/>
<source>F9</source> <source>F9</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="148"/> <location filename="../src/game.cpp" line="181"/>
<source>F10</source> <source>F10</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="343"/> <location filename="../src/game.cpp" line="388"/>
<source>Set life</source> <source>Set life</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="343"/> <location filename="../src/game.cpp" line="388"/>
<source>New life total:</source> <source>New life total:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="351"/> <location filename="../src/game.cpp" line="396"/>
<source>Roll dice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/game.cpp" line="351"/>
<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/game.cpp" line="421"/> <location filename="../src/game.cpp" line="466"/>
<source>Number:</source> <source>Number:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="358"/> <location filename="../src/game.cpp" line="403"/>
<source>Create token</source> <source>Create token</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="358"/> <location filename="../src/game.cpp" line="136"/>
<source>R&amp;oll die...</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/game.cpp" line="396"/>
<source>Roll die</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/game.cpp" line="403"/>
<source>Name:</source> <source>Name:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/game.cpp" line="421"/> <location filename="../src/game.cpp" line="466"/>
<source>Set counters</source> <source>Set counters</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -694,287 +694,357 @@
<context> <context>
<name>MessageLogWidget</name> <name>MessageLogWidget</name>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="16"/> <location filename="../src/messagelogwidget.cpp" line="39"/>
<source>Connecting to %1...</source> <source>Connecting to %1...</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="21"/> <location filename="../src/messagelogwidget.cpp" line="44"/>
<source>Connected.</source> <source>Connected.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="30"/> <location filename="../src/messagelogwidget.cpp" line="53"/>
<source>Disconnected from server.</source> <source>Disconnected from server.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="41"/> <location filename="../src/messagelogwidget.cpp" line="64"/>
<source>Invalid password.</source> <source>Invalid password.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="49"/> <location filename="../src/messagelogwidget.cpp" line="72"/>
<source>You have joined the game. Player list:</source> <source>You have joined the game. Player list:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="57"/> <location filename="../src/messagelogwidget.cpp" line="80"/>
<source>%1 has joined the game</source> <source>%1 has joined the game</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="62"/> <location filename="../src/messagelogwidget.cpp" line="85"/>
<source>%1 has left the game</source> <source>%1 has left the game</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="67"/> <location filename="../src/messagelogwidget.cpp" line="90"/>
<source>%1 is ready to start a new game.</source> <source>%1 is ready to start a new game.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message>
<location filename="../src/messagelogwidget.cpp" line="72"/>
<source>Game has started.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="82"/>
<source>%1 shuffles his/her library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="87"/>
<source>%1 rolled a %2 with a %3-sided dice</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="93"/>
<source>%1 draws a card</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="95"/>
<source>%1 draws %2 cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="144"/>
<source>a card</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="106"/>
<source>from table</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="108"/>
<source>from graveyard</source>
<translation type="unfinished"></translation>
</message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="110"/> <location filename="../src/messagelogwidget.cpp" line="110"/>
<source>from exile</source> <source>%1 rolls a %2 with a %3-sided die.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="112"/>
<source>from hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="115"/>
<source>from the bottom of his library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="117"/>
<source>from the top of his library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="119"/>
<source>from library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="121"/>
<source>from sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="125"/>
<source>%1 puts %2 into play %3</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="127"/>
<source>%1 puts %2 %3 into graveyard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="129"/>
<source>%1 exiles %2 %3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="131"/> <location filename="../src/messagelogwidget.cpp" line="131"/>
<source>%1 moves %2 %3 to hand</source> <source> from table</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="134"/> <location filename="../src/messagelogwidget.cpp" line="133"/>
<source>%1 puts %2 %3 into his library</source> <source> from graveyard</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="136"/> <location filename="../src/messagelogwidget.cpp" line="135"/>
<source>%1 puts %2 %3 on bottom of his library</source> <source> from exile</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="138"/> <location filename="../src/messagelogwidget.cpp" line="137"/>
<source>%1 puts %2 %3 on top of his library</source> <source> from hand</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="140"/> <location filename="../src/messagelogwidget.cpp" line="141"/>
<source>%1 puts %2 %3 into his library at position %4</source> <source>the bottom card of his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="142"/> <location filename="../src/messagelogwidget.cpp" line="144"/>
<source>%1 moves %2 %3 to sideboard</source> <source> from the bottom of his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="197"/> <location filename="../src/messagelogwidget.cpp" line="147"/>
<source>%1 stops looking at %2&apos;s %3</source> <source>the top card of his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="203"/> <location filename="../src/messagelogwidget.cpp" line="150"/>
<source>It is now %1&apos;s turn.</source> <source> from the top of his library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="211"/> <location filename="../src/messagelogwidget.cpp" line="152"/>
<source>untap step</source> <source> from library</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="212"/> <location filename="../src/messagelogwidget.cpp" line="154"/>
<source>upkeep step</source> <source> from sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="213"/>
<source>draw step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="214"/>
<source>first main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="215"/>
<source>beginning of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="216"/>
<source>declare attackers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="217"/>
<source>declare blockers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="218"/>
<source>combat damage step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="219"/>
<source>end of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="220"/>
<source>second main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="221"/>
<source>end of turn step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="223"/>
<source>It is now the %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="149"/>
<source>%1 creates token: %2</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="156"/>
<source>%1 places %2 counters on %3 (now %4)</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="158"/> <location filename="../src/messagelogwidget.cpp" line="158"/>
<source>%1 removes %2 counters from %3 (now %4)</source> <source>%1 puts %2 into play%3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="160"/>
<source>%1 puts %2%3 into graveyard.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="162"/>
<source>%1 exiles %2%3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="164"/>
<source>%1 moves %2%3 to hand.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="167"/>
<source>%1 puts %2%3 into his library.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="169"/> <location filename="../src/messagelogwidget.cpp" line="169"/>
<source>%1 %2 %3</source> <source>%1 puts %2%3 on bottom of his library.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="169"/> <location filename="../src/messagelogwidget.cpp" line="171"/>
<source>taps</source> <source>%1 puts %2%3 on top of his library.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="169"/> <location filename="../src/messagelogwidget.cpp" line="173"/>
<source>untaps</source> <source>%1 puts %2%3 into his library at position %4.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="174"/> <location filename="../src/messagelogwidget.cpp" line="175"/>
<source>%1 sets counter &quot;%2&quot; to %3 (%4%5)</source> <source>%1 moves %2%3 to sideboard.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="181"/> <location filename="../src/messagelogwidget.cpp" line="181"/>
<source>%1 sets %2 to not untap normally.</source> <source>a card</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="183"/> <location filename="../src/messagelogwidget.cpp" line="231"/>
<source>%1 sets %2 to untap normally.</source> <source>%1 is looking at the top %2 cards %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="19"/>
<source>of his hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="19"/>
<source>of %1&apos;s hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="20"/>
<source>his hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="20"/>
<source>%1&apos;s hand</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="25"/>
<source>of his library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="25"/>
<source>of %1&apos;s library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="26"/>
<source>his library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="26"/>
<source>%1&apos;s library</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="31"/>
<source>of his sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="31"/>
<source>of %1&apos;s sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="32"/>
<source>his sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="32"/>
<source>%1&apos;s sideboard</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="95"/>
<source>The game has started.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="116"/>
<source>%1 draws a card.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="118"/>
<source>%1 draws %2 cards.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="190"/> <location filename="../src/messagelogwidget.cpp" line="190"/>
<source>%1 is looking at the top %2 cards of %3&apos;s %4</source> <source>%1 creates token: %2.</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="192"/> <location filename="../src/messagelogwidget.cpp" line="197"/>
<source>%1 is looking at %2&apos;s %3</source> <source>%1 places %2 counters on %3 (now %4).</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/messagelogwidget.cpp" line="166"/> <location filename="../src/messagelogwidget.cpp" line="199"/>
<source>%1 removes %2 counters from %3 (now %4).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="210"/>
<source>%1 %2 %3.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="215"/>
<source>%1 sets counter &quot;%2&quot; to %3 (%4%5).</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="233"/>
<source>%1 is looking at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="239"/>
<source>%1 stops looking at %2.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="263"/>
<source>ending phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="245"/>
<source>It is now %1&apos;s turn.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="105"/>
<source>%1 shuffles his library.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="253"/>
<source>untap step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="254"/>
<source>upkeep step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="255"/>
<source>draw step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="256"/>
<source>first main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="257"/>
<source>beginning of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="258"/>
<source>declare attackers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="259"/>
<source>declare blockers step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="260"/>
<source>combat damage step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="261"/>
<source>end of combat step</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="262"/>
<source>second main phase</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="265"/>
<source>It is now the %1.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="210"/>
<source>taps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="210"/>
<source>untaps</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="222"/>
<source>%1 sets %2 to not untap normally.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="224"/>
<source>%1 sets %2 to untap normally.</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/messagelogwidget.cpp" line="207"/>
<source>his permanents</source> <source>his permanents</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
@ -1063,127 +1133,127 @@
<context> <context>
<name>Player</name> <name>Player</name>
<message> <message>
<location filename="../src/player.cpp" line="20"/> <location filename="../src/player.cpp" line="108"/>
<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="22"/> <location filename="../src/player.cpp" line="109"/>
<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="25"/> <location filename="../src/player.cpp" line="110"/>
<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="26"/> <location filename="../src/player.cpp" line="111"/>
<source>F3</source> <source>F3</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="28"/> <location filename="../src/player.cpp" line="112"/>
<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="32"/> <location filename="../src/player.cpp" line="101"/>
<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="34"/> <location filename="../src/player.cpp" line="113"/>
<source>F4</source> <source>F4</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>
<message> <message>
<location filename="../src/player.cpp" line="37"/> <location filename="../src/player.cpp" line="114"/>
<source>&amp;View removed cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="41"/>
<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="55"/> <location filename="../src/player.cpp" line="103"/>
<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="58"/> <location filename="../src/player.cpp" line="122"/>
<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="63"/> <location filename="../src/player.cpp" line="124"/>
<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="74"/> <location filename="../src/player.cpp" line="104"/>
<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="78"/> <location filename="../src/player.cpp" line="123"/>
<source>&amp;Removed cards</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="83"/>
<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="117"/> <location filename="../src/player.cpp" line="146"/>
<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="117"/> <location filename="../src/player.cpp" line="146"/>
<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="44"/> <location filename="../src/player.cpp" line="115"/>
<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="46"/> <location filename="../src/player.cpp" line="102"/>
<source>&amp;View exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="105"/>
<source>&amp;Exile</source>
<translation type="unfinished"></translation>
</message>
<message>
<location filename="../src/player.cpp" line="116"/>
<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="47"/> <location filename="../src/player.cpp" line="117"/>
<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="49"/> <location filename="../src/player.cpp" line="118"/>
<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="50"/> <location filename="../src/player.cpp" line="119"/>
<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="52"/> <location filename="../src/player.cpp" line="120"/>
<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="151"/> <location filename="../src/player.cpp" line="180"/>
<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="151"/> <location filename="../src/player.cpp" line="180"/>
<source>Number:</source> <source>Number:</source>
<translation type="unfinished"></translation> <translation type="unfinished"></translation>
</message> </message>

View file

@ -219,7 +219,7 @@ const ServerSocket::CommandProperties ServerSocket::commandList[ServerSocket::nu
<< QVariant::Int, &ServerSocket::cmdDumpZone}, << QVariant::Int, &ServerSocket::cmdDumpZone},
{"stop_dump_zone", true, true, true, QList<QVariant::Type>() << QVariant::Int {"stop_dump_zone", true, true, true, QList<QVariant::Type>() << QVariant::Int
<< QVariant::String, &ServerSocket::cmdStopDumpZone}, << QVariant::String, &ServerSocket::cmdStopDumpZone},
{"roll_dice", true, true, true, QList<QVariant::Type>() << QVariant::Int, &ServerSocket::cmdRollDice}, {"roll_die", true, true, true, QList<QVariant::Type>() << QVariant::Int, &ServerSocket::cmdRollDie},
{"next_turn", true, true, true, QList<QVariant::Type>(), &ServerSocket::cmdNextTurn}, {"next_turn", true, true, true, QList<QVariant::Type>(), &ServerSocket::cmdNextTurn},
{"set_active_phase", true, true, true, QList<QVariant::Type>() << QVariant::Int, &ServerSocket::cmdSetActivePhase} {"set_active_phase", true, true, true, QList<QVariant::Type>() << QVariant::Int, &ServerSocket::cmdSetActivePhase}
}; };
@ -662,10 +662,10 @@ ReturnMessage::ReturnCode ServerSocket::cmdStopDumpZone(const QList<QVariant> &p
return ReturnMessage::ReturnOk; return ReturnMessage::ReturnOk;
} }
ReturnMessage::ReturnCode ServerSocket::cmdRollDice(const QList<QVariant> &params) ReturnMessage::ReturnCode ServerSocket::cmdRollDie(const QList<QVariant> &params)
{ {
int sides = params[0].toInt(); int sides = params[0].toInt();
emit broadcastEvent(QString("roll_dice|%1|%2").arg(sides).arg(server->getRNG()->getNumber(1, sides)), this); emit broadcastEvent(QString("roll_die|%1|%2").arg(sides).arg(server->getRNG()->getNumber(1, sides)), this);
return ReturnMessage::ReturnOk; return ReturnMessage::ReturnOk;
} }

View file

@ -86,7 +86,7 @@ private:
ReturnMessage::ReturnCode cmdListZones(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdListZones(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdDumpZone(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdDumpZone(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdStopDumpZone(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdStopDumpZone(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdRollDice(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdRollDie(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdNextTurn(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdNextTurn(const QList<QVariant> &params);
ReturnMessage::ReturnCode cmdSetActivePhase(const QList<QVariant> &params); ReturnMessage::ReturnCode cmdSetActivePhase(const QList<QVariant> &params);