single player improvements

This commit is contained in:
Max-Wilhelm Bruker 2010-09-07 03:51:48 +02:00
parent 82e4f9e19d
commit c4c1723205
11 changed files with 121 additions and 29 deletions

View file

@ -42,11 +42,24 @@ void Counter::retranslateUi()
{ {
if (menu) { if (menu) {
aSet->setText(tr("&Set counter...")); aSet->setText(tr("&Set counter..."));
if (name == "life") { }
aSet->setShortcut(tr("Ctrl+L")); }
aDec->setShortcut(tr("F11"));
aInc->setShortcut(tr("F12")); void Counter::setShortcutsActive()
} {
if (name == "life") {
aSet->setShortcut(tr("Ctrl+L"));
aDec->setShortcut(tr("F11"));
aInc->setShortcut(tr("F12"));
}
}
void Counter::setShortcutsInactive()
{
if (name == "life") {
aSet->setShortcut(QKeySequence());
aDec->setShortcut(QKeySequence());
aInc->setShortcut(QKeySequence());
} }
} }

View file

@ -37,6 +37,9 @@ public:
QString getName() const { return name; } QString getName() const { return name; }
int getValue() const { return value; } int getValue() const { return value; }
void setValue(int _value); void setValue(int _value);
void setShortcutsActive();
void setShortcutsInactive();
}; };
#endif #endif

View file

@ -13,5 +13,6 @@ LocalServer::~LocalServer()
LocalServerInterface *LocalServer::newConnection() LocalServerInterface *LocalServer::newConnection()
{ {
LocalServerInterface *lsi = new LocalServerInterface(this); LocalServerInterface *lsi = new LocalServerInterface(this);
addClient(lsi);
return lsi; return lsi;
} }

View file

@ -300,19 +300,12 @@ void Player::retranslateUi()
aMoveRfgToHand->setText(tr("Move to &hand")); aMoveRfgToHand->setText(tr("Move to &hand"));
aMoveRfgToGrave->setText(tr("Move to g&raveyard")); aMoveRfgToGrave->setText(tr("Move to g&raveyard"));
aViewLibrary->setText(tr("&View library")); aViewLibrary->setText(tr("&View library"));
aViewLibrary->setShortcut(tr("F3"));
aViewTopCards->setText(tr("View &top cards of library...")); aViewTopCards->setText(tr("View &top cards of library..."));
aViewTopCards->setShortcut(tr("Ctrl+W"));
aViewGraveyard->setShortcut(tr("F4"));
aViewSideboard->setText(tr("&View sideboard")); aViewSideboard->setText(tr("&View sideboard"));
aDrawCard->setText(tr("&Draw card")); aDrawCard->setText(tr("&Draw card"));
aDrawCard->setShortcut(tr("Ctrl+D"));
aDrawCards->setText(tr("D&raw cards...")); aDrawCards->setText(tr("D&raw cards..."));
aDrawCards->setShortcut(tr("Ctrl+E")); aMulligan->setText(tr("Take &mulligan"));
aMulligan->setText(tr("Take &mulligan"));
aMulligan->setShortcut(tr("Ctrl+M"));
aShuffle->setText(tr("&Shuffle")); aShuffle->setText(tr("&Shuffle"));
aShuffle->setShortcut(tr("Ctrl+S"));
handMenu->setTitle(tr("&Hand")); handMenu->setTitle(tr("&Hand"));
sbMenu->setTitle(tr("&Sideboard")); sbMenu->setTitle(tr("&Sideboard"));
@ -320,13 +313,9 @@ void Player::retranslateUi()
countersMenu->setTitle(tr("&Counters")); countersMenu->setTitle(tr("&Counters"));
aUntapAll->setText(tr("&Untap all permanents")); aUntapAll->setText(tr("&Untap all permanents"));
aUntapAll->setShortcut(tr("Ctrl+U"));
aRollDie->setText(tr("R&oll die...")); aRollDie->setText(tr("R&oll die..."));
aRollDie->setShortcut(tr("Ctrl+I"));
aCreateToken->setText(tr("&Create token...")); aCreateToken->setText(tr("&Create token..."));
aCreateToken->setShortcut(tr("Ctrl+T"));
aCreateAnotherToken->setText(tr("C&reate another token")); aCreateAnotherToken->setText(tr("C&reate another token"));
aCreateAnotherToken->setShortcut(tr("Ctrl+G"));
sayMenu->setTitle(tr("S&ay")); sayMenu->setTitle(tr("S&ay"));
QMapIterator<int, Counter *> counterIterator(counters); QMapIterator<int, Counter *> counterIterator(counters);
@ -341,6 +330,44 @@ void Player::retranslateUi()
zoneIterator.next().value()->retranslateUi(); zoneIterator.next().value()->retranslateUi();
} }
void Player::setShortcutsActive()
{
aViewLibrary->setShortcut(tr("F3"));
aViewTopCards->setShortcut(tr("Ctrl+W"));
aViewGraveyard->setShortcut(tr("F4"));
aDrawCard->setShortcut(tr("Ctrl+D"));
aDrawCards->setShortcut(tr("Ctrl+E"));
aMulligan->setShortcut(tr("Ctrl+M"));
aShuffle->setShortcut(tr("Ctrl+S"));
aUntapAll->setShortcut(tr("Ctrl+U"));
aRollDie->setShortcut(tr("Ctrl+I"));
aCreateToken->setShortcut(tr("Ctrl+T"));
aCreateAnotherToken->setShortcut(tr("Ctrl+G"));
QMapIterator<int, Counter *> counterIterator(counters);
while (counterIterator.hasNext())
counterIterator.next().value()->setShortcutsActive();
}
void Player::setShortcutsInactive()
{
aViewLibrary->setShortcut(QKeySequence());
aViewTopCards->setShortcut(QKeySequence());
aViewGraveyard->setShortcut(QKeySequence());
aDrawCard->setShortcut(QKeySequence());
aDrawCards->setShortcut(QKeySequence());
aMulligan->setShortcut(QKeySequence());
aShuffle->setShortcut(QKeySequence());
aUntapAll->setShortcut(QKeySequence());
aRollDie->setShortcut(QKeySequence());
aCreateToken->setShortcut(QKeySequence());
aCreateAnotherToken->setShortcut(QKeySequence());
QMapIterator<int, Counter *> counterIterator(counters);
while (counterIterator.hasNext())
counterIterator.next().value()->setShortcutsInactive();
}
void Player::initSayMenu() void Player::initSayMenu()
{ {
sayMenu->clear(); sayMenu->clear();

View file

@ -185,6 +185,8 @@ public:
QMenu *getCardMenu() const; QMenu *getCardMenu() const;
bool getActive() const { return active; } bool getActive() const { return active; }
void setActive(bool _active); void setActive(bool _active);
void setShortcutsActive();
void setShortcutsInactive();
qreal getMinimumWidth() const; qreal getMinimumWidth() const;
void setMirrored(bool _mirrored); void setMirrored(bool _mirrored);

View file

@ -328,8 +328,10 @@ Player *TabGame::addPlayer(int playerId, const QString &playerName)
AbstractClient *client; AbstractClient *client;
if (clients.size() > 1) if (clients.size() > 1)
client = clients.at(playerId); client = clients.at(playerId);
else else {
client = clients.first(); client = clients.first();
newPlayer->setShortcutsActive();
}
DeckViewContainer *deckView = new DeckViewContainer(client, this); DeckViewContainer *deckView = new DeckViewContainer(client, this);
connect(deckView, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *))); connect(deckView, SIGNAL(newCardAdded(AbstractCardItem *)), this, SLOT(newCardAdded(AbstractCardItem *)));
deckViewContainers.insert(playerId, deckView); deckViewContainers.insert(playerId, deckView);
@ -590,7 +592,15 @@ Player *TabGame::setActivePlayer(int id)
QMapIterator<int, Player *> i(players); QMapIterator<int, Player *> i(players);
while (i.hasNext()) { while (i.hasNext()) {
i.next(); i.next();
i.value()->setActive(i.value() == player); if (i.value() == player) {
i.value()->setActive(true);
if (clients.size() > 1)
i.value()->setShortcutsActive();
} else {
i.value()->setActive(false);
if (clients.size() > 1)
i.value()->setShortcutsInactive();
}
} }
currentPhase = -1; currentPhase = -1;
emit userEvent(); emit userEvent();

View file

@ -20,6 +20,7 @@ TabSupervisor:: TabSupervisor(QWidget *parent)
TabSupervisor::~TabSupervisor() TabSupervisor::~TabSupervisor()
{ {
stop();
delete tabChangedIcon; delete tabChangedIcon;
} }
@ -78,11 +79,22 @@ void TabSupervisor::startLocal(const QList<AbstractClient *> &_clients)
void TabSupervisor::stop() void TabSupervisor::stop()
{ {
if (!client) if ((!client) && localClients.isEmpty())
return; return;
disconnect(client, 0, this, 0); if (client) {
disconnect(client, 0, this, 0);
client = 0;
}
if (!localClients.isEmpty()) {
for (int i = 0; i < localClients.size(); ++i)
localClients[i]->deleteLater();
localClients.clear();
emit localGameEnded();
}
clear(); clear();
delete tabServer; delete tabServer;
@ -93,12 +105,12 @@ void TabSupervisor::stop()
QMapIterator<QString, TabChatChannel *> chatChannelIterator(chatChannelTabs); QMapIterator<QString, TabChatChannel *> chatChannelIterator(chatChannelTabs);
while (chatChannelIterator.hasNext()) while (chatChannelIterator.hasNext())
delete chatChannelIterator.next().value(); chatChannelIterator.next().value()->deleteLater();
chatChannelTabs.clear(); chatChannelTabs.clear();
QMapIterator<int, TabGame *> gameIterator(gameTabs); QMapIterator<int, TabGame *> gameIterator(gameTabs);
while (gameIterator.hasNext()) while (gameIterator.hasNext())
delete gameIterator.next().value(); gameIterator.next().value()->deleteLater();
gameTabs.clear(); gameTabs.clear();
} }
@ -128,7 +140,6 @@ void TabSupervisor::localGameJoined(Event_GameJoined *event)
setCurrentWidget(tab); setCurrentWidget(tab);
for (int i = 1; i < localClients.size(); ++i) { for (int i = 1; i < localClients.size(); ++i) {
qDebug("JOINING");
Command_JoinGame *cmd = new Command_JoinGame(event->getGameId()); Command_JoinGame *cmd = new Command_JoinGame(event->getGameId());
localClients[i]->sendCommand(cmd); localClients[i]->sendCommand(cmd);
} }
@ -140,6 +151,9 @@ void TabSupervisor::gameLeft(TabGame *tab)
gameTabs.remove(tab->getGameId()); gameTabs.remove(tab->getGameId());
removeTab(indexOf(tab)); removeTab(indexOf(tab));
if (!localClients.isEmpty())
stop();
} }
void TabSupervisor::addChatChannelTab(const QString &channelName) void TabSupervisor::addChatChannelTab(const QString &channelName)

View file

@ -36,6 +36,7 @@ public:
int getGameCount() const { return gameTabs.size(); } int getGameCount() const { return gameTabs.size(); }
signals: signals:
void setMenu(QMenu *menu); void setMenu(QMenu *menu);
void localGameEnded();
private slots: private slots:
void updateCurrent(int index); void updateCurrent(int index);
void updatePingTime(int value, int max); void updatePingTime(int value, int max);

View file

@ -48,10 +48,12 @@ void MainWindow::statusChanged(ClientStatus _status)
break; break;
case StatusDisconnected: case StatusDisconnected:
tabSupervisor->stop(); tabSupervisor->stop();
aSinglePlayer->setEnabled(true);
aConnect->setEnabled(true); aConnect->setEnabled(true);
aDisconnect->setEnabled(false); aDisconnect->setEnabled(false);
break; break;
case StatusLoggingIn: case StatusLoggingIn:
aSinglePlayer->setEnabled(false);
aConnect->setEnabled(false); aConnect->setEnabled(false);
aDisconnect->setEnabled(true); aDisconnect->setEnabled(true);
break; break;
@ -85,13 +87,17 @@ void MainWindow::actSinglePlayer()
if (!ok) if (!ok)
return; return;
LocalServer *ls = new LocalServer(this); aConnect->setEnabled(false);
LocalServerInterface *mainLsi = ls->newConnection(); aSinglePlayer->setEnabled(false);
localServer = new LocalServer(this);
LocalServerInterface *mainLsi = localServer->newConnection();
LocalClient *mainClient = new LocalClient(mainLsi, tr("Player %1").arg(1), this); LocalClient *mainClient = new LocalClient(mainLsi, tr("Player %1").arg(1), this);
QList<AbstractClient *> localClients;
localClients.append(mainClient); localClients.append(mainClient);
for (int i = 0; i < numberPlayers - 1; ++i) { for (int i = 0; i < numberPlayers - 1; ++i) {
LocalServerInterface *slaveLsi = ls->newConnection(); LocalServerInterface *slaveLsi = localServer->newConnection();
LocalClient *slaveClient = new LocalClient(slaveLsi, tr("Player %1").arg(i + 2), this); LocalClient *slaveClient = new LocalClient(slaveLsi, tr("Player %1").arg(i + 2), this);
localClients.append(slaveClient); localClients.append(slaveClient);
} }
@ -101,6 +107,15 @@ void MainWindow::actSinglePlayer()
mainClient->sendCommand(createCommand); mainClient->sendCommand(createCommand);
} }
void MainWindow::localGameEnded()
{
delete localServer;
localServer = 0;
aConnect->setEnabled(true);
aSinglePlayer->setEnabled(true);
}
void MainWindow::actDeckEditor() void MainWindow::actDeckEditor()
{ {
WndDeckEditor *deckEditor = new WndDeckEditor(this); WndDeckEditor *deckEditor = new WndDeckEditor(this);
@ -214,7 +229,7 @@ void MainWindow::createMenus()
} }
MainWindow::MainWindow(QWidget *parent) MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent), tabMenu(0) : QMainWindow(parent), tabMenu(0), localServer(0)
{ {
QPixmapCache::setCacheLimit(200000); QPixmapCache::setCacheLimit(200000);
@ -227,6 +242,7 @@ MainWindow::MainWindow(QWidget *parent)
tabSupervisor = new TabSupervisor; tabSupervisor = new TabSupervisor;
connect(tabSupervisor, SIGNAL(setMenu(QMenu *)), this, SLOT(updateTabMenu(QMenu *))); connect(tabSupervisor, SIGNAL(setMenu(QMenu *)), this, SLOT(updateTabMenu(QMenu *)));
connect(tabSupervisor, SIGNAL(localGameEnded()), this, SLOT(localGameEnded()));
setCentralWidget(tabSupervisor); setCentralWidget(tabSupervisor);

View file

@ -27,6 +27,7 @@
class TabSupervisor; class TabSupervisor;
class RemoteClient; class RemoteClient;
class LocalClient; class LocalClient;
class LocalServer;
class MainWindow : public QMainWindow { class MainWindow : public QMainWindow {
Q_OBJECT Q_OBJECT
@ -37,6 +38,7 @@ private slots:
void serverError(ResponseCode r); void serverError(ResponseCode r);
void socketError(const QString &errorStr); void socketError(const QString &errorStr);
void protocolVersionMismatch(int localVersion, int remoteVersion); void protocolVersionMismatch(int localVersion, int remoteVersion);
void localGameEnded();
void actConnect(); void actConnect();
void actDisconnect(); void actDisconnect();
@ -56,7 +58,7 @@ private:
TabSupervisor *tabSupervisor; TabSupervisor *tabSupervisor;
RemoteClient *client; RemoteClient *client;
QList<AbstractClient *> localClients; LocalServer *localServer;
public: public:
MainWindow(QWidget *parent = 0); MainWindow(QWidget *parent = 0);
protected: protected:

View file

@ -22,6 +22,7 @@
#include "server_counter.h" #include "server_counter.h"
#include "server_chatchannel.h" #include "server_chatchannel.h"
#include "server_protocolhandler.h" #include "server_protocolhandler.h"
#include <QDebug>
Server::Server(QObject *parent) Server::Server(QObject *parent)
: QObject(parent), nextGameId(0) : QObject(parent), nextGameId(0)
@ -30,6 +31,8 @@ Server::Server(QObject *parent)
Server::~Server() Server::~Server()
{ {
while (!clients.isEmpty())
delete clients.takeFirst();
} }
Server_Game *Server::createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator) Server_Game *Server::createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator)