paused_ = false;
screenLitKeeper_.keepScreenLit(true);
+ QSettings settings;
+
//set background
QPixmap waves (":/pix/meri.png");
qsrand(QTime::currentTime().msec()+2); //+2 to avoid setting it to 1
-//Setup the level list
+
+//Setup level sets
+
+ 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);
+ availableLevelsets_.append(set);
+
+
+ //Create another set of levels and place it in the available levelsets list
+ levelList.clear();
+ Level set2level1(8,15,4,50);
+ levelList.append(set2level1);
+ Level set2level2(8,20,4,50);
+ levelList.append(set2level2);
+ Level set2level3(8,20,5,80);
+ levelList.append(set2level3);
+ Level set2level4(8,20,6,120);
+ levelList.append(set2level4);
+ Level set2level5(8,25,8,150);
+ levelList.append(set2level5);
+
+ Levelset set2("Difficult",levelList);
+ availableLevelsets_.append(set2);
+
+
+ //Setup starting levelset
+
+ QString levelname = settings.value("levelset","Original").toString();
+ bool found = false;
+ foreach (Levelset levelset, availableLevelsets_)
+ {
+ if (levelset.getName() == levelname)
+ {
+ levelset_ = levelset;
+ found = true;
+ break;
+ }
+ }
+
+ if (!found) //The last used level is not available
+ {
+ levelset_ = availableLevelsets_.value(0);
+ }
currentLevel_ = 0;
+ totalScore_ = 0;
- connect(this,SIGNAL(allGhostsPicked()),this,SLOT(nextLevel()));
+ connect(this,SIGNAL(allGhostsPicked()),this,SLOT(nextLevel()));
+
pVibrateAction_ = new QAction(tr("Vibration effects"),this);
pVibrateAction_->setCheckable(true);
connect(pVibrateAction_,SIGNAL(toggled(bool)),this,SLOT(vibrationActivate(bool)));
- QSettings settings;
+
pVibrateAction_->setChecked(settings.value("vibration",false).toBool());
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()));
}
createAboutBoxItems();
+ createSelectLevelsetFromListItems();
+
createVictoryItems();
+ createLevelCompletedItems();
+
//empty the list of moving items
connect(pOctopus,SIGNAL(droppingGhosts()),pShip,SLOT(dropAllGhosts()));
}
delete pPosition;
-
-
}
void SeaScene::setupMap(Level level)
if (pPausetextItem_)
pPausetextItem_->hide();
+ scoreCounter_.start();
+
autopauseTimer.start(); //Start counting towards autopause
+ deviceLockPollTimer_.start(); //Start polling whether device is locked
}
else
{
- qDebug("about to stop movement");
+// qDebug("about to stop movement");
emit pauseOn();
screenLitKeeper_.keepScreenLit(false);
if (pPausetextItem_ != NULL)
{
- qDebug() << "about to show the pause text";
+// qDebug() << "about to show the pause text";
pPausetextItem_->show();
- qDebug() << "showing pause text";
+// qDebug() << "showing pause text";
}
- else qDebug() << "No pause text available";
+// 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
}
}
{
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_)
}
}
+
//If the game is paused and no victory, check if menu item was selected
QList<QGraphicsItem *> items = selectedItems();
if (items.isEmpty())
{
+ pSelectLevelsetFromListItem_->hide();
pPauseAction_->setChecked(false);
+
return;
}
if (pItem == pRestartGameItem_)
{
- qDebug() << "game restart requested";
+// qDebug() << "game restart requested";
restartGame();
pPauseAction_->setChecked(false); //unpause game
else if (pItem == pRestartLevelItem_)
{
- qDebug() << "Level restart requested";
+// qDebug() << "Level restart requested";
restartLevel();
pPauseAction_->setChecked(false); //unpause game
{
qApp->quit();
}
+ else if (pItem == pChooseLevelsetItem_)
+ {
+ pPausetextItem_->hide();
+ pSelectLevelsetFromListItem_->show();
+ }
+
+ else
+ {
+ foreach (QGraphicsItem* pLevelItem, levelsetItems_)
+ {
+ if (pItem == pLevelItem)
+ {
+ QVariant variant = pLevelItem->data(0);
+
+ if (variant.canConvert<Levelset>())
+ {
+ levelset_ = variant.value<Levelset>();
+
+ QSettings settings;
+ settings.setValue("levelset",levelset_.getName());
+
+ restartGame();
+ pPauseAction_->setChecked(false); //unpause game
+ }
+ }
+ }
+ }
+
}
pRestartLevelItem_->setHtml(tr("Restart <br> level").prepend(menufonthtml));
prepareForMenu(pRestartLevelItem_);
+ pChooseLevelsetItem_ = new QGraphicsTextItem;
+ pChooseLevelsetItem_->setHtml(tr("Choose <br> levelset").prepend(menufonthtml));
+ prepareForMenu(pChooseLevelsetItem_);
+
pSettingsItem_ = new QGraphicsTextItem;
- QString vibraText(tr("Vibration <br> effects "));
+ QString vibraText(tr("Turn vibration <br> effects "));
QString statusText;
if (pVibrateAction_->isChecked())
{
//They are also shown and hidden with it, resulting in the menu being visble when the game is paused
//Their coordinates are given relative to the parent.
+ int itemsPerRow = 4;
-
- int itemsPerRow = 3;
-
pItem->setParentItem(pPausetextItem_);
pItem->setZValue(1000);
pItem->setFlag(QGraphicsItem::ItemIsSelectable);
int row = menuItemCount_/(itemsPerRow);
pItem->setY(150+row*120);
- pItem->setX(((menuItemCount_%(itemsPerRow))*180+5));
+ pItem->setX(((menuItemCount_%(itemsPerRow))*180-125));
menuItemCount_++;
+
}
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
+
+
}
void SeaScene::nextLevel()
{
- currentLevel_++;
+ //get score for previous level
+ levelScore_ += scoreCounter_.elapsed();
+ totalScore_ += levelScore_;
+ int highscore = levelset_.getLevelHighScore(currentLevel_);
- if (levelList_.empty())
- setupMap(Level());
+ //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").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<br>the new best time!").arg(levelScore_/1000).arg((levelScore_%1000)/100);
+ levelset_.setLevelHighScore(currentLevel_,levelScore_);
+ }
- pPauseAction_->setChecked(true); //Pause the game while showing the victory dialog
+ //pause to show the highscore or victory screen
- pPausetextItem_->hide();
+ turnPauseOn();
+ pPausetextItem_->hide();
- pVictoryCongratulationsItem_->show();
+ //Go to the next level if available
+ currentLevel_++;
+
+ if ( currentLevel_ < levelset_.numberOfLevels() )
+ {
+
+ pLevelCompletedItem_->setHtml(scoretext);
+ pLevelCompletedItem_->show();
+// restartLevel();
+ }
+
+ else //Victory!
+ {
+ int totalHighsore = levelset_.getTotalHighScore();
+ if (totalScore_ >= totalHighsore)
+ {
+ scoretext.append(tr("<br>Your total time: %1.%2 s<br>Best total time:%3.%4 s").arg(totalScore_/1000).arg((totalScore_%1000)/100).arg(totalHighsore/1000).arg((totalHighsore%1000)/100));
+ }
+ else //new total high score
+ {
+ scoretext.append(tr("<br>Your total time %1.%2 s is<br>the new best time").arg(totalScore_/1000).arg((totalScore_%1000)/100));
+ levelset_.setTotalHighScore(totalScore_);
+ }
+
+ pVictoryScoreItem_->setHtml(scoretext);
+ pVictoryCongratulationsItem_->show();
}
}
void SeaScene::restartGame()
{
currentLevel_ = 0;
+ totalScore_ = 0;
restartLevel();
}
pVictoryCongratulationsItem_ = new QGraphicsTextItem;
pVictoryCongratulationsItem_->setHtml("<font size=\"6\" color = darkorange> Victory!");
pVictoryCongratulationsItem_->hide();
- pVictoryCongratulationsItem_->setPos(300,50);
+ pVictoryCongratulationsItem_->setPos(315,30);
pVictoryCongratulationsItem_->setZValue(1000);
addItem(pVictoryCongratulationsItem_);
-// QGraphicsPixmapItem * pImageItem = new QGraphicsPixmapItem(QPixmap(":/pix/aavesaari.png"),pVictoryCongratulationsItem_);
-// pImageItem->setPos(-100,150);
-// pImageItem->setZValue(1000);
-// pImageItem->setScale(2.0);
+ //coordinates are relative to the parent
QGraphicsTextItem * pTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_);
- pTextItem->setHtml("<center> <font size=\"5\" color = darkorange> Congratulations! <br> You have saved all the ghosts."
- "<br><br> Tap to play again ");
- pTextItem->setPos(-50,100);
+ pTextItem->setHtml("<font size=\"5\" color = darkorange> Congratulations!");
+ pTextItem->setPos(-50,80);
pTextItem->setZValue(1000);
+
+ QGraphicsTextItem * pMiddleTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_);
+ pMiddleTextItem->setHtml("<font size=\"5\" color = darkorange> You have saved all the ghosts.");
+ pMiddleTextItem->setPos(-145,120);
+ pMiddleTextItem->setZValue(1000);
+
+
+ pVictoryScoreItem_ = new QGraphicsTextItem(pVictoryCongratulationsItem_);
+ pVictoryScoreItem_->setPos(-50,180);
+ pMiddleTextItem->setZValue(1000);
+ //Text is set at usetime!
+
+ QGraphicsTextItem * pLowestTextItem = new QGraphicsTextItem(pVictoryCongratulationsItem_);
+ pLowestTextItem->setHtml("<font size=\"5\" color = darkorange> Tap to play again");
+ pLowestTextItem->setPos(-50,360);
+ pLowestTextItem->setZValue(1000);
}
void SeaScene::createAboutBoxItems()
"%1 <br> <font size = \"5\"> Version %2"
"<p><font size = \"4\"> Copyright 2011 Heli Hyvättinen"
"<p><font size = \"4\"> License: General Public License v2"
- "<p><font size = \"3\"> Bug Reports: <br> https://bugs.maemo.org/ "
+ "<p><font size = \"3\"> Web: http://ghostsoverboard.garage.maemo.org/<br>"
+ "Bug Reports: <br> https://bugs.maemo.org/"
"enter_bug.cgi?product=Ghosts%20Overboard"
).arg(QApplication::applicationName(),QApplication::applicationVersion()));
pAboutItem_ = NULL;
pQuitItem_ = NULL ;
pMinimizeItem_ = NULL;
+ pChooseLevelsetItem_ = NULL;
pAboutBoxItem_ = NULL;
pVictoryCongratulationsItem_ = NULL;
+ pLevelCompletedItem_ = NULL;
+ pVictoryCongratulationsItem_ = NULL;
+ pVictoryScoreItem_ = 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::createLevelCompletedItems()
+{
+ pLevelCompletedItem_ = new QGraphicsTextItem;
+ addItem(pLevelCompletedItem_);
+ pLevelCompletedItem_->setPos(240,100);
+ pLevelCompletedItem_->setZValue(1000);
+ pLevelCompletedItem_->hide();
+ //The text is set at usetime
+
+ QGraphicsTextItem * pTapForNextLevelItem = new QGraphicsTextItem(pLevelCompletedItem_);
+ pTapForNextLevelItem->setPos(-60,100);
+ pTapForNextLevelItem->setZValue(1000);
+ pTapForNextLevelItem->setHtml("<font size=\"5\" color = darkorange>Tap to start the next level");
+
+}
+void SeaScene::createSelectLevelsetFromListItems()
+{
+ if (availableLevelsets_.isEmpty()) //Something is badly wrong in code if this is true...
+ return;
+
+
+ pSelectLevelsetFromListItem_ = new QGraphicsTextItem;
+ addItem(pSelectLevelsetFromListItem_);
+ pSelectLevelsetFromListItem_->setPos(260,60);
+ pSelectLevelsetFromListItem_->setZValue(1000);
+ pSelectLevelsetFromListItem_->hide();
+
+ QString fontstring ("<font color = darkorange size = \"5\">");
+
+ pSelectLevelsetFromListItem_->setHtml(tr("Choose a levelset").prepend(fontstring));
+
+ int yPos = 100;
+
+ levelsetItems_.clear();
+
+
+ foreach (Levelset set, availableLevelsets_)
+ {
+ QGraphicsTextItem * pItem = new QGraphicsTextItem(pSelectLevelsetFromListItem_);
+ QString text (fontstring);
+ if (levelset_.getName() == set.getName())
+ text.append("<b>");
+ text.append(set.getName());
+ pItem->setHtml(text);
+ pItem->setPos(65,yPos);
+ yPos+=80;
+ pItem->setZValue(1000);
+ pItem->setFlag(QGraphicsItem::ItemIsSelectable);
+ pItem->setData(0,QVariant::fromValue(set));
+ levelsetItems_.append(pItem);
+
+ }
+
+ }