void MainWindow::endGame() { isSetUp = false; emit updateNeeded(); boardUi->endGame(); emit gameEvent(tr("Game ended.")); QSettings settings; settings.beginGroup("games"); int size = settings.beginReadArray("game"); settings.endArray(); settings.beginWriteArray("game"); settings.setArrayIndex(size-1); settings.beginWriteArray("result"); int playerCount = game->getPlayerCount(); for (int i = 0; i < playerCount; ++i) { settings.setArrayIndex(i); settings.setValue("score", game->getPlayerScore(i)); } settings.endArray(); settings.endArray(); settings.endGroup(); }
void MainWindow::nodeScored(const Node * n, const int score, const Game * game) { QStringList players; uchar meepleCount = n->getMaxMeeples(); { int player = 0; for (uchar const * m = n->getMeeples(), * end = m + game->getPlayerCount(); m < end; ++m, ++player) { if (*m == meepleCount) players.append(QString::number(player+1)); } } QString name; switch (n->getTerrain()) { case Field: name = tr("Field"); break; case City: name = tr("City"); break; case Road: name = tr("Road"); break; case Cloister: name = tr("Cloister"); break; case None: default: name = tr("[Unknown]"); break; } emit gameEvent(tr("%1 scored %n point(s) for players: %2", "", score).arg(name).arg(players.join(", "))); }
void MainWindow::newGame(int player, const Game * game) { gameStartTimestamp = QDateTime::currentMSecsSinceEpoch(); if (player < 0) { qDebug("New game started with players:"); for (Player const * p : game->getPlayers()) qDebug() << p->getTypeName(); qDebug(); } boardUi->newGame(player, game); if (isSetUp) return; isSetUp = true; qDeleteAll(playerInfos); playerInfos.clear(); for (uint i = 0; i < game->getPlayerCount(); ++i) { PlayerInfoView * pi = new PlayerInfoView(i, game, &imgFactory); ui->playerInfoLayout->insertWidget(i, pi); connect(this, SIGNAL(updateNeeded()), pi, SLOT(updateView())); connect(this, SIGNAL(tileDrawn(int,int)), pi, SLOT(displayTile(int,int))); playerInfos.push_back(pi); } emit gameEvent(tr("New game started")); ui->remainingTiles->setUp(game, &imgFactory); connect(this, SIGNAL(updateNeeded()), ui->remainingTiles, SLOT(updateView())); QSettings settings; settings.beginGroup("games"); int size = settings.beginReadArray("game"); settings.endArray(); settings.beginWriteArray("game"); settings.setArrayIndex(size); settings.setValue("appRevision", APP_REVISION_STR); settings.setValue("qtCompileVersion", QT_VERSION_STR); settings.setValue("qtRuntimeVersionn", qVersion()); settings.setValue("timestamp", gameStartTimestamp); settings.beginWriteArray("players"); auto const & players = game->getPlayers(); for (size_t i = 0; i < players.size(); ++i) { settings.setArrayIndex((int)i); settings.setValue("type", players[i]->getTypeName()); } settings.endArray(); settings.endArray(); settings.endGroup(); }
void GameModel::localResign() { if (status_ == StatusMyTurn) { myResign_ = true; setStatus(StatusLose); emit gameEvent("turn\nresign"); } }
void GameModel::localAccept() { if (status_ == StatusMyTurn && oppDraw_) { myAccept_ = true; setStatus(StatusDraw); emit gameEvent("turn\naccept"); } }
void MainWindow::playerMoved(int player, const Tile * tile, const MoveHistoryEntry & move) { emit updateNeeded(); boardUi->playerMoved(player, tile, move); if (move.move.tileMove.isNull()) emit gameEvent(tr("A non-suitable tile was drawn and discarded.")); else emit gameEvent(tr("Player %1 moved.").arg(player+1)); // QSettings settings; // settings.beginGroup("games"); // int size = settings.beginReadArray("game"); // settings.endArray(); //game // settings.beginWriteArray("game"); // settings.setArrayIndex(size-1); // int moveSize = settings.beginReadArray("moves"); // settings.endArray(); //moves // auto const & history = game->getMoveHistory(); // settings.beginWriteArray("moves"); // for (size_t i = moveSize; i < history.size(); ++i) // { // settings.setArrayIndex((int)i); // MoveHistoryEntry const & m = history[i]; // settings.setValue("tile", m.tile); // settings.setValue("x", m.move.tileMove.x); // settings.setValue("y", m.move.tileMove.y); // settings.setValue("orientation", m.move.tileMove.orientation); // settings.setValue("meeple", m.move.meepleMove.nodeIndex); // } // settings.endArray(); //moves // settings.endArray(); //game // settings.endGroup(); //games QString const & dataLoc = QStandardPaths::writableLocation(QStandardPaths::DataLocation); QDir dir = QDir(dataLoc).absoluteFilePath("games"); if (dir.mkpath(".") && gameStartTimestamp != -1) game->storeToFile(dir.absoluteFilePath(QString::number(gameStartTimestamp))); }
void PluginWindow::initBoard() { if (!gm_) { gm_ = new GameModel(this); connect(gm_, SIGNAL(gameEvent(QString)), this, SIGNAL(gameEvent(QString))); connect(gm_, SIGNAL(statusChanged()), this, SLOT(updateStatus())); connect(ui.actionNewGame, SIGNAL(triggered()), this, SLOT(newGame())); connect(ui.actionExit, SIGNAL(triggered()), this, SLOT(close())); connect(ui.btnFreeze, SIGNAL(clicked()), this, SLOT(freezeShips())); connect(ui.btnDraw, SIGNAL(toggled(bool)), gm_, SLOT(setLocalDraw(bool))); connect(ui.btnAccept, SIGNAL(clicked()), gm_, SLOT(localAccept())); connect(ui.btnResign, SIGNAL(clicked()), gm_, SLOT(localResign())); connect(ui.actionResign, SIGNAL(triggered()), gm_, SLOT(localResign())); BoardModel *bmodel = new BoardModel(this); bmodel->init(gm_); BoardDelegate *bd_ = new BoardDelegate(bmodel, this); ui.tvBoard->setItemDelegate(bd_); ui.tvBoard->setModel(bmodel); }
void GameModel::localTurn(int pos) { if (status_ == StatusMyTurn) { lastShot_ = pos; QString data = QString("turn\npos;%1").arg(pos); if (draw_) data.append("\ndraw"); setStatus(StatusWaitingTurnAccept); emit gameEvent(data); } }
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); #if !MAINWINDOW_ENABLE_UNDO delete ui->actionUndo; #endif ui->optionsWidget->setVisible(ui->optionsCheckBox->isChecked()); setWindowTitle(APP_NAME); playerSelector = new PlayerSelector(&tileFactory, this); for (int i = 1; i <= MAX_PLAYERS; ++i) { QLabel * numberLabel = new QLabel(QString::number(i)); ui->ngPlayerLayout->addWidget(numberLabel, i, 0); QComboBox * colorBox = new QComboBox(); for (uint j = 0; j < colors.size(); ++j) { colorBox->addItem(colorNames[j]); QPixmap px(32, 32); QPainter painter(&px); painter.fillRect(px.rect(), colors[j]); painter.drawRect(0, 0, px.width() - 1, px.height() - 1); colorBox->setItemIcon(j, QIcon(px)); } colorBox->setCurrentIndex(i-1); ui->ngPlayerLayout->addWidget(colorBox, i, 1); connect(colorBox, SIGNAL(currentIndexChanged(int)), this, SLOT(colorBoxChanged(int))); QComboBox * typeBox = new QComboBox(); typeBox->addItems(QStringList{tr("", "player selection: no player"), tr("Player"), tr("Computer")}); ui->ngPlayerLayout->addWidget(typeBox, i, 2); connect(typeBox, SIGNAL(currentIndexChanged(int)), this, SLOT(typeBoxChanged(int))); QLineEdit * nameEdit = new QLineEdit(); ui->ngPlayerLayout->addWidget(nameEdit, i, 3); ngPlayerEdits[i-1] = NgPlayerEdit{colorBox, typeBox, nameEdit}; } auto actionGroup = new QActionGroup(this); actionGroup->addAction(ui->actionRandom_Tiles); actionGroup->addAction(ui->actionChoose_Tiles); boardUi = new BoardGraphicsScene(&tileFactory, &imgFactory, ui->boardView); game = new Game(this, true); game->addView(this); gameThread = new GameThread(game, this); boardUi->setGame(game); ui->boardView->setScene(boardUi); connect(boardUi, SIGNAL(sceneRectChanged(QRectF)), this, SLOT(recenter(QRectF))); connect(this, SIGNAL(gameEvent(QString)), this, SLOT(displayGameEvent(QString))); connect(this, SIGNAL(gameEventPop()), this, SLOT(displayGameEventPop())); readSettings(); game->addWatchingPlayer(this); }
void GameModel::sendCoveredBoard() { myBoard_.calculateCellsHash(); emit gameEvent("covered-board\n" + myBoard_.toStringList(true).join("\n")); }