From: Marja Hassinen Date: Sun, 3 Jan 2010 18:55:53 +0000 (+0200) Subject: Saving games & starting from the next un-passed level (draft). X-Git-Tag: 0.1~28 X-Git-Url: http://vcs.maemo.org/git/?p=evilplumber;a=commitdiff_plain;h=591b3072d24a7b356b3104803fbb5ea940d255ee Saving games & starting from the next un-passed level (draft). --- diff --git a/src/game.cpp b/src/game.cpp index 6093fa3..907292c 100644 --- a/src/game.cpp +++ b/src/game.cpp @@ -20,9 +20,10 @@ #include #include #include -#include #include #include +#include +#include #include const Piece* findPiece(PieceType type, int rotation) @@ -190,6 +191,11 @@ void GameField::indicateFlow(int row, int col, Direction dir) if (row < 0 || col < 0 || row >= rows || col >= cols) { return; } + if (dir == DirDone || dir == DirFailed || dir == DirPassed) { + // No need to indicate these pseudo-directions + return; + } + int index = toIndex(row, col); if (dir != DirNone && (field[index].piece->flows[0] == dir || field[index].piece->flows[1] == dir)) { field[index].flow[0] = true; @@ -203,7 +209,6 @@ void GameField::indicateFlow(int row, int col, Direction dir) field[index].piece = ppieces; field[index].flow[0] = true; field[index].flow[1] = false; - } else { qWarning() << "Indicate flow: illegal direction" << row << col << dir; @@ -414,6 +419,7 @@ void GameController::startLevel(QString fileName) doneButton->setEnabled(true); timer.start(); levelRunning = true; + file.close(); } void GameController::onTimeout() @@ -554,13 +560,14 @@ LevelSwitcher::LevelSwitcher(GameController* gameController, levelWidget(levelWidget), levelList(levelList), levelStartButton(levelStartButton), startWidget(startWidget), startTitle(startTitle), startLabel(startLabel), startButton(startButton), levelLabel(levelLabel), scoreLabel(scoreLabel), - levelCollections(levelCollections), level(0), totalScore(0) + levelCollections(levelCollections), curColl(0), level(0), totalScore(0) { connect(levelStartButton, SIGNAL(clicked()), this, SLOT(onLevelCollectionChosen())); connect(startButton, SIGNAL(clicked()), this, SLOT(onStartClicked())); connect(gameController, SIGNAL(levelPassed(int)), this, SLOT(onLevelPassed(int))); connect(gameController, SIGNAL(levelFailed()), this, SLOT(onLevelFailed())); + readSavedGames(); chooseLevelCollection(); } @@ -570,9 +577,16 @@ void LevelSwitcher::chooseLevelCollection() bool first = true; foreach (const QString& collection, levelCollections) { QListWidgetItem *newItem = new QListWidgetItem(); - newItem->setText(collection); + + // Check how many levels the user has already passed + int passed = 0; + if (savedGames.contains(collection)) { + passed = savedGames[collection]; + } + + newItem->setText(collection + " " + QString::number(passed) + " / " /*+ y*/); levelList->addItem(newItem); // transfers ownership - if (first) { + if (first) { // TODO: and passed < total levelList->setCurrentItem(newItem); first = false; } @@ -583,8 +597,9 @@ void LevelSwitcher::chooseLevelCollection() void LevelSwitcher::onLevelCollectionChosen() { levelWidget->hide(); - QString collection = levelList->currentItem()->text(); - QFile file(QString(LEVDIR) + "/" + collection + ".dat"); + curColl = levelList->currentItem()->text().split(" ").first(); + QFile file(QString(LEVDIR) + "/" + curColl + ".dat"); + qDebug() << "Trying to read" << file.fileName(); if (!file.exists()) qFatal("Error reading game file: doesn't exist"); file.open(QIODevice::ReadOnly); @@ -595,9 +610,18 @@ void LevelSwitcher::onLevelCollectionChosen() levels << levelData.readLine(); level = 0; + // Go to the level the user has not yet passed + if (savedGames.contains(curColl)) { + level = savedGames[curColl]; + if (level >= levels.size() - 1) { + level = 0; + } + } + totalScore = 0; startTitle->setText("Starting a new game."); scoreLabel->setText("0"); + file.close(); initiateLevel(); } @@ -639,6 +663,11 @@ void LevelSwitcher::onLevelPassed(int score) if (level < levels.size() - 1) { ++ level; startTitle->setText(QString("Level ") + QString::number(level) + QString(" passed, proceeding to level ") + QString::number(level+1)); + // Record that the level has been passed, so that the user can + // start again + savedGames.insert(curColl, level); + writeSavedGames(); + initiateLevel(); } else { @@ -646,6 +675,10 @@ void LevelSwitcher::onLevelPassed(int score) startLabel->setText("Start a new game?"); startButton->disconnect(); connect(startButton, SIGNAL(clicked()), this, SLOT(chooseLevelCollection())); + // Record that all levels have been passed + savedGames.insert(curColl, levels.size() - 1); + writeSavedGames(); + level = 0; startWidget->show(); } @@ -657,6 +690,37 @@ void LevelSwitcher::onLevelFailed() initiateLevel(); } +void LevelSwitcher::readSavedGames() +{ + QFile file(QDir::homePath() + "/.evilplumber"); + if (!file.exists()) { + qWarning() << "Save file doesn't exist"; + return; + } + file.open(QIODevice::ReadOnly); + QTextStream saveData(&file); + QString collection = 0; + int level = 0; + while (!saveData.atEnd()) { + saveData >> collection; + saveData >> level; + qDebug() << "Got saved game: " << collection << level; + savedGames.insert(collection, level); + } + file.close(); +} + +void LevelSwitcher::writeSavedGames() +{ + QFile file(QDir::homePath() + "/.evilplumber"); + file.open(QIODevice::Truncate | QIODevice::WriteOnly); + QTextStream saveData(&file); + foreach (const QString& collection, savedGames.keys()) { + saveData << collection << " " << savedGames[collection] << endl; + } + file.close(); +} + // Todo next: // better graphics // save & load diff --git a/src/game.h b/src/game.h index 61cdd79..681aac8 100644 --- a/src/game.h +++ b/src/game.h @@ -243,6 +243,8 @@ private slots: private: void initiateLevel(); + void readSavedGames(); + void writeSavedGames(); GameController* gameController; // Not owned QWidget* levelWidget; // Not owned @@ -256,9 +258,11 @@ private: QLabel* scoreLabel; // Not owned QStringList levelCollections; + QString curColl; QStringList levels; int level; int totalScore; + QHash savedGames; // level collection -> next level ix }; #endif