Saving games & starting from the next un-passed level (draft).
authorMarja Hassinen <marja2@Vahvero.(none)>
Sun, 3 Jan 2010 18:55:53 +0000 (20:55 +0200)
committerMarja Hassinen <marja2@Vahvero.(none)>
Sun, 3 Jan 2010 18:55:53 +0000 (20:55 +0200)
src/game.cpp
src/game.h

index 6093fa3..907292c 100644 (file)
 #include <QTableWidget>
 #include <QListWidget>
 #include <QLabel>
-#include <QFile>
 #include <QPushButton>
 #include <QApplication>
+#include <QFile>
+#include <QDir>
 #include <QDebug>
 
 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
index 61cdd79..681aac8 100644 (file)
@@ -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<QString, int> savedGames; // level collection -> next level ix
 };
 
 #endif