diff --git a/cockatrice/src/dlg_creategame.cpp b/cockatrice/src/dlg_creategame.cpp index e36a6815..20775954 100644 --- a/cockatrice/src/dlg_creategame.cpp +++ b/cockatrice/src/dlg_creategame.cpp @@ -11,8 +11,8 @@ #include "dlg_creategame.h" #include "protocol_items.h" -DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, QWidget *parent) - : QDialog(parent), client(_client), roomId(_roomId) +DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, const QMap &_gameTypes, QWidget *parent) + : QDialog(parent), client(_client), roomId(_roomId), gameTypes(_gameTypes) { descriptionLabel = new QLabel(tr("&Description:")); descriptionEdit = new QLineEdit; @@ -29,6 +29,17 @@ DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, QWidget *pare maxPlayersEdit->setValue(2); maxPlayersLabel->setBuddy(maxPlayersEdit); + QVBoxLayout *gameTypeLayout = new QVBoxLayout; + QMapIterator gameTypeIterator(gameTypes); + while (gameTypeIterator.hasNext()) { + gameTypeIterator.next(); + QCheckBox *gameTypeCheckBox = new QCheckBox(gameTypeIterator.value()); + gameTypeLayout->addWidget(gameTypeCheckBox); + gameTypeCheckBoxes.insert(gameTypeIterator.key(), gameTypeCheckBox); + } + QGroupBox *gameTypeGroupBox = new QGroupBox(tr("Game type")); + gameTypeGroupBox->setLayout(gameTypeLayout); + spectatorsAllowedCheckBox = new QCheckBox(tr("&Spectators allowed")); spectatorsAllowedCheckBox->setChecked(true); connect(spectatorsAllowedCheckBox, SIGNAL(stateChanged(int)), this, SLOT(spectatorsAllowedChanged(int))); @@ -50,7 +61,8 @@ DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, QWidget *pare grid->addWidget(passwordEdit, 1, 1); grid->addWidget(maxPlayersLabel, 2, 0); grid->addWidget(maxPlayersEdit, 2, 1); - grid->addWidget(spectatorsGroupBox, 3, 0, 1, 2); + grid->addWidget(gameTypeGroupBox, 3, 0, 1, 2); + grid->addWidget(spectatorsGroupBox, 4, 0, 1, 2); okButton = new QPushButton(tr("&OK")); okButton->setDefault(true); @@ -76,11 +88,20 @@ DlgCreateGame::DlgCreateGame(AbstractClient *_client, int _roomId, QWidget *pare void DlgCreateGame::actOK() { + QList gameTypeList; + QMapIterator gameTypeCheckBoxIterator(gameTypeCheckBoxes); + while (gameTypeCheckBoxIterator.hasNext()) { + gameTypeCheckBoxIterator.next(); + if (gameTypeCheckBoxIterator.value()->isChecked()) + gameTypeList.append(new GameTypeId(gameTypeCheckBoxIterator.key())); + } + Command_CreateGame *createCommand = new Command_CreateGame( roomId, descriptionEdit->text(), passwordEdit->text(), maxPlayersEdit->value(), + gameTypeList, spectatorsAllowedCheckBox->isChecked(), spectatorsNeedPasswordCheckBox->isChecked(), spectatorsCanTalkCheckBox->isChecked(), diff --git a/cockatrice/src/dlg_creategame.h b/cockatrice/src/dlg_creategame.h index dcd901df..dd68e08e 100644 --- a/cockatrice/src/dlg_creategame.h +++ b/cockatrice/src/dlg_creategame.h @@ -14,7 +14,7 @@ class QSpinBox; class DlgCreateGame : public QDialog { Q_OBJECT public: - DlgCreateGame(AbstractClient *_client, int _roomId, QWidget *parent = 0); + DlgCreateGame(AbstractClient *_client, int _roomId, const QMap &_gameTypes, QWidget *parent = 0); private slots: void actOK(); void checkResponse(ResponseCode response); @@ -22,6 +22,8 @@ private slots: private: AbstractClient *client; int roomId; + QMap gameTypes; + QMap gameTypeCheckBoxes; QGroupBox *spectatorsGroupBox; QLabel *descriptionLabel, *passwordLabel, *maxPlayersLabel; diff --git a/cockatrice/src/gamesmodel.cpp b/cockatrice/src/gamesmodel.cpp index a448d078..38adbd16 100644 --- a/cockatrice/src/gamesmodel.cpp +++ b/cockatrice/src/gamesmodel.cpp @@ -1,6 +1,11 @@ #include "gamesmodel.h" #include "protocol_datastructures.h" +GamesModel::GamesModel(const QMap &_gameTypes, QObject *parent) + : QAbstractTableModel(parent), gameTypes(_gameTypes) +{ +} + GamesModel::~GamesModel() { if (!gameList.isEmpty()) { @@ -27,9 +32,16 @@ QVariant GamesModel::data(const QModelIndex &index, int role) const switch (index.column()) { case 0: return g->getDescription(); case 1: return g->getCreatorInfo()->getName(); - case 2: return g->getHasPassword() ? (g->getSpectatorsNeedPassword() ? tr("yes") : tr("yes, free for spectators")) : tr("no"); - case 3: return QString("%1/%2").arg(g->getPlayerCount()).arg(g->getMaxPlayers()); - case 4: return g->getSpectatorsAllowed() ? QVariant(g->getSpectatorCount()) : QVariant(tr("not allowed")); + case 2: { + QStringList result; + QList gameTypeList = g->getGameTypes(); + for (int i = 0; i < gameTypeList.size(); ++i) + result.append(gameTypes.value(gameTypeList[i]->getData())); + return result.join(", "); + } + case 3: return g->getHasPassword() ? (g->getSpectatorsNeedPassword() ? tr("yes") : tr("yes, free for spectators")) : tr("no"); + case 4: return QString("%1/%2").arg(g->getPlayerCount()).arg(g->getMaxPlayers()); + case 5: return g->getSpectatorsAllowed() ? QVariant(g->getSpectatorCount()) : QVariant(tr("not allowed")); default: return QVariant(); } } @@ -41,9 +53,10 @@ QVariant GamesModel::headerData(int section, Qt::Orientation orientation, int ro switch (section) { case 0: return tr("Description"); case 1: return tr("Creator"); - case 2: return tr("Password"); - case 3: return tr("Players"); - case 4: return tr("Spectators"); + case 2: return tr("Game type"); + case 3: return tr("Password"); + case 4: return tr("Players"); + case 5: return tr("Spectators"); default: return QVariant(); } } @@ -56,7 +69,11 @@ ServerInfo_Game *GamesModel::getGame(int row) void GamesModel::updateGameList(ServerInfo_Game *_game) { - ServerInfo_Game *game = new ServerInfo_Game(_game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), new ServerInfo_User(_game->getCreatorInfo()), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); + QList gameTypeList, oldGameTypeList = _game->getGameTypes(); + for (int i = 0; i < oldGameTypeList.size(); ++i) + gameTypeList.append(new GameTypeId(oldGameTypeList[i]->getData())); + + ServerInfo_Game *game = new ServerInfo_Game(_game->getGameId(), _game->getDescription(), _game->getHasPassword(), _game->getPlayerCount(), _game->getMaxPlayers(), gameTypeList, new ServerInfo_User(_game->getCreatorInfo()), _game->getSpectatorsAllowed(), _game->getSpectatorsNeedPassword(), _game->getSpectatorCount()); for (int i = 0; i < gameList.size(); i++) if (gameList[i]->getGameId() == game->getGameId()) { if (game->getPlayerCount() == 0) { diff --git a/cockatrice/src/gamesmodel.h b/cockatrice/src/gamesmodel.h index b9558db2..525d75e6 100644 --- a/cockatrice/src/gamesmodel.h +++ b/cockatrice/src/gamesmodel.h @@ -9,8 +9,11 @@ class ServerInfo_Game; class GamesModel : public QAbstractTableModel { Q_OBJECT +private: + QList gameList; + QMap gameTypes; public: - GamesModel(QObject *parent = 0) : QAbstractTableModel(parent) { } + GamesModel(const QMap &_gameTypes, QObject *parent = 0); ~GamesModel(); int rowCount(const QModelIndex &parent = QModelIndex()) const { return parent.isValid() ? 0 : gameList.size(); } int columnCount(const QModelIndex &/*parent*/ = QModelIndex()) const { return 5; } @@ -19,8 +22,6 @@ public: ServerInfo_Game *getGame(int row); void updateGameList(ServerInfo_Game *game); -private: - QList gameList; }; class GamesProxyModel : public QSortFilterProxyModel { diff --git a/cockatrice/src/localserver.cpp b/cockatrice/src/localserver.cpp index da403f91..4cadbdf3 100644 --- a/cockatrice/src/localserver.cpp +++ b/cockatrice/src/localserver.cpp @@ -5,7 +5,7 @@ LocalServer::LocalServer(QObject *parent) : Server(parent) { - addRoom(new Server_Room(0, QString(), QString(), false, QString(), this)); + addRoom(new Server_Room(0, QString(), QString(), false, QString(), QStringList(), this)); } LocalServer::~LocalServer() diff --git a/cockatrice/src/tab_room.cpp b/cockatrice/src/tab_room.cpp index 494e2f92..d8f15168 100644 --- a/cockatrice/src/tab_room.cpp +++ b/cockatrice/src/tab_room.cpp @@ -17,15 +17,16 @@ #include "gamesmodel.h" #include "chatview.h" -GameSelector::GameSelector(AbstractClient *_client, int _roomId, QWidget *parent) - : QGroupBox(parent), client(_client), roomId(_roomId) +GameSelector::GameSelector(AbstractClient *_client, TabRoom *_room, QWidget *parent) + : QGroupBox(parent), client(_client), room(_room) { gameListView = new QTreeView; - gameListModel = new GamesModel(this); + gameListModel = new GamesModel(room->getGameTypes(), this); gameListProxyModel = new GamesProxyModel(this); gameListProxyModel->setSourceModel(gameListModel); gameListView->setModel(gameListProxyModel); gameListView->header()->setResizeMode(0, QHeaderView::ResizeToContents); + gameListView->setSortingEnabled(true); showFullGamesCheckBox = new QCheckBox; createButton = new QPushButton; @@ -61,7 +62,7 @@ void GameSelector::showFullGamesChanged(int state) void GameSelector::actCreate() { - DlgCreateGame dlg(client, roomId, this); + DlgCreateGame dlg(client, room->getRoomId(), room->getGameTypes(), this); dlg.exec(); } @@ -96,7 +97,7 @@ void GameSelector::actJoin() return; } - Command_JoinGame *commandJoinGame = new Command_JoinGame(roomId, game->getGameId(), password, spectator); + Command_JoinGame *commandJoinGame = new Command_JoinGame(room->getRoomId(), game->getGameId(), password, spectator); connect(commandJoinGame, SIGNAL(finished(ResponseCode)), this, SLOT(checkResponse(ResponseCode))); client->sendCommand(commandJoinGame); @@ -122,7 +123,11 @@ void GameSelector::processGameInfo(ServerInfo_Game *info) TabRoom::TabRoom(AbstractClient *_client, const QString &_ownName, ServerInfo_Room *info) : Tab(), client(_client), roomId(info->getRoomId()), roomName(info->getName()), ownName(_ownName) { - gameSelector = new GameSelector(client, roomId); + const QList gameTypeList = info->getGameTypeList(); + for (int i = 0; i < gameTypeList.size(); ++i) + gameTypes.insert(gameTypeList[i]->getGameTypeId(), gameTypeList[i]->getDescription()); + + gameSelector = new GameSelector(client, this); userList = new UserList(client, false); connect(userList, SIGNAL(openMessageDialog(const QString &, bool)), this, SIGNAL(openMessageDialog(const QString &, bool))); diff --git a/cockatrice/src/tab_room.h b/cockatrice/src/tab_room.h index d9ac35af..331097f2 100644 --- a/cockatrice/src/tab_room.h +++ b/cockatrice/src/tab_room.h @@ -23,6 +23,7 @@ class Event_ListGames; class Event_JoinRoom; class Event_LeaveRoom; class Event_RoomSay; +class TabRoom; class GameSelector : public QGroupBox { Q_OBJECT @@ -35,7 +36,7 @@ signals: void gameJoined(int gameId); private: AbstractClient *client; - int roomId; + TabRoom *room; QTreeView *gameListView; GamesModel *gameListModel; @@ -43,7 +44,7 @@ private: QPushButton *createButton, *joinButton, *spectateButton; QCheckBox *showFullGamesCheckBox; public: - GameSelector(AbstractClient *_client, int _roomId, QWidget *parent = 0); + GameSelector(AbstractClient *_client, TabRoom *_room, QWidget *parent = 0); void retranslateUi(); void processGameInfo(ServerInfo_Game *info); }; @@ -55,6 +56,7 @@ private: int roomId; QString roomName; QString ownName; + QMap gameTypes; GameSelector *gameSelector; UserList *userList; @@ -82,6 +84,7 @@ public: void retranslateUi(); void processRoomEvent(RoomEvent *event); int getRoomId() const { return roomId; } + const QMap &getGameTypes() const { return gameTypes; } QString getChannelName() const { return roomName; } QString getTabText() const { return roomName; } }; diff --git a/cockatrice/src/window_main.cpp b/cockatrice/src/window_main.cpp index daf61fb7..35c45db3 100644 --- a/cockatrice/src/window_main.cpp +++ b/cockatrice/src/window_main.cpp @@ -113,7 +113,7 @@ void MainWindow::actSinglePlayer() } tabSupervisor->startLocal(localClients); - Command_CreateGame *createCommand = new Command_CreateGame(0, QString(), QString(), numberPlayers, false, false, false, false); + Command_CreateGame *createCommand = new Command_CreateGame(0, QString(), QString(), numberPlayers, QList(), false, false, false, false); mainClient->sendCommand(createCommand); } diff --git a/common/protocol.cpp b/common/protocol.cpp index fbaa13fe..624ebed0 100644 --- a/common/protocol.cpp +++ b/common/protocol.cpp @@ -17,6 +17,7 @@ void ProtocolItem::initializeHash() registerSerializableItem("room", ServerInfo_Room::newItem); registerSerializableItem("user", ServerInfo_User::newItem); registerSerializableItem("game", ServerInfo_Game::newItem); + registerSerializableItem("game_type", ServerInfo_GameType::newItem); registerSerializableItem("card_counter", ServerInfo_CardCounter::newItem); registerSerializableItem("card", ServerInfo_Card::newItem); registerSerializableItem("zone", ServerInfo_Zone::newItem); @@ -28,10 +29,12 @@ void ProtocolItem::initializeHash() registerSerializableItem("file", DeckList_File::newItem); registerSerializableItem("directory", DeckList_Directory::newItem); registerSerializableItem("card_id", CardId::newItem); + registerSerializableItem("game_type_id", GameTypeId::newItem); registerSerializableItem("containercmd", CommandContainer::newItem); registerSerializableItem("containergame_event", GameEventContainer::newItem); + registerSerializableItem("cmdcreate_game", Command_CreateGame::newItem); registerSerializableItem("cmddeck_upload", Command_DeckUpload::newItem); registerSerializableItem("cmddeck_select", Command_DeckSelect::newItem); registerSerializableItem("cmdset_sideboard_plan", Command_SetSideboardPlan::newItem); @@ -166,6 +169,21 @@ void CommandContainer::enqueueGameEventPrivate(GameEvent *event, int gameId, int gameEventQueuePrivate->setContext(context); } +Command_CreateGame::Command_CreateGame(int _roomId, const QString &_description, const QString &_password, int _maxPlayers, const QList &_gameTypes, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything) + : RoomCommand("create_game", _roomId) +{ + insertItem(new SerializableItem_String("description", _description)); + insertItem(new SerializableItem_String("password", _password)); + insertItem(new SerializableItem_Int("max_players", _maxPlayers)); + insertItem(new SerializableItem_Bool("spectators_allowed", _spectatorsAllowed)); + insertItem(new SerializableItem_Bool("spectators_need_password", _spectatorsNeedPassword)); + insertItem(new SerializableItem_Bool("spectators_can_talk", _spectatorsCanTalk)); + insertItem(new SerializableItem_Bool("spectators_see_everything", _spectatorsSeeEverything)); + + for (int i = 0; i < _gameTypes.size(); ++i) + itemList.append(_gameTypes[i]); +} + Command_DeckUpload::Command_DeckUpload(DeckList *_deck, const QString &_path) : Command("deck_upload") { diff --git a/common/protocol.h b/common/protocol.h index ab6a6160..fc3b1d1d 100644 --- a/common/protocol.h +++ b/common/protocol.h @@ -23,6 +23,7 @@ class MoveCardToZone; enum ItemId { ItemId_CommandContainer = ItemId_Other + 50, ItemId_GameEventContainer = ItemId_Other + 51, + ItemId_Command_CreateGame = ItemId_Other + 99, ItemId_Command_DeckUpload = ItemId_Other + 100, ItemId_Command_DeckSelect = ItemId_Other + 101, ItemId_Command_SetSideboardPlan = ItemId_Other + 102, @@ -173,6 +174,22 @@ public: } }; +class Command_CreateGame : public RoomCommand { + Q_OBJECT +public: + Command_CreateGame(int _roomId = -1, const QString &_description = QString(), const QString &_password = QString(), int _maxPlayers = -1, const QList &_gameTypes = QList(), bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, bool _spectatorsCanTalk = false, bool _spectatorsSeeEverything = false); + QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); }; + QString getPassword() const { return static_cast(itemMap.value("password"))->getData(); }; + int getMaxPlayers() const { return static_cast(itemMap.value("max_players"))->getData(); }; + bool getSpectatorsAllowed() const { return static_cast(itemMap.value("spectators_allowed"))->getData(); }; + bool getSpectatorsNeedPassword() const { return static_cast(itemMap.value("spectators_need_password"))->getData(); }; + bool getSpectatorsCanTalk() const { return static_cast(itemMap.value("spectators_can_talk"))->getData(); }; + bool getSpectatorsSeeEverything() const { return static_cast(itemMap.value("spectators_see_everything"))->getData(); }; + QList getGameTypes() const { return typecastItemList(); } + static SerializableItem *newItem() { return new Command_CreateGame; } + int getItemId() const { return ItemId_Command_CreateGame; } +}; + class Command_DeckUpload : public Command { Q_OBJECT public: diff --git a/common/protocol_datastructures.cpp b/common/protocol_datastructures.cpp index 20c85506..93748bce 100644 --- a/common/protocol_datastructures.cpp +++ b/common/protocol_datastructures.cpp @@ -23,7 +23,7 @@ ServerInfo_User::ServerInfo_User(const ServerInfo_User *other, bool complete) insertItem(new SerializableItem_ByteArray("avatar_bmp", complete ? other->getAvatarBmp() : QByteArray())); } -ServerInfo_Game::ServerInfo_Game(int _gameId, const QString &_description, bool _hasPassword, int _playerCount, int _maxPlayers, ServerInfo_User *_creatorInfo, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) +ServerInfo_Game::ServerInfo_Game(int _gameId, const QString &_description, bool _hasPassword, int _playerCount, int _maxPlayers, const QList &_gameTypes, ServerInfo_User *_creatorInfo, bool _spectatorsAllowed, bool _spectatorsNeedPassword, int _spectatorCount) : SerializableItem_Map("game") { insertItem(new SerializableItem_Int("game_id", _gameId)); @@ -37,9 +37,19 @@ ServerInfo_Game::ServerInfo_Game(int _gameId, const QString &_description, bool insertItem(new SerializableItem_Bool("spectators_allowed", _spectatorsAllowed)); insertItem(new SerializableItem_Bool("spectators_need_password", _spectatorsNeedPassword)); insertItem(new SerializableItem_Int("spectator_count", _spectatorCount)); + + for (int i = 0; i < _gameTypes.size(); ++i) + itemList.append(_gameTypes[i]); } -ServerInfo_Room::ServerInfo_Room(int _roomId, const QString &_name, const QString &_description, int _gameCount, int _playerCount, bool _autoJoin, const QList &_gameList, const QList &_userList) +ServerInfo_GameType::ServerInfo_GameType(int _gameTypeId, const QString &_description) + : SerializableItem_Map("game_type") +{ + insertItem(new SerializableItem_Int("game_type_id", _gameTypeId)); + insertItem(new SerializableItem_String("description", _description)); +} + +ServerInfo_Room::ServerInfo_Room(int _roomId, const QString &_name, const QString &_description, int _gameCount, int _playerCount, bool _autoJoin, const QList &_gameList, const QList &_userList, const QList &_gameTypeList) : SerializableItem_Map("room") { insertItem(new SerializableItem_Int("room_id", _roomId)); @@ -55,6 +65,9 @@ ServerInfo_Room::ServerInfo_Room(int _roomId, const QString &_name, const QStrin userList = _userList; for (int i = 0; i < _userList.size(); ++i) itemList.append(_userList[i]); + gameTypeList = _gameTypeList; + for (int i = 0; i < _gameTypeList.size(); ++i) + itemList.append(_gameTypeList[i]); } void ServerInfo_Room::extractData() @@ -70,6 +83,11 @@ void ServerInfo_Room::extractData() gameList.append(game); continue; } + ServerInfo_GameType *gameType = dynamic_cast(itemList[i]); + if (gameType) { + gameTypeList.append(gameType); + continue; + } } } diff --git a/common/protocol_datastructures.h b/common/protocol_datastructures.h index a6a9c9ac..39d9efc1 100644 --- a/common/protocol_datastructures.h +++ b/common/protocol_datastructures.h @@ -25,6 +25,11 @@ public: CardId(int _cardId = -1) : SerializableItem_Int("card_id", _cardId) { } static SerializableItem *newItem() { return new CardId; } }; +class GameTypeId : public SerializableItem_Int { +public: + GameTypeId(int _gameTypeId = -1) : SerializableItem_Int("game_type_id", _gameTypeId) { } + static SerializableItem *newItem() { return new GameTypeId; } +}; class ServerInfo_User : public SerializableItem_Map { public: @@ -48,27 +53,37 @@ public: class ServerInfo_Game : public SerializableItem_Map { public: - ServerInfo_Game(int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, ServerInfo_User *creatorInfo = 0, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); + ServerInfo_Game(int _gameId = -1, const QString &_description = QString(), bool _hasPassword = false, int _playerCount = -1, int _maxPlayers = -1, const QList &_gameTypes = QList(), ServerInfo_User *creatorInfo = 0, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, int _spectatorCount = -1); static SerializableItem *newItem() { return new ServerInfo_Game; } int getGameId() const { return static_cast(itemMap.value("game_id"))->getData(); } QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); } bool getHasPassword() const { return static_cast(itemMap.value("has_password"))->getData(); } int getPlayerCount() const { return static_cast(itemMap.value("player_count"))->getData(); } int getMaxPlayers() const { return static_cast(itemMap.value("max_players"))->getData(); } + QList getGameTypes() const { return typecastItemList(); } ServerInfo_User *getCreatorInfo() const { return static_cast(itemMap.value("user")); } bool getSpectatorsAllowed() const { return static_cast(itemMap.value("spectators_allowed"))->getData(); } bool getSpectatorsNeedPassword() const { return static_cast(itemMap.value("spectators_need_password"))->getData(); } int getSpectatorCount() const { return static_cast(itemMap.value("spectator_count"))->getData(); } }; +class ServerInfo_GameType : public SerializableItem_Map { +public: + ServerInfo_GameType(int _gameTypeId = -1, const QString &_description = QString()); + static SerializableItem *newItem() { return new ServerInfo_GameType; } + int getGameTypeId() const { return static_cast(itemMap.value("game_type_id"))->getData(); } + QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); } +}; + class ServerInfo_Room : public SerializableItem_Map { private: QList gameList; QList userList; + QList gameTypeList; protected: void extractData(); public: - ServerInfo_Room(int _id = -1, const QString &_name = QString(), const QString &_description = QString(), int _gameCount = -1, int _playerCount = -1, bool _autoJoin = false, const QList &_gameList = QList(), const QList &_userList = QList()); + ServerInfo_Room(int _id = -1, const QString &_name = QString(), const QString &_description = QString(), int _gameCount = -1, int _playerCount = -1, bool _autoJoin = false, const QList &_gameList = QList(), const QList &_userList = QList(), const QList &_gameTypeList = QList()); static SerializableItem *newItem() { return new ServerInfo_Room; } int getRoomId() const { return static_cast(itemMap.value("room_id"))->getData(); } QString getName() const { return static_cast(itemMap.value("name"))->getData(); } @@ -78,6 +93,7 @@ public: bool getAutoJoin() const { return static_cast(itemMap.value("auto_join"))->getData(); } const QList &getGameList() const { return gameList; } const QList &getUserList() const { return userList; } + const QList &getGameTypeList() const { return gameTypeList; } }; class ServerInfo_CardCounter : public SerializableItem_Map { diff --git a/common/protocol_item_ids.h b/common/protocol_item_ids.h index f6201b19..534ffe26 100644 --- a/common/protocol_item_ids.h +++ b/common/protocol_item_ids.h @@ -13,63 +13,62 @@ ItemId_Command_ListRooms = 1011, ItemId_Command_JoinRoom = 1012, ItemId_Command_LeaveRoom = 1013, ItemId_Command_RoomSay = 1014, -ItemId_Command_CreateGame = 1015, -ItemId_Command_JoinGame = 1016, -ItemId_Command_LeaveGame = 1017, -ItemId_Command_Say = 1018, -ItemId_Command_Shuffle = 1019, -ItemId_Command_Mulligan = 1020, -ItemId_Command_RollDie = 1021, -ItemId_Command_DrawCards = 1022, -ItemId_Command_UndoDraw = 1023, -ItemId_Command_FlipCard = 1024, -ItemId_Command_AttachCard = 1025, -ItemId_Command_CreateToken = 1026, -ItemId_Command_CreateArrow = 1027, -ItemId_Command_DeleteArrow = 1028, -ItemId_Command_SetCardAttr = 1029, -ItemId_Command_SetCardCounter = 1030, -ItemId_Command_IncCardCounter = 1031, -ItemId_Command_ReadyStart = 1032, -ItemId_Command_Concede = 1033, -ItemId_Command_IncCounter = 1034, -ItemId_Command_CreateCounter = 1035, -ItemId_Command_SetCounter = 1036, -ItemId_Command_DelCounter = 1037, -ItemId_Command_NextTurn = 1038, -ItemId_Command_SetActivePhase = 1039, -ItemId_Command_DumpZone = 1040, -ItemId_Command_StopDumpZone = 1041, -ItemId_Command_RevealCards = 1042, -ItemId_Event_Say = 1043, -ItemId_Event_Leave = 1044, -ItemId_Event_GameClosed = 1045, -ItemId_Event_Shuffle = 1046, -ItemId_Event_RollDie = 1047, -ItemId_Event_MoveCard = 1048, -ItemId_Event_FlipCard = 1049, -ItemId_Event_DestroyCard = 1050, -ItemId_Event_AttachCard = 1051, -ItemId_Event_CreateToken = 1052, -ItemId_Event_DeleteArrow = 1053, -ItemId_Event_SetCardAttr = 1054, -ItemId_Event_SetCardCounter = 1055, -ItemId_Event_SetCounter = 1056, -ItemId_Event_DelCounter = 1057, -ItemId_Event_SetActivePlayer = 1058, -ItemId_Event_SetActivePhase = 1059, -ItemId_Event_DumpZone = 1060, -ItemId_Event_StopDumpZone = 1061, -ItemId_Event_ServerMessage = 1062, -ItemId_Event_Message = 1063, -ItemId_Event_GameJoined = 1064, -ItemId_Event_UserLeft = 1065, -ItemId_Event_LeaveRoom = 1066, -ItemId_Event_RoomSay = 1067, -ItemId_Context_ReadyStart = 1068, -ItemId_Context_Concede = 1069, -ItemId_Context_DeckSelect = 1070, -ItemId_Context_UndoDraw = 1071, -ItemId_Command_UpdateServerMessage = 1072, -ItemId_Other = 1073 +ItemId_Command_JoinGame = 1015, +ItemId_Command_LeaveGame = 1016, +ItemId_Command_Say = 1017, +ItemId_Command_Shuffle = 1018, +ItemId_Command_Mulligan = 1019, +ItemId_Command_RollDie = 1020, +ItemId_Command_DrawCards = 1021, +ItemId_Command_UndoDraw = 1022, +ItemId_Command_FlipCard = 1023, +ItemId_Command_AttachCard = 1024, +ItemId_Command_CreateToken = 1025, +ItemId_Command_CreateArrow = 1026, +ItemId_Command_DeleteArrow = 1027, +ItemId_Command_SetCardAttr = 1028, +ItemId_Command_SetCardCounter = 1029, +ItemId_Command_IncCardCounter = 1030, +ItemId_Command_ReadyStart = 1031, +ItemId_Command_Concede = 1032, +ItemId_Command_IncCounter = 1033, +ItemId_Command_CreateCounter = 1034, +ItemId_Command_SetCounter = 1035, +ItemId_Command_DelCounter = 1036, +ItemId_Command_NextTurn = 1037, +ItemId_Command_SetActivePhase = 1038, +ItemId_Command_DumpZone = 1039, +ItemId_Command_StopDumpZone = 1040, +ItemId_Command_RevealCards = 1041, +ItemId_Event_Say = 1042, +ItemId_Event_Leave = 1043, +ItemId_Event_GameClosed = 1044, +ItemId_Event_Shuffle = 1045, +ItemId_Event_RollDie = 1046, +ItemId_Event_MoveCard = 1047, +ItemId_Event_FlipCard = 1048, +ItemId_Event_DestroyCard = 1049, +ItemId_Event_AttachCard = 1050, +ItemId_Event_CreateToken = 1051, +ItemId_Event_DeleteArrow = 1052, +ItemId_Event_SetCardAttr = 1053, +ItemId_Event_SetCardCounter = 1054, +ItemId_Event_SetCounter = 1055, +ItemId_Event_DelCounter = 1056, +ItemId_Event_SetActivePlayer = 1057, +ItemId_Event_SetActivePhase = 1058, +ItemId_Event_DumpZone = 1059, +ItemId_Event_StopDumpZone = 1060, +ItemId_Event_ServerMessage = 1061, +ItemId_Event_Message = 1062, +ItemId_Event_GameJoined = 1063, +ItemId_Event_UserLeft = 1064, +ItemId_Event_LeaveRoom = 1065, +ItemId_Event_RoomSay = 1066, +ItemId_Context_ReadyStart = 1067, +ItemId_Context_Concede = 1068, +ItemId_Context_DeckSelect = 1069, +ItemId_Context_UndoDraw = 1070, +ItemId_Command_UpdateServerMessage = 1071, +ItemId_Other = 1072 }; diff --git a/common/protocol_items.cpp b/common/protocol_items.cpp index 0970c181..3e569cb9 100644 --- a/common/protocol_items.cpp +++ b/common/protocol_items.cpp @@ -69,17 +69,6 @@ Command_RoomSay::Command_RoomSay(int _roomId, const QString &_message) { insertItem(new SerializableItem_String("message", _message)); } -Command_CreateGame::Command_CreateGame(int _roomId, const QString &_description, const QString &_password, int _maxPlayers, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything) - : RoomCommand("create_game", _roomId) -{ - insertItem(new SerializableItem_String("description", _description)); - insertItem(new SerializableItem_String("password", _password)); - insertItem(new SerializableItem_Int("max_players", _maxPlayers)); - insertItem(new SerializableItem_Bool("spectators_allowed", _spectatorsAllowed)); - insertItem(new SerializableItem_Bool("spectators_need_password", _spectatorsNeedPassword)); - insertItem(new SerializableItem_Bool("spectators_can_talk", _spectatorsCanTalk)); - insertItem(new SerializableItem_Bool("spectators_see_everything", _spectatorsSeeEverything)); -} Command_JoinGame::Command_JoinGame(int _roomId, int _gameId, const QString &_password, bool _spectator) : RoomCommand("join_game", _roomId) { @@ -453,7 +442,6 @@ void ProtocolItem::initializeHashAuto() itemNameHash.insert("cmdjoin_room", Command_JoinRoom::newItem); itemNameHash.insert("cmdleave_room", Command_LeaveRoom::newItem); itemNameHash.insert("cmdroom_say", Command_RoomSay::newItem); - itemNameHash.insert("cmdcreate_game", Command_CreateGame::newItem); itemNameHash.insert("cmdjoin_game", Command_JoinGame::newItem); itemNameHash.insert("cmdleave_game", Command_LeaveGame::newItem); itemNameHash.insert("cmdsay", Command_Say::newItem); diff --git a/common/protocol_items.dat b/common/protocol_items.dat index 47b4a099..c2018087 100644 --- a/common/protocol_items.dat +++ b/common/protocol_items.dat @@ -12,7 +12,6 @@ 0:join_room:i,room_id 1:leave_room 1:room_say:s,message -1:create_game:s,description:s,password:i,max_players:b,spectators_allowed:b,spectators_need_password:b,spectators_can_talk:b,spectators_see_everything 1:join_game:i,game_id:s,password:b,spectator 2:leave_game 2:say:s,message diff --git a/common/protocol_items.h b/common/protocol_items.h index 9655a834..a0242130 100644 --- a/common/protocol_items.h +++ b/common/protocol_items.h @@ -113,20 +113,6 @@ public: static SerializableItem *newItem() { return new Command_RoomSay; } int getItemId() const { return ItemId_Command_RoomSay; } }; -class Command_CreateGame : public RoomCommand { - Q_OBJECT -public: - Command_CreateGame(int _roomId = -1, const QString &_description = QString(), const QString &_password = QString(), int _maxPlayers = -1, bool _spectatorsAllowed = false, bool _spectatorsNeedPassword = false, bool _spectatorsCanTalk = false, bool _spectatorsSeeEverything = false); - QString getDescription() const { return static_cast(itemMap.value("description"))->getData(); }; - QString getPassword() const { return static_cast(itemMap.value("password"))->getData(); }; - int getMaxPlayers() const { return static_cast(itemMap.value("max_players"))->getData(); }; - bool getSpectatorsAllowed() const { return static_cast(itemMap.value("spectators_allowed"))->getData(); }; - bool getSpectatorsNeedPassword() const { return static_cast(itemMap.value("spectators_need_password"))->getData(); }; - bool getSpectatorsCanTalk() const { return static_cast(itemMap.value("spectators_can_talk"))->getData(); }; - bool getSpectatorsSeeEverything() const { return static_cast(itemMap.value("spectators_see_everything"))->getData(); }; - static SerializableItem *newItem() { return new Command_CreateGame; } - int getItemId() const { return ItemId_Command_CreateGame; } -}; class Command_JoinGame : public RoomCommand { Q_OBJECT public: diff --git a/common/server_game.cpp b/common/server_game.cpp index 330534bf..92234d45 100644 --- a/common/server_game.cpp +++ b/common/server_game.cpp @@ -28,8 +28,8 @@ #include #include -Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent) - : QObject(parent), creatorInfo(new ServerInfo_User(_creator->getUserInfo())), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), activePlayer(-1), activePhase(-1), spectatorsAllowed(_spectatorsAllowed), spectatorsNeedPassword(_spectatorsNeedPassword), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), inactivityCounter(0), secondsElapsed(0) +Server_Game::Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, const QList &_gameTypes, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent) + : QObject(parent), creatorInfo(new ServerInfo_User(_creator->getUserInfo())), gameStarted(false), gameId(_gameId), description(_description), password(_password), maxPlayers(_maxPlayers), gameTypes(_gameTypes), activePlayer(-1), activePhase(-1), spectatorsAllowed(_spectatorsAllowed), spectatorsNeedPassword(_spectatorsNeedPassword), spectatorsCanTalk(_spectatorsCanTalk), spectatorsSeeEverything(_spectatorsSeeEverything), inactivityCounter(0), secondsElapsed(0) { addPlayer(_creator, false, false); @@ -399,18 +399,25 @@ ServerInfo_Game *Server_Game::getInfo() const { if (players.isEmpty()) // Game is closing - return new ServerInfo_Game(getGameId(), QString(), false, 0, getMaxPlayers(), 0, false, 0); - else + return new ServerInfo_Game(getGameId(), QString(), false, 0, getMaxPlayers(), QList(), 0, false, 0); + else { // Game is open + + QList gameTypeList; + for (int i = 0; i < gameTypes.size(); ++i) + gameTypeList.append(new GameTypeId(gameTypes[i])); + return new ServerInfo_Game( getGameId(), getDescription(), !getPassword().isEmpty(), getPlayerCount(), getMaxPlayers(), + gameTypeList, new ServerInfo_User(getCreatorInfo(), false), getSpectatorsAllowed(), getSpectatorsNeedPassword(), getSpectatorCount() ); + } } \ No newline at end of file diff --git a/common/server_game.h b/common/server_game.h index 29d2c91a..e5fbc5a2 100644 --- a/common/server_game.h +++ b/common/server_game.h @@ -40,6 +40,7 @@ private: QString description; QString password; int maxPlayers; + QList gameTypes; int activePlayer, activePhase; bool spectatorsAllowed; bool spectatorsNeedPassword; @@ -53,7 +54,7 @@ signals: private slots: void pingClockTimeout(); public: - Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent); + Server_Game(Server_ProtocolHandler *_creator, int _gameId, const QString &_description, const QString &_password, int _maxPlayers, const QList &_gameTypes, bool _spectatorsAllowed, bool _spectatorsNeedPassword, bool _spectatorsCanTalk, bool _spectatorsSeeEverything, Server_Room *parent); ~Server_Game(); ServerInfo_Game *getInfo() const; ServerInfo_User *getCreatorInfo() const { return creatorInfo; } diff --git a/common/server_protocolhandler.cpp b/common/server_protocolhandler.cpp index 56cb4a76..db9348f5 100644 --- a/common/server_protocolhandler.cpp +++ b/common/server_protocolhandler.cpp @@ -356,7 +356,12 @@ ResponseCode Server_ProtocolHandler::cmdCreateGame(Command_CreateGame *cmd, Comm if (authState == PasswordWrong) return RespLoginNeeded; - Server_Game *game = room->createGame(cmd->getDescription(), cmd->getPassword(), cmd->getMaxPlayers(), cmd->getSpectatorsAllowed(), cmd->getSpectatorsNeedPassword(), cmd->getSpectatorsCanTalk(), cmd->getSpectatorsSeeEverything(), this); + QList gameTypes; + QList gameTypeList = cmd->getGameTypes(); + for (int i = 0; i < gameTypeList.size(); ++i) + gameTypes.append(gameTypeList[i]->getData()); + + Server_Game *game = room->createGame(cmd->getDescription(), cmd->getPassword(), cmd->getMaxPlayers(), gameTypes, cmd->getSpectatorsAllowed(), cmd->getSpectatorsNeedPassword(), cmd->getSpectatorsCanTalk(), cmd->getSpectatorsSeeEverything(), this); Server_Player *creator = game->getPlayers().values().first(); games.insert(game->getGameId(), QPair(game, creator)); diff --git a/common/server_room.cpp b/common/server_room.cpp index 2d244255..0bbea016 100644 --- a/common/server_room.cpp +++ b/common/server_room.cpp @@ -3,8 +3,8 @@ #include "server_game.h" #include -Server_Room::Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, Server *parent) - : QObject(parent), id(_id), name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage) +Server_Room::Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent) + : QObject(parent), id(_id), name(_name), description(_description), autoJoin(_autoJoin), joinMessage(_joinMessage), gameTypes(_gameTypes) { } @@ -17,6 +17,7 @@ ServerInfo_Room *Server_Room::getInfo(bool complete) const { QList gameList; QList userList; + QList gameTypeList; if (complete) { QMapIterator gameIterator(games); while (gameIterator.hasNext()) @@ -24,9 +25,12 @@ ServerInfo_Room *Server_Room::getInfo(bool complete) const for (int i = 0; i < size(); ++i) userList.append(new ServerInfo_User(at(i)->getUserInfo(), false)); + + for (int i = 0; i < gameTypes.size(); ++i) + gameTypeList.append(new ServerInfo_GameType(i, gameTypes[i])); } - return new ServerInfo_Room(id, name, description, games.size(), size(), autoJoin, gameList, userList); + return new ServerInfo_Room(id, name, description, games.size(), size(), autoJoin, gameList, userList, gameTypeList); } void Server_Room::addClient(Server_ProtocolHandler *client) @@ -64,9 +68,9 @@ void Server_Room::broadcastGameListUpdate(Server_Game *game) delete event; } -Server_Game *Server_Room::createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator) +Server_Game *Server_Room::createGame(const QString &description, const QString &password, int maxPlayers, const QList &gameTypes, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator) { - Server_Game *newGame = new Server_Game(creator, static_cast(parent())->getNextGameId(), description, password, maxPlayers, spectatorsAllowed, spectatorsNeedPassword, spectatorsCanTalk, spectatorsSeeEverything, this); + Server_Game *newGame = new Server_Game(creator, static_cast(parent())->getNextGameId(), description, password, maxPlayers, gameTypes, spectatorsAllowed, spectatorsNeedPassword, spectatorsCanTalk, spectatorsSeeEverything, this); games.insert(newGame->getGameId(), newGame); connect(newGame, SIGNAL(gameClosing()), this, SLOT(removeGame())); diff --git a/common/server_room.h b/common/server_room.h index 3df55b87..cc8c52aa 100644 --- a/common/server_room.h +++ b/common/server_room.h @@ -25,11 +25,12 @@ private: QString description; bool autoJoin; QString joinMessage; + QStringList gameTypes; QMap games; private slots: void removeGame(); public: - Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, Server *parent); + Server_Room(int _id, const QString &_name, const QString &_description, bool _autoJoin, const QString &_joinMessage, const QStringList &_gameTypes, Server *parent); int getId() const { return id; } QString getName() const { return name; } QString getDescription() const { return description; } @@ -43,7 +44,7 @@ public: void removeClient(Server_ProtocolHandler *client); void say(Server_ProtocolHandler *client, const QString &s); void broadcastGameListUpdate(Server_Game *game); - Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator); + Server_Game *createGame(const QString &description, const QString &password, int maxPlayers, const QList &_gameTypes, bool spectatorsAllowed, bool spectatorsNeedPassword, bool spectatorsCanTalk, bool spectatorsSeeEverything, Server_ProtocolHandler *creator); void sendRoomEvent(RoomEvent *event); }; diff --git a/servatrice/servatrice.ini.example b/servatrice/servatrice.ini.example index e9d1246e..46a2359d 100644 --- a/servatrice/servatrice.ini.example +++ b/servatrice/servatrice.ini.example @@ -19,6 +19,10 @@ size=1 1\description="Play anything here." 1\autojoin=true 1\joinmessage="This message is only here to show that rooms can have a join message." +1\game_types\size=3 +1\game_types\1\name="GameType1" +1\game_types\2\name="GameType2" +1\game_types\3\name="GameType3" [game] max_game_inactivity_time=120 diff --git a/servatrice/src/servatrice.cpp b/servatrice/src/servatrice.cpp index 2c8cf326..89b89f0e 100644 --- a/servatrice/src/servatrice.cpp +++ b/servatrice/src/servatrice.cpp @@ -58,12 +58,22 @@ Servatrice::Servatrice(QObject *parent) int size = settings->beginReadArray("rooms"); for (int i = 0; i < size; ++i) { settings->setArrayIndex(i); + + QStringList gameTypes; + int size2 = settings->beginReadArray("game_types"); + for (int j = 0; j < size2; ++j) { + settings->setArrayIndex(j); + gameTypes.append(settings->value("name").toString()); + } + settings->endArray(); + Server_Room *newRoom = new Server_Room( i, settings->value("name").toString(), settings->value("description").toString(), settings->value("autojoin").toBool(), settings->value("joinmessage").toString(), + gameTypes, this ); addRoom(newRoom);