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) {
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; }
int getValue() const { return value; }
void setValue(int _value);
void setShortcutsActive();
void setShortcutsInactive();
};
#endif

View file

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

View file

@ -300,19 +300,12 @@ void Player::retranslateUi()
aMoveRfgToHand->setText(tr("Move to &hand"));
aMoveRfgToGrave->setText(tr("Move to g&raveyard"));
aViewLibrary->setText(tr("&View library"));
aViewLibrary->setShortcut(tr("F3"));
aViewTopCards->setText(tr("View &top cards of library..."));
aViewTopCards->setShortcut(tr("Ctrl+W"));
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"));
aMulligan->setText(tr("Take &mulligan"));
aMulligan->setShortcut(tr("Ctrl+M"));
aMulligan->setText(tr("Take &mulligan"));
aShuffle->setText(tr("&Shuffle"));
aShuffle->setShortcut(tr("Ctrl+S"));
handMenu->setTitle(tr("&Hand"));
sbMenu->setTitle(tr("&Sideboard"));
@ -320,13 +313,9 @@ void Player::retranslateUi()
countersMenu->setTitle(tr("&Counters"));
aUntapAll->setText(tr("&Untap all permanents"));
aUntapAll->setShortcut(tr("Ctrl+U"));
aRollDie->setText(tr("R&oll die..."));
aRollDie->setShortcut(tr("Ctrl+I"));
aCreateToken->setText(tr("&Create token..."));
aCreateToken->setShortcut(tr("Ctrl+T"));
aCreateAnotherToken->setText(tr("C&reate another token"));
aCreateAnotherToken->setShortcut(tr("Ctrl+G"));
sayMenu->setTitle(tr("S&ay"));
QMapIterator<int, Counter *> counterIterator(counters);
@ -341,6 +330,44 @@ void Player::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()
{
sayMenu->clear();

View file

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

View file

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

View file

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

View file

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

View file

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

View file

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

View file

@ -22,6 +22,7 @@
#include "server_counter.h"
#include "server_chatchannel.h"
#include "server_protocolhandler.h"
#include <QDebug>
Server::Server(QObject *parent)
: QObject(parent), nextGameId(0)
@ -30,6 +31,8 @@ Server::Server(QObject *parent)
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)