diff --git a/cockatrice/cockatrice.pro b/cockatrice/cockatrice.pro index 03ceb383..648d6d10 100644 --- a/cockatrice/cockatrice.pro +++ b/cockatrice/cockatrice.pro @@ -63,6 +63,7 @@ HEADERS += src/counter.h \ src/localserver.h \ src/localserverinterface.h \ src/localclient.h \ + src/translation.h \ ../common/color.h \ ../common/serializable_item.h \ ../common/decklist.h \ diff --git a/cockatrice/src/cardzone.cpp b/cockatrice/src/cardzone.cpp index 73f41393..6052f34e 100644 --- a/cockatrice/src/cardzone.cpp +++ b/cockatrice/src/cardzone.cpp @@ -48,33 +48,33 @@ QString CardZone::getTranslatedName(bool hisOwn, GrammaticalCase gc) const QString ownerName = player->getName(); if (name == "hand") switch (gc) { - case CaseNominative: return hisOwn ? tr("his hand") : tr("%1's hand").arg(ownerName); - case CaseGenitive: return hisOwn ? tr("of his hand") : tr("of %1's hand").arg(ownerName); - case CaseAccusative: return hisOwn ? tr("his hand") : tr("%1's hand").arg(ownerName); + case CaseNominative: return hisOwn ? tr("his hand", "nominative") : tr("%1's hand", "nominative").arg(ownerName); + case CaseGenitive: return hisOwn ? tr("of his hand", "genitive") : tr("of %1's hand", "genitive").arg(ownerName); + case CaseAccusative: return hisOwn ? tr("his hand", "accusative") : tr("%1's hand", "accusative").arg(ownerName); } else if (name == "deck") switch (gc) { - case CaseNominative: return hisOwn ? tr("his library") : tr("%1's library").arg(ownerName); - case CaseGenitive: return hisOwn ? tr("of his library") : tr("of %1's library").arg(ownerName); - case CaseAccusative: return hisOwn ? tr("his library") : tr("%1's library").arg(ownerName); + case CaseNominative: return hisOwn ? tr("his library", "nominative") : tr("%1's library", "nominative").arg(ownerName); + case CaseGenitive: return hisOwn ? tr("of his library", "genitive") : tr("of %1's library", "genitive").arg(ownerName); + case CaseAccusative: return hisOwn ? tr("his library", "accusative") : tr("%1's library", "accusative").arg(ownerName); } else if (name == "grave") switch (gc) { - case CaseNominative: return hisOwn ? tr("his graveyard") : tr("%1's graveyard").arg(ownerName); - case CaseGenitive: return hisOwn ? tr("of his graveyard") : tr("of %1's graveyard").arg(ownerName); - case CaseAccusative: return hisOwn ? tr("his graveyard") : tr("%1's graveyard").arg(ownerName); + case CaseNominative: return hisOwn ? tr("his graveyard", "nominative") : tr("%1's graveyard", "nominative").arg(ownerName); + case CaseGenitive: return hisOwn ? tr("of his graveyard", "genitive") : tr("of %1's graveyard", "genitive").arg(ownerName); + case CaseAccusative: return hisOwn ? tr("his graveyard", "accusative") : tr("%1's graveyard", "accusative").arg(ownerName); } else if (name == "rfg") switch (gc) { - case CaseNominative: return hisOwn ? tr("his exile") : tr("%1's exile").arg(ownerName); - case CaseGenitive: return hisOwn ? tr("of his exile") : tr("of %1's exile").arg(ownerName); - case CaseAccusative: return hisOwn ? tr("his exile") : tr("%1's exile").arg(ownerName); + case CaseNominative: return hisOwn ? tr("his exile", "nominative") : tr("%1's exile", "nominative").arg(ownerName); + case CaseGenitive: return hisOwn ? tr("of his exile", "genitive") : tr("of %1's exile", "genitive").arg(ownerName); + case CaseAccusative: return hisOwn ? tr("his exile", "accusative") : tr("%1's exile", "accusative").arg(ownerName); } else if (name == "sb") switch (gc) { - case CaseNominative: return hisOwn ? tr("his sideboard") : tr("%1's sideboard").arg(ownerName); - case CaseGenitive: return hisOwn ? tr("of his sideboard") : tr("of %1's sideboard").arg(ownerName); - case CaseAccusative: return hisOwn ? tr("his sideboard") : tr("%1's sideboard").arg(ownerName); + case CaseNominative: return hisOwn ? tr("his sideboard", "nominative") : tr("%1's sideboard", "nominative").arg(ownerName); + case CaseGenitive: return hisOwn ? tr("of his sideboard", "genitive") : tr("of %1's sideboard", "genitive").arg(ownerName); + case CaseAccusative: return hisOwn ? tr("his sideboard", "accusative") : tr("%1's sideboard", "accusative").arg(ownerName); } return QString(); } diff --git a/cockatrice/src/gamescene.cpp b/cockatrice/src/gamescene.cpp index 972dfcf4..a7309b78 100644 --- a/cockatrice/src/gamescene.cpp +++ b/cockatrice/src/gamescene.cpp @@ -89,6 +89,15 @@ void GameScene::toggleZoneView(Player *player, const QString &zoneName, int numb item->setPos(100, 100); } +void GameScene::addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList) +{ + ZoneViewWidget *item = new ZoneViewWidget(player, zone, -2, cardList); + views.append(item); + connect(item, SIGNAL(closePressed(ZoneViewWidget *)), this, SLOT(removeZoneView(ZoneViewWidget *))); + addItem(item); + item->setPos(100, 100); +} + void GameScene::removeZoneView(ZoneViewWidget *item) { views.removeAt(views.indexOf(item)); diff --git a/cockatrice/src/gamescene.h b/cockatrice/src/gamescene.h index f56250b4..7756cb5c 100644 --- a/cockatrice/src/gamescene.h +++ b/cockatrice/src/gamescene.h @@ -6,6 +6,8 @@ class Player; class ZoneViewWidget; +class CardZone; +class ServerInfo_Card; class GameScene : public QGraphicsScene { Q_OBJECT @@ -23,6 +25,7 @@ public: void processViewSizeChange(const QSize &newSize); public slots: void toggleZoneView(Player *player, const QString &zoneName, int numberCards); + void addRevealedZoneView(Player *player, CardZone *zone, const QList &cardList); void removeZoneView(ZoneViewWidget *item); void addPlayer(Player *player); void removePlayer(Player *player); diff --git a/cockatrice/src/messagelogwidget.cpp b/cockatrice/src/messagelogwidget.cpp index c98641ff..bab79039 100644 --- a/cockatrice/src/messagelogwidget.cpp +++ b/cockatrice/src/messagelogwidget.cpp @@ -138,14 +138,11 @@ void MessageLogWidget::logDrawCards(Player *player, int 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) +QPair MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const { - QString startName = startZone->getName(); - QString targetName = targetZone->getName(); - if (((startName == "table") && (targetName == "table")) || ((startName == "hand") && (targetName == "hand"))) - return; - QString fromStr; bool cardNameContainsStartZone = false; + QString fromStr; + QString startName = zone->getName(); if (startName == "table") fromStr = tr(" from table"); @@ -156,13 +153,13 @@ void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *s else if (startName == "hand") fromStr = tr(" from hand"); else if (startName == "deck") { - if (oldX == startZone->getCards().size() - 1) { + if (position == zone->getCards().size() - 1) { if (cardName.isEmpty()) { cardName = tr("the bottom card of his library"); cardNameContainsStartZone = true; } else fromStr = tr(" from the bottom of his library"); - } else if (oldX == 0) { + } else if (position == 0) { if (cardName.isEmpty()) { cardName = tr("the top card of his library"); cardNameContainsStartZone = true; @@ -172,6 +169,25 @@ void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *s fromStr = tr(" from library"); } else if (startName == "sb") fromStr = tr(" from sideboard"); + + if (!cardNameContainsStartZone) + cardName.clear(); + return QPair(cardName, fromStr); +} + +void MessageLogWidget::logMoveCard(Player *player, QString cardName, CardZone *startZone, int oldX, CardZone *targetZone, int newX) +{ + QString startName = startZone->getName(); + QString targetName = targetZone->getName(); + if (((startName == "table") && (targetName == "table")) || ((startName == "hand") && (targetName == "hand"))) + return; + QPair temp = getFromStr(startZone, cardName, oldX); + bool cardNameContainsStartZone = false; + if (!temp.first.isEmpty()) { + cardNameContainsStartZone = true; + cardName = temp.first; + } + QString fromStr = temp.second; QString finalStr; if (targetName == "table") @@ -321,6 +337,42 @@ void MessageLogWidget::logStopDumpZone(Player *player, CardZone *zone) append(tr("%1 stops looking at %2.").arg(sanitizeHtml(player->getName())).arg(zoneName)); } +void MessageLogWidget::logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer) +{ + QPair temp = getFromStr(zone, cardName, cardId); + bool cardNameContainsStartZone = false; + if (!temp.first.isEmpty()) { + cardNameContainsStartZone = true; + cardName = temp.first; + } + QString fromStr = temp.second; + + QString cardStr; + if (cardNameContainsStartZone) + cardStr = cardName; + else if (cardName.isEmpty()) + cardStr = tr("a card"); + else + cardStr = QString("%1").arg(sanitizeHtml(cardName)); + + if (cardId == -1) { + if (otherPlayer) + append(tr("%1 reveals %2 to %3.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative)).arg(sanitizeHtml(otherPlayer->getName()))); + else + append(tr("%1 reveals %2.").arg(sanitizeHtml(player->getName())).arg(zone->getTranslatedName(true, CaseAccusative))); + } else if (cardId == -2) { + if (otherPlayer) + append(tr("%1 randomly reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + else + append(tr("%1 randomly reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + } else { + if (otherPlayer) + append(tr("%1 reveals %2%3 to %4.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr).arg(sanitizeHtml(otherPlayer->getName()))); + else + append(tr("%1 reveals %2%3.").arg(sanitizeHtml(player->getName())).arg(cardStr).arg(fromStr)); + } +} + void MessageLogWidget::logSetActivePlayer(Player *player) { append("---"); @@ -368,6 +420,7 @@ void MessageLogWidget::connectToPlayer(Player *player) connect(player, SIGNAL(logDumpZone(Player *, CardZone *, int)), this, SLOT(logDumpZone(Player *, CardZone *, int))); connect(player, SIGNAL(logStopDumpZone(Player *, CardZone *)), this, SLOT(logStopDumpZone(Player *, CardZone *))); connect(player, SIGNAL(logDrawCards(Player *, int)), this, SLOT(logDrawCards(Player *, int))); + connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *))); } MessageLogWidget::MessageLogWidget(QWidget *parent) @@ -379,12 +432,12 @@ MessageLogWidget::MessageLogWidget(QWidget *parent) setFont(f); } -void MessageLogWidget::enterEvent(QEvent *event) +void MessageLogWidget::enterEvent(QEvent * /*event*/) { setMouseTracking(true); } -void MessageLogWidget::leaveEvent(QEvent *event) +void MessageLogWidget::leaveEvent(QEvent * /*event*/) { setMouseTracking(false); } diff --git a/cockatrice/src/messagelogwidget.h b/cockatrice/src/messagelogwidget.h index 0640daa0..2cd2a375 100644 --- a/cockatrice/src/messagelogwidget.h +++ b/cockatrice/src/messagelogwidget.h @@ -17,7 +17,7 @@ class MessageLogWidget : public QTextEdit { private: CardInfoWidget *infoWidget; QString sanitizeHtml(QString dirty) const; - QString trZoneName(CardZone *zone, Player *player, bool hisOwn, GrammaticalCase gc) const; + QPair getFromStr(CardZone *zone, QString cardName, int position) const; QString getCardNameUnderMouse(const QPoint &pos) const; signals: void cardNameHovered(QString cardName); @@ -62,6 +62,7 @@ public slots: void logSetAnnotation(Player *player, QString cardName, QString newAnnotation); void logDumpZone(Player *player, CardZone *zone, int numberCards); void logStopDumpZone(Player *player, CardZone *zone); + void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer); void logSetActivePlayer(Player *player); void logSetActivePhase(int phase); public: diff --git a/cockatrice/src/player.cpp b/cockatrice/src/player.cpp index 430d3e29..5cfa5b83 100644 --- a/cockatrice/src/player.cpp +++ b/cockatrice/src/player.cpp @@ -223,6 +223,15 @@ Player::Player(ServerInfo_User *info, int _id, bool _local, TabGame *_parent) aCardMenu = new QAction(this); playerMenu->addSeparator(); playerMenu->addAction(aCardMenu); + + for (int i = 0; i < playerLists.size(); ++i) { + QAction *newAction = playerLists[i]->addAction(QString()); + newAction->setData(-1); + connect(newAction, SIGNAL(triggered()), this, SLOT(playerListActionTriggered())); + allPlayersActions.append(newAction); + playerLists[i]->addSeparator(); + } + } else { countersMenu = 0; sbMenu = 0; @@ -286,6 +295,12 @@ void Player::playerListActionTriggered() if (menu == mRevealLibrary) { sendGameCommand(new Command_RevealCards(-1, "deck", -1, otherPlayerId)); + } else if (menu == mRevealTopCard) { + sendGameCommand(new Command_RevealCards(-1, "deck", 0, otherPlayerId)); + } else if (menu == mRevealHand) { + sendGameCommand(new Command_RevealCards(-1, "hand", -1, otherPlayerId)); + } else if (menu == mRevealRandomHandCard) { + sendGameCommand(new Command_RevealCards(-1, "hand", -2, otherPlayerId)); } } @@ -384,6 +399,9 @@ void Player::retranslateUi() counterIterator.next().value()->retranslateUi(); aCardMenu->setText(tr("C&ard")); + + for (int i = 0; i < allPlayersActions.size(); ++i) + allPlayersActions[i]->setText(tr("&All players")); } QMapIterator zoneIterator(zones); @@ -880,6 +898,28 @@ void Player::eventDrawCards(Event_DrawCards *event) emit logDrawCards(this, event->getNumberCards()); } +void Player::eventRevealCards(Event_RevealCards *event) +{ + CardZone *zone = zones.value(event->getZoneName()); + if (!zone) + return; + Player *otherPlayer = 0; + if (event->getOtherPlayerId() != -1) { + otherPlayer = static_cast(parent())->getPlayers().value(event->getOtherPlayerId()); + if (!otherPlayer) + return; + } + + QList cardList = event->getCardList(); + if (!cardList.isEmpty()) + static_cast(scene())->addRevealedZoneView(this, zone, cardList); + + QString cardName; + if (cardList.size() == 1) + cardName = cardList.first()->getName(); + emit logRevealCards(this, zone, event->getCardId(), cardName, otherPlayer); +} + void Player::processGameEvent(GameEvent *event, GameEventContext *context) { qDebug() << "player event: id=" << event->getItemId(); @@ -902,6 +942,7 @@ void Player::processGameEvent(GameEvent *event, GameEventContext *context) case ItemId_Event_DestroyCard: eventDestroyCard(qobject_cast(event)); break; case ItemId_Event_AttachCard: eventAttachCard(qobject_cast(event)); break; case ItemId_Event_DrawCards: eventDrawCards(qobject_cast(event)); break; + case ItemId_Event_RevealCards: eventRevealCards(qobject_cast(event)); break; default: { qDebug() << "unhandled game event"; } diff --git a/cockatrice/src/player.h b/cockatrice/src/player.h index 2a5a581b..56589995 100644 --- a/cockatrice/src/player.h +++ b/cockatrice/src/player.h @@ -43,6 +43,7 @@ class Event_FlipCard; class Event_DestroyCard; class Event_AttachCard; class Event_DrawCards; +class Event_RevealCards; class Player : public QObject, public QGraphicsItem { Q_OBJECT @@ -68,6 +69,7 @@ signals: void logSetAnnotation(Player *player, QString cardName, QString newAnnotation); void logDumpZone(Player *player, CardZone *zone, int numberCards); void logStopDumpZone(Player *player, CardZone *zone); + void logRevealCards(Player *player, CardZone *zone, int cardId, QString cardName, Player *otherPlayer); void sizeChanged(); public slots: @@ -109,6 +111,7 @@ private: QMenu *playerMenu, *handMenu, *graveMenu, *rfgMenu, *libraryMenu, *sbMenu, *countersMenu, *sayMenu, *mRevealLibrary, *mRevealTopCard, *mRevealHand, *mRevealRandomHandCard; QList playerLists; + QList allPlayersActions; QAction *aMoveHandToTopLibrary, *aMoveHandToBottomLibrary, *aMoveHandToGrave, *aMoveHandToRfg, *aMoveGraveToTopLibrary, *aMoveGraveToBottomLibrary, *aMoveGraveToHand, *aMoveGraveToRfg, *aMoveRfgToTopLibrary, *aMoveRfgToBottomLibrary, *aMoveRfgToHand, *aMoveRfgToGrave, @@ -166,6 +169,7 @@ private: void eventDestroyCard(Event_DestroyCard *event); void eventAttachCard(Event_AttachCard *event); void eventDrawCards(Event_DrawCards *event); + void eventRevealCards(Event_RevealCards *event); public: static const int counterAreaWidth = 65; diff --git a/cockatrice/src/zoneviewwidget.cpp b/cockatrice/src/zoneviewwidget.cpp index 39ace6a3..4bca206a 100644 --- a/cockatrice/src/zoneviewwidget.cpp +++ b/cockatrice/src/zoneviewwidget.cpp @@ -9,7 +9,7 @@ #include "protocol_items.h" #include "settingscache.h" -ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards) +ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards, const QList &cardList) : QGraphicsWidget(0, Qt::Tool | Qt::CustomizeWindowHint | Qt::WindowSystemMenuHint | Qt::WindowTitleHint/* | Qt::WindowCloseButtonHint*/), player(_player) { setAttribute(Qt::WA_DeleteOnClose); @@ -21,7 +21,7 @@ ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberC QGraphicsLinearLayout *vbox = new QGraphicsLinearLayout(Qt::Vertical); - if (numberCards == -1) { + if (numberCards < 0) { sortByNameCheckBox = new QCheckBox; QGraphicsProxyWidget *sortByNameProxy = new QGraphicsProxyWidget; sortByNameProxy->setWidget(sortByNameCheckBox); @@ -52,7 +52,7 @@ ZoneViewWidget::ZoneViewWidget(Player *_player, CardZone *_origZone, int numberC connect(zone, SIGNAL(optimumRectChanged()), this, SLOT(resizeToZoneContents())); connect(zone, SIGNAL(beingDeleted()), this, SLOT(zoneDeleted())); vbox->addItem(zone); - zone->initializeCards(); + zone->initializeCards(cardList); if (sortByNameCheckBox) { connect(sortByNameCheckBox, SIGNAL(stateChanged(int)), zone, SLOT(setSortByName(int))); @@ -89,7 +89,8 @@ void ZoneViewWidget::resizeToZoneContents() void ZoneViewWidget::closeEvent(QCloseEvent *event) { disconnect(zone, SIGNAL(beingDeleted()), this, 0); - player->sendGameCommand(new Command_StopDumpZone(-1, player->getId(), zone->getName())); + if (zone->getNumberCards() != -2) + player->sendGameCommand(new Command_StopDumpZone(-1, player->getId(), zone->getName())); if (shuffleCheckBox) if (shuffleCheckBox->isChecked()) player->sendGameCommand(new Command_Shuffle); diff --git a/cockatrice/src/zoneviewwidget.h b/cockatrice/src/zoneviewwidget.h index 6f989ff6..71dcd754 100644 --- a/cockatrice/src/zoneviewwidget.h +++ b/cockatrice/src/zoneviewwidget.h @@ -12,6 +12,7 @@ class CardDatabase; class QScrollBar; class QCheckBox; class GameScene; +class ServerInfo_Card; class ZoneViewWidget : public QGraphicsWidget { Q_OBJECT @@ -29,7 +30,7 @@ private slots: void resizeToZoneContents(); void zoneDeleted(); public: - ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0); + ZoneViewWidget(Player *_player, CardZone *_origZone, int numberCards = 0, const QList &cardList = QList()); ZoneViewZone *getZone() const { return zone; } void retranslateUi(); protected: diff --git a/cockatrice/src/zoneviewzone.cpp b/cockatrice/src/zoneviewzone.cpp index 5f34bd41..91b9f477 100644 --- a/cockatrice/src/zoneviewzone.cpp +++ b/cockatrice/src/zoneviewzone.cpp @@ -26,9 +26,13 @@ void ZoneViewZone::paint(QPainter */*painter*/, const QStyleOptionGraphicsItem * { } -void ZoneViewZone::initializeCards() +void ZoneViewZone::initializeCards(const QList &cardList) { - if (!origZone->contentsKnown()) { + if (!cardList.isEmpty()) { + for (int i = 0; i < cardList.size(); ++i) + addCard(new CardItem(player, cardList[i]->getName(), cardList[i]->getId(), this), false, i); + reorganizeCards(); + } else if (!origZone->contentsKnown()) { Command_DumpZone *command = new Command_DumpZone(-1, player->getId(), name, numberCards); connect(command, SIGNAL(finished(ProtocolResponse *)), this, SLOT(zoneDumpReceived(ProtocolResponse *))); player->sendGameCommand(command); @@ -80,6 +84,7 @@ void ZoneViewZone::reorganizeCards() cols = 2; qDebug() << "reorganizeCards: rows=" << rows << "cols=" << cols; + qDebug() << "SORT BY NAME:" << sortByName << "SORT BY TYPE:" << sortByType; CardList cardsToDisplay(cards); if (sortByName || sortByType) @@ -119,7 +124,6 @@ void ZoneViewZone::addCardImpl(CardItem *card, int x, int /*y*/) void ZoneViewZone::handleDropEvent(int cardId, CardZone *startZone, const QPoint &/*dropPoint*/, bool /*faceDown*/) { - qDebug(QString("handleDropEvent id=%1").arg(cardId).toLatin1()); player->sendGameCommand(new Command_MoveCard(-1, startZone->getName(), cardId, getName(), 0, 0, false)); } diff --git a/cockatrice/src/zoneviewzone.h b/cockatrice/src/zoneviewzone.h index df7e35f6..e331b7a2 100644 --- a/cockatrice/src/zoneviewzone.h +++ b/cockatrice/src/zoneviewzone.h @@ -6,6 +6,7 @@ class ZoneViewWidget; class ProtocolResponse; +class ServerInfo_Card; class ZoneViewZone : public CardZone, public QGraphicsLayoutItem { Q_OBJECT @@ -21,7 +22,7 @@ public: QRectF boundingRect() const; void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget); void reorganizeCards(); - void initializeCards(); + void initializeCards(const QList &cardList = QList()); void removeCard(int position); int getNumberCards() const { return numberCards; } void setGeometry(const QRectF &rect); diff --git a/cockatrice/translations/cockatrice_de.ts b/cockatrice/translations/cockatrice_de.ts index eea5153b..51515f3a 100644 --- a/cockatrice/translations/cockatrice_de.ts +++ b/cockatrice/translations/cockatrice_de.ts @@ -170,112 +170,112 @@ CardItem - + &Tap &Tappen - + &Untap E&nttappen - + Toggle &normal untapping N&ormales Enttappen umschalten - + &Flip &Umdrehen - + &Clone &Kopieren - + &Attach to card... &An Karte anlegen... - + Ctrl+A Ctrl+A - + Unattac&h &Von Karte lösen - + Set &P/T... &Kampfwerte setzen... - + &Set annotation... &Hinweis setzen... - + red rot - + yellow gelb - + green grün - + &Add counter (%1) Zählmarke &hinzufügen (%1) - + &Remove counter (%1) Zählmarke &entfernen (%1) - + &Set counters (%1)... Zählmarken &setzen (%1)... - + &top of library &auf die Bibliothek - + &bottom of library &unter die Bibliothek - + &graveyard in den &Friedhof - + Ctrl+Del Ctrl+Del - + &exile ins &Exil - + &Move to &Verschieben @@ -283,115 +283,325 @@ CardZone - - his hand + seine Hand + + + %1's hand + %1s Hand + + + of his hand + seiner Hand + + + of %1's hand + von %1s Hand + + + his library + seine Bibliothek + + + %1's library + %1s Bibliothek + + + of his library + seiner Bibliothek + + + of %1's library + von %1s Bibliothek + + + his graveyard + sein Friedhof + + + %1's graveyard + %1s Friedhof + + + of his graveyard + seines Friedhofs + + + of %1's graveyard + von %1s Friedhof + + + his exile + sein Exil + + + %1's exile + %1s Exil + + + of his exile + seines Exils + + + of %1's exile + von %1s Exil + + + his sideboard + sein Sideboard + + + %1's sideboard + %1s Sideboard + + + of his sideboard + seines Sideboards + + + of %1's sideboard + von %1s Sideboard + + + + his hand + nominative seine Hand - %1's hand + nominative %1s Hand of his hand + genitive seiner Hand of %1's hand + genitive von %1s Hand - - + + his hand + accusative + seine Hand + + + + %1's hand + accusative + %1s Hand + + + + his hand + from + seiner Hand + + + + %1's hand + from + %1s Hand + + + his library + nominative seine Bibliothek - - + %1's library + nominative %1s Bibliothek - + of his library + genitive seiner Bibliothek - + of %1's library + genitive von %1s Bibliothek - + + his library + accusative + seine Bibliothek + + + + %1's library + accusative + %1s Bibliothek + + + + his library + from + seiner Bibliothek + + + + %1's library + from + %1s Bibliothek + + his graveyard + nominative sein Friedhof - %1's graveyard + nominative %1s Friedhof - + of his graveyard + genitive seines Friedhofs - + of %1's graveyard + genitive von %1s Friedhof - - + + his graveyard + accusative + sein Friedhof + + + + %1's graveyard + accusative + %1s Friedhof + + + + his graveyard + from + seinem Friedhof + + + + %1's graveyard + from + %1s Friedhof + + + his exile + nominative sein Exil - - + %1's exile + nominative %1s Exil - + of his exile + genitive seines Exils - + of %1's exile + genitive von %1s Exil + + + his exile + accusative + sein Exil + + + + %1's exile + accusative + %1s Exil + - + his exile + from + seinem Exil + + + + %1's exile + from + %1s Exil + + + his sideboard + nominative sein Sideboard - - + %1's sideboard + nominative %1s Sideboard - + of his sideboard + genitive seines Sideboards - + of %1's sideboard + genitive von %1s Sideboard + + + his sideboard + accusative + sein Sideboard + + + + %1's sideboard + accusative + %1s Sideboard + + + + his sideboard + from + seinem Sideboard + + + + %1's sideboard + from + %1s Sideboard + ChannelWidget @@ -515,22 +725,22 @@ DeckViewContainer - + Load &local deck &Lokales Deck laden - + Load d&eck from server Deck vom Server l&aden - + Ready to s&tart Bereit zum S&tarten - + Load deck Deck laden @@ -1526,22 +1736,22 @@ MessageLogWidget - + Connecting to %1... Verbinde zu %1... - + Connected. Verbunden. - + Disconnected from server. Verbindung zum Server getrennt. - + Invalid password. Ungültiges Passwort. @@ -1582,7 +1792,8 @@ %1 zieht %2 Karten - + + a card eine Karte @@ -1639,12 +1850,12 @@ %1s Sideboard - + The game has started. Das Spiel hat begonnen. - + %1 shuffles his library. %1 mischt seine Bibliothek. @@ -1661,82 +1872,82 @@ Protokollversion stimmt nicht überein. - + Protocol version mismatch. Client: %1, Server: %2 - + Protocol error. Protokollfehler. - + You have joined game #%1. Sie sind dem Spiel %1 beigetreten. - + %1 has joined the game. %1 ist dem Spiel beigetreten. - + %1 has left the game. %1 hat das Spiel verlassen. - + The game has been closed. Das Spiel wurde geschlossen. - + %1 is now watching the game. %1 schaut nun dem Spiel zu. - + %1 is not watching the game any more. %1 schaut dem Spiel nicht mehr zu. - + %1 has loaded a local deck. %1 hat ein lokales Deck geladen. - + %1 has loaded deck #%2. %1 hat das Deck Nr. %2 geladen. - + %1 is ready to start the game. %1 ist bereit, das Spiel zu starten. - + %1 is not ready to start the game any more. %1 ist nicht mehr bereit, das Spiel zu starten. - + %1 has conceded the game. %1 hat das Spiel aufgegeben. - + %1 rolls a %2 with a %3-sided die. %1 würfelt eine %2 mit einem %3-seitigen Würfel. - + %1 draws a card. %1 zieht eine Karte. - + %1 draws %2 cards. %1 zieht %2 Karten. @@ -1791,96 +2002,116 @@ aus dem Sideboard - + %1 puts %2 into play%3. %1 bringt %2%3 ins Spiel. - + %1 puts %2%3 into graveyard. %1 legt %2%3 auf den Friedhof. - + %1 exiles %2%3. %1 schickt %2%3 ins Exil. - + %1 moves %2%3 to hand. %1 nimmt %2%3 auf die Hand. - + %1 puts %2%3 into his library. %1 legt %2%3 in seine Bibliothek. - + %1 puts %2%3 on bottom of his library. %1 legt %2%3 unter seine Bibliothek. - + %1 puts %2%3 on top of his library. %1 legt %2%3 auf die Bibliothek. - + %1 puts %2%3 into his library at position %4. %1 legt %2%3 in seine Bibliothek an %4. Stelle. - + %1 moves %2%3 to sideboard. %1 legt %2%3 in sein Sideboard. - + %1 flips %2 face-down. %1 wendet %2 auf die Rückseite. - + %1 flips %2 face-up. %1 wendet %2 auf die Vorderseite. - + %1 destroys %2. %1 zerstört %2. - + %1 attaches %2 to %3's %4. %1 legt %2 an %3s %4 an. - + %1 unattaches %2. %1 löst %2 ab. - + %1 creates token: %2%3. %1 erstellt Token: %2%3. - + %1 points from %2's %3 to %4. %1 zeigt von %2s %3 auf %4. + + + %1 randomly reveals %2%3 to %4. + %1 zeigt %4 zufällig %2%3 vor. + + + + %1 randomly reveals %2%3. + %1 zeigt zufällig %2%3 offen vor. + + + + %1 reveals %2%3 to %4. + %1 zeigt %4 %2%3 vor. + + + + %1 reveals %2%3. + %1 zeigt %2%3 offen vor. + %1 creates token: %2 (%3). %1 erstellt einen Spielstein: %2 (%3). - + %1 points from %2's %3 to %4's %5. %1 zeigt von %2s %3 auf %4s %5. - + %1 places %n counter(s) (%2) on %3 (now %4). %1 legt eine Marke (%2) auf %3 (jetzt %4). @@ -1888,7 +2119,7 @@ - + %1 removes %n counter(s) (%2) from %3 (now %4). %1 entfernt eine Marke (%2) von %3 (jetzt %4). @@ -1896,37 +2127,37 @@ - + red rot - + yellow gelb - + green grün - + %1 sets counter %2 to %3 (%4%5). %1 setzt Zähler %2 auf %3 (%4%5). - + %1 sets PT of %2 to %3. %1 setzt Kampfwerte von %2 auf %3. - + %1 sets annotation of %2 to %3. %1 versieht %2 mit dem Hinweis %3. - + %1 is looking at the top %2 cards %3. %1 sieht sich die obersten %2 Karten %3 an. @@ -2023,7 +2254,7 @@ %1 entfernt %2 Zählmarken von %3 (jetzt %4). - + %1 %2 %3. %1 %2 %3. @@ -2036,17 +2267,43 @@ %1 sieht sich die obersten %2 Karten %3 an. - + %1 is looking at %2. %1 sieht sich %2 an. - + %1 stops looking at %2. %1 sieht sich %2 nicht mehr an. - + + %1 reveals %2 to %3. + %1 zeigt %3 %2. + + + + %1 reveals %2. + %1 zeigt %2 offen vor. + + + %1 randomly reveals %2 from %3 to %4. + %1 zeigt %4 zufällig %2 aus %3. + + + %1 randomly reveals %2 from %3. + %1 zeigt zufällig %2 aus %3 offen vor. + + + %1 reveals %2 from %3 to %4. + %1 zeigt %4 %2 aus %3. + + + %1 reveals %2 from %3. + %1 zeigt %2 aus %3 offen vor. + + + ending phase die Zugendphase @@ -2075,57 +2332,57 @@ %1 sieht sich %2s %3 nicht mehr an - + It is now %1's turn. %1 ist am Zug. - + untap step das Enttappsegment - + upkeep step das Versorgungssegment - + draw step das Ziehsegment - + first main phase die erste Hauptphase - + beginning of combat step das Anfangssegment der Kampfphase - + declare attackers step das Angreifer-Deklarieren-Segment - + declare blockers step das Blocker-Deklarieren-Segment - + combat damage step das Kampfschadenssegment - + end of combat step das Endsegment der Kampfphase - + second main phase die zweite Hauptphase @@ -2134,7 +2391,7 @@ das Ende-des-Zuges-Segment - + It is now the %1. Es ist nun %1. @@ -2143,12 +2400,12 @@ %1 bewegt %2 %3 nach %4 - + taps tappt - + untaps enttappt @@ -2173,7 +2430,7 @@ %1 entfernt %2 Zählmarken von %3 (jetzt %4) - + his permanents seine bleibenden Karten @@ -2186,12 +2443,12 @@ %1 setzt Zähler "%2" auf %3 (%4%5) - + %1 sets %2 to not untap normally. %1 setzt %2 auf explizites Enttappen. - + %1 sets %2 to untap normally. %1 setzt %2 auf normales Enttappen. @@ -2296,51 +2553,55 @@ Player - - - + + + Move to &top of library Oben auf die Biblio&thek legen - - - + + + Move to &bottom of library Unter die &Bibliothek legen - + &View library &Zeige Bibliothek - Move top cards to g&raveyard... - Oberste Karten in den F&riedhof legen... + Oberste Karten in den F&riedhof legen... - + Move top cards to &exile... Oberste Karten ins &Exil schicken... - + F3 F3 - + View &top cards of library... Zeige die oberen Kar&ten der Bibliothek... - + &View graveyard &Zeige Friedhof - + + &All players + &allen Spielern + + + F4 F4 @@ -2349,32 +2610,63 @@ Zeige ent&fernte Karten - + &View sideboard Zeige &Sideboard - + Player "%1" Spieler "%1" - + + + Move to &graveyard + Auf den &Friedhof legen + + + + Reveal &library to + &Bibliothek jemandem zeigen + + + + Reveal t&op card to + &Oberste Karte jemandem zeigen + + + Take &mulligan &Mulligan nehmen - + + Move top cards to &graveyard... + Oberste Karten auf den F&riedhof legen... + + + &Hand &Hand - + + &Reveal to + Jemandem &zeigen + + + + Reveal r&andom card to + Z&ufällige Karte jemandem zeigen + + + &Library Bib&liothek - + &Graveyard &Friedhof @@ -2383,7 +2675,7 @@ Entfe&rnte Karten - + &Sideboard &Sideboard @@ -2396,65 +2688,63 @@ &Hinweis setzen... - + View top cards of library Zeige die obersten Karten der Bibliothek - + Number of cards: Anzahl der Karten: - + &Draw card Karte &ziehen - + &View exile &Zeige Exil - + &Exile &Exil - - + + Move to &hand auf die &Hand nehmen - - Move to g&raveyard - auf den &Friedhof legen + auf den &Friedhof legen - - + + Move to &exile ins &Exil schicken - + Ctrl+W Ctrl+W - + Ctrl+D Ctrl+D - + D&raw cards... Ka&rten ziehen... - + Ctrl+E Ctrl+E @@ -2463,32 +2753,32 @@ &Mulligan nehmen... - + Ctrl+M Ctrl+M - + &Shuffle Mi&schen - + Ctrl+S Ctrl+S - + &Counters &Zähler - + &Untap all permanents &Enttappe alle bleibenden Karten - + Ctrl+U Ctrl+U @@ -2517,42 +2807,42 @@ Ctrl+L - + R&oll die... &Würfeln... - + Ctrl+I Ctrl+I - + &Create token... Spiels&tein erstellen... - + Ctrl+T Ctrl+T - + C&reate another token &Noch einen Spielstein erstellen - + Ctrl+G Ctrl+G - + S&ay S&agen - + C&ard &Karte @@ -2645,50 +2935,50 @@ F10 - + Draw cards Karten ziehen - - - - + + + + Number: Anzahl: - + Move top cards to grave Oberste Karten in den Friedhof legen - + Move top cards to exile Oberste Karten ins Exil schicken - + Set power/toughness Kampfwerte setzen - + Please enter the new PT: Bitte die neuen Kampfwerte eingeben: - + Set annotation Hinweis setzen - + Please enter the new annotation: Bitte den Hinweis eingeben: - + Set counters Setze Zählmarken @@ -2701,12 +2991,12 @@ Neue Lebenspunkte insgesamt: - + Roll die Würfeln - + Number of sides: Anzahl der Seiten: @@ -2932,57 +3222,57 @@ Bitte geben Sie einen Namen ein: TabGame - + &Game Spi&el - + Next &phase Nächste &Phase - + Ctrl+Space Ctrl+Space - + Next &turn Nächster &Zug - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Lokale Pfeile entfernen - + Ctrl+R Ctrl+R - + &Concede - + F2 F2 - + &Leave game Spiel ver&lassen @@ -3003,7 +3293,7 @@ Bitte geben Sie einen Namen ein: Spiel s&tarten - + &Say: &Sagen: @@ -3016,22 +3306,22 @@ Bitte geben Sie einen Namen ein: Esc - + Concede Aufgeben - + Are you sure you want to concede this game? Sind Sie sicher, dass Sie das Spiel aufgeben möchten? - + Leave game Spiel verlassen - + Are you sure you want to leave this game? Sind Sie sicher, dass Sie das Spiel verlassen möchten? @@ -3040,7 +3330,7 @@ Bitte geben Sie einen Namen ein: Deck laden - + Game %1: %2 Spiel %1: %2 diff --git a/cockatrice/translations/cockatrice_en.ts b/cockatrice/translations/cockatrice_en.ts index d5d61eca..e39a33a7 100644 --- a/cockatrice/translations/cockatrice_en.ts +++ b/cockatrice/translations/cockatrice_en.ts @@ -131,112 +131,112 @@ CardItem - + &Tap - + &Untap - + Toggle &normal untapping - + &Flip - + &Clone - + &Attach to card... - + Ctrl+A - + Unattac&h - + Set &P/T... - + &Set annotation... - + red - + yellow - + green - + &Add counter (%1) - + &Remove counter (%1) - + &Set counters (%1)... - + &top of library - + &bottom of library - + &graveyard - + Ctrl+Del - + &exile - + &Move to @@ -245,112 +245,242 @@ CardZone - his hand + nominative - %1's hand + nominative of his hand + genitive of %1's hand + genitive - - + + his hand + accusative + + + + + %1's hand + accusative + + + + + his hand + from + + + + + %1's hand + from + + + + his library + nominative - - + %1's library + nominative - + of his library + genitive - + of %1's library + genitive + + + + + his library + accusative + + + + + %1's library + accusative + + + + + his library + from + + + + + %1's library + from - his graveyard + nominative - %1's graveyard + nominative - + of his graveyard + genitive - + of %1's graveyard + genitive - - + + his graveyard + accusative + + + + + %1's graveyard + accusative + + + + + his graveyard + from + + + + + %1's graveyard + from + + + + his exile + nominative - - + %1's exile + nominative - + of his exile + genitive - + of %1's exile + genitive + + + + + his exile + accusative + + + + + %1's exile + accusative - + his exile + from + + + + + %1's exile + from + + + + his sideboard + nominative - - + %1's sideboard + nominative - + of his sideboard + genitive - + of %1's sideboard + genitive + + + + + his sideboard + accusative + + + + + %1's sideboard + accusative + + + + + his sideboard + from + + + + + %1's sideboard + from @@ -431,22 +561,22 @@ DeckViewContainer - + Load &local deck - + Load d&eck from server - + Ready to s&tart - + Load deck @@ -1085,47 +1215,47 @@ MessageLogWidget - + Connecting to %1... - + Disconnected from server. - + Invalid password. - + Protocol error. - + The game has been closed. - + %1 is now watching the game. - + %1 is not watching the game any more. - + %1 is not ready to start the game any more. - + %1 rolls a %2 with a %3-sided die. @@ -1180,82 +1310,83 @@ - + %1 puts %2 into play%3. - + %1 puts %2%3 into graveyard. - + %1 exiles %2%3. - + %1 moves %2%3 to hand. - + %1 puts %2%3 into his library. - + %1 puts %2%3 on bottom of his library. - + %1 puts %2%3 on top of his library. - + %1 puts %2%3 into his library at position %4. - + %1 moves %2%3 to sideboard. - + + a card - + %1 flips %2 face-down. - + %1 flips %2 face-up. - + %1 attaches %2 to %3's %4. - + %1 unattaches %2. - + %1 points from %2's %3 to %4's %5. - + %1 places %n counter(s) (%2) on %3 (now %4). %1 places a counter (%2) on %3 (now %4). @@ -1263,7 +1394,7 @@ - + %1 removes %n counter(s) (%2) from %3 (now %4). %1 removes a counter (%2) from %3 (now %4). @@ -1271,222 +1402,252 @@ - + red - + yellow - + green - + %1 sets counter %2 to %3 (%4%5). - + %1 sets PT of %2 to %3. - + %1 sets annotation of %2 to %3. - + %1 is looking at the top %2 cards %3. - + The game has started. - + Connected. - + Protocol version mismatch. Client: %1, Server: %2 - + You have joined game #%1. - + %1 has joined the game. - + %1 has left the game. - + %1 has loaded a local deck. - + %1 has loaded deck #%2. - + %1 is ready to start the game. - + %1 has conceded the game. - + %1 draws a card. - + %1 draws %2 cards. - + %1 destroys %2. - + %1 creates token: %2%3. - + %1 points from %2's %3 to %4. - + %1 %2 %3. - + %1 is looking at %2. - + %1 stops looking at %2. - + + %1 reveals %2 to %3. + + + + + %1 reveals %2. + + + + ending phase - + It is now %1's turn. - + %1 shuffles his library. - + + %1 randomly reveals %2%3 to %4. + + + + + %1 randomly reveals %2%3. + + + + + %1 reveals %2%3 to %4. + + + + + %1 reveals %2%3. + + + + untap step - + upkeep step - + draw step - + first main phase - + beginning of combat step - + declare attackers step - + declare blockers step - + combat damage step - + end of combat step - + second main phase - + It is now the %1. - + taps - + untaps - + %1 sets %2 to not untap normally. - + %1 sets %2 to untap normally. - + his permanents @@ -1575,277 +1736,302 @@ Player - - - + + + Move to &top of library - - - + + + Move to &bottom of library - + + + Move to &graveyard + + + + &View library - + + Reveal &library to + + + + + Reveal t&op card to + + + + + Move top cards to &graveyard... + + + + F3 - + View &top cards of library... - + &View graveyard - + F4 - + &View sideboard - + Player "%1" - + &Hand - + &Library - + &Graveyard - + &Sideboard - + View top cards of library - + Number of cards: - + &Draw card - + &View exile - + &Exile - - + + Move to &hand - - - Move to g&raveyard - - - - - + + Move to &exile - + Ctrl+W - + Ctrl+D - + D&raw cards... - + Ctrl+E - + Take &mulligan - + Ctrl+M - + &Shuffle - + Ctrl+S - + &Counters - + &Untap all permanents - + Ctrl+U - + R&oll die... - + Ctrl+I - + &Create token... - + Ctrl+T - + C&reate another token - + Ctrl+G - + S&ay - - Move top cards to g&raveyard... - - - - + Move top cards to &exile... - + + &Reveal to + + + + + Reveal r&andom card to + + + + C&ard - + + &All players + + + + Draw cards - - - - + + + + Number: - + Move top cards to grave - + Move top cards to exile - + Roll die - + Number of sides: - + Set power/toughness - + Please enter the new PT: - + Set annotation - + Please enter the new annotation: - + Set counters @@ -2038,87 +2224,87 @@ Please enter a name: TabGame - + &Game - + Next &phase - + Ctrl+Space - + Next &turn - + Ctrl+Return - + Ctrl+Enter - + &Remove all local arrows - + Ctrl+R - + &Concede - + F2 - + &Leave game - + &Say: - + Concede - + Are you sure you want to concede this game? - + Leave game - + Are you sure you want to leave this game? - + Game %1: %2 diff --git a/cockatrice/translations/cockatrice_es.ts b/cockatrice/translations/cockatrice_es.ts index 398ad148..43b31e53 100644 --- a/cockatrice/translations/cockatrice_es.ts +++ b/cockatrice/translations/cockatrice_es.ts @@ -135,112 +135,112 @@ CardItem - + &Tap &Girar - + &Untap &Enderezar - + Toggle &normal untapping Alternar enderezamiento &normal - + &Flip &Voltear - + &Clone &Clonar - + &Attach to card... Ane&xar a una carta... - + Ctrl+A Ctrl+A - + Unattac&h Desane&xar - + Set &P/T... Establecer &F/R... - + &Set annotation... E&scribir anotación... - + red rojo - + yellow amarillo - + green verde - + &Add counter (%1) &Añadir contador (%1) - + &Remove counter (%1) &Quitar contador (%1) - + &Set counters (%1)... E&stablecer contadores (%1)... - + &top of library &parte superior de la biblioteca - + &bottom of library &fondo de la biblioteca - + &graveyard &cementerio - + Ctrl+Del Ctrl+Del - + &exile &exilio - + &Move to &Mover a @@ -248,114 +248,324 @@ CardZone - - his hand - su mano + su mano + + + %1's hand + mano &de %1 + + + of his hand + de su mano + + + of %1's hand + de la mano &de %1 + + + his library + su biblioteca + + + %1's library + biblioteca &de %1 + + + of his library + de su biblioteca + + + of %1's library + de la biblioteca &de %1 + + + his graveyard + su cementerio + + + %1's graveyard + cementerio &de %1 + + + of his graveyard + de su cementerio + + + of %1's graveyard + del cementerio &de %1 + + + his exile + su exilio + + + %1's exile + el exilio de %1 + + + of his exile + de su exilio + + + of %1's exile + del exilio de %1 + + + his sideboard + su reserva + + + %1's sideboard + la reserva de %1 + + + of his sideboard + de su reserva + + + of %1's sideboard + de la reserva &de %1 + + + + his hand + nominative + su mano - %1's hand - mano &de %1 + nominative + mano &de %1 of his hand - de su mano + genitive + de su mano of %1's hand - de la mano &de %1 + genitive + de la mano &de %1 - - + + his hand + accusative + su mano + + + + %1's hand + accusative + mano &de %1 + + + + his hand + from + su mano + + + + %1's hand + from + mano &de %1 + + + his library - su biblioteca + nominative + su biblioteca - - + %1's library - biblioteca &de %1 + nominative + biblioteca &de %1 - + of his library - de su biblioteca + genitive + de su biblioteca - + of %1's library - de la biblioteca &de %1 + genitive + de la biblioteca &de %1 + + + + his library + accusative + su biblioteca + + + + %1's library + accusative + biblioteca &de %1 + + + + his library + from + su biblioteca + + + + %1's library + from + biblioteca &de %1 - his graveyard - su cementerio + nominative + su cementerio - %1's graveyard - cementerio &de %1 + nominative + cementerio &de %1 - + of his graveyard - de su cementerio + genitive + de su cementerio - + of %1's graveyard - del cementerio &de %1 + genitive + del cementerio &de %1 - - + + his graveyard + accusative + su cementerio + + + + %1's graveyard + accusative + cementerio &de %1 + + + + his graveyard + from + su cementerio + + + + %1's graveyard + from + cementerio &de %1 + + + his exile - su exilio + nominative + su exilio - - + %1's exile - el exilio de %1 + nominative + el exilio de %1 - + of his exile - de su exilio + genitive + de su exilio - + of %1's exile - del exilio de %1 + genitive + del exilio de %1 + + + + his exile + accusative + su exilio + + + + %1's exile + accusative + el exilio de %1 - + his exile + from + su exilio + + + + %1's exile + from + el exilio de %1 + + + his sideboard - su reserva + nominative + su reserva - - + %1's sideboard - la reserva de %1 + nominative + la reserva de %1 - + of his sideboard - de su reserva + genitive + de su reserva - + of %1's sideboard - de la reserva &de %1 + genitive + de la reserva &de %1 + + + + his sideboard + accusative + su reserva + + + + %1's sideboard + accusative + la reserva de %1 + + + + his sideboard + from + su reserva + + + + %1's sideboard + from + la reserva de %1 @@ -435,22 +645,22 @@ DeckViewContainer - + Load &local deck Cargar mazo &local - + Load d&eck from server Cargar mazo del &servidor - + Ready to s&tart Listo para &empezar - + Load deck Cargar mazo @@ -1101,47 +1311,47 @@ MessageLogWidget - + Connecting to %1... Conectando a %1... - + Disconnected from server. Desconectado del servidor. - + Invalid password. Contraseña incorrecta. - + Protocol error. Error del protocolo. - + The game has been closed. La partida ha sido cerrada. - + %1 is now watching the game. %1 está ahora observando la partida. - + %1 is not watching the game any more. %1 ya no está observado más la partida. - + %1 is not ready to start the game any more. %1 ya no está listo para empezar el juego. - + %1 rolls a %2 with a %3-sided die. %1 sacó un %2 con un dado de %3 caras. @@ -1196,82 +1406,83 @@ de la reserva - + %1 puts %2 into play%3. %1 pone %2 en juego %3. - + %1 puts %2%3 into graveyard. %1 pone %2%3 en el cementerio. - + %1 exiles %2%3. %1 exilia %2%3. - + %1 moves %2%3 to hand. %1 mueve %2%3 a la mano. - + %1 puts %2%3 into his library. %1 pone %2%3 en la biblioteca. - + %1 puts %2%3 on bottom of his library. %1 pone %2%3 en la parte inferior de su biblioteca. - + %1 puts %2%3 on top of his library. %1 pone %2%3 en la parte superior de su biblioteca. - + %1 puts %2%3 into his library at position %4. %1 pone %2%3 en su biblioteca en la posición %4. - + %1 moves %2%3 to sideboard. %1 mueve %2%3 a la reserva. - + + a card una carta - + %1 flips %2 face-down. %1 voltea %2 boca abajo. - + %1 flips %2 face-up. %1 voltea %2 boca arriba. - + %1 attaches %2 to %3's %4. %1 anexa %2 a el %4 de %3. - + %1 unattaches %2. %1 desanexa %2. - + %1 points from %2's %3 to %4's %5. %1 apunta desde el %3 de %2 al %5 de %4. - + %1 places %n counter(s) (%2) on %3 (now %4). %1 pone un contador (%2) en %3 (ahora %4). @@ -1279,7 +1490,7 @@ - + %1 removes %n counter(s) (%2) from %3 (now %4). %1 remueve un contador (%2) de %3 (ahora %4). @@ -1287,222 +1498,252 @@ - + red rojo - + yellow amarillo - + green verde - + %1 sets counter %2 to %3 (%4%5). %1 establece los contadores de %2 a %3 (%4%5). - + %1 sets PT of %2 to %3. %1 establece F/R de %2 a %3. - + %1 sets annotation of %2 to %3. %1 establece la anotación de %2 a %3. - + %1 is looking at the top %2 cards %3. %1 esta mirando las primeras %2 cartas de %3. - + The game has started. La partida ha comenzado. - + Connected. Conectado. - + Protocol version mismatch. Client: %1, Server: %2 La versión del protocolo es diferente. Cliente: %1, Servidor: %2 - + You have joined game #%1. Te has unido a la partida #%1. - + %1 has joined the game. %1 se ha unido a la partida. - + %1 has left the game. %1 ha dejado la partida. - + %1 has loaded a local deck. %1 ha cargado un mazo local. - + %1 has loaded deck #%2. %1 ha cargado el mazo #%2. - + %1 is ready to start the game. %1 está preparado para empezar la partida. - + %1 has conceded the game. %1 ha concedido la partida. - + %1 draws a card. %1 roba una carta. - + %1 draws %2 cards. %1 roba %2 cartas. - + %1 destroys %2. %1 destruye %2. - + %1 creates token: %2%3. %1 crea una ficha: %2%3. - + %1 points from %2's %3 to %4. %1 apunta desde el %3 de %2 a %4. - + %1 %2 %3. %1 %2 %3. - + %1 is looking at %2. %1 está mirando: %2. - + %1 stops looking at %2. %1 termina de mirar: %2. - + + %1 reveals %2 to %3. + + + + + %1 reveals %2. + + + + ending phase fase de fin de turno - + It is now %1's turn. Es el turno de %1. - + %1 shuffles his library. %1 baraja su biblioteca. - + + %1 randomly reveals %2%3 to %4. + + + + + %1 randomly reveals %2%3. + + + + + %1 reveals %2%3 to %4. + + + + + %1 reveals %2%3. + + + + untap step paso de enderezar - + upkeep step paso de mantenimiento - + draw step paso de robar - + first main phase primera fase principal - + beginning of combat step paso de inicio de combate - + declare attackers step paso de declarar atacantes - + declare blockers step paso de declarar bloqueadores - + combat damage step paso de daño de combate - + end of combat step paso de fin de combate - + second main phase segunda fase principal - + It is now the %1. Ahora es el %1. - + taps gira - + untaps endereza - + %1 sets %2 to not untap normally. %1 establece que %2 no se endereze normalmente. - + %1 sets %2 to untap normally. %1 establece que %2 se endereze normalmente. - + his permanents sus permanentes @@ -1591,277 +1832,310 @@ Player - - - + + + Move to &top of library Mover a la &parte superior de la biblioteca - - - + + + Move to &bottom of library Mover al &fondo de la biblioteca - + + + Move to &graveyard + + + + &View library &Ver biblioteca - + + Reveal &library to + + + + + Reveal t&op card to + + + + + Move top cards to &graveyard... + + + + F3 F3 - + View &top cards of library... Ver cartas de la parte &superior de la biblioteca... - + &View graveyard Ver &Cementerio - + F4 F4 - + &View sideboard Ver &sideboard - + Player "%1" Jugador "%1" - + &Hand &Mano - + &Library &Biblioteca - + &Graveyard &Cementerio - + &Sideboard &Reserva - + View top cards of library Ver cartas de la parte superior de la biblioteca - + Number of cards: Número de cartas: - + &Draw card &Robar carta - + &View exile Ver &exilio - + &Exile &Exilio - - + + Move to &hand Mover a la m&ano - - Move to g&raveyard - Mover al &cementerio + Mover al &cementerio - - + + Move to &exile Mover al &exilio - + Ctrl+W Ctrl+W - + Ctrl+D Ctrl+D - + D&raw cards... &Robar cartas... - + Ctrl+E Ctrl+E - + Take &mulligan Hacer &mulligan - + Ctrl+M Ctrl+M - + &Shuffle &Barajar - + Ctrl+S Ctrl+S - + &Counters &Contadores - + &Untap all permanents &Enderezar todos los permanentes - + Ctrl+U Ctrl+U - + R&oll die... &Lanzar dado... - + Ctrl+I Ctrl+I - + &Create token... Crear &Ficha... - + Ctrl+T Ctrl+T - + C&reate another token C&rea otra ficha - + Ctrl+G Ctrl+G - + S&ay D&ecir - Move top cards to g&raveyard... - Mover cartas superiores al ce&menterio... + Mover cartas superiores al ce&menterio... - + Move top cards to &exile... Mover cartas superiores al &exilio... - + + &Reveal to + + + + + Reveal r&andom card to + + + + C&ard C&arta - + + &All players + + + + Draw cards Robar cartas - - - - + + + + Number: Número: - + Move top cards to grave Mover cartas superiores al cementerio - + Move top cards to exile Mover cartas superiores al exilio - + Roll die Lanzar dado - + Number of sides: Número de caras: - + Set power/toughness Establecer fuerza/resistencia - + Please enter the new PT: Por favor, introduzca la nueva F/R: - + Set annotation Escribir anotación - + Please enter the new annotation: Por favor, introduza la nueva anotación: - + Set counters Establecer contadores @@ -2067,87 +2341,87 @@ Por favor, introduzca un nombre: TabGame - + &Game &Partida - + Next &phase Próxima &fase - + Ctrl+Space Ctrl+Space - + Next &turn Próximo &turno - + Ctrl+Return Ctrl+Return - + Ctrl+Enter Ctrl+Enter - + &Remove all local arrows &Retirar todas las flechas locales - + Ctrl+R Ctrl+R - + &Concede &Conceder - + F2 F2 - + &Leave game &Abandonar la partida - + &Say: &Decir: - + Concede Conceder - + Are you sure you want to concede this game? ¿Estás seguro de que quieres conceder esta partida? - + Leave game Abandonar la partida - + Are you sure you want to leave this game? ¿Estás seguro de que quieres abandonar la partida? - + Game %1: %2 Partida %1: %2 diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 4a2fe7b3..4e5fb70c 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -1161,9 +1161,12 @@ ResponseCode Server_ProtocolHandler::cmdRevealCards(Command_RevealCards *cmd, Co if (!game->getGameStarted()) return RespGameNotStarted; - Server_Player *otherPlayer = game->getPlayer(cmd->getPlayerId()); - if (!otherPlayer) - return RespNameNotFound; + Server_Player *otherPlayer = 0; + if (cmd->getPlayerId() != -1) { + otherPlayer = game->getPlayer(cmd->getPlayerId()); + if (!otherPlayer) + return RespNameNotFound; + } Server_CardZone *zone = player->getZones().value(cmd->getZoneName()); if (!zone) return RespNameNotFound; @@ -1171,7 +1174,11 @@ ResponseCode Server_ProtocolHandler::cmdRevealCards(Command_RevealCards *cmd, Co QList cardsToReveal; if (cmd->getCardId() == -1) cardsToReveal = zone->cards; - else { + else if (cmd->getCardId() == -2) { + if (zone->cards.isEmpty()) + return RespContextError; + cardsToReveal.append(zone->cards.at(rng->getNumber(0, zone->cards.size() - 1))); + } else { Server_Card *card = zone->getCard(cmd->getCardId(), false); if (!card) return RespNameNotFound; @@ -1198,13 +1205,18 @@ ResponseCode Server_ProtocolHandler::cmdRevealCards(Command_RevealCards *cmd, Co attachCardId = card->getParentCard()->getId(); } - respCardListPrivate.append(new ServerInfo_Card(card->getId(), card->getName(), card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterList, attachPlayerId, attachZone, attachCardId)); + if (cmd->getPlayerId() != -1) + respCardListPrivate.append(new ServerInfo_Card(card->getId(), card->getName(), card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterList, attachPlayerId, attachZone, attachCardId)); respCardListOmniscient.append(new ServerInfo_Card(card->getId(), card->getName(), card->getX(), card->getY(), card->getTapped(), card->getAttacking(), card->getColor(), card->getPT(), card->getAnnotation(), card->getDestroyOnZoneChange(), cardCounterList, attachPlayerId, attachZone, attachCardId)); } - cont->enqueueGameEventPublic(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId()), game->getGameId()); - cont->enqueueGameEventPrivate(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListPrivate), game->getGameId(), otherPlayer->getPlayerId()); - cont->enqueueGameEventOmniscient(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListOmniscient), game->getGameId()); + if (cmd->getPlayerId() == -1) + cont->enqueueGameEventPublic(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), -1, respCardListOmniscient), game->getGameId()); + else { + cont->enqueueGameEventPublic(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId()), game->getGameId()); + cont->enqueueGameEventPrivate(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListPrivate), game->getGameId(), otherPlayer->getPlayerId()); + cont->enqueueGameEventOmniscient(new Event_RevealCards(player->getPlayerId(), zone->getName(), cmd->getCardId(), otherPlayer->getPlayerId(), respCardListOmniscient), game->getGameId()); + } return RespOk; -} \ No newline at end of file +}