From ba1f3cb0a625a8411fe7073e0c299fc0445bae11 Mon Sep 17 00:00:00 2001 From: Tobias Markus Date: Tue, 7 Apr 2015 22:31:39 +0200 Subject: [PATCH] Unify both calls to level title and level target time, fixes unnecessary disk I/O --- src/worldmap/worldmap.cpp | 45 ++++++++++++--------------------------- src/worldmap/worldmap.hpp | 4 ++-- 2 files changed, 16 insertions(+), 33 deletions(-) diff --git a/src/worldmap/worldmap.cpp b/src/worldmap/worldmap.cpp index 80e16392f93..64e10568ae2 100644 --- a/src/worldmap/worldmap.cpp +++ b/src/worldmap/worldmap.cpp @@ -344,35 +344,17 @@ WorldMap::load(const std::string& filename) } void -WorldMap::get_level_title(LevelTile& level) +WorldMap::load_level_information(LevelTile& level) { - /** get special_tile's title */ - level.title = ""; - - try { - lisp::Parser parser; - const lisp::Lisp* root = parser.parse(levels_path + level.get_name()); - - const lisp::Lisp* level_lisp = root->get_lisp("supertux-level"); - if(!level_lisp) - return; - - level_lisp->get("name", level.title); - } catch(std::exception& e) { - log_warning << "Problem when reading leveltitle: " << e.what() << std::endl; - return; - } -} - -void -WorldMap::get_level_target_time(LevelTile& level) -{ - if(last_position == tux->get_tile_pos()) { - level.target_time = last_target_time; + if(last_position == tux->get_tile_pos()) + { return; } - last_position = level.pos; + last_position = tux->get_tile_pos(); + /** get special_tile's title */ + level.title = ""; + level.target_time = 0.0f; try { lisp::Parser parser; @@ -382,12 +364,11 @@ WorldMap::get_level_target_time(LevelTile& level) if(!level_lisp) return; + level_lisp->get("name", level.title); level_lisp->get("target-time", level.target_time); - last_target_time = level.target_time; - } catch(std::exception& e) { - log_warning << "Problem when reading level target time: " << e.what() << std::endl; + log_warning << "Problem when reading level information: " << e.what() << std::endl; return; } } @@ -493,7 +474,9 @@ WorldMap::finished_level(Level* gamelevel) // deal with statistics level->statistics.merge(gamelevel->stats); calculate_total_stats(); - get_level_target_time(*level); + if (level->target_time == 0.0f) + load_level_information(*level); + if(level->statistics.completed(level->statistics, level->target_time)) { level->perfect = true; if(level->sprite->has_action("perfect")) @@ -846,7 +829,7 @@ WorldMap::draw_status(DrawingContext& context) if (level->pos == tux->get_tile_pos()) { if(level->title == "") - get_level_title(*level); + load_level_information(*level); context.draw_text(Resources::normal_font, level->title, Vector(SCREEN_WIDTH/2, @@ -867,7 +850,7 @@ WorldMap::draw_status(DrawingContext& context) */ if (level->target_time == 0.0f) - get_level_target_time(*level); + load_level_information(*level); level->statistics.draw_worldmap_info(context, level->target_time); break; } diff --git a/src/worldmap/worldmap.hpp b/src/worldmap/worldmap.hpp index c42e5510bd5..21df836c0d8 100644 --- a/src/worldmap/worldmap.hpp +++ b/src/worldmap/worldmap.hpp @@ -227,8 +227,7 @@ class WorldMap : public Screen void set_levels_solved(bool solved, bool perfect); private: - void get_level_title(LevelTile& level); - void get_level_target_time(LevelTile& level); + void load_level_information(LevelTile& level); void draw_status(DrawingContext& context); void calculate_total_stats(); @@ -239,6 +238,7 @@ class WorldMap : public Screen void clamp_camera_position(Vector& c); Vector last_position; float last_target_time; + std::string last_title; private: WorldMap(const WorldMap&);