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

added 'undo last draw' feature. protocol version bump (12)

parent c203d51f
...@@ -97,13 +97,13 @@ void AbstractCounter::mousePressEvent(QGraphicsSceneMouseEvent *event) ...@@ -97,13 +97,13 @@ void AbstractCounter::mousePressEvent(QGraphicsSceneMouseEvent *event)
event->ignore(); event->ignore();
} }
void AbstractCounter::hoverEnterEvent(QGraphicsSceneHoverEvent *event) void AbstractCounter::hoverEnterEvent(QGraphicsSceneHoverEvent * /*event*/)
{ {
hovered = true; hovered = true;
update(); update();
} }
void AbstractCounter::hoverLeaveEvent(QGraphicsSceneHoverEvent *event) void AbstractCounter::hoverLeaveEvent(QGraphicsSceneHoverEvent * /*event*/)
{ {
hovered = false; hovered = false;
update(); update();
......
...@@ -138,6 +138,14 @@ void MessageLogWidget::logDrawCards(Player *player, int number) ...@@ -138,6 +138,14 @@ void MessageLogWidget::logDrawCards(Player *player, int number)
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::logUndoDraw(Player *player, QString cardName)
{
if (cardName.isEmpty())
append(tr("%1 undoes his last draw.").arg(sanitizeHtml(player->getName())));
else
append(tr("%1 undoes his last draw (%2).").arg(sanitizeHtml(player->getName())).arg(sanitizeHtml(cardName)));
}
QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const QPair<QString, QString> MessageLogWidget::getFromStr(CardZone *zone, QString cardName, int position) const
{ {
bool cardNameContainsStartZone = false; bool cardNameContainsStartZone = false;
...@@ -428,6 +436,7 @@ void MessageLogWidget::connectToPlayer(Player *player) ...@@ -428,6 +436,7 @@ void MessageLogWidget::connectToPlayer(Player *player)
connect(player, SIGNAL(logDumpZone(Player *, CardZone *, int)), this, SLOT(logDumpZone(Player *, CardZone *, int))); connect(player, SIGNAL(logDumpZone(Player *, CardZone *, int)), this, SLOT(logDumpZone(Player *, CardZone *, int)));
connect(player, SIGNAL(logStopDumpZone(Player *, CardZone *)), this, SLOT(logStopDumpZone(Player *, CardZone *))); 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(logDrawCards(Player *, int)), this, SLOT(logDrawCards(Player *, int)));
connect(player, SIGNAL(logUndoDraw(Player *, QString)), this, SLOT(logUndoDraw(Player *, QString)));
connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *))); connect(player, SIGNAL(logRevealCards(Player *, CardZone *, int, QString, Player *)), this, SLOT(logRevealCards(Player *, CardZone *, int, QString, Player *)));
} }
......
...@@ -47,6 +47,7 @@ public slots: ...@@ -47,6 +47,7 @@ public slots:
void logShuffle(Player *player); void logShuffle(Player *player);
void logRollDie(Player *player, int sides, int roll); void logRollDie(Player *player, int sides, int roll);
void logDrawCards(Player *player, int number); void logDrawCards(Player *player, int number);
void logUndoDraw(Player *player, QString cardName);
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 logFlipCard(Player *player, QString cardName, bool faceDown); void logFlipCard(Player *player, QString cardName, bool faceDown);
void logDestroyCard(Player *player, QString cardName); void logDestroyCard(Player *player, QString cardName);
......
...@@ -130,6 +130,8 @@ Player::Player(ServerInfo_User *info, int _id, bool _local, TabGame *_parent) ...@@ -130,6 +130,8 @@ Player::Player(ServerInfo_User *info, int _id, bool _local, TabGame *_parent)
connect(aDrawCard, SIGNAL(triggered()), this, SLOT(actDrawCard())); connect(aDrawCard, SIGNAL(triggered()), this, SLOT(actDrawCard()));
aDrawCards = new QAction(this); aDrawCards = new QAction(this);
connect(aDrawCards, SIGNAL(triggered()), this, SLOT(actDrawCards())); connect(aDrawCards, SIGNAL(triggered()), this, SLOT(actDrawCards()));
aUndoDraw = new QAction(this);
connect(aUndoDraw, SIGNAL(triggered()), this, SLOT(actUndoDraw()));
aShuffle = new QAction(this); aShuffle = new QAction(this);
connect(aShuffle, SIGNAL(triggered()), this, SLOT(actShuffle())); connect(aShuffle, SIGNAL(triggered()), this, SLOT(actShuffle()));
aMulligan = new QAction(this); aMulligan = new QAction(this);
...@@ -159,6 +161,7 @@ Player::Player(ServerInfo_User *info, int _id, bool _local, TabGame *_parent) ...@@ -159,6 +161,7 @@ Player::Player(ServerInfo_User *info, int _id, bool _local, TabGame *_parent)
libraryMenu = playerMenu->addMenu(QString()); libraryMenu = playerMenu->addMenu(QString());
libraryMenu->addAction(aDrawCard); libraryMenu->addAction(aDrawCard);
libraryMenu->addAction(aDrawCards); libraryMenu->addAction(aDrawCards);
libraryMenu->addAction(aUndoDraw);
libraryMenu->addSeparator(); libraryMenu->addSeparator();
libraryMenu->addAction(aShuffle); libraryMenu->addAction(aShuffle);
libraryMenu->addSeparator(); libraryMenu->addSeparator();
...@@ -409,6 +412,7 @@ void Player::retranslateUi() ...@@ -409,6 +412,7 @@ void Player::retranslateUi()
aViewSideboard->setText(tr("&View sideboard")); aViewSideboard->setText(tr("&View sideboard"));
aDrawCard->setText(tr("&Draw card")); aDrawCard->setText(tr("&Draw card"));
aDrawCards->setText(tr("D&raw cards...")); aDrawCards->setText(tr("D&raw cards..."));
aUndoDraw->setText(tr("&Undo last draw"));
aMulligan->setText(tr("Take &mulligan")); aMulligan->setText(tr("Take &mulligan"));
aShuffle->setText(tr("&Shuffle")); aShuffle->setText(tr("&Shuffle"));
aMoveTopCardsToGrave->setText(tr("Move top cards to &graveyard...")); aMoveTopCardsToGrave->setText(tr("Move top cards to &graveyard..."));
...@@ -453,6 +457,7 @@ void Player::setShortcutsActive() ...@@ -453,6 +457,7 @@ void Player::setShortcutsActive()
aViewGraveyard->setShortcut(tr("F4")); aViewGraveyard->setShortcut(tr("F4"));
aDrawCard->setShortcut(tr("Ctrl+D")); aDrawCard->setShortcut(tr("Ctrl+D"));
aDrawCards->setShortcut(tr("Ctrl+E")); aDrawCards->setShortcut(tr("Ctrl+E"));
aUndoDraw->setShortcut(tr("Ctrl+Shift+D"));
aMulligan->setShortcut(tr("Ctrl+M")); aMulligan->setShortcut(tr("Ctrl+M"));
aShuffle->setShortcut(tr("Ctrl+S")); aShuffle->setShortcut(tr("Ctrl+S"));
aUntapAll->setShortcut(tr("Ctrl+U")); aUntapAll->setShortcut(tr("Ctrl+U"));
...@@ -475,6 +480,7 @@ void Player::setShortcutsInactive() ...@@ -475,6 +480,7 @@ void Player::setShortcutsInactive()
aViewGraveyard->setShortcut(QKeySequence()); aViewGraveyard->setShortcut(QKeySequence());
aDrawCard->setShortcut(QKeySequence()); aDrawCard->setShortcut(QKeySequence());
aDrawCards->setShortcut(QKeySequence()); aDrawCards->setShortcut(QKeySequence());
aUndoDraw->setShortcut(QKeySequence());
aMulligan->setShortcut(QKeySequence()); aMulligan->setShortcut(QKeySequence());
aShuffle->setShortcut(QKeySequence()); aShuffle->setShortcut(QKeySequence());
aUntapAll->setShortcut(QKeySequence()); aUntapAll->setShortcut(QKeySequence());
...@@ -555,6 +561,11 @@ void Player::actDrawCards() ...@@ -555,6 +561,11 @@ void Player::actDrawCards()
sendGameCommand(new Command_DrawCards(-1, number)); sendGameCommand(new Command_DrawCards(-1, number));
} }
void Player::actUndoDraw()
{
sendGameCommand(new Command_UndoDraw);
}
void Player::actMoveTopCardsToGrave() void Player::actMoveTopCardsToGrave()
{ {
int number = QInputDialog::getInteger(0, tr("Move top cards to grave"), tr("Number:")); int number = QInputDialog::getInteger(0, tr("Move top cards to grave"), tr("Number:"));
...@@ -793,7 +804,7 @@ void Player::eventStopDumpZone(Event_StopDumpZone *event) ...@@ -793,7 +804,7 @@ void Player::eventStopDumpZone(Event_StopDumpZone *event)
emit logStopDumpZone(this, zone); emit logStopDumpZone(this, zone);
} }
void Player::eventMoveCard(Event_MoveCard *event) void Player::eventMoveCard(Event_MoveCard *event, GameEventContext *context)
{ {
CardZone *startZone = zones.value(event->getStartZone(), 0); CardZone *startZone = zones.value(event->getStartZone(), 0);
Player *targetPlayer = static_cast<TabGame *>(parent())->getPlayers().value(event->getTargetPlayerId()); Player *targetPlayer = static_cast<TabGame *>(parent())->getPlayers().value(event->getTargetPlayerId());
...@@ -840,6 +851,12 @@ void Player::eventMoveCard(Event_MoveCard *event) ...@@ -840,6 +851,12 @@ void Player::eventMoveCard(Event_MoveCard *event)
// The log event has to be sent before the card is added to the target zone // The log event has to be sent before the card is added to the target zone
// because the addCard function can modify the card object. // because the addCard function can modify the card object.
if (context)
switch (context->getItemId()) {
case ItemId_Context_UndoDraw: emit logUndoDraw(this, card->getName()); break;
default: ;
}
else
emit logMoveCard(this, card->getName(), startZone, logPosition, targetZone, logX); emit logMoveCard(this, card->getName(), startZone, logPosition, targetZone, logX);
targetZone->addCard(card, true, x, y); targetZone->addCard(card, true, x, y);
...@@ -983,25 +1000,25 @@ void Player::processGameEvent(GameEvent *event, GameEventContext *context) ...@@ -983,25 +1000,25 @@ void Player::processGameEvent(GameEvent *event, GameEventContext *context)
{ {
qDebug() << "player event: id=" << event->getItemId(); qDebug() << "player event: id=" << event->getItemId();
switch (event->getItemId()) { switch (event->getItemId()) {
case ItemId_Event_Say: eventSay(qobject_cast<Event_Say *>(event)); break; case ItemId_Event_Say: eventSay(static_cast<Event_Say *>(event)); break;
case ItemId_Event_Shuffle: eventShuffle(qobject_cast<Event_Shuffle *>(event)); break; case ItemId_Event_Shuffle: eventShuffle(static_cast<Event_Shuffle *>(event)); break;
case ItemId_Event_RollDie: eventRollDie(qobject_cast<Event_RollDie *>(event)); break; case ItemId_Event_RollDie: eventRollDie(static_cast<Event_RollDie *>(event)); break;
case ItemId_Event_CreateArrows: eventCreateArrows(qobject_cast<Event_CreateArrows *>(event)); break; case ItemId_Event_CreateArrows: eventCreateArrows(static_cast<Event_CreateArrows *>(event)); break;
case ItemId_Event_DeleteArrow: eventDeleteArrow(qobject_cast<Event_DeleteArrow *>(event)); break; case ItemId_Event_DeleteArrow: eventDeleteArrow(static_cast<Event_DeleteArrow *>(event)); break;
case ItemId_Event_CreateToken: eventCreateToken(qobject_cast<Event_CreateToken *>(event)); break; case ItemId_Event_CreateToken: eventCreateToken(static_cast<Event_CreateToken *>(event)); break;
case ItemId_Event_SetCardAttr: eventSetCardAttr(qobject_cast<Event_SetCardAttr *>(event)); break; case ItemId_Event_SetCardAttr: eventSetCardAttr(static_cast<Event_SetCardAttr *>(event)); break;
case ItemId_Event_SetCardCounter: eventSetCardCounter(qobject_cast<Event_SetCardCounter *>(event)); break; case ItemId_Event_SetCardCounter: eventSetCardCounter(static_cast<Event_SetCardCounter *>(event)); break;
case ItemId_Event_CreateCounters: eventCreateCounters(qobject_cast<Event_CreateCounters *>(event)); break; case ItemId_Event_CreateCounters: eventCreateCounters(static_cast<Event_CreateCounters *>(event)); break;
case ItemId_Event_SetCounter: eventSetCounter(qobject_cast<Event_SetCounter *>(event)); break; case ItemId_Event_SetCounter: eventSetCounter(static_cast<Event_SetCounter *>(event)); break;
case ItemId_Event_DelCounter: eventDelCounter(qobject_cast<Event_DelCounter *>(event)); break; case ItemId_Event_DelCounter: eventDelCounter(static_cast<Event_DelCounter *>(event)); break;
case ItemId_Event_DumpZone: eventDumpZone(qobject_cast<Event_DumpZone *>(event)); break; case ItemId_Event_DumpZone: eventDumpZone(static_cast<Event_DumpZone *>(event)); break;
case ItemId_Event_StopDumpZone: eventStopDumpZone(qobject_cast<Event_StopDumpZone *>(event)); break; case ItemId_Event_StopDumpZone: eventStopDumpZone(static_cast<Event_StopDumpZone *>(event)); break;
case ItemId_Event_MoveCard: eventMoveCard(qobject_cast<Event_MoveCard *>(event)); break; case ItemId_Event_MoveCard: eventMoveCard(static_cast<Event_MoveCard *>(event), context); break;
case ItemId_Event_FlipCard: eventFlipCard(qobject_cast<Event_FlipCard *>(event)); break; case ItemId_Event_FlipCard: eventFlipCard(static_cast<Event_FlipCard *>(event)); break;
case ItemId_Event_DestroyCard: eventDestroyCard(qobject_cast<Event_DestroyCard *>(event)); break; case ItemId_Event_DestroyCard: eventDestroyCard(static_cast<Event_DestroyCard *>(event)); break;
case ItemId_Event_AttachCard: eventAttachCard(qobject_cast<Event_AttachCard *>(event)); break; case ItemId_Event_AttachCard: eventAttachCard(static_cast<Event_AttachCard *>(event)); break;
case ItemId_Event_DrawCards: eventDrawCards(qobject_cast<Event_DrawCards *>(event)); break; case ItemId_Event_DrawCards: eventDrawCards(static_cast<Event_DrawCards *>(event)); break;
case ItemId_Event_RevealCards: eventRevealCards(qobject_cast<Event_RevealCards *>(event)); break; case ItemId_Event_RevealCards: eventRevealCards(static_cast<Event_RevealCards *>(event)); break;
default: { default: {
qDebug() << "unhandled game event"; qDebug() << "unhandled game event";
} }
......
...@@ -57,6 +57,7 @@ signals: ...@@ -57,6 +57,7 @@ signals:
void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool _playerTarget); void logCreateArrow(Player *player, Player *startPlayer, QString startCard, Player *targetPlayer, QString targetCard, bool _playerTarget);
void logCreateToken(Player *player, QString cardName, QString pt); void logCreateToken(Player *player, QString cardName, QString pt);
void logDrawCards(Player *player, int number); void logDrawCards(Player *player, int number);
void logUndoDraw(Player *player, QString cardName);
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 logFlipCard(Player *player, QString cardName, bool faceDown); void logFlipCard(Player *player, QString cardName, bool faceDown);
void logDestroyCard(Player *player, QString cardName); void logDestroyCard(Player *player, QString cardName);
...@@ -81,6 +82,7 @@ public slots: ...@@ -81,6 +82,7 @@ public slots:
void actShuffle(); void actShuffle();
void actDrawCard(); void actDrawCard();
void actDrawCards(); void actDrawCards();
void actUndoDraw();
void actMulligan(); void actMulligan();
void actMoveTopCardsToGrave(); void actMoveTopCardsToGrave();
void actMoveTopCardsToExile(); void actMoveTopCardsToExile();
...@@ -119,7 +121,7 @@ private: ...@@ -119,7 +121,7 @@ private:
*aMoveRfgToTopLibrary, *aMoveRfgToBottomLibrary, *aMoveRfgToHand, *aMoveRfgToGrave, *aMoveRfgToTopLibrary, *aMoveRfgToBottomLibrary, *aMoveRfgToHand, *aMoveRfgToGrave,
*aViewLibrary, *aViewTopCards, *aMoveTopCardsToGrave, *aMoveTopCardsToExile, *aMoveTopCardToBottom, *aViewLibrary, *aViewTopCards, *aMoveTopCardsToGrave, *aMoveTopCardsToExile, *aMoveTopCardToBottom,
*aViewGraveyard, *aViewRfg, *aViewSideboard, *aViewGraveyard, *aViewRfg, *aViewSideboard,
*aDrawCard, *aDrawCards, *aMulligan, *aShuffle, *aDrawCard, *aDrawCards, *aUndoDraw, *aMulligan, *aShuffle,
*aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken, *aUntapAll, *aRollDie, *aCreateToken, *aCreateAnotherToken,
*aCardMenu; *aCardMenu;
...@@ -167,7 +169,7 @@ private: ...@@ -167,7 +169,7 @@ private:
void eventDelCounter(Event_DelCounter *event); void eventDelCounter(Event_DelCounter *event);
void eventDumpZone(Event_DumpZone *event); void eventDumpZone(Event_DumpZone *event);
void eventStopDumpZone(Event_StopDumpZone *event); void eventStopDumpZone(Event_StopDumpZone *event);
void eventMoveCard(Event_MoveCard *event); void eventMoveCard(Event_MoveCard *event, GameEventContext *context);
void eventFlipCard(Event_FlipCard *event); void eventFlipCard(Event_FlipCard *event);
void eventDestroyCard(Event_DestroyCard *event); void eventDestroyCard(Event_DestroyCard *event);
void eventAttachCard(Event_AttachCard *event); void eventAttachCard(Event_AttachCard *event);
......
...@@ -186,7 +186,10 @@ void MainWindow::socketError(const QString &errorStr) ...@@ -186,7 +186,10 @@ void MainWindow::socketError(const QString &errorStr)
void MainWindow::protocolVersionMismatch(int localVersion, int remoteVersion) void MainWindow::protocolVersionMismatch(int localVersion, int remoteVersion)
{ {
QMessageBox::critical(this, tr("Error"), tr("Protocol version mismatch. Local version: %1, remote version: %2.").arg(localVersion).arg(remoteVersion)); if (localVersion > remoteVersion)
QMessageBox::critical(this, tr("Error"), tr("You are trying to connect to an obsolete server. Please downgrade your Cockatrice version or connect to a suitable server.\nLocal version is %1, remote version is %2.").arg(localVersion).arg(remoteVersion));
else
QMessageBox::critical(this, tr("Error"), tr("Your Cockatrice client is obsolete. Please update your Cockatrice version.\nLocal version is %1, remote version is %2.").arg(localVersion).arg(remoteVersion));
} }
void MainWindow::setClientStatusTitle() void MainWindow::setClientStatusTitle()
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -138,26 +138,32 @@ void CommandContainer::setResponse(ProtocolResponse *_resp) ...@@ -138,26 +138,32 @@ void CommandContainer::setResponse(ProtocolResponse *_resp)
resp = _resp; resp = _resp;
} }
void CommandContainer::enqueueGameEventPublic(GameEvent *event, int gameId) void CommandContainer::enqueueGameEventPublic(GameEvent *event, int gameId, GameEventContext *context)
{ {
if (!gameEventQueuePublic) if (!gameEventQueuePublic)
gameEventQueuePublic = new GameEventContainer(QList<GameEvent *>(), gameId); gameEventQueuePublic = new GameEventContainer(QList<GameEvent *>(), gameId);
gameEventQueuePublic->addGameEvent(event); gameEventQueuePublic->addGameEvent(event);
if (context)
gameEventQueuePublic->setContext(context);
} }
void CommandContainer::enqueueGameEventOmniscient(GameEvent *event, int gameId) void CommandContainer::enqueueGameEventOmniscient(GameEvent *event, int gameId, GameEventContext *context)
{ {
if (!gameEventQueueOmniscient) if (!gameEventQueueOmniscient)
gameEventQueueOmniscient = new GameEventContainer(QList<GameEvent *>(), gameId); gameEventQueueOmniscient = new GameEventContainer(QList<GameEvent *>(), gameId);
gameEventQueueOmniscient->addGameEvent(event); gameEventQueueOmniscient->addGameEvent(event);
if (context)
gameEventQueueOmniscient->setContext(context);
} }
void CommandContainer::enqueueGameEventPrivate(GameEvent *event, int gameId, int playerId) void CommandContainer::enqueueGameEventPrivate(GameEvent *event, int gameId, int playerId, GameEventContext *context)
{ {
if (!gameEventQueuePrivate) if (!gameEventQueuePrivate)
gameEventQueuePrivate = new GameEventContainer(QList<GameEvent *>(), gameId); gameEventQueuePrivate = new GameEventContainer(QList<GameEvent *>(), gameId);
gameEventQueuePrivate->addGameEvent(event); gameEventQueuePrivate->addGameEvent(event);
privatePlayerId = playerId; privatePlayerId = playerId;
if (context)
gameEventQueuePrivate->setContext(context);
} }
Command_DeckUpload::Command_DeckUpload(DeckList *_deck, const QString &_path) Command_DeckUpload::Command_DeckUpload(DeckList *_deck, const QString &_path)
......
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
2:mulligan 2:mulligan
2:roll_die:i,sides 2:roll_die:i,sides
2:draw_cards:i,number 2:draw_cards:i,number
2:undo_draw
2:flip_card:s,zone:i,card_id:b,face_down 2:flip_card:s,zone:i,card_id:b,face_down
2:attach_card:s,start_zone:i,card_id:i,target_player_id:s,target_zone:i,target_card_id 2:attach_card:s,start_zone:i,card_id:i,target_player_id:s,target_zone:i,target_card_id
2:create_token:s,zone:s,card_name:s,color:s,pt:s,annotation:b,destroy:i,x:i,y 2:create_token:s,zone:s,card_name:s,color:s,pt:s,annotation:b,destroy:i,x:i,y
...@@ -67,4 +68,5 @@ ...@@ -67,4 +68,5 @@
6:ready_start 6:ready_start
6:concede 6:concede
6:deck_select:i,deck_id 6:deck_select:i,deck_id
6:undo_draw
7:update_server_message 7:update_server_message
This diff is collapsed.
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment