The score counting now stops during pauses
[ghostsoverboard] / seascene.cpp
index fa17ec2..cf14094 100644 (file)
@@ -61,19 +61,25 @@ SeaScene::SeaScene(QObject *parent) :
 
 //Setup the level list
 
+    QList<Level> levelList;
     Level level1(5,10);
-    levelList_.append(level1);
+    levelList.append(level1);
     Level level2(5,10,2,50);
-    levelList_.append(level2);
+    levelList.append(level2);
     Level level3(5,15,2,50);
-    levelList_.append(level3);
+    levelList.append(level3);
     Level level4(5,15,4,50);
-    levelList_.append(level4);
+    levelList.append(level4);
     Level level5(5,15,5,100);
-    levelList_.append(level5);
+    levelList.append(level5);
+
+    Levelset set ("Original",levelList);
+    levelset_ = set;
 
     currentLevel_ = 0;
 
+    totalScore_ = 0;
+
 
     connect(this,SIGNAL(allGhostsPicked()),this,SLOT(nextLevel()));
 
@@ -90,9 +96,14 @@ SeaScene::SeaScene(QObject *parent) :
     connect(pPauseAction_,SIGNAL(toggled(bool)),this,SLOT(pause(bool)));
 
 
+    deviceLockPollTimer_.setInterval(20*60);
+    connect(&deviceLockPollTimer_,SIGNAL(timeout()),this,SLOT(pollDeviceLocked()));
+    deviceLockPollTimer_.start();
+
+
     autopauseTimer.setSingleShot(true);
     autopauseTimer.setInterval(15*60*1000);
-    connect(&autopauseTimer,SIGNAL(timeout()),this,SLOT(forcePause()));
+    connect(&autopauseTimer,SIGNAL(timeout()),this,SLOT(turnPauseOn()));
 
 
 }
@@ -111,6 +122,8 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed)
 
     createVictoryItems();
 
+    createLevelCompletedItem();
+
 
     //empty the list of moving items
 
@@ -228,8 +241,6 @@ void SeaScene::setupMap(int ghosts, int rocks, int octopuses, int octopusSpeed)
         connect(pOctopus,SIGNAL(droppingGhosts()),pShip,SLOT(dropAllGhosts()));
     }
     delete pPosition;
-
-
 }
 
 void SeaScene::setupMap(Level level)
@@ -363,7 +374,10 @@ void SeaScene::pause(bool paused)
             if (pPausetextItem_)
                 pPausetextItem_->hide();
 
+            scoreCounter_.start();
+
             autopauseTimer.start(); //Start counting towards autopause
+            deviceLockPollTimer_.start(); //Start polling whether device is locked
         }
 
         else
@@ -379,7 +393,10 @@ void SeaScene::pause(bool paused)
             }
 //                else qDebug() << "No pause text available";
 
+            levelScore_ += scoreCounter_.elapsed();
+
             autopauseTimer.stop(); //No need to count toward autopause when already paused
+            deviceLockPollTimer_.stop(); //No need to check for unlock as no unpause anyway
         }
 }
 
@@ -406,9 +423,22 @@ void SeaScene::handleScreenTapped()
         {
             pAboutBoxItem_->hide();
             pPausetextItem_->show();
+            return;
         }
     }
 
+    //If the game is paused, check if the level completed item is shown
+
+    if (pLevelCompletedItem_)
+    {
+        if (pLevelCompletedItem_->isVisible())
+        {
+            pLevelCompletedItem_->hide();
+            restartLevel(); //Current level has already been set to the next one before showing the level completed item
+            pPauseAction_->setChecked(false); //unpause
+            return;
+        }
+    }
   
     //If the game is paused, check if the victory item is being shown
     if(pVictoryCongratulationsItem_)
@@ -422,6 +452,7 @@ void SeaScene::handleScreenTapped()
         }
     }
 
+
     //If the game is paused and no victory, check if menu item was selected
 
     QList<QGraphicsItem *> items = selectedItems();
@@ -528,7 +559,7 @@ void SeaScene::createMenuItems()
     prepareForMenu(pRestartLevelItem_);
 
     pSettingsItem_ = new QGraphicsTextItem;
-    QString vibraText(tr("Vibration <br> effects "));
+    QString vibraText(tr("Turn vibration <br> effects "));
     QString statusText;
     if (pVibrateAction_->isChecked())
     {
@@ -589,10 +620,18 @@ void SeaScene::about()
 
 void SeaScene::restartLevel()
 {
-    setupMap(levelList_.value(currentLevel_));  //value() returns default constructor Level if index is invalid, so no risk of crash
+
+    levelScore_ = 0;
+
+    setupMap(levelset_.getLevel(currentLevel_));  //getLevel() returns default constructor Level if index is invalid, so no risk of crash
+
+    scoreCounter_.start();
+
     vibrationActivate(pVibrateAction_->isChecked());  //Vibration effects are lost without this
    // qDebug() << pVibrateAction_->isChecked();
     autopauseTimer.start();  //reset counting towards autopause
+
+
 }
 
 
@@ -600,26 +639,45 @@ void SeaScene::restartLevel()
 void SeaScene::nextLevel()
 {
 
-    currentLevel_++;
-
-    if (levelList_.empty())
-        setupMap(Level());
+    //get score for previous level
+    levelScore_ += scoreCounter_.elapsed();
+    totalScore_ += levelScore_;
+    int highscore = levelset_.getLevelHighScore(currentLevel_);
+    qDebug() << highscore;
 
+    QString scoretext;
 
-    if ( currentLevel_ < levelList_.size() )
+    if (levelScore_ >= highscore)
     {
-       restartLevel();
+        scoretext = tr("<font size=\"5\" color = darkorange>Your time: %1.%2 s<br>Best time: %3.%4 s<br><br>Tap to start the next level").arg(levelScore_/1000).arg((levelScore_%1000)/100).arg(highscore/1000).arg((highscore%1000)/100);
     }
 
-    else //Victory!
+    else //New high score!
+
     {
+        scoretext = tr("<font size=\"5\" color = darkorange>Your time %1.%2 s is the new best time!<br>br> Tap to start the next level").arg(levelScore_/1000).arg((levelScore_%1000)/100);
+        levelset_.setLevelHighScore(currentLevel_,levelScore_);
+    }
+
+    //pause to show the highscore or victory screen
 
-        pPauseAction_->setChecked(true); //Pause the game while showing the victory dialog
+    turnPauseOn();
+    pPausetextItem_->hide();
 
-        pPausetextItem_->hide();
 
-        pVictoryCongratulationsItem_->show();
+    //Go to the next level if available
+    currentLevel_++;
 
+    if ( currentLevel_ < levelset_.numberOfLevels() )
+    {
+       pLevelCompletedItem_->setHtml(scoretext);
+       pLevelCompletedItem_->show();
+//       restartLevel();
+    }
+
+    else //Victory!
+    {
+        pVictoryCongratulationsItem_->show();
     }
 }
 
@@ -627,6 +685,7 @@ void SeaScene::nextLevel()
 void SeaScene::restartGame()
 {
     currentLevel_ = 0;
+    totalScore_ = 0;
     restartLevel();
 }
 
@@ -651,7 +710,7 @@ void SeaScene::createVictoryItems()
     pVictoryCongratulationsItem_ = new QGraphicsTextItem;
     pVictoryCongratulationsItem_->setHtml("<font size=\"6\" color = darkorange> Victory!");
     pVictoryCongratulationsItem_->hide();
-    pVictoryCongratulationsItem_->setPos(300,50);
+    pVictoryCongratulationsItem_->setPos(355,50);
     pVictoryCongratulationsItem_->setZValue(1000);
     addItem(pVictoryCongratulationsItem_);
 
@@ -705,5 +764,52 @@ void SeaScene::setItemPointersNull()
 
     pAboutBoxItem_ = NULL;
     pVictoryCongratulationsItem_ = NULL;
+    pLevelCompletedItem_ = NULL;
+
+
+}
+
+void SeaScene::turnPauseOn()
+{
+    pPauseAction_->setChecked(true);
+}
+
+void SeaScene::handleDeviceLocked(bool isLocked)
+{
+    //pauses if locked but does not unpause if unlocked
+    if(isLocked)
+    {
+        pPauseAction_->setChecked(true);
+    }
+}
+
+void SeaScene::pollDeviceLocked()
+{
+
+    bool locked = deviceInfo_.isDeviceLocked();
+
+    if (locked)
+    {
+        if (!alreadyLocked_)
+        {
+            pPauseAction_->setChecked(true);
+            alreadyLocked_ = true;
+        }
+
+    else
+        {
+            alreadyLocked_ = false;
+        }
+    }
+}
+
+void SeaScene::createLevelCompletedItem()
+{
+    pLevelCompletedItem_ = new QGraphicsTextItem;
+    addItem(pLevelCompletedItem_);
+    pLevelCompletedItem_->setPos(20,20);
+    pLevelCompletedItem_->setZValue(1000);
+    pLevelCompletedItem_->hide();
+    //The text is set at usetime
 
 }