// Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
#include <config.h>
-#include <iostream>
#include <fstream>
#include <sstream>
#include <cassert>
#include <SDL.h>
#include "game_session.hpp"
+#include "msg.hpp"
#include "video/screen.hpp"
#include "audio/sound_manager.hpp"
#include "gui/menu.hpp"
#include "object/tilemap.hpp"
#include "object/camera.hpp"
#include "object/player.hpp"
+#include "object/level_time.hpp"
#include "lisp/lisp.hpp"
#include "lisp/parser.hpp"
#include "resources.hpp"
currentsector = 0;
game_pause = false;
- music_playing = false;
fps_fps = 0;
context = new DrawingContext();
global_stats.reset();
global_stats.set_total_points(COINS_COLLECTED_STAT, level->get_total_coins());
global_stats.set_total_points(BADGUYS_KILLED_STAT, level->get_total_badguys());
- //global_stats.set_total_points(TIME_NEEDED_STAT, level->timelimit);
+
+ // get time
+ int time = 0;
+ for(std::vector<Sector*>::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i)
+ {
+ Sector* sec = *i;
+
+ for(std::vector<GameObject*>::iterator j = sec->gameobjects.begin();
+ j != sec->gameobjects.end(); ++j)
+ {
+ GameObject* obj = *j;
+
+ LevelTime* lt = dynamic_cast<LevelTime*> (obj);
+ if(lt)
+ time += int(lt->get_level_time());
+ }
+ }
+ global_stats.set_total_points(TIME_NEEDED_STAT, (time == 0) ? -1 : time);
if(reset_sector != "") {
currentsector = level->get_sector(reset_sector);
if(mode == ST_GL_PLAY || mode == ST_GL_LOAD_LEVEL_FILE)
levelintro();
- if (!music_playing)
- {
- currentsector->play_music(LEVEL_MUSIC);
- music_playing = true;
- }
+ currentsector->play_music(LEVEL_MUSIC);
if(capture_file != "")
record_demo(capture_file);
{
char str[60];
+ sound_manager->stop_music();
+
DrawingContext context;
for(Sector::GameObjects::iterator i = currentsector->gameobjects.begin();
i != currentsector->gameobjects.end(); ++i) {
tux.kill(tux.KILL);
}
if(main_controller->check_cheatcode("whereami")) {
- std::cout << "You are at x " << tux.get_pos().x << ", y " << tux.get_pos().y << "." << std::endl;
+ msg_info("You are at x " << tux.get_pos().x << ", y " << tux.get_pos().y);
}
#if 0
if(main_controller->check_cheatcode("grid")) {
exit_status = ES_LEVEL_FINISHED;
// don't add points to stats though...
}
+ if(main_controller->check_cheatcode("camera")) {
+ msg_info("Camera is at "
+ << Sector::current()->camera->get_translation().x << ","
+ << Sector::current()->camera->get_translation().y);
+ }
}
void
/* End of level? */
if(end_sequence && endsequence_timer.check()) {
exit_status = ES_LEVEL_FINISHED;
+
+ // add time spent to statistics
+ int tottime = 0, remtime = 0;
+ for(std::vector<Sector*>::iterator i = level->sectors.begin(); i != level->sectors.end(); ++i)
+ {
+ Sector* sec = *i;
+
+ for(std::vector<GameObject*>::iterator j = sec->gameobjects.begin();
+ j != sec->gameobjects.end(); ++j)
+ {
+ GameObject* obj = *j;
+
+ LevelTime* lt = dynamic_cast<LevelTime*> (obj);
+ if(lt)
+ {
+ tottime += int(lt->get_level_time());
+ remtime += int(lt->get_remaining_time());
+ }
+ }
+ }
+ global_stats.set_points(TIME_NEEDED_STAT, (tottime == 0 ? -1 : (tottime-remtime)));
+
return;
} else if (!end_sequence && tux->is_dead()) {
if (player_status->lives < 0) { // No more lives!?
if(newsector != "" && newspawnpoint != "") {
Sector* sector = level->get_sector(newsector);
if(sector == 0) {
- std::cerr << "Sector '" << newsector << "' not found.\n";
+ msg_warning("Sector '" << newsector << "' not found");
}
sector->activate(newspawnpoint);
sector->play_music(LEVEL_MUSIC);
return;
end_sequence = ENDSEQUENCE_RUNNING;
- endsequence_timer.start(7.0); // 7 seconds until we finish the map
+ endsequence_timer.start(level->extro_length);
last_x_pos = -1;
- sound_manager->play_music("music/leveldone.ogg", false);
- currentsector->player->invincible_timer.start(7.0);
+ sound_manager->play_music("music/" + level->extro_music, false);
+ currentsector->player->invincible_timer.start(level->extro_length);
+
+ // Stop all clocks.
+ for(std::vector<GameObject*>::iterator i = currentsector->gameobjects.begin();
+ i != currentsector->gameobjects.end(); ++i)
+ {
+ GameObject* obj = *i;
+
+ LevelTime* lt = dynamic_cast<LevelTime*> (obj);
+ if(lt)
+ lt->stop();
+ }
if(sequencename == "fireworks") {
currentsector->add_object(new Fireworks());
}
} else if(sequencename == "stoptux") {
if(!end_sequence) {
- std::cout << "WARNING: Final target reached without "
- << "an active end sequence." << std::endl;
+ msg_warning("Final target reached without "
+ << "an active end sequence");
this->start_sequence("endsequence");
}
end_sequence = ENDSEQUENCE_WAITING;
} else {
- std::cout << "Unknown sequence '" << sequencename << "'.\n";
+ msg_warning("Unknown sequence '" << sequencename << "'");
}
}