Merge branch 'master' of ssh://marcus@cockatrice.de/home/cockgit/cockatrice
This commit is contained in:
commit
5b1bf7a1a2
28 changed files with 855 additions and 182 deletions
|
@ -44,7 +44,8 @@ HEADERS += src/counter.h \
|
||||||
src/window_sets.h \
|
src/window_sets.h \
|
||||||
src/abstractgraphicsitem.h \
|
src/abstractgraphicsitem.h \
|
||||||
src/dlg_settings.h \
|
src/dlg_settings.h \
|
||||||
src/phasestoolbar.h
|
src/phasestoolbar.h \
|
||||||
|
src/chatwidget.h
|
||||||
SOURCES += src/counter.cpp \
|
SOURCES += src/counter.cpp \
|
||||||
src/gameselector.cpp \
|
src/gameselector.cpp \
|
||||||
src/dlg_creategame.cpp \
|
src/dlg_creategame.cpp \
|
||||||
|
@ -82,5 +83,6 @@ SOURCES += src/counter.cpp \
|
||||||
src/window_sets.cpp \
|
src/window_sets.cpp \
|
||||||
src/abstractgraphicsitem.cpp \
|
src/abstractgraphicsitem.cpp \
|
||||||
src/dlg_settings.cpp \
|
src/dlg_settings.cpp \
|
||||||
src/phasestoolbar.cpp
|
src/phasestoolbar.cpp \
|
||||||
|
src/chatwidget.cpp
|
||||||
TRANSLATIONS += translations/cockatrice_de.ts translations/cockatrice_en.ts
|
TRANSLATIONS += translations/cockatrice_de.ts translations/cockatrice_en.ts
|
||||||
|
|
|
@ -62,6 +62,7 @@ CardInfoWidget::CardInfoWidget(CardDatabase *_db, QWidget *parent)
|
||||||
|
|
||||||
retranslateUi();
|
retranslateUi();
|
||||||
setFrameStyle(QFrame::Panel | QFrame::Raised);
|
setFrameStyle(QFrame::Panel | QFrame::Raised);
|
||||||
|
textLabel->setFixedHeight(130);
|
||||||
setFixedSize(sizeHint());
|
setFixedSize(sizeHint());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
250
cockatrice/src/chatwidget.cpp
Normal file
250
cockatrice/src/chatwidget.cpp
Normal file
|
@ -0,0 +1,250 @@
|
||||||
|
#include <QtGui>
|
||||||
|
#include "chatwidget.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
|
ChannelWidget::ChannelWidget(Client *_client, const QString &_name, bool readOnly, bool _virtualChannel, QWidget *parent)
|
||||||
|
: QWidget(parent), client(_client), name(_name), virtualChannel(_virtualChannel)
|
||||||
|
{
|
||||||
|
playerList = new QListWidget;
|
||||||
|
playerList->setFixedWidth(100);
|
||||||
|
|
||||||
|
textEdit = new QTextEdit;
|
||||||
|
textEdit->setReadOnly(true);
|
||||||
|
if (!readOnly) {
|
||||||
|
sayEdit = new QLineEdit;
|
||||||
|
connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(sendMessage()));
|
||||||
|
}
|
||||||
|
|
||||||
|
QVBoxLayout *vbox = new QVBoxLayout;
|
||||||
|
vbox->addWidget(textEdit);
|
||||||
|
if (!readOnly)
|
||||||
|
vbox->addWidget(sayEdit);
|
||||||
|
|
||||||
|
QHBoxLayout *hbox = new QHBoxLayout;
|
||||||
|
hbox->addLayout(vbox);
|
||||||
|
hbox->addWidget(playerList);
|
||||||
|
|
||||||
|
setLayout(hbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChannelWidget::~ChannelWidget()
|
||||||
|
{
|
||||||
|
if (!virtualChannel)
|
||||||
|
client->chatLeaveChannel(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::sendMessage()
|
||||||
|
{
|
||||||
|
if (sayEdit->text().isEmpty())
|
||||||
|
return;
|
||||||
|
client->chatSay(name, sayEdit->text());
|
||||||
|
sayEdit->clear();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::joinEvent(const QString &playerName)
|
||||||
|
{
|
||||||
|
textEdit->append(tr("%1 has joined the channel.").arg(playerName));
|
||||||
|
playerList->addItem(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::listPlayersEvent(const QString &playerName)
|
||||||
|
{
|
||||||
|
playerList->addItem(playerName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::leaveEvent(const QString &playerName)
|
||||||
|
{
|
||||||
|
textEdit->append(tr("%1 has left the channel.").arg(playerName));
|
||||||
|
for (int i = 0; i < playerList->count(); ++i)
|
||||||
|
if (playerList->item(i)->text() == playerName) {
|
||||||
|
delete playerList->takeItem(i);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::sayEvent(const QString &playerName, const QString &s)
|
||||||
|
{
|
||||||
|
textEdit->append(QString("<font color=\"red\">%1:</font> %2").arg(playerName).arg(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChannelWidget::serverMessageEvent(const QString &s)
|
||||||
|
{
|
||||||
|
textEdit->append(QString("<font color=\"blue\">%1</font>").arg(s));
|
||||||
|
}
|
||||||
|
|
||||||
|
ChatWidget::ChatWidget(Client *_client, QWidget *parent)
|
||||||
|
: QWidget(parent), client(_client)
|
||||||
|
{
|
||||||
|
channelList = new QTreeWidget;
|
||||||
|
channelList->setRootIsDecorated(false);
|
||||||
|
channelList->setFixedWidth(200);
|
||||||
|
|
||||||
|
joinButton = new QPushButton;
|
||||||
|
connect(joinButton, SIGNAL(clicked()), this, SLOT(joinClicked()));
|
||||||
|
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
||||||
|
buttonLayout->addStretch();
|
||||||
|
buttonLayout->addWidget(joinButton);
|
||||||
|
QVBoxLayout *leftLayout = new QVBoxLayout;
|
||||||
|
leftLayout->addWidget(channelList);
|
||||||
|
leftLayout->addLayout(buttonLayout);
|
||||||
|
|
||||||
|
tab = new QTabWidget;
|
||||||
|
|
||||||
|
QHBoxLayout *hbox = new QHBoxLayout;
|
||||||
|
hbox->addLayout(leftLayout);
|
||||||
|
hbox->addWidget(tab, 1);
|
||||||
|
|
||||||
|
retranslateUi();
|
||||||
|
setLayout(hbox);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::retranslateUi()
|
||||||
|
{
|
||||||
|
joinButton->setText(tr("Joi&n"));
|
||||||
|
|
||||||
|
QTreeWidgetItem *header = channelList->headerItem();
|
||||||
|
Q_ASSERT(header != 0);
|
||||||
|
header->setText(0, tr("Channel"));
|
||||||
|
header->setText(1, tr("Players"));
|
||||||
|
header->setTextAlignment(1, Qt::AlignRight);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::enableChat()
|
||||||
|
{
|
||||||
|
connect(client, SIGNAL(chatEvent(const ChatEventData &)), this, SLOT(chatEvent(const ChatEventData &)));
|
||||||
|
client->chatListChannels();
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::disableChat()
|
||||||
|
{
|
||||||
|
disconnect(client, 0, this, 0);
|
||||||
|
while (tab->count()) {
|
||||||
|
ChannelWidget *cw = qobject_cast<ChannelWidget *>(tab->widget(0));
|
||||||
|
tab->removeTab(0);
|
||||||
|
delete cw;
|
||||||
|
}
|
||||||
|
channelList->clear();
|
||||||
|
hide();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::chatEvent(const ChatEventData &data)
|
||||||
|
{
|
||||||
|
const QStringList &msg = data.getEventData();
|
||||||
|
switch (data.getEventType()) {
|
||||||
|
case eventChatListChannels: {
|
||||||
|
if (msg.size() != 4)
|
||||||
|
break;
|
||||||
|
for (int i = 0; i < channelList->topLevelItemCount(); ++i) {
|
||||||
|
QTreeWidgetItem *twi = channelList->topLevelItem(i);
|
||||||
|
if (twi->text(0) == msg[0]) {
|
||||||
|
twi->setToolTip(0, msg[1]);
|
||||||
|
twi->setText(1, msg[2]);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
QTreeWidgetItem *twi = new QTreeWidgetItem(QStringList() << msg[0] << msg[2]);
|
||||||
|
twi->setTextAlignment(1, Qt::AlignRight);
|
||||||
|
twi->setToolTip(0, msg[1]);
|
||||||
|
channelList->addTopLevelItem(twi);
|
||||||
|
channelList->resizeColumnToContents(0);
|
||||||
|
channelList->resizeColumnToContents(1);
|
||||||
|
if (msg[3] == "1")
|
||||||
|
joinChannel(msg[0]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eventChatJoinChannel: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->joinEvent(msg[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eventChatListPlayers: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->listPlayersEvent(msg[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eventChatLeaveChannel: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->leaveEvent(msg[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eventChatSay: {
|
||||||
|
if (msg.size() != 3)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w = getChannel(msg[0]);
|
||||||
|
if (!w)
|
||||||
|
break;
|
||||||
|
w->sayEvent(msg[1], msg[2]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case eventChatServerMessage: {
|
||||||
|
if (msg.size() != 2)
|
||||||
|
break;
|
||||||
|
ChannelWidget *w;
|
||||||
|
if (msg[0].isEmpty()) {
|
||||||
|
w = getChannel("Server");
|
||||||
|
if (!w) {
|
||||||
|
w = new ChannelWidget(client, "Server", true, true);
|
||||||
|
tab->addTab(w, "Server");
|
||||||
|
}
|
||||||
|
} else
|
||||||
|
w = getChannel(msg[0]);
|
||||||
|
w->serverMessageEvent(msg[1]);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
default: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::joinChannel(const QString &channelName)
|
||||||
|
{
|
||||||
|
PendingCommand *pc = client->chatJoinChannel(channelName);
|
||||||
|
pc->setExtraData(channelName);
|
||||||
|
connect(pc, SIGNAL(finished(ServerResponse)), this, SLOT(joinFinished(ServerResponse)));
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::joinClicked()
|
||||||
|
{
|
||||||
|
QTreeWidgetItem *twi = channelList->currentItem();
|
||||||
|
if (!twi)
|
||||||
|
return;
|
||||||
|
QString channelName = twi->text(0);
|
||||||
|
if (getChannel(channelName))
|
||||||
|
return;
|
||||||
|
|
||||||
|
joinChannel(channelName);
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatWidget::joinFinished(ServerResponse resp)
|
||||||
|
{
|
||||||
|
if (resp != RespOk)
|
||||||
|
return;
|
||||||
|
|
||||||
|
PendingCommand *pc = qobject_cast<PendingCommand *>(sender());
|
||||||
|
QString channelName = pc->getExtraData();
|
||||||
|
ChannelWidget *cw = new ChannelWidget(client, channelName);
|
||||||
|
tab->addTab(cw, channelName);
|
||||||
|
}
|
||||||
|
|
||||||
|
ChannelWidget *ChatWidget::getChannel(const QString &name)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < tab->count(); ++i) {
|
||||||
|
ChannelWidget *cw = qobject_cast<ChannelWidget *>(tab->widget(i));
|
||||||
|
if (cw->getName() == name)
|
||||||
|
return cw;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
59
cockatrice/src/chatwidget.h
Normal file
59
cockatrice/src/chatwidget.h
Normal file
|
@ -0,0 +1,59 @@
|
||||||
|
#ifndef CHATWIDGET_H
|
||||||
|
#define CHATWIDGET_H
|
||||||
|
|
||||||
|
#include <QWidget>
|
||||||
|
#include "servereventdata.h"
|
||||||
|
#include "client.h"
|
||||||
|
|
||||||
|
class QListWidget;
|
||||||
|
class QTextEdit;
|
||||||
|
class QLineEdit;
|
||||||
|
class QTreeWidget;
|
||||||
|
class QTabWidget;
|
||||||
|
class QPushButton;
|
||||||
|
|
||||||
|
class ChannelWidget : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QListWidget *playerList;
|
||||||
|
QTextEdit *textEdit;
|
||||||
|
QLineEdit *sayEdit;
|
||||||
|
Client *client;
|
||||||
|
QString name;
|
||||||
|
bool virtualChannel;
|
||||||
|
private slots:
|
||||||
|
void sendMessage();
|
||||||
|
public:
|
||||||
|
ChannelWidget(Client *_client, const QString &_name, bool readOnly = false, bool _virtualChannel = false, QWidget *parent = 0);
|
||||||
|
~ChannelWidget();
|
||||||
|
const QString &getName() const { return name; }
|
||||||
|
|
||||||
|
void joinEvent(const QString &playerName);
|
||||||
|
void listPlayersEvent(const QString &playerName);
|
||||||
|
void leaveEvent(const QString &playerName);
|
||||||
|
void sayEvent(const QString &playerName, const QString &s);
|
||||||
|
void serverMessageEvent(const QString &s);
|
||||||
|
};
|
||||||
|
|
||||||
|
class ChatWidget : public QWidget {
|
||||||
|
Q_OBJECT
|
||||||
|
private:
|
||||||
|
QTreeWidget *channelList;
|
||||||
|
QPushButton *joinButton;
|
||||||
|
QTabWidget *tab;
|
||||||
|
Client *client;
|
||||||
|
|
||||||
|
ChannelWidget *getChannel(const QString &name);
|
||||||
|
void joinChannel(const QString &channelName);
|
||||||
|
private slots:
|
||||||
|
void chatEvent(const ChatEventData &data);
|
||||||
|
void joinClicked();
|
||||||
|
void joinFinished(ServerResponse resp);
|
||||||
|
public:
|
||||||
|
ChatWidget(Client *_client, QWidget *parent = 0);
|
||||||
|
void retranslateUi();
|
||||||
|
void enableChat();
|
||||||
|
void disableChat();
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -110,6 +110,8 @@ void Client::readLine()
|
||||||
emit playerIdReceived(id, data[1]);
|
emit playerIdReceived(id, data[1]);
|
||||||
} else
|
} else
|
||||||
emit gameEvent(event);
|
emit gameEvent(event);
|
||||||
|
} else if (prefix == "chat") {
|
||||||
|
emit chatEvent(ChatEventData(line));
|
||||||
} else if (prefix == "resp") {
|
} else if (prefix == "resp") {
|
||||||
if (values.size() != 2) {
|
if (values.size() != 2) {
|
||||||
// XXX
|
// XXX
|
||||||
|
@ -231,6 +233,26 @@ void Client::ping()
|
||||||
cmd("ping");
|
cmd("ping");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PendingCommand *Client::chatListChannels()
|
||||||
|
{
|
||||||
|
return cmd("chat_list_channels");
|
||||||
|
}
|
||||||
|
|
||||||
|
PendingCommand *Client::chatJoinChannel(const QString &name)
|
||||||
|
{
|
||||||
|
return cmd(QString("chat_join_channel|%1").arg(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
PendingCommand *Client::chatLeaveChannel(const QString &name)
|
||||||
|
{
|
||||||
|
return cmd(QString("chat_leave_channel|%1").arg(name));
|
||||||
|
}
|
||||||
|
|
||||||
|
PendingCommand *Client::chatSay(const QString &channel, const QString &s)
|
||||||
|
{
|
||||||
|
return cmd(QString("chat_say|%1|%2").arg(channel).arg(s));
|
||||||
|
}
|
||||||
|
|
||||||
PendingCommand *Client::listGames()
|
PendingCommand *Client::listGames()
|
||||||
{
|
{
|
||||||
return cmd("list_games");
|
return cmd("list_games");
|
||||||
|
|
|
@ -33,6 +33,7 @@ private:
|
||||||
QString cmd;
|
QString cmd;
|
||||||
int msgid;
|
int msgid;
|
||||||
int time;
|
int time;
|
||||||
|
QString extraData;
|
||||||
signals:
|
signals:
|
||||||
void finished(ServerResponse resp);
|
void finished(ServerResponse resp);
|
||||||
void timeout();
|
void timeout();
|
||||||
|
@ -42,6 +43,8 @@ public slots:
|
||||||
public:
|
public:
|
||||||
int getMsgId() const { return msgid; }
|
int getMsgId() const { return msgid; }
|
||||||
QString getCmd() const { return cmd; }
|
QString getCmd() const { return cmd; }
|
||||||
|
const QString &getExtraData() const { return extraData; }
|
||||||
|
void setExtraData(const QString &_extraData) { extraData = _extraData; }
|
||||||
PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0);
|
PendingCommand(const QString &_cmd, int _msgid, QObject *parent = 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -57,6 +60,7 @@ signals:
|
||||||
void responseReceived(int msgid, ServerResponse resp);
|
void responseReceived(int msgid, ServerResponse resp);
|
||||||
void playerIdReceived(int id, QString name);
|
void playerIdReceived(int id, QString name);
|
||||||
void gameEvent(const ServerEventData &msg);
|
void gameEvent(const ServerEventData &msg);
|
||||||
|
void chatEvent(const ChatEventData &msg);
|
||||||
void serverTimeout();
|
void serverTimeout();
|
||||||
void logSocketError(const QString &errorString);
|
void logSocketError(const QString &errorString);
|
||||||
void serverError(ServerResponse resp);
|
void serverError(ServerResponse resp);
|
||||||
|
@ -90,6 +94,10 @@ public:
|
||||||
void connectToServer(const QString &hostname, unsigned int port, const QString &_playerName, const QString &_password);
|
void connectToServer(const QString &hostname, unsigned int port, const QString &_playerName, const QString &_password);
|
||||||
void disconnectFromServer();
|
void disconnectFromServer();
|
||||||
public slots:
|
public slots:
|
||||||
|
PendingCommand *chatListChannels();
|
||||||
|
PendingCommand *chatJoinChannel(const QString &name);
|
||||||
|
PendingCommand *chatLeaveChannel(const QString &name);
|
||||||
|
PendingCommand *chatSay(const QString &name, const QString &s);
|
||||||
PendingCommand *listGames();
|
PendingCommand *listGames();
|
||||||
PendingCommand *listPlayers();
|
PendingCommand *listPlayers();
|
||||||
PendingCommand *createGame(const QString &description, const QString &password, unsigned int maxPlayers);
|
PendingCommand *createGame(const QString &description, const QString &password, unsigned int maxPlayers);
|
||||||
|
|
|
@ -300,9 +300,12 @@ void Game::gameEvent(const ServerEventData &msg)
|
||||||
p->gameEvent(msg);
|
p->gameEvent(msg);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case eventInvalid:
|
case eventInvalid: {
|
||||||
qDebug("Unhandled global event");
|
qDebug("Unhandled global event");
|
||||||
}
|
}
|
||||||
|
default: {
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -9,8 +9,8 @@ GameSelector::GameSelector(Client *_client, QWidget *parent)
|
||||||
gameListModel = new GamesModel(this);
|
gameListModel = new GamesModel(this);
|
||||||
gameListView->setModel(gameListModel);
|
gameListView->setModel(gameListModel);
|
||||||
|
|
||||||
createButton = new QPushButton(tr("C&reate"));
|
createButton = new QPushButton;
|
||||||
joinButton = new QPushButton(tr("&Join"));
|
joinButton = new QPushButton;
|
||||||
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
QHBoxLayout *buttonLayout = new QHBoxLayout;
|
||||||
buttonLayout->addStretch();
|
buttonLayout->addStretch();
|
||||||
buttonLayout->addWidget(createButton);
|
buttonLayout->addWidget(createButton);
|
||||||
|
@ -20,6 +20,7 @@ GameSelector::GameSelector(Client *_client, QWidget *parent)
|
||||||
mainLayout->addWidget(gameListView);
|
mainLayout->addWidget(gameListView);
|
||||||
mainLayout->addLayout(buttonLayout);
|
mainLayout->addLayout(buttonLayout);
|
||||||
|
|
||||||
|
retranslateUi();
|
||||||
setLayout(mainLayout);
|
setLayout(mainLayout);
|
||||||
|
|
||||||
setMinimumWidth(gameListView->columnWidth(0) * gameListModel->columnCount());
|
setMinimumWidth(gameListView->columnWidth(0) * gameListModel->columnCount());
|
||||||
|
@ -27,18 +28,13 @@ GameSelector::GameSelector(Client *_client, QWidget *parent)
|
||||||
|
|
||||||
connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate()));
|
connect(createButton, SIGNAL(clicked()), this, SLOT(actCreate()));
|
||||||
connect(joinButton, SIGNAL(clicked()), this, SLOT(actJoin()));
|
connect(joinButton, SIGNAL(clicked()), this, SLOT(actJoin()));
|
||||||
|
|
||||||
connect(client, SIGNAL(gameListEvent(ServerGame *)), gameListModel, SLOT(updateGameList(ServerGame *)));
|
|
||||||
connect(client, SIGNAL(statusChanged(ProtocolStatus)), this, SLOT(statusChanged(ProtocolStatus)));
|
|
||||||
|
|
||||||
client->listGames();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSelector::actCreate()
|
void GameSelector::actCreate()
|
||||||
{
|
{
|
||||||
DlgCreateGame dlg(client, this);
|
DlgCreateGame dlg(client, this);
|
||||||
if (dlg.exec())
|
if (dlg.exec())
|
||||||
deleteLater();
|
disableGameList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSelector::actRefresh()
|
void GameSelector::actRefresh()
|
||||||
|
@ -46,19 +42,13 @@ void GameSelector::actRefresh()
|
||||||
client->listGames();
|
client->listGames();
|
||||||
}
|
}
|
||||||
|
|
||||||
void GameSelector::statusChanged(ProtocolStatus status)
|
|
||||||
{
|
|
||||||
if (status == StatusDisconnected)
|
|
||||||
deleteLater();
|
|
||||||
}
|
|
||||||
|
|
||||||
void GameSelector::checkResponse(ServerResponse response)
|
void GameSelector::checkResponse(ServerResponse response)
|
||||||
{
|
{
|
||||||
createButton->setEnabled(true);
|
createButton->setEnabled(true);
|
||||||
joinButton->setEnabled(true);
|
joinButton->setEnabled(true);
|
||||||
|
|
||||||
if (response == RespOk)
|
if (response == RespOk)
|
||||||
deleteLater();
|
disableGameList();
|
||||||
else {
|
else {
|
||||||
QMessageBox::critical(this, tr("Error"), tr("XXX"));
|
QMessageBox::critical(this, tr("Error"), tr("XXX"));
|
||||||
return;
|
return;
|
||||||
|
@ -84,3 +74,23 @@ void GameSelector::actJoin()
|
||||||
createButton->setEnabled(false);
|
createButton->setEnabled(false);
|
||||||
joinButton->setEnabled(false);
|
joinButton->setEnabled(false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void GameSelector::enableGameList()
|
||||||
|
{
|
||||||
|
connect(client, SIGNAL(gameListEvent(ServerGame *)), gameListModel, SLOT(updateGameList(ServerGame *)));
|
||||||
|
client->listGames();
|
||||||
|
show();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameSelector::disableGameList()
|
||||||
|
{
|
||||||
|
disconnect(client, 0, this, 0);
|
||||||
|
hide();
|
||||||
|
gameListModel->cleanList();
|
||||||
|
}
|
||||||
|
|
||||||
|
void GameSelector::retranslateUi()
|
||||||
|
{
|
||||||
|
createButton->setText(tr("C&reate"));
|
||||||
|
joinButton->setText(tr("&Join"));
|
||||||
|
}
|
|
@ -13,12 +13,14 @@ class GameSelector : public QWidget {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
public:
|
public:
|
||||||
GameSelector(Client *_client, QWidget *parent = 0);
|
GameSelector(Client *_client, QWidget *parent = 0);
|
||||||
|
void enableGameList();
|
||||||
|
void disableGameList();
|
||||||
|
void retranslateUi();
|
||||||
private slots:
|
private slots:
|
||||||
void actCreate();
|
void actCreate();
|
||||||
void actRefresh();
|
void actRefresh();
|
||||||
void actJoin();
|
void actJoin();
|
||||||
void checkResponse(ServerResponse response);
|
void checkResponse(ServerResponse response);
|
||||||
void statusChanged(ProtocolStatus status);
|
|
||||||
private:
|
private:
|
||||||
Client *client;
|
Client *client;
|
||||||
|
|
||||||
|
|
|
@ -69,8 +69,10 @@ void GamesModel::updateGameList(ServerGame *game)
|
||||||
|
|
||||||
void GamesModel::cleanList()
|
void GamesModel::cleanList()
|
||||||
{
|
{
|
||||||
|
beginRemoveRows(QModelIndex(), 0, gameList.size() - 1);
|
||||||
QListIterator<ServerGame *> i(gameList);
|
QListIterator<ServerGame *> i(gameList);
|
||||||
while (i.hasNext())
|
while (i.hasNext())
|
||||||
delete i.next();
|
delete i.next();
|
||||||
gameList.clear();
|
gameList.clear();
|
||||||
|
endRemoveRows();
|
||||||
}
|
}
|
||||||
|
|
|
@ -16,11 +16,11 @@ public:
|
||||||
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
QVariant headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const;
|
||||||
|
|
||||||
ServerGame *getGame(int row);
|
ServerGame *getGame(int row);
|
||||||
|
void cleanList();
|
||||||
public slots:
|
public slots:
|
||||||
void updateGameList(ServerGame *game);
|
void updateGameList(ServerGame *game);
|
||||||
private:
|
private:
|
||||||
QList<ServerGame *> gameList;
|
QList<ServerGame *> gameList;
|
||||||
void cleanList();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -64,6 +64,8 @@ Player::Player(const QString &_name, int _id, QPointF _base, bool _local, CardDa
|
||||||
libraryMenu->addAction(aDrawCard);
|
libraryMenu->addAction(aDrawCard);
|
||||||
libraryMenu->addAction(aDrawCards);
|
libraryMenu->addAction(aDrawCards);
|
||||||
libraryMenu->addSeparator();
|
libraryMenu->addSeparator();
|
||||||
|
libraryMenu->addAction(aShuffle);
|
||||||
|
libraryMenu->addSeparator();
|
||||||
libraryMenu->addAction(aViewLibrary);
|
libraryMenu->addAction(aViewLibrary);
|
||||||
libraryMenu->addAction(aViewTopCards);
|
libraryMenu->addAction(aViewTopCards);
|
||||||
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
|
zones.findZone("deck")->setMenu(libraryMenu, aDrawCard);
|
||||||
|
|
|
@ -3,49 +3,58 @@
|
||||||
// Message structure for server events:
|
// Message structure for server events:
|
||||||
// {"private","public"}|PlayerId|PlayerName|EventType|EventData
|
// {"private","public"}|PlayerId|PlayerName|EventType|EventData
|
||||||
|
|
||||||
const int event_count = 21;
|
QHash<QString, ServerEventType> ServerEventData::eventHash;
|
||||||
const event_string event_strings[event_count] = {
|
|
||||||
{eventPlayerId, "player_id"},
|
|
||||||
{eventSay, "say"},
|
|
||||||
{eventName, "name"},
|
|
||||||
{eventJoin, "join"},
|
|
||||||
{eventLeave, "leave"},
|
|
||||||
{eventReadyStart, "ready_start"},
|
|
||||||
{eventSetupZones, "setup_zones"},
|
|
||||||
{eventGameStart, "game_start"},
|
|
||||||
{eventShuffle, "shuffle"},
|
|
||||||
{eventRollDice, "roll_dice"},
|
|
||||||
{eventDraw, "draw"},
|
|
||||||
{eventMoveCard, "move_card"},
|
|
||||||
{eventCreateToken, "create_token"},
|
|
||||||
{eventSetCardAttr, "set_card_attr"},
|
|
||||||
{eventAddCounter, "add_counter"},
|
|
||||||
{eventSetCounter, "set_counter"},
|
|
||||||
{eventDelCounter, "del_counter"},
|
|
||||||
{eventSetActivePlayer, "set_active_player"},
|
|
||||||
{eventSetActivePhase, "set_active_phase"},
|
|
||||||
{eventDumpZone, "dump_zone"},
|
|
||||||
{eventStopDumpZone, "stop_dump_zone"}
|
|
||||||
};
|
|
||||||
|
|
||||||
ServerEventData::ServerEventData(const QString &line)
|
ServerEventData::ServerEventData(const QString &line)
|
||||||
{
|
{
|
||||||
QStringList values = line.split("|");
|
if (eventHash.isEmpty()) {
|
||||||
|
eventHash.insert("player_id", eventPlayerId);
|
||||||
|
eventHash.insert("say", eventSay);
|
||||||
|
eventHash.insert("name", eventName);
|
||||||
|
eventHash.insert("join", eventJoin);
|
||||||
|
eventHash.insert("leave", eventLeave);
|
||||||
|
eventHash.insert("ready_start", eventReadyStart);
|
||||||
|
eventHash.insert("setup_zones", eventSetupZones);
|
||||||
|
eventHash.insert("game_start", eventGameStart);
|
||||||
|
eventHash.insert("shuffle", eventShuffle);
|
||||||
|
eventHash.insert("roll_dice", eventRollDice);
|
||||||
|
eventHash.insert("draw", eventDraw);
|
||||||
|
eventHash.insert("move_card", eventMoveCard);
|
||||||
|
eventHash.insert("create_token", eventCreateToken);
|
||||||
|
eventHash.insert("set_card_attr", eventSetCardAttr);
|
||||||
|
eventHash.insert("add_counter", eventAddCounter);
|
||||||
|
eventHash.insert("set_counter", eventSetCounter);
|
||||||
|
eventHash.insert("del_counter", eventDelCounter);
|
||||||
|
eventHash.insert("set_active_player", eventSetActivePlayer);
|
||||||
|
eventHash.insert("set_active_phase", eventSetActivePhase);
|
||||||
|
eventHash.insert("dump_zone", eventDumpZone);
|
||||||
|
eventHash.insert("stop_dump_zone", eventStopDumpZone);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList values = line.split('|');
|
||||||
|
|
||||||
IsPublic = !values.takeFirst().compare("public");
|
IsPublic = !values.takeFirst().compare("public");
|
||||||
PlayerId = values.takeFirst().toInt();
|
PlayerId = values.takeFirst().toInt();
|
||||||
PlayerName = values.takeFirst();
|
PlayerName = values.takeFirst();
|
||||||
|
EventType = eventHash.value(values.takeFirst(), eventInvalid);
|
||||||
QString type = values.takeFirst();
|
|
||||||
bool found = false;
|
|
||||||
for (int i = 0; i < event_count; i++)
|
|
||||||
if (!type.compare(event_strings[i].str)) {
|
|
||||||
EventType = event_strings[i].type;
|
|
||||||
found = true;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
if (!found)
|
|
||||||
EventType = eventInvalid;
|
|
||||||
|
|
||||||
EventData = values;
|
EventData = values;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
QHash<QString, ChatEventType> ChatEventData::eventHash;
|
||||||
|
|
||||||
|
ChatEventData::ChatEventData(const QString &line)
|
||||||
|
{
|
||||||
|
if (eventHash.isEmpty()) {
|
||||||
|
eventHash.insert("list_channels", eventChatListChannels);
|
||||||
|
eventHash.insert("join_channel", eventChatJoinChannel);
|
||||||
|
eventHash.insert("list_players", eventChatListPlayers);
|
||||||
|
eventHash.insert("leave_channel", eventChatLeaveChannel);
|
||||||
|
eventHash.insert("say", eventChatSay);
|
||||||
|
eventHash.insert("server_message", eventChatServerMessage);
|
||||||
|
}
|
||||||
|
|
||||||
|
QStringList values = line.split('|');
|
||||||
|
values.removeFirst();
|
||||||
|
eventType = eventHash.value(values.takeFirst(), eventChatInvalid);
|
||||||
|
eventData = values;
|
||||||
|
}
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#define SERVEREVENTDATA_H
|
#define SERVEREVENTDATA_H
|
||||||
|
|
||||||
#include <QStringList>
|
#include <QStringList>
|
||||||
|
#include <QHash>
|
||||||
|
|
||||||
enum ServerEventType {
|
enum ServerEventType {
|
||||||
eventInvalid,
|
eventInvalid,
|
||||||
|
@ -28,16 +29,10 @@ enum ServerEventType {
|
||||||
eventStopDumpZone
|
eventStopDumpZone
|
||||||
};
|
};
|
||||||
|
|
||||||
struct event_string {
|
|
||||||
ServerEventType type;
|
|
||||||
char *str;
|
|
||||||
};
|
|
||||||
|
|
||||||
extern const int event_count;
|
|
||||||
extern const event_string event_strings[];
|
|
||||||
|
|
||||||
class ServerEventData {
|
class ServerEventData {
|
||||||
private:
|
private:
|
||||||
|
static QHash<QString, ServerEventType> eventHash;
|
||||||
|
|
||||||
bool IsPublic;
|
bool IsPublic;
|
||||||
int PlayerId;
|
int PlayerId;
|
||||||
QString PlayerName;
|
QString PlayerName;
|
||||||
|
@ -47,9 +42,31 @@ public:
|
||||||
ServerEventData(const QString &line);
|
ServerEventData(const QString &line);
|
||||||
bool getPublic() const { return IsPublic; }
|
bool getPublic() const { return IsPublic; }
|
||||||
int getPlayerId() const { return PlayerId; }
|
int getPlayerId() const { return PlayerId; }
|
||||||
QString getPlayerName() const { return PlayerName; }
|
const QString &getPlayerName() const { return PlayerName; }
|
||||||
ServerEventType getEventType() const { return EventType; }
|
ServerEventType getEventType() const { return EventType; }
|
||||||
QStringList getEventData() const { return EventData; }
|
const QStringList &getEventData() const { return EventData; }
|
||||||
|
};
|
||||||
|
|
||||||
|
enum ChatEventType {
|
||||||
|
eventChatInvalid,
|
||||||
|
eventChatListChannels,
|
||||||
|
eventChatJoinChannel,
|
||||||
|
eventChatListPlayers,
|
||||||
|
eventChatLeaveChannel,
|
||||||
|
eventChatSay,
|
||||||
|
eventChatServerMessage
|
||||||
|
};
|
||||||
|
|
||||||
|
class ChatEventData {
|
||||||
|
private:
|
||||||
|
static QHash<QString, ChatEventType> eventHash;
|
||||||
|
|
||||||
|
ChatEventType eventType;
|
||||||
|
QStringList eventData;
|
||||||
|
public:
|
||||||
|
ChatEventData(const QString &line);
|
||||||
|
ChatEventType getEventType() const { return eventType; }
|
||||||
|
const QStringList &getEventData() const { return eventData; }
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
|
@ -35,6 +35,7 @@
|
||||||
#include "zoneviewzone.h"
|
#include "zoneviewzone.h"
|
||||||
#include "zoneviewwidget.h"
|
#include "zoneviewwidget.h"
|
||||||
#include "zoneviewlayout.h"
|
#include "zoneviewlayout.h"
|
||||||
|
#include "chatwidget.h"
|
||||||
|
|
||||||
void MainWindow::hoverCard(QString name)
|
void MainWindow::hoverCard(QString name)
|
||||||
{
|
{
|
||||||
|
@ -69,7 +70,9 @@ void MainWindow::statusChanged(ProtocolStatus _status)
|
||||||
aRestartGame->setEnabled(false);
|
aRestartGame->setEnabled(false);
|
||||||
aLeaveGame->setEnabled(false);
|
aLeaveGame->setEnabled(false);
|
||||||
phasesToolbar->setActivePhase(-1);
|
phasesToolbar->setActivePhase(-1);
|
||||||
phasesToolbar->setEnabled(false);
|
phasesToolbar->hide();
|
||||||
|
gameSelector->disableGameList();
|
||||||
|
chatWidget->disableChat();
|
||||||
emit logDisconnected();
|
emit logDisconnected();
|
||||||
break;
|
break;
|
||||||
case StatusLoggingIn:
|
case StatusLoggingIn:
|
||||||
|
@ -84,14 +87,17 @@ void MainWindow::statusChanged(ProtocolStatus _status)
|
||||||
aRestartGame->setEnabled(false);
|
aRestartGame->setEnabled(false);
|
||||||
aLeaveGame->setEnabled(false);
|
aLeaveGame->setEnabled(false);
|
||||||
phasesToolbar->setActivePhase(-1);
|
phasesToolbar->setActivePhase(-1);
|
||||||
phasesToolbar->setEnabled(false);
|
phasesToolbar->hide();
|
||||||
|
|
||||||
GameSelector *gameSelector = new GameSelector(client);
|
view->hide();
|
||||||
viewLayout->insertWidget(0, gameSelector);
|
gameSelector->enableGameList();
|
||||||
|
chatWidget->enableChat();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case StatusPlaying:
|
case StatusPlaying:
|
||||||
phasesToolbar->setEnabled(true);
|
chatWidget->disableChat();
|
||||||
|
phasesToolbar->show();
|
||||||
|
view->show();
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -211,6 +217,8 @@ void MainWindow::retranslateUi()
|
||||||
sayLabel->setText(tr("&Say:"));
|
sayLabel->setText(tr("&Say:"));
|
||||||
|
|
||||||
cardInfo->retranslateUi();
|
cardInfo->retranslateUi();
|
||||||
|
chatWidget->retranslateUi();
|
||||||
|
gameSelector->retranslateUi();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::createActions()
|
void MainWindow::createActions()
|
||||||
|
@ -272,6 +280,7 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
|
|
||||||
scene = new QGraphicsScene(0, 0, 1096, 1160, this);
|
scene = new QGraphicsScene(0, 0, 1096, 1160, this);
|
||||||
view = new GameView(scene);
|
view = new GameView(scene);
|
||||||
|
view->hide();
|
||||||
|
|
||||||
// view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
|
// view->setViewport(new QGLWidget(QGLFormat(QGL::SampleBuffers)));
|
||||||
|
|
||||||
|
@ -285,6 +294,12 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
sayLabel = new QLabel;
|
sayLabel = new QLabel;
|
||||||
sayEdit = new QLineEdit;
|
sayEdit = new QLineEdit;
|
||||||
sayLabel->setBuddy(sayEdit);
|
sayLabel->setBuddy(sayEdit);
|
||||||
|
|
||||||
|
client = new Client(this);
|
||||||
|
gameSelector = new GameSelector(client);
|
||||||
|
gameSelector->hide();
|
||||||
|
chatWidget = new ChatWidget(client);
|
||||||
|
chatWidget->hide();
|
||||||
|
|
||||||
QHBoxLayout *hLayout = new QHBoxLayout;
|
QHBoxLayout *hLayout = new QHBoxLayout;
|
||||||
hLayout->addWidget(sayLabel);
|
hLayout->addWidget(sayLabel);
|
||||||
|
@ -296,10 +311,12 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
verticalLayout->addLayout(hLayout);
|
verticalLayout->addLayout(hLayout);
|
||||||
|
|
||||||
viewLayout = new QVBoxLayout;
|
viewLayout = new QVBoxLayout;
|
||||||
|
viewLayout->addWidget(gameSelector);
|
||||||
|
viewLayout->addWidget(chatWidget);
|
||||||
viewLayout->addWidget(view);
|
viewLayout->addWidget(view);
|
||||||
|
|
||||||
phasesToolbar = new PhasesToolbar;
|
phasesToolbar = new PhasesToolbar;
|
||||||
phasesToolbar->setEnabled(false);
|
phasesToolbar->hide();
|
||||||
|
|
||||||
QHBoxLayout *mainLayout = new QHBoxLayout;
|
QHBoxLayout *mainLayout = new QHBoxLayout;
|
||||||
mainLayout->addWidget(phasesToolbar);
|
mainLayout->addWidget(phasesToolbar);
|
||||||
|
@ -312,7 +329,6 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
|
|
||||||
connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(actSay()));
|
connect(sayEdit, SIGNAL(returnPressed()), this, SLOT(actSay()));
|
||||||
|
|
||||||
client = new Client(this);
|
|
||||||
connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout()));
|
connect(client, SIGNAL(serverTimeout()), this, SLOT(serverTimeout()));
|
||||||
connect(client, SIGNAL(statusChanged(ProtocolStatus)), this, SLOT(statusChanged(ProtocolStatus)));
|
connect(client, SIGNAL(statusChanged(ProtocolStatus)), this, SLOT(statusChanged(ProtocolStatus)));
|
||||||
connect(client, SIGNAL(playerIdReceived(int, QString)), this, SLOT(playerIdReceived(int, QString)));
|
connect(client, SIGNAL(playerIdReceived(int, QString)), this, SLOT(playerIdReceived(int, QString)));
|
||||||
|
@ -334,6 +350,8 @@ MainWindow::MainWindow(QTranslator *_translator, QWidget *parent)
|
||||||
void MainWindow::closeEvent(QCloseEvent */*event*/)
|
void MainWindow::closeEvent(QCloseEvent */*event*/)
|
||||||
{
|
{
|
||||||
delete game;
|
delete game;
|
||||||
|
chatWidget->disableChat();
|
||||||
|
gameSelector->disableGameList();
|
||||||
}
|
}
|
||||||
|
|
||||||
void MainWindow::changeEvent(QEvent *event)
|
void MainWindow::changeEvent(QEvent *event)
|
||||||
|
|
|
@ -40,6 +40,8 @@ class ServerZoneCard;
|
||||||
class ZoneViewLayout;
|
class ZoneViewLayout;
|
||||||
class ZoneViewWidget;
|
class ZoneViewWidget;
|
||||||
class PhasesToolbar;
|
class PhasesToolbar;
|
||||||
|
class GameSelector;
|
||||||
|
class ChatWidget;
|
||||||
|
|
||||||
class MainWindow : public QMainWindow {
|
class MainWindow : public QMainWindow {
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
|
@ -80,6 +82,8 @@ private:
|
||||||
QLabel *sayLabel;
|
QLabel *sayLabel;
|
||||||
QLineEdit *sayEdit;
|
QLineEdit *sayEdit;
|
||||||
PhasesToolbar *phasesToolbar;
|
PhasesToolbar *phasesToolbar;
|
||||||
|
GameSelector *gameSelector;
|
||||||
|
ChatWidget *chatWidget;
|
||||||
|
|
||||||
Client *client;
|
Client *client;
|
||||||
QGraphicsScene *scene;
|
QGraphicsScene *scene;
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE TS><TS version="1.1" language="de_DE">
|
<!DOCTYPE TS>
|
||||||
<defaultcodec></defaultcodec>
|
<TS version="2.0" language="de_DE">
|
||||||
<context>
|
<context>
|
||||||
<name></name>
|
<name></name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -55,22 +55,22 @@
|
||||||
<context>
|
<context>
|
||||||
<name>CardInfoWidget</name>
|
<name>CardInfoWidget</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="93"/>
|
<location filename="../src/cardinfowidget.cpp" line="94"/>
|
||||||
<source>Name:</source>
|
<source>Name:</source>
|
||||||
<translation>Name:</translation>
|
<translation>Name:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="94"/>
|
<location filename="../src/cardinfowidget.cpp" line="95"/>
|
||||||
<source>Mana cost:</source>
|
<source>Mana cost:</source>
|
||||||
<translation>Manakosten:</translation>
|
<translation>Manakosten:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="95"/>
|
<location filename="../src/cardinfowidget.cpp" line="96"/>
|
||||||
<source>Card type:</source>
|
<source>Card type:</source>
|
||||||
<translation>Kartentyp:</translation>
|
<translation>Kartentyp:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="96"/>
|
<location filename="../src/cardinfowidget.cpp" line="97"/>
|
||||||
<source>P / T:</source>
|
<source>P / T:</source>
|
||||||
<translation>S/W:</translation>
|
<translation>S/W:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -83,6 +83,41 @@
|
||||||
<translation type="obsolete">Das Kartenhintergrundbild konnte nicht geladen werden.</translation>
|
<translation type="obsolete">Das Kartenhintergrundbild konnte nicht geladen werden.</translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ChannelWidget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="46"/>
|
||||||
|
<source>%1 has joined the channel.</source>
|
||||||
|
<translation>%1 hat den Raum betreten.</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="57"/>
|
||||||
|
<source>%1 has left the channel.</source>
|
||||||
|
<translation>%1 hat den Raum verlassen.</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ChatWidget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="103"/>
|
||||||
|
<source>Joi&n</source>
|
||||||
|
<translation>Teil&nehmen</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="107"/>
|
||||||
|
<source>Channel</source>
|
||||||
|
<translation>Raum</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<source>Description</source>
|
||||||
|
<translation type="obsolete">Beschreibung</translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="108"/>
|
||||||
|
<source>Players</source>
|
||||||
|
<translation>Spielerzahl</translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DeckList</name>
|
<name>DeckList</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -185,6 +220,7 @@
|
||||||
<translation>Spiel erstellen</translation>
|
<translation>Spiel erstellen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_creategame.cpp" line="54"/>
|
||||||
<location filename="../src/dlg_creategame.cpp" line="71"/>
|
<location filename="../src/dlg_creategame.cpp" line="71"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation>Fehler</translation>
|
<translation>Fehler</translation>
|
||||||
|
@ -316,32 +352,26 @@
|
||||||
<translation>Ctrl+L</translation>
|
<translation>Ctrl+L</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="40"/>
|
|
||||||
<source>&Shuffle</source>
|
<source>&Shuffle</source>
|
||||||
<translation type="obsolete">Mi&schen</translation>
|
<translation type="obsolete">Mi&schen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="41"/>
|
|
||||||
<source>Ctrl+S</source>
|
<source>Ctrl+S</source>
|
||||||
<translation type="obsolete">Ctrl+S</translation>
|
<translation type="obsolete">Ctrl+S</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="43"/>
|
|
||||||
<source>&Draw a card</source>
|
<source>&Draw a card</source>
|
||||||
<translation type="obsolete">Karte &ziehen</translation>
|
<translation type="obsolete">Karte &ziehen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="44"/>
|
|
||||||
<source>Ctrl+D</source>
|
<source>Ctrl+D</source>
|
||||||
<translation type="obsolete">Ctrl+D</translation>
|
<translation type="obsolete">Ctrl+D</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="46"/>
|
|
||||||
<source>D&raw cards...</source>
|
<source>D&raw cards...</source>
|
||||||
<translation type="obsolete">Ka&rten ziehen...</translation>
|
<translation type="obsolete">Ka&rten ziehen...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="48"/>
|
|
||||||
<source>Ctrl+E</source>
|
<source>Ctrl+E</source>
|
||||||
<translation type="obsolete">Ctrl+E</translation>
|
<translation type="obsolete">Ctrl+E</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -494,47 +524,46 @@
|
||||||
<translation>F10</translation>
|
<translation>F10</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="340"/>
|
<location filename="../src/game.cpp" line="343"/>
|
||||||
<source>Set life</source>
|
<source>Set life</source>
|
||||||
<translation>Setze Leben</translation>
|
<translation>Setze Leben</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="340"/>
|
<location filename="../src/game.cpp" line="343"/>
|
||||||
<source>New life total:</source>
|
<source>New life total:</source>
|
||||||
<translation>Neues Leben insgesammt:</translation>
|
<translation>Neues Leben insgesammt:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="348"/>
|
<location filename="../src/game.cpp" line="351"/>
|
||||||
<source>Roll dice</source>
|
<source>Roll dice</source>
|
||||||
<translation>Würfeln</translation>
|
<translation>Würfeln</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="348"/>
|
<location filename="../src/game.cpp" line="351"/>
|
||||||
<source>Number of sides:</source>
|
<source>Number of sides:</source>
|
||||||
<translation>Anzahl der Seiten:</translation>
|
<translation>Anzahl der Seiten:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="377"/>
|
|
||||||
<source>Draw cards</source>
|
<source>Draw cards</source>
|
||||||
<translation type="obsolete">Karten ziehen</translation>
|
<translation type="obsolete">Karten ziehen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="418"/>
|
<location filename="../src/game.cpp" line="421"/>
|
||||||
<source>Number:</source>
|
<source>Number:</source>
|
||||||
<translation>Anzahl:</translation>
|
<translation>Anzahl:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="355"/>
|
<location filename="../src/game.cpp" line="358"/>
|
||||||
<source>Create token</source>
|
<source>Create token</source>
|
||||||
<translation>Token erstellen</translation>
|
<translation>Token erstellen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="355"/>
|
<location filename="../src/game.cpp" line="358"/>
|
||||||
<source>Name:</source>
|
<source>Name:</source>
|
||||||
<translation>Name:</translation>
|
<translation>Name:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="418"/>
|
<location filename="../src/game.cpp" line="421"/>
|
||||||
<source>Set counters</source>
|
<source>Set counters</source>
|
||||||
<translation>Setze Zählmarke</translation>
|
<translation>Setze Zählmarke</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -542,32 +571,32 @@
|
||||||
<context>
|
<context>
|
||||||
<name>GameSelector</name>
|
<name>GameSelector</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="12"/>
|
<location filename="../src/gameselector.cpp" line="94"/>
|
||||||
<source>C&reate</source>
|
<source>C&reate</source>
|
||||||
<translation>Spiel e&rstellen</translation>
|
<translation>Spiel e&rstellen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="13"/>
|
<location filename="../src/gameselector.cpp" line="95"/>
|
||||||
<source>&Join</source>
|
<source>&Join</source>
|
||||||
<translation>&Teilnehmen</translation>
|
<translation>&Teilnehmen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="63"/>
|
<location filename="../src/gameselector.cpp" line="53"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation>Fehler</translation>
|
<translation>Fehler</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="63"/>
|
<location filename="../src/gameselector.cpp" line="53"/>
|
||||||
<source>XXX</source>
|
<source>XXX</source>
|
||||||
<translation>XXX</translation>
|
<translation>XXX</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="77"/>
|
<location filename="../src/gameselector.cpp" line="67"/>
|
||||||
<source>Join game</source>
|
<source>Join game</source>
|
||||||
<translation>Spiel beitreten</translation>
|
<translation>Spiel beitreten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="77"/>
|
<location filename="../src/gameselector.cpp" line="67"/>
|
||||||
<source>Password:</source>
|
<source>Password:</source>
|
||||||
<translation>Passwort:</translation>
|
<translation>Passwort:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -613,6 +642,9 @@
|
||||||
<context>
|
<context>
|
||||||
<name>GeneralSettingsPage</name>
|
<name>GeneralSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="114"/>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="125"/>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="138"/>
|
||||||
<location filename="../src/dlg_settings.cpp" line="151"/>
|
<location filename="../src/dlg_settings.cpp" line="151"/>
|
||||||
<source>Choose path</source>
|
<source>Choose path</source>
|
||||||
<translation>Pfad auswählen</translation>
|
<translation>Pfad auswählen</translation>
|
||||||
|
@ -653,6 +685,7 @@
|
||||||
<translation>Pfad zur Kartendatenbank:</translation>
|
<translation>Pfad zur Kartendatenbank:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="21"/>
|
||||||
<location filename="../src/dlg_settings.cpp" line="109"/>
|
<location filename="../src/dlg_settings.cpp" line="109"/>
|
||||||
<source>English</source>
|
<source>English</source>
|
||||||
<translation>Deutsch</translation>
|
<translation>Deutsch</translation>
|
||||||
|
@ -661,97 +694,97 @@
|
||||||
<context>
|
<context>
|
||||||
<name>MainWindow</name>
|
<name>MainWindow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="187"/>
|
<location filename="../src/window_main.cpp" line="193"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation>Fehler</translation>
|
<translation>Fehler</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="187"/>
|
<location filename="../src/window_main.cpp" line="193"/>
|
||||||
<source>Server timeout</source>
|
<source>Server timeout</source>
|
||||||
<translation>Server Zeitüberschreitung</translation>
|
<translation>Server Zeitüberschreitung</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="194"/>
|
<location filename="../src/window_main.cpp" line="200"/>
|
||||||
<source>&Connect...</source>
|
<source>&Connect...</source>
|
||||||
<translation>&Verbinden...</translation>
|
<translation>&Verbinden...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="195"/>
|
<location filename="../src/window_main.cpp" line="201"/>
|
||||||
<source>&Disconnect</source>
|
<source>&Disconnect</source>
|
||||||
<translation>Verbindung &trennen</translation>
|
<translation>Verbindung &trennen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="196"/>
|
<location filename="../src/window_main.cpp" line="202"/>
|
||||||
<source>&Restart game...</source>
|
<source>&Restart game...</source>
|
||||||
<translation>Spiel neu sta&rten...</translation>
|
<translation>Spiel neu sta&rten...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="197"/>
|
<location filename="../src/window_main.cpp" line="203"/>
|
||||||
<source>F2</source>
|
<source>F2</source>
|
||||||
<translation>F2</translation>
|
<translation>F2</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="198"/>
|
<location filename="../src/window_main.cpp" line="204"/>
|
||||||
<source>&Leave game</source>
|
<source>&Leave game</source>
|
||||||
<translation>Spiel ver&lassen</translation>
|
<translation>Spiel ver&lassen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="199"/>
|
<location filename="../src/window_main.cpp" line="205"/>
|
||||||
<source>&Deck editor</source>
|
<source>&Deck editor</source>
|
||||||
<translation>&Deck-Editor</translation>
|
<translation>&Deck-Editor</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="200"/>
|
<location filename="../src/window_main.cpp" line="206"/>
|
||||||
<source>&Full screen</source>
|
<source>&Full screen</source>
|
||||||
<translation>&Vollbild</translation>
|
<translation>&Vollbild</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="201"/>
|
<location filename="../src/window_main.cpp" line="207"/>
|
||||||
<source>Ctrl+F</source>
|
<source>Ctrl+F</source>
|
||||||
<translation>Ctrl+F</translation>
|
<translation>Ctrl+F</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="202"/>
|
<location filename="../src/window_main.cpp" line="208"/>
|
||||||
<source>&Settings...</source>
|
<source>&Settings...</source>
|
||||||
<translation>&Einstellungen...</translation>
|
<translation>&Einstellungen...</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="203"/>
|
<location filename="../src/window_main.cpp" line="209"/>
|
||||||
<source>&Exit</source>
|
<source>&Exit</source>
|
||||||
<translation>&Beenden</translation>
|
<translation>&Beenden</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="204"/>
|
<location filename="../src/window_main.cpp" line="210"/>
|
||||||
<source>Close most recent zone view</source>
|
<source>Close most recent zone view</source>
|
||||||
<translation>Letzte Zonenansicht schließen</translation>
|
<translation>Letzte Zonenansicht schließen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="205"/>
|
<location filename="../src/window_main.cpp" line="211"/>
|
||||||
<source>Esc</source>
|
<source>Esc</source>
|
||||||
<translation>Esc</translation>
|
<translation>Esc</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="207"/>
|
<location filename="../src/window_main.cpp" line="213"/>
|
||||||
<source>&Game</source>
|
<source>&Game</source>
|
||||||
<translation>Spi&el</translation>
|
<translation>Spi&el</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="208"/>
|
<location filename="../src/window_main.cpp" line="214"/>
|
||||||
<source>&Actions</source>
|
<source>&Actions</source>
|
||||||
<translation>&Aktionen</translation>
|
<translation>&Aktionen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="209"/>
|
<location filename="../src/window_main.cpp" line="215"/>
|
||||||
<source>&Card</source>
|
<source>&Card</source>
|
||||||
<translation>&Karte</translation>
|
<translation>&Karte</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="211"/>
|
<location filename="../src/window_main.cpp" line="217"/>
|
||||||
<source>&Say:</source>
|
<source>&Say:</source>
|
||||||
<translation>&Sagen:</translation>
|
<translation>&Sagen:</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="192"/>
|
<location filename="../src/window_main.cpp" line="198"/>
|
||||||
<source>Cockatrice</source>
|
<source>Cockatrice</source>
|
||||||
<translation>Cockatrice</translation>
|
<translation>Cockatrice</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1208,27 +1241,27 @@
|
||||||
<translation>Bib&liothek</translation>
|
<translation>Bib&liothek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="72"/>
|
<location filename="../src/player.cpp" line="74"/>
|
||||||
<source>&Graveyard</source>
|
<source>&Graveyard</source>
|
||||||
<translation>&Friedhof</translation>
|
<translation>&Friedhof</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="76"/>
|
<location filename="../src/player.cpp" line="78"/>
|
||||||
<source>&Removed cards</source>
|
<source>&Removed cards</source>
|
||||||
<translation>Entfe&rnte Karten</translation>
|
<translation>Entfe&rnte Karten</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="81"/>
|
<location filename="../src/player.cpp" line="83"/>
|
||||||
<source>&Sideboard</source>
|
<source>&Sideboard</source>
|
||||||
<translation>&Sideboard</translation>
|
<translation>&Sideboard</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="115"/>
|
<location filename="../src/player.cpp" line="117"/>
|
||||||
<source>View top cards of library</source>
|
<source>View top cards of library</source>
|
||||||
<translation>Zeige die obersten Karten der Bibliothek</translation>
|
<translation>Zeige die obersten Karten der Bibliothek</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="115"/>
|
<location filename="../src/player.cpp" line="117"/>
|
||||||
<source>Number of cards:</source>
|
<source>Number of cards:</source>
|
||||||
<translation>Anzahl der Karten:</translation>
|
<translation>Anzahl der Karten:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1263,12 +1296,12 @@
|
||||||
<translation>Ctrl+S</translation>
|
<translation>Ctrl+S</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="149"/>
|
<location filename="../src/player.cpp" line="151"/>
|
||||||
<source>Draw cards</source>
|
<source>Draw cards</source>
|
||||||
<translation>Karten ziehen</translation>
|
<translation>Karten ziehen</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="149"/>
|
<location filename="../src/player.cpp" line="151"/>
|
||||||
<source>Number:</source>
|
<source>Number:</source>
|
||||||
<translation>Anzahl:</translation>
|
<translation>Anzahl:</translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1286,12 +1319,12 @@
|
||||||
<translation>Sideboard</translation>
|
<translation>Sideboard</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/decklist.cpp" line="297"/>
|
<location filename="../src/decklist.cpp" line="296"/>
|
||||||
<source>Cockatrice decks (*.cod)</source>
|
<source>Cockatrice decks (*.cod)</source>
|
||||||
<translation>Cockatrice Decks (*.cod)</translation>
|
<translation>Cockatrice Decks (*.cod)</translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/decklist.cpp" line="298"/>
|
<location filename="../src/decklist.cpp" line="297"/>
|
||||||
<source>Plain text decks (*.dec *.mwDeck)</source>
|
<source>Plain text decks (*.dec *.mwDeck)</source>
|
||||||
<translation>Text Decks (*.dec *.mwDeck)</translation>
|
<translation>Text Decks (*.dec *.mwDeck)</translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<!DOCTYPE TS><TS version="1.1" language="en_US">
|
<!DOCTYPE TS>
|
||||||
|
<TS version="2.0" language="en_US">
|
||||||
<context>
|
<context>
|
||||||
<name>CardDatabaseModel</name>
|
<name>CardDatabaseModel</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -31,26 +32,57 @@
|
||||||
<context>
|
<context>
|
||||||
<name>CardInfoWidget</name>
|
<name>CardInfoWidget</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="93"/>
|
<location filename="../src/cardinfowidget.cpp" line="94"/>
|
||||||
<source>Name:</source>
|
<source>Name:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="94"/>
|
<location filename="../src/cardinfowidget.cpp" line="95"/>
|
||||||
<source>Mana cost:</source>
|
<source>Mana cost:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="95"/>
|
<location filename="../src/cardinfowidget.cpp" line="96"/>
|
||||||
<source>Card type:</source>
|
<source>Card type:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/cardinfowidget.cpp" line="96"/>
|
<location filename="../src/cardinfowidget.cpp" line="97"/>
|
||||||
<source>P / T:</source>
|
<source>P / T:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
</context>
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ChannelWidget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="46"/>
|
||||||
|
<source>%1 has joined the channel.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="57"/>
|
||||||
|
<source>%1 has left the channel.</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
|
<context>
|
||||||
|
<name>ChatWidget</name>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="103"/>
|
||||||
|
<source>Joi&n</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="107"/>
|
||||||
|
<source>Channel</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
<message>
|
||||||
|
<location filename="../src/chatwidget.cpp" line="108"/>
|
||||||
|
<source>Players</source>
|
||||||
|
<translation type="unfinished"></translation>
|
||||||
|
</message>
|
||||||
|
</context>
|
||||||
<context>
|
<context>
|
||||||
<name>DeckList</name>
|
<name>DeckList</name>
|
||||||
<message>
|
<message>
|
||||||
|
@ -153,6 +185,7 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_creategame.cpp" line="54"/>
|
||||||
<location filename="../src/dlg_creategame.cpp" line="71"/>
|
<location filename="../src/dlg_creategame.cpp" line="71"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -397,42 +430,42 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="340"/>
|
<location filename="../src/game.cpp" line="343"/>
|
||||||
<source>Set life</source>
|
<source>Set life</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="340"/>
|
<location filename="../src/game.cpp" line="343"/>
|
||||||
<source>New life total:</source>
|
<source>New life total:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="348"/>
|
<location filename="../src/game.cpp" line="351"/>
|
||||||
<source>Roll dice</source>
|
<source>Roll dice</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="348"/>
|
<location filename="../src/game.cpp" line="351"/>
|
||||||
<source>Number of sides:</source>
|
<source>Number of sides:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="418"/>
|
<location filename="../src/game.cpp" line="421"/>
|
||||||
<source>Number:</source>
|
<source>Number:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="355"/>
|
<location filename="../src/game.cpp" line="358"/>
|
||||||
<source>Create token</source>
|
<source>Create token</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="355"/>
|
<location filename="../src/game.cpp" line="358"/>
|
||||||
<source>Name:</source>
|
<source>Name:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/game.cpp" line="418"/>
|
<location filename="../src/game.cpp" line="421"/>
|
||||||
<source>Set counters</source>
|
<source>Set counters</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -440,32 +473,32 @@
|
||||||
<context>
|
<context>
|
||||||
<name>GameSelector</name>
|
<name>GameSelector</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="12"/>
|
<location filename="../src/gameselector.cpp" line="94"/>
|
||||||
<source>C&reate</source>
|
<source>C&reate</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="13"/>
|
<location filename="../src/gameselector.cpp" line="95"/>
|
||||||
<source>&Join</source>
|
<source>&Join</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="63"/>
|
<location filename="../src/gameselector.cpp" line="53"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="63"/>
|
<location filename="../src/gameselector.cpp" line="53"/>
|
||||||
<source>XXX</source>
|
<source>XXX</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="77"/>
|
<location filename="../src/gameselector.cpp" line="67"/>
|
||||||
<source>Join game</source>
|
<source>Join game</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/gameselector.cpp" line="77"/>
|
<location filename="../src/gameselector.cpp" line="67"/>
|
||||||
<source>Password:</source>
|
<source>Password:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -511,6 +544,9 @@
|
||||||
<context>
|
<context>
|
||||||
<name>GeneralSettingsPage</name>
|
<name>GeneralSettingsPage</name>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="114"/>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="125"/>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="138"/>
|
||||||
<location filename="../src/dlg_settings.cpp" line="151"/>
|
<location filename="../src/dlg_settings.cpp" line="151"/>
|
||||||
<source>Choose path</source>
|
<source>Choose path</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
|
@ -551,6 +587,7 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
|
<location filename="../src/dlg_settings.cpp" line="21"/>
|
||||||
<location filename="../src/dlg_settings.cpp" line="109"/>
|
<location filename="../src/dlg_settings.cpp" line="109"/>
|
||||||
<source>English</source>
|
<source>English</source>
|
||||||
<translation>English</translation>
|
<translation>English</translation>
|
||||||
|
@ -559,97 +596,97 @@
|
||||||
<context>
|
<context>
|
||||||
<name>MainWindow</name>
|
<name>MainWindow</name>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="187"/>
|
<location filename="../src/window_main.cpp" line="193"/>
|
||||||
<source>Error</source>
|
<source>Error</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="187"/>
|
<location filename="../src/window_main.cpp" line="193"/>
|
||||||
<source>Server timeout</source>
|
<source>Server timeout</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="194"/>
|
<location filename="../src/window_main.cpp" line="200"/>
|
||||||
<source>&Connect...</source>
|
<source>&Connect...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="195"/>
|
<location filename="../src/window_main.cpp" line="201"/>
|
||||||
<source>&Disconnect</source>
|
<source>&Disconnect</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="196"/>
|
<location filename="../src/window_main.cpp" line="202"/>
|
||||||
<source>&Restart game...</source>
|
<source>&Restart game...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="197"/>
|
<location filename="../src/window_main.cpp" line="203"/>
|
||||||
<source>F2</source>
|
<source>F2</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="198"/>
|
<location filename="../src/window_main.cpp" line="204"/>
|
||||||
<source>&Leave game</source>
|
<source>&Leave game</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="199"/>
|
<location filename="../src/window_main.cpp" line="205"/>
|
||||||
<source>&Deck editor</source>
|
<source>&Deck editor</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="200"/>
|
<location filename="../src/window_main.cpp" line="206"/>
|
||||||
<source>&Full screen</source>
|
<source>&Full screen</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="201"/>
|
<location filename="../src/window_main.cpp" line="207"/>
|
||||||
<source>Ctrl+F</source>
|
<source>Ctrl+F</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="202"/>
|
<location filename="../src/window_main.cpp" line="208"/>
|
||||||
<source>&Settings...</source>
|
<source>&Settings...</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="203"/>
|
<location filename="../src/window_main.cpp" line="209"/>
|
||||||
<source>&Exit</source>
|
<source>&Exit</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="204"/>
|
<location filename="../src/window_main.cpp" line="210"/>
|
||||||
<source>Close most recent zone view</source>
|
<source>Close most recent zone view</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="205"/>
|
<location filename="../src/window_main.cpp" line="211"/>
|
||||||
<source>Esc</source>
|
<source>Esc</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="207"/>
|
<location filename="../src/window_main.cpp" line="213"/>
|
||||||
<source>&Game</source>
|
<source>&Game</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="208"/>
|
<location filename="../src/window_main.cpp" line="214"/>
|
||||||
<source>&Actions</source>
|
<source>&Actions</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="209"/>
|
<location filename="../src/window_main.cpp" line="215"/>
|
||||||
<source>&Card</source>
|
<source>&Card</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="211"/>
|
<location filename="../src/window_main.cpp" line="217"/>
|
||||||
<source>&Say:</source>
|
<source>&Say:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/window_main.cpp" line="192"/>
|
<location filename="../src/window_main.cpp" line="198"/>
|
||||||
<source>Cockatrice</source>
|
<source>Cockatrice</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1086,27 +1123,27 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="72"/>
|
<location filename="../src/player.cpp" line="74"/>
|
||||||
<source>&Graveyard</source>
|
<source>&Graveyard</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="76"/>
|
<location filename="../src/player.cpp" line="78"/>
|
||||||
<source>&Removed cards</source>
|
<source>&Removed cards</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="81"/>
|
<location filename="../src/player.cpp" line="83"/>
|
||||||
<source>&Sideboard</source>
|
<source>&Sideboard</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="115"/>
|
<location filename="../src/player.cpp" line="117"/>
|
||||||
<source>View top cards of library</source>
|
<source>View top cards of library</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="115"/>
|
<location filename="../src/player.cpp" line="117"/>
|
||||||
<source>Number of cards:</source>
|
<source>Number of cards:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1141,12 +1178,12 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="149"/>
|
<location filename="../src/player.cpp" line="151"/>
|
||||||
<source>Draw cards</source>
|
<source>Draw cards</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/player.cpp" line="149"/>
|
<location filename="../src/player.cpp" line="151"/>
|
||||||
<source>Number:</source>
|
<source>Number:</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
@ -1164,12 +1201,12 @@
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/decklist.cpp" line="297"/>
|
<location filename="../src/decklist.cpp" line="296"/>
|
||||||
<source>Cockatrice decks (*.cod)</source>
|
<source>Cockatrice decks (*.cod)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
<message>
|
<message>
|
||||||
<location filename="../src/decklist.cpp" line="298"/>
|
<location filename="../src/decklist.cpp" line="297"/>
|
||||||
<source>Plain text decks (*.dec *.mwDeck)</source>
|
<source>Plain text decks (*.dec *.mwDeck)</source>
|
||||||
<translation type="unfinished"></translation>
|
<translation type="unfinished"></translation>
|
||||||
</message>
|
</message>
|
||||||
|
|
|
@ -7,3 +7,14 @@ hostname=localhost
|
||||||
database=servatrice
|
database=servatrice
|
||||||
user=servatrice
|
user=servatrice
|
||||||
password=foobar
|
password=foobar
|
||||||
|
|
||||||
|
[messages]
|
||||||
|
login="Example line 1", "Example line 2"
|
||||||
|
|
||||||
|
[chatchannels]
|
||||||
|
size=1
|
||||||
|
1\name="General Chat"
|
||||||
|
1\description="Discuss anything here."
|
||||||
|
1\autojoin=true
|
||||||
|
1\joinmessage="This is the general chat channel.", "This message is only here to show that channels can have a join message."
|
||||||
|
|
||||||
|
|
|
@ -9,7 +9,7 @@ INCLUDEPATH += . src
|
||||||
MOC_DIR = build
|
MOC_DIR = build
|
||||||
OBJECTS_DIR = build
|
OBJECTS_DIR = build
|
||||||
|
|
||||||
# CONFIG += qt debug
|
CONFIG += qt debug
|
||||||
QT += network sql
|
QT += network sql
|
||||||
QT -= gui
|
QT -= gui
|
||||||
|
|
||||||
|
@ -21,7 +21,8 @@ HEADERS += src/server.h src/servergame.h src/serversocket.h \
|
||||||
src/counter.h \
|
src/counter.h \
|
||||||
src/abstractrng.h \
|
src/abstractrng.h \
|
||||||
src/rng_qt.h \
|
src/rng_qt.h \
|
||||||
src/returnmessage.h
|
src/returnmessage.h \
|
||||||
|
src/chatchannel.h
|
||||||
SOURCES += src/main.cpp \
|
SOURCES += src/main.cpp \
|
||||||
src/server.cpp \
|
src/server.cpp \
|
||||||
src/servergame.cpp \
|
src/servergame.cpp \
|
||||||
|
@ -30,4 +31,5 @@ SOURCES += src/main.cpp \
|
||||||
src/card.cpp \
|
src/card.cpp \
|
||||||
src/counter.cpp \
|
src/counter.cpp \
|
||||||
src/rng_qt.cpp \
|
src/rng_qt.cpp \
|
||||||
src/returnmessage.cpp
|
src/returnmessage.cpp \
|
||||||
|
src/chatchannel.cpp
|
||||||
|
|
46
servatrice/src/chatchannel.cpp
Normal file
46
servatrice/src/chatchannel.cpp
Normal file
|
@ -0,0 +1,46 @@
|
||||||
|
#include "chatchannel.h"
|
||||||
|
#include "serversocket.h"
|
||||||
|
|
||||||
|
ChatChannel::ChatChannel(const QString &_name, const QString &_description, bool _autoJoin, const QStringList &_joinMessage)
|
||||||
|
: name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatChannel::addPlayer(ServerSocket *player)
|
||||||
|
{
|
||||||
|
QString str = QString("chat|join_channel|%1|%2").arg(name).arg(player->getPlayerName());
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
at(i)->msg(str);
|
||||||
|
|
||||||
|
append(player);
|
||||||
|
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
player->msg(QString("chat|list_players|%1|%2").arg(name).arg(at(i)->getPlayerName()));
|
||||||
|
for (int i = 0; i < joinMessage.size(); ++i)
|
||||||
|
player->msg(QString("chat|server_message|%1|%2").arg(name).arg(joinMessage[i]));
|
||||||
|
|
||||||
|
emit channelInfoChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatChannel::removePlayer(ServerSocket *player)
|
||||||
|
{
|
||||||
|
QString str = QString("chat|leave_channel|%1|%2").arg(name).arg(player->getPlayerName());
|
||||||
|
|
||||||
|
removeAt(indexOf(player));
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
at(i)->msg(str);
|
||||||
|
|
||||||
|
emit channelInfoChanged();
|
||||||
|
}
|
||||||
|
|
||||||
|
void ChatChannel::say(ServerSocket *player, const QString &s)
|
||||||
|
{
|
||||||
|
QString str = QString("chat|say|%1|%2|%3").arg(name).arg(player->getPlayerName()).arg(s);
|
||||||
|
for (int i = 0; i < size(); ++i)
|
||||||
|
at(i)->msg(str);
|
||||||
|
}
|
||||||
|
|
||||||
|
QString ChatChannel::getChannelListLine() const
|
||||||
|
{
|
||||||
|
return QString("chat|list_channels|%1|%2|%3|%4").arg(name).arg(description).arg(size()).arg(autoJoin ? 1 : 0);
|
||||||
|
}
|
30
servatrice/src/chatchannel.h
Normal file
30
servatrice/src/chatchannel.h
Normal file
|
@ -0,0 +1,30 @@
|
||||||
|
#ifndef CHATCHANNEL_H
|
||||||
|
#define CHATCHANNEL_H
|
||||||
|
|
||||||
|
#include <QList>
|
||||||
|
#include <QObject>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
|
class ServerSocket;
|
||||||
|
|
||||||
|
class ChatChannel : public QObject, public QList<ServerSocket *> {
|
||||||
|
Q_OBJECT
|
||||||
|
signals:
|
||||||
|
void channelInfoChanged();
|
||||||
|
private:
|
||||||
|
QString name;
|
||||||
|
QString description;
|
||||||
|
bool autoJoin;
|
||||||
|
QStringList joinMessage;
|
||||||
|
public:
|
||||||
|
ChatChannel(const QString &_name, const QString &_description, bool _autoJoin, const QStringList &_joinMessage);
|
||||||
|
QString getName() const { return name; }
|
||||||
|
QString getDescription() const { return description; }
|
||||||
|
bool getAutoJoin() const { return autoJoin; }
|
||||||
|
void addPlayer(ServerSocket *player);
|
||||||
|
void removePlayer(ServerSocket *player);
|
||||||
|
void say(ServerSocket *player, const QString &s);
|
||||||
|
QString getChannelListLine() const;
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif
|
|
@ -10,6 +10,7 @@ bool ReturnMessage::send(ReturnCode code)
|
||||||
switch (code) {
|
switch (code) {
|
||||||
case ReturnNothing: return true;
|
case ReturnNothing: return true;
|
||||||
case ReturnOk: returnCodeString = "ok"; break;
|
case ReturnOk: returnCodeString = "ok"; break;
|
||||||
|
case ReturnNameNotFound: returnCodeString = "name_not_found"; break;
|
||||||
case ReturnLoginNeeded: returnCodeString = "login_needed"; break;
|
case ReturnLoginNeeded: returnCodeString = "login_needed"; break;
|
||||||
case ReturnSyntaxError: returnCodeString = "syntax"; break;
|
case ReturnSyntaxError: returnCodeString = "syntax"; break;
|
||||||
case ReturnContextError: returnCodeString = "context"; break;
|
case ReturnContextError: returnCodeString = "context"; break;
|
||||||
|
|
|
@ -9,7 +9,7 @@ private:
|
||||||
unsigned int msg_id;
|
unsigned int msg_id;
|
||||||
QString cmd;
|
QString cmd;
|
||||||
public:
|
public:
|
||||||
enum ReturnCode { ReturnNothing, ReturnOk, ReturnLoginNeeded, ReturnSyntaxError, ReturnContextError, ReturnPasswordWrong };
|
enum ReturnCode { ReturnNothing, ReturnOk, ReturnNameNotFound, ReturnLoginNeeded, ReturnSyntaxError, ReturnContextError, ReturnPasswordWrong };
|
||||||
ReturnMessage(QObject *parent = 0) : QObject(parent), msg_id(0) { }
|
ReturnMessage(QObject *parent = 0) : QObject(parent), msg_id(0) { }
|
||||||
unsigned int getMsgId() const { return msg_id; }
|
unsigned int getMsgId() const { return msg_id; }
|
||||||
void setMsgId(unsigned int _msg_id) { msg_id = _msg_id; }
|
void setMsgId(unsigned int _msg_id) { msg_id = _msg_id; }
|
||||||
|
|
|
@ -22,11 +22,12 @@
|
||||||
#include "serversocket.h"
|
#include "serversocket.h"
|
||||||
#include "counter.h"
|
#include "counter.h"
|
||||||
#include "rng_qt.h"
|
#include "rng_qt.h"
|
||||||
|
#include "chatchannel.h"
|
||||||
#include <QtSql>
|
#include <QtSql>
|
||||||
#include <QSettings>
|
#include <QSettings>
|
||||||
|
|
||||||
Server::Server(QObject *parent)
|
Server::Server(QObject *parent)
|
||||||
: QTcpServer(parent), nextGameId(0)
|
: QTcpServer(parent), nextGameId(0)
|
||||||
{
|
{
|
||||||
rng = new RNG_Qt(this);
|
rng = new RNG_Qt(this);
|
||||||
|
|
||||||
|
@ -35,6 +36,21 @@ Server::Server(QObject *parent)
|
||||||
QString dbType = settings->value("database/type").toString();
|
QString dbType = settings->value("database/type").toString();
|
||||||
if (dbType == "mysql")
|
if (dbType == "mysql")
|
||||||
openDatabase();
|
openDatabase();
|
||||||
|
|
||||||
|
int size = settings->beginReadArray("chatchannels");
|
||||||
|
for (int i = 0; i < size; ++i) {
|
||||||
|
settings->setArrayIndex(i);
|
||||||
|
chatChannelList << new ChatChannel(settings->value("name").toString(),
|
||||||
|
settings->value("description").toString(),
|
||||||
|
settings->value("autojoin").toBool(),
|
||||||
|
settings->value("joinmessage").toStringList());
|
||||||
|
}
|
||||||
|
settings->endArray();
|
||||||
|
|
||||||
|
for (int i = 0; i < chatChannelList.size(); ++i)
|
||||||
|
connect(chatChannelList[i], SIGNAL(channelInfoChanged()), this, SLOT(broadcastChannelUpdate()));
|
||||||
|
|
||||||
|
loginMessage = settings->value("messages/login").toStringList();
|
||||||
}
|
}
|
||||||
|
|
||||||
Server::~Server()
|
Server::~Server()
|
||||||
|
@ -159,6 +175,14 @@ void Server::broadcastGameListUpdate(ServerGame *game)
|
||||||
players[i]->msg(line);
|
players[i]->msg(line);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Server::broadcastChannelUpdate()
|
||||||
|
{
|
||||||
|
QString line = qobject_cast<ChatChannel *>(sender())->getChannelListLine();
|
||||||
|
for (int i = 0; i < players.size(); ++i)
|
||||||
|
if (players[i]->getAcceptsChatChannelListChanges())
|
||||||
|
players[i]->msg(line);
|
||||||
|
}
|
||||||
|
|
||||||
void Server::addClientToGame(int gameId, ServerSocket *client)
|
void Server::addClientToGame(int gameId, ServerSocket *client)
|
||||||
{
|
{
|
||||||
ServerGame *game = getGame(gameId);
|
ServerGame *game = getGame(gameId);
|
||||||
|
|
|
@ -21,12 +21,14 @@
|
||||||
#define SERVER_H
|
#define SERVER_H
|
||||||
|
|
||||||
#include <QTcpServer>
|
#include <QTcpServer>
|
||||||
|
#include <QStringList>
|
||||||
|
|
||||||
class ServerGame;
|
class ServerGame;
|
||||||
class ServerSocket;
|
class ServerSocket;
|
||||||
class QSqlDatabase;
|
class QSqlDatabase;
|
||||||
class QSettings;
|
class QSettings;
|
||||||
class AbstractRNG;
|
class AbstractRNG;
|
||||||
|
class ChatChannel;
|
||||||
|
|
||||||
enum AuthenticationResult { PasswordWrong = 0, PasswordRight = 1, UnknownUser = 2 };
|
enum AuthenticationResult { PasswordWrong = 0, PasswordRight = 1, UnknownUser = 2 };
|
||||||
|
|
||||||
|
@ -37,6 +39,7 @@ private slots:
|
||||||
void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator);
|
void addGame(const QString description, const QString password, const int maxPlayers, ServerSocket *creator);
|
||||||
void addClientToGame(int gameId, ServerSocket *client);
|
void addClientToGame(int gameId, ServerSocket *client);
|
||||||
void gameClosing();
|
void gameClosing();
|
||||||
|
void broadcastChannelUpdate();
|
||||||
public:
|
public:
|
||||||
Server(QObject *parent = 0);
|
Server(QObject *parent = 0);
|
||||||
~Server();
|
~Server();
|
||||||
|
@ -45,15 +48,19 @@ public:
|
||||||
bool checkGamePassword(int gameId, const QString &password);
|
bool checkGamePassword(int gameId, const QString &password);
|
||||||
AuthenticationResult checkUserPassword(const QString &user, const QString &password);
|
AuthenticationResult checkUserPassword(const QString &user, const QString &password);
|
||||||
QList<ServerGame *> listOpenGames();
|
QList<ServerGame *> listOpenGames();
|
||||||
|
QList<ChatChannel *> getChatChannelList() { return chatChannelList; }
|
||||||
ServerGame *getGame(int gameId);
|
ServerGame *getGame(int gameId);
|
||||||
AbstractRNG *getRNG() const { return rng; }
|
AbstractRNG *getRNG() const { return rng; }
|
||||||
void broadcastGameListUpdate(ServerGame *game);
|
void broadcastGameListUpdate(ServerGame *game);
|
||||||
void removePlayer(ServerSocket *player);
|
void removePlayer(ServerSocket *player);
|
||||||
|
const QStringList &getLoginMessage() const { return loginMessage; }
|
||||||
private:
|
private:
|
||||||
void incomingConnection(int SocketId);
|
void incomingConnection(int SocketId);
|
||||||
QList<ServerGame *> games;
|
QList<ServerGame *> games;
|
||||||
QList<ServerSocket *> players;
|
QList<ServerSocket *> players;
|
||||||
|
QList<ChatChannel *> chatChannelList;
|
||||||
int nextGameId;
|
int nextGameId;
|
||||||
|
QStringList loginMessage;
|
||||||
AbstractRNG *rng;
|
AbstractRNG *rng;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -28,6 +28,7 @@
|
||||||
#include "counter.h"
|
#include "counter.h"
|
||||||
#include "card.h"
|
#include "card.h"
|
||||||
#include "abstractrng.h"
|
#include "abstractrng.h"
|
||||||
|
#include "chatchannel.h"
|
||||||
|
|
||||||
ServerSocket::ServerSocket(Server *_server, QObject *parent)
|
ServerSocket::ServerSocket(Server *_server, QObject *parent)
|
||||||
: QTcpSocket(parent), server(_server), game(0), PlayerStatus(StatusNormal), authState(PasswordWrong), acceptsGameListChanges(false)
|
: QTcpSocket(parent), server(_server), game(0), PlayerStatus(StatusNormal), authState(PasswordWrong), acceptsGameListChanges(false)
|
||||||
|
@ -47,6 +48,8 @@ ServerSocket::~ServerSocket()
|
||||||
server->removePlayer(this);
|
server->removePlayer(this);
|
||||||
if (game)
|
if (game)
|
||||||
game->removePlayer(this);
|
game->removePlayer(this);
|
||||||
|
for (int i = 0; i < chatChannels.size(); ++i)
|
||||||
|
chatChannels[i]->removePlayer(this);
|
||||||
}
|
}
|
||||||
|
|
||||||
int ServerSocket::newCardId()
|
int ServerSocket::newCardId()
|
||||||
|
@ -166,6 +169,11 @@ const ServerSocket::CommandProperties ServerSocket::commandList[ServerSocket::nu
|
||||||
{"ping", false, false, false, QList<QVariant::Type>(), &ServerSocket::cmdPing},
|
{"ping", false, false, false, QList<QVariant::Type>(), &ServerSocket::cmdPing},
|
||||||
{"login", false, false, false, QList<QVariant::Type>() << QVariant::String
|
{"login", false, false, false, QList<QVariant::Type>() << QVariant::String
|
||||||
<< QVariant::String, &ServerSocket::cmdLogin},
|
<< QVariant::String, &ServerSocket::cmdLogin},
|
||||||
|
{"chat_list_channels", true, false, false, QList<QVariant::Type>(), &ServerSocket::cmdChatListChannels},
|
||||||
|
{"chat_join_channel", true, false, false, QList<QVariant::Type>() << QVariant::String, &ServerSocket::cmdChatJoinChannel},
|
||||||
|
{"chat_leave_channel", true, false, false, QList<QVariant::Type>() << QVariant::String, &ServerSocket::cmdChatLeaveChannel},
|
||||||
|
{"chat_say", true, false, false, QList<QVariant::Type>() << QVariant::String
|
||||||
|
<< QVariant::String, &ServerSocket::cmdChatSay},
|
||||||
{"list_games", true, false, false, QList<QVariant::Type>(), &ServerSocket::cmdListGames},
|
{"list_games", true, false, false, QList<QVariant::Type>(), &ServerSocket::cmdListGames},
|
||||||
{"create_game", true, false, false, QList<QVariant::Type>() << QVariant::String
|
{"create_game", true, false, false, QList<QVariant::Type>() << QVariant::String
|
||||||
<< QVariant::String
|
<< QVariant::String
|
||||||
|
@ -228,9 +236,65 @@ ReturnMessage::ReturnCode ServerSocket::cmdLogin(const QList<QVariant> ¶ms)
|
||||||
return ReturnMessage::ReturnPasswordWrong;
|
return ReturnMessage::ReturnPasswordWrong;
|
||||||
playerName = params[0].toString();
|
playerName = params[0].toString();
|
||||||
|
|
||||||
|
remsg->send(ReturnMessage::ReturnOk);
|
||||||
|
|
||||||
|
QStringList loginMessage = server->getLoginMessage();
|
||||||
|
for (int i = 0; i < loginMessage.size(); ++i)
|
||||||
|
msg("chat|server_message||" + loginMessage[i]);
|
||||||
|
|
||||||
|
return ReturnMessage::ReturnNothing;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnMessage::ReturnCode ServerSocket::cmdChatListChannels(const QList<QVariant> &/*params*/)
|
||||||
|
{
|
||||||
|
QList<ChatChannel *> chatChannelList = server->getChatChannelList();
|
||||||
|
for (int i = 0; i < chatChannelList.size(); ++i)
|
||||||
|
msg(chatChannelList[i]->getChannelListLine());
|
||||||
|
|
||||||
|
acceptsChatChannelListChanges = true;
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnOk;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
ReturnMessage::ReturnCode ServerSocket::cmdChatJoinChannel(const QList<QVariant> ¶ms)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < chatChannels.size(); ++i)
|
||||||
|
if (chatChannels[i]->getName() == params[0])
|
||||||
|
return ReturnMessage::ReturnContextError;
|
||||||
|
|
||||||
|
QList<ChatChannel *> allChannels = server->getChatChannelList();
|
||||||
|
for (int i = 0; i < allChannels.size(); ++i)
|
||||||
|
if (allChannels[i]->getName() == params[0]) {
|
||||||
|
remsg->send(ReturnMessage::ReturnOk);
|
||||||
|
allChannels[i]->addPlayer(this);
|
||||||
|
chatChannels << allChannels[i];
|
||||||
|
return ReturnMessage::ReturnNothing;
|
||||||
|
}
|
||||||
|
return ReturnMessage::ReturnNameNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnMessage::ReturnCode ServerSocket::cmdChatLeaveChannel(const QList<QVariant> ¶ms)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < chatChannels.size(); ++i) {
|
||||||
|
ChatChannel *c = chatChannels[i];
|
||||||
|
if (c->getName() == params[0]) {
|
||||||
|
chatChannels.removeAt(i);
|
||||||
|
c->removePlayer(this);
|
||||||
|
return ReturnMessage::ReturnOk;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return ReturnMessage::ReturnNameNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
|
ReturnMessage::ReturnCode ServerSocket::cmdChatSay(const QList<QVariant> ¶ms)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < chatChannels.size(); ++i)
|
||||||
|
if (chatChannels[i]->getName() == params[0]) {
|
||||||
|
chatChannels[i]->say(this, params[1].toString());
|
||||||
|
return ReturnMessage::ReturnOk;
|
||||||
|
}
|
||||||
|
return ReturnMessage::ReturnNameNotFound;
|
||||||
|
}
|
||||||
|
|
||||||
ReturnMessage::ReturnCode ServerSocket::cmdListGames(const QList<QVariant> &/*params*/)
|
ReturnMessage::ReturnCode ServerSocket::cmdListGames(const QList<QVariant> &/*params*/)
|
||||||
{
|
{
|
||||||
QList<ServerGame *> gameList = server->listOpenGames();
|
QList<ServerGame *> gameList = server->listOpenGames();
|
||||||
|
@ -248,6 +312,7 @@ ReturnMessage::ReturnCode ServerSocket::cmdCreateGame(const QList<QVariant> &par
|
||||||
QString password = params[1].toString();
|
QString password = params[1].toString();
|
||||||
int maxPlayers = params[2].toInt();
|
int maxPlayers = params[2].toInt();
|
||||||
acceptsGameListChanges = false;
|
acceptsGameListChanges = false;
|
||||||
|
acceptsChatChannelListChanges = false;
|
||||||
leaveGame();
|
leaveGame();
|
||||||
emit createGame(description, password, maxPlayers, this);
|
emit createGame(description, password, maxPlayers, this);
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnOk;
|
||||||
|
@ -260,6 +325,7 @@ ReturnMessage::ReturnCode ServerSocket::cmdJoinGame(const QList<QVariant> ¶m
|
||||||
if (!server->checkGamePassword(gameId, password))
|
if (!server->checkGamePassword(gameId, password))
|
||||||
return ReturnMessage::ReturnPasswordWrong;
|
return ReturnMessage::ReturnPasswordWrong;
|
||||||
acceptsGameListChanges = false;
|
acceptsGameListChanges = false;
|
||||||
|
acceptsChatChannelListChanges = false;
|
||||||
leaveGame();
|
leaveGame();
|
||||||
emit joinGame(gameId, this);
|
emit joinGame(gameId, this);
|
||||||
return ReturnMessage::ReturnOk;
|
return ReturnMessage::ReturnOk;
|
||||||
|
|
|
@ -55,11 +55,15 @@ private:
|
||||||
QList<QVariant::Type> paramTypes;
|
QList<QVariant::Type> paramTypes;
|
||||||
CommandHandler handler;
|
CommandHandler handler;
|
||||||
};
|
};
|
||||||
static const int numberCommands = 27;
|
static const int numberCommands = 31;
|
||||||
static const CommandProperties commandList[numberCommands];
|
static const CommandProperties commandList[numberCommands];
|
||||||
|
|
||||||
ReturnMessage::ReturnCode cmdPing(const QList<QVariant> ¶ms);
|
ReturnMessage::ReturnCode cmdPing(const QList<QVariant> ¶ms);
|
||||||
ReturnMessage::ReturnCode cmdLogin(const QList<QVariant> ¶ms);
|
ReturnMessage::ReturnCode cmdLogin(const QList<QVariant> ¶ms);
|
||||||
|
ReturnMessage::ReturnCode cmdChatListChannels(const QList<QVariant> ¶ms);
|
||||||
|
ReturnMessage::ReturnCode cmdChatJoinChannel(const QList<QVariant> ¶ms);
|
||||||
|
ReturnMessage::ReturnCode cmdChatLeaveChannel(const QList<QVariant> ¶ms);
|
||||||
|
ReturnMessage::ReturnCode cmdChatSay(const QList<QVariant> ¶ms);
|
||||||
ReturnMessage::ReturnCode cmdListGames(const QList<QVariant> ¶ms);
|
ReturnMessage::ReturnCode cmdListGames(const QList<QVariant> ¶ms);
|
||||||
ReturnMessage::ReturnCode cmdCreateGame(const QList<QVariant> ¶ms);
|
ReturnMessage::ReturnCode cmdCreateGame(const QList<QVariant> ¶ms);
|
||||||
ReturnMessage::ReturnCode cmdJoinGame(const QList<QVariant> ¶ms);
|
ReturnMessage::ReturnCode cmdJoinGame(const QList<QVariant> ¶ms);
|
||||||
|
@ -88,6 +92,7 @@ private:
|
||||||
|
|
||||||
Server *server;
|
Server *server;
|
||||||
ServerGame *game;
|
ServerGame *game;
|
||||||
|
QList<ChatChannel *> chatChannels;
|
||||||
QList<QString> DeckList;
|
QList<QString> DeckList;
|
||||||
QList<QString> SideboardList;
|
QList<QString> SideboardList;
|
||||||
QList<PlayerZone *> zones;
|
QList<PlayerZone *> zones;
|
||||||
|
@ -105,6 +110,7 @@ private:
|
||||||
ReturnMessage *remsg;
|
ReturnMessage *remsg;
|
||||||
AuthenticationResult authState;
|
AuthenticationResult authState;
|
||||||
bool acceptsGameListChanges;
|
bool acceptsGameListChanges;
|
||||||
|
bool acceptsChatChannelListChanges;
|
||||||
public:
|
public:
|
||||||
ServerSocket(Server *_server, QObject *parent = 0);
|
ServerSocket(Server *_server, QObject *parent = 0);
|
||||||
~ServerSocket();
|
~ServerSocket();
|
||||||
|
@ -117,6 +123,7 @@ public:
|
||||||
void setPlayerId(int _id) { playerId = _id; }
|
void setPlayerId(int _id) { playerId = _id; }
|
||||||
QString getPlayerName() const { return playerName; }
|
QString getPlayerName() const { return playerName; }
|
||||||
bool getAcceptsGameListChanges() const { return acceptsGameListChanges; }
|
bool getAcceptsGameListChanges() const { return acceptsGameListChanges; }
|
||||||
|
bool getAcceptsChatChannelListChanges() const { return acceptsChatChannelListChanges; }
|
||||||
QStringList listCounters() const;
|
QStringList listCounters() const;
|
||||||
QStringList listZones() const;
|
QStringList listZones() const;
|
||||||
void setupZones();
|
void setupZones();
|
||||||
|
|
Loading…
Reference in a new issue