Ui fixes.
[evilplumber] / src / game.cpp
index 907292c..62da042 100644 (file)
@@ -49,8 +49,7 @@ QString pieceToIconId(const Piece* piece, bool flow1 = false, bool flow2 = false
         fileName += (QString("_flow_") + (flow1? "1" : "0") + (flow2? "1" : "0"));
     }
 
-
-    qDebug() << "need: " << fileName;
+    //qDebug() << "need: " << fileName;
     return fileName + ".png";
 }
 
@@ -155,6 +154,10 @@ bool GameField::setPiece(int row, int col, const Piece* piece, bool fixed)
         QLabel* label = (QLabel*)fieldUi->indexWidget(index);
         label->setPixmap(QPixmap(iconId));
 
+        if (fixed) {
+            label->setStyleSheet("background-color: #263d49");
+        }
+
         return true;
     }
     return false;
@@ -191,7 +194,7 @@ 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) {
+    if (dir == DirFailed || dir == DirPassed) {
         // No need to indicate these pseudo-directions
         return;
     }
@@ -235,7 +238,7 @@ AvailablePieces::AvailablePieces(QTableWidget* ui)
     for (int i = 0; i < 2; ++i)
         pieceUi->setColumnWidth(i, 120);
 
-    for (int i = 0; i < 4; ++i)
+    for (int i = 0; i < 5; ++i)
         pieceUi->setRowHeight(i, 70);
 
     for (int i = 0; ppieces[i].type != PiecesEnd; ++i) {
@@ -555,12 +558,12 @@ LevelSwitcher::LevelSwitcher(GameController* gameController,
                              QWidget* startWidget, QLabel* startTitle, 
                              QLabel* startLabel, QPushButton* startButton,
                              QLabel* levelLabel, QLabel* scoreLabel,
-                             QStringList levelCollections)
+                             QStringList collections)
     : gameController(gameController),
       levelWidget(levelWidget), levelList(levelList), levelStartButton(levelStartButton),
       startWidget(startWidget), startTitle(startTitle), startLabel(startLabel), startButton(startButton),
       levelLabel(levelLabel), scoreLabel(scoreLabel),
-      levelCollections(levelCollections), curColl(0), level(0), totalScore(0)
+      curColl(""), level(0), totalScore(0)
 {
     connect(levelStartButton, SIGNAL(clicked()), this, SLOT(onLevelCollectionChosen()));
 
@@ -568,6 +571,7 @@ LevelSwitcher::LevelSwitcher(GameController* gameController,
     connect(gameController, SIGNAL(levelPassed(int)), this, SLOT(onLevelPassed(int)));
     connect(gameController, SIGNAL(levelFailed()), this, SLOT(onLevelFailed()));
     readSavedGames();
+    readLevelCollections(collections);
     chooseLevelCollection();
 }
 
@@ -575,7 +579,7 @@ void LevelSwitcher::chooseLevelCollection()
 {
     levelList->clear();
     bool first = true;
-    foreach (const QString& collection, levelCollections) {
+    foreach (const QString& collection, levelCollections.keys()) {
         QListWidgetItem *newItem = new QListWidgetItem();
 
         // Check how many levels the user has already passed
@@ -583,10 +587,15 @@ void LevelSwitcher::chooseLevelCollection()
         if (savedGames.contains(collection)) {
             passed = savedGames[collection];
         }
+        int total = 0;
+        if (levelCollections.contains(collection)) {
+            total = levelCollections[collection].size();
+        }
 
-        newItem->setText(collection + " " + QString::number(passed) + " / " /*+ y*/);
+        newItem->setText(collection + "   \tPassed: " + 
+                         QString::number(passed) + " / " + QString::number(total));
         levelList->addItem(newItem); // transfers ownership
-        if (first) { // TODO: and passed < total
+        if (first && passed < total) {
             levelList->setCurrentItem(newItem);
             first = false;
         }
@@ -598,22 +607,19 @@ void LevelSwitcher::onLevelCollectionChosen()
 {
     levelWidget->hide();
     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);
-    QTextStream levelData(&file);
-    levels.clear();
-    
-    while (!levelData.atEnd())
-        levels << levelData.readLine();
+
+    if (levelCollections.contains(curColl)) {
+        levels = levelCollections[curColl];
+    }
+    else
+        qFatal("Error choosing a level collection: unrecognized");
 
     level = 0;
     // Go to the level the user has not yet passed
     if (savedGames.contains(curColl)) {
+        qDebug() << "going to saved level" << savedGames[curColl];
         level = savedGames[curColl];
-        if (level >= levels.size() - 1) {
+        if (level >= levels.size()) {
             level = 0;
         }
     }
@@ -621,7 +627,6 @@ void LevelSwitcher::onLevelCollectionChosen()
     totalScore = 0;
     startTitle->setText("Starting a new game.");
     scoreLabel->setText("0");
-    file.close();
     initiateLevel();
 }
 
@@ -676,7 +681,7 @@ void LevelSwitcher::onLevelPassed(int score)
         startButton->disconnect();
         connect(startButton, SIGNAL(clicked()), this, SLOT(chooseLevelCollection()));
         // Record that all levels have been passed
-        savedGames.insert(curColl, levels.size() - 1);
+        savedGames.insert(curColl, levels.size());
         writeSavedGames();
 
         level = 0;
@@ -705,30 +710,51 @@ void LevelSwitcher::readSavedGames()
         saveData >> collection;
         saveData >> level;
         qDebug() << "Got saved game: " << collection << level;
-        savedGames.insert(collection, level);
+        if (collection != "")
+            savedGames.insert(collection, level);
     }
     file.close();
 }
 
+void LevelSwitcher::readLevelCollections(QStringList collections)
+{
+    foreach (const QString& coll, collections) {
+        QFile file(QString(LEVDIR) + "/" + coll + ".dat");
+        qDebug() << "Trying to read" << file.fileName();
+        if (!file.exists())
+            qFatal("Error reading level collection: doesn't exist");
+        file.open(QIODevice::ReadOnly);
+        QTextStream levelData(&file);
+        QStringList readLevels;
+        while (!levelData.atEnd())
+            readLevels << levelData.readLine();
+
+        levelCollections.insert(coll, readLevels);
+        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()) {
+        qDebug() << "writing" << collection << savedGames[collection];
         saveData << collection << " " << savedGames[collection] << endl;
     }
     file.close();
 }
 
-// Todo next:
-// better graphics
-// save & load
-// level collections: introduction + basic
-// more levels
+// TODO:
+// --- 0.1 ---
+// more levels to the basic collection
 // make fixed pipes look different than non-fixed ones
+// get rid of debug prints
+// --- 0.2 ---
+// ability to install level sets as different packages
+// better graphics
 // color theme
-// --------------
 // re-placing pieces
 // graphical hints on what to do next
 // graphical help, showing the ui elements: demo