added par time to levels

main
Martin Felis 2011-03-30 10:45:22 +02:00
parent 48bf4a4a62
commit 4b63d0beba
4 changed files with 95 additions and 7 deletions

View File

@ -37,7 +37,6 @@ int Model::OnInit (int argc, char* argv[]) {
/// \TODO use <optional> or similar for initialization of mCurrentLevelIndex /// \TODO use <optional> or similar for initialization of mCurrentLevelIndex
mCurrentLevelIndex = 99999; mCurrentLevelIndex = 99999;
mLevelName = "";
if (InitLevelList() == 0) if (InitLevelList() == 0)
Engine::LogError ("No levels found!"); Engine::LogError ("No levels found!");
@ -55,6 +54,8 @@ int Model::OnInit (int argc, char* argv[]) {
mLevelAuthor = ""; mLevelAuthor = "";
mLevelTitle = ""; mLevelTitle = "";
mLevelName = "";
mLevelParTimeSeconds = -1.f;
// initialize SDL_net to be able to retrieve highscore from the internet // initialize SDL_net to be able to retrieve highscore from the internet
if (SDLNet_Init() == -1) { if (SDLNet_Init() == -1) {
@ -104,6 +105,11 @@ bool Model::OnReceiveEvent (const Engine::EventBasePtr &event) {
void Model::Process () { void Model::Process () {
if (mLastGameState == mGameState) { if (mLastGameState == mGameState) {
if (mGameState == GameStateRunning) { if (mGameState == GameStateRunning) {
// Only if we are still controlling the ship we increase the level
// timer
if (Engine::GetPlayerEntityId() != Engine::NullEntityId)
mLevelTimeSeconds += Engine::GetFrameDuration();
Engine::ModelBase::Process(); Engine::ModelBase::Process();
} }
return; return;
@ -496,6 +502,9 @@ int Model::DoLoadLevel (const char* filename) {
int entity_count = 0; int entity_count = 0;
SetLevelTitle (""); SetLevelTitle ("");
SetLevelAuthor (""); SetLevelAuthor ("");
mLevelTimeSeconds = 0.f;
mLevelParTimeSeconds = -1.f;
mLevelPoints = 0;
while (level_file >> entity_type_str) { while (level_file >> entity_type_str) {
if (entity_type_str[0] == '#') { if (entity_type_str[0] == '#') {
@ -516,8 +525,23 @@ int Model::DoLoadLevel (const char* filename) {
level_author = strip_whitespaces (level_author); level_author = strip_whitespaces (level_author);
SetLevelAuthor (level_author); SetLevelAuthor (level_author);
continue; continue;
} else if (entity_type_str == "ParTime") {
std::string partime_string;
getline (level_file, partime_string);
partime_string = strip_whitespaces (partime_string);
std::stringstream partime_stream (partime_string);
float partime = -1.;
partime_stream >> partime;
if (partime > 0.)
mLevelParTimeSeconds = partime;
continue;
} }
GameEntityType entity_type = GameEntityTypeUnknown; GameEntityType entity_type = GameEntityTypeUnknown;
if (entity_type_str == "GameEntityTypeShip") if (entity_type_str == "GameEntityTypeShip")
@ -556,6 +580,11 @@ int Model::DoLoadLevel (const char* filename) {
entity_count ++; entity_count ++;
} }
if (mLevelParTimeSeconds == -1.f) {
Engine::LogWarning ("Level %s has no par time set. Setting to 120s.", filename);
mLevelParTimeSeconds = 120.f;
}
level_file.close(); level_file.close();
Engine::LogDebug ("%d Entities loaded!", mEntities.size()); Engine::LogDebug ("%d Entities loaded!", mEntities.size());
@ -660,6 +689,7 @@ void Model::OnNewGame() {
mPlayerLives = 3; mPlayerLives = 3;
mCurrentLevelIndex = 0; mCurrentLevelIndex = 0;
mPoints = 0; mPoints = 0;
mLevelPoints = 0;
DoLoadLevel (mLevelList[mCurrentLevelIndex].c_str()); DoLoadLevel (mLevelList[mCurrentLevelIndex].c_str());
} }
@ -697,8 +727,9 @@ void Model::OnKillEntity (const Engine::EntityBase *entity) {
unsigned int i; unsigned int i;
const AsteroidEntity *asteroid = static_cast<const AsteroidEntity*>(entity); const AsteroidEntity *asteroid = static_cast<const AsteroidEntity*>(entity);
if (GetPlayerEntityId() != Engine::NullEntityId) if (GetPlayerEntityId() != Engine::NullEntityId) {
mPoints += 150 + asteroid->mSubAsteroidsCount * 75; mLevelPoints += 150 + asteroid->mSubAsteroidsCount * 75;
}
for (i = 0; i < mAsteroids.size(); i++) { for (i = 0; i < mAsteroids.size(); i++) {
if (mAsteroids.at(i) == entity->mId) { if (mAsteroids.at(i) == entity->mId) {

View File

@ -31,6 +31,7 @@ class Model : public Engine::ModelBase {
int GetPlayerLives () { return mPlayerLives; }; int GetPlayerLives () { return mPlayerLives; };
void SetPlayerLives (int lives) { mPlayerLives = lives; }; void SetPlayerLives (int lives) { mPlayerLives = lives; };
unsigned int GetPoints () { return mPoints; }; unsigned int GetPoints () { return mPoints; };
unsigned int GetLevelPoints () { return mLevelPoints; };
std::string GetPlayerName() { return mPlayerName; }; std::string GetPlayerName() { return mPlayerName; };
void SetPlayerName(const std::string &name) { void SetPlayerName(const std::string &name) {
Engine::LogDebug("new player name: %s", name.c_str()); Engine::LogDebug("new player name: %s", name.c_str());
@ -55,6 +56,9 @@ class Model : public Engine::ModelBase {
mLevelTitle = title; mLevelTitle = title;
} }
float GetLevelTimeSeconds() { return mLevelTimeSeconds; };
float GetLevelParTimeSeconds() { return mLevelParTimeSeconds; };
/* Highscore */ /* Highscore */
struct HighscoreEntry { struct HighscoreEntry {
HighscoreEntry(): name ("unknown"), points (0) { }; HighscoreEntry(): name ("unknown"), points (0) { };
@ -99,13 +103,17 @@ class Model : public Engine::ModelBase {
int mPlayerLives; int mPlayerLives;
unsigned int mPoints; unsigned int mPoints;
unsigned int mCurrentLevelIndex; unsigned int mCurrentLevelIndex;
std::string mPlayerName; std::string mPlayerName;
std::vector<std::string> mLevelList; std::vector<std::string> mLevelList;
std::string mLevelName; std::string mLevelName;
std::string mLevelAuthor; std::string mLevelAuthor;
std::string mLevelTitle; std::string mLevelTitle;
unsigned int mLevelPoints;
float mLevelTimeSeconds;
// par time (= my run through, rounded down + 30 seconds
float mLevelParTimeSeconds;
static Engine::Variable HighscoreServerName; static Engine::Variable HighscoreServerName;
static Engine::Variable HighscoreServerPath; static Engine::Variable HighscoreServerPath;

View File

@ -480,10 +480,10 @@ void View::DrawPageTitle (const std::string& title) {
float xpos = (screen_right - width) * 0.5 - 40; float xpos = (screen_right - width) * 0.5 - 40;
float ypos = 180; float ypos = 180;
Engine::GUI::Label (4, title.c_str(), xpos - 2, ypos + 2); DrawGLString (xpos - 2, ypos + 2, title.c_str());
SelectFont("console.ttf size=46 color=#ffffff"); SelectFont("console.ttf size=46 color=#ffffff");
Engine::GUI::Label (4, title.c_str(), xpos, ypos); DrawGLString (xpos, ypos, title.c_str());
} }
void View::DrawUiMainMenu() { void View::DrawUiMainMenu() {
@ -726,11 +726,56 @@ void View::DrawUiLevelIntro() {
} }
} }
void split_time_seconds (float time_seconds, int *minutes, int *seconds) {
float current_time = roundf(time_seconds);
*minutes = static_cast<int> (floor (current_time / 60.f));
*seconds = static_cast<int> (current_time - *minutes * 60);
}
std::string time_seconds_to_string (float time_seconds) {
stringstream time_stream;
int minutes, seconds;
split_time_seconds (time_seconds, &minutes, &seconds);
time_stream << minutes << ":";
if (seconds < 10)
time_stream << "0";
time_stream << seconds;
return time_stream.str();
}
void View::DrawUiLevelComplete() { void View::DrawUiLevelComplete() {
DrawPageTitle ("Level Complete!"); DrawPageTitle ("Level Complete!");
SelectFont ("console.ttf size=23"); SelectFont ("console.ttf size=23 color=#ffffff");
stringstream temp_stream;
int minutes, seconds;
split_time_seconds (GetModel()->GetLevelTimeSeconds(), &minutes, &seconds);
int level_time_xpos, level_time_ypos;
temp_stream << "Your time: " << time_seconds_to_string (GetModel()->GetLevelTimeSeconds());
level_time_xpos = (screen_right - screen_left) * 0.5 - 120;
level_time_ypos = 250;
Engine::GUI::Label (1, temp_stream.str().c_str(),
level_time_xpos, level_time_ypos + 3
);
temp_stream.str("");
temp_stream << "PAR time: " << time_seconds_to_string (GetModel()->GetLevelParTimeSeconds());
level_time_xpos = (screen_right - screen_left) * 0.5 - 120;
level_time_ypos += 32;
Engine::GUI::Label (1, temp_stream.str().c_str(),
level_time_xpos, level_time_ypos + 3
);
if(Engine::GUI::Button (1, "Next level ...", (screen_right - button_width) * 0.5, screen_bottom * 0.5 + 60, button_width, button_height)) { if(Engine::GUI::Button (1, "Next level ...", (screen_right - button_width) * 0.5, screen_bottom * 0.5 + 60, button_width, button_height)) {
PopViewState(); PopViewState();
// we have to take care when we are testing the level to not proceed to // we have to take care when we are testing the level to not proceed to

View File

@ -128,6 +128,10 @@ void Label (int id, const char* caption, int x, int y) {
assert (view); assert (view);
view->DrawGLStringMeasure(caption, &width, &height); view->DrawGLStringMeasure(caption, &width, &height);
SelectFont("console.ttf size=23 color=#808080");
view->DrawGLString(x - 1 , y + height * 0.5 + 1, caption);
SelectFont("console.ttf size=23 color=#ffffff");
view->DrawGLString(x , y + height * 0.5, caption); view->DrawGLString(x , y + height * 0.5, caption);
} }
} }