X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Ftitle.cpp;h=12f1c255b48a0a1e9c08fcde09b3ba26c5fc6203;hb=b51665e5a1fdd19972691cfe1c33f108ad97e727;hp=4874916c120a25063fc115489eeaa0627ca04ab2;hpb=5a542dea3c6043703683b68fcaa774f6cb0d9127;p=supertux.git diff --git a/src/title.cpp b/src/title.cpp index 4874916c1..12f1c255b 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -41,25 +41,26 @@ #include "title.h" #include "video/screen.h" #include "video/surface.h" -#include "high_scores.h" #include "gui/menu.h" #include "timer.h" #include "special/frame_rate.h" #include "app/setup.h" +#include "lisp/lisp.h" +#include "lisp/parser.h" #include "level.h" #include "level_subset.h" #include "gameloop.h" #include "worldmap.h" #include "leveleditor.h" #include "scene.h" -#include "player.h" #include "tile.h" #include "sector.h" -#include "tilemap.h" +#include "object/tilemap.h" +#include "object/camera.h" +#include "object/player.h" #include "resources.h" #include "app/gettext.h" #include "misc.h" -#include "camera.h" static Surface* bkg_title; static Surface* logo; @@ -74,9 +75,6 @@ static GameSession* titlesession; static std::vector contrib_subsets; static LevelSubset* current_contrib_subset = 0; -static int first_level_index; - -static std::set worldmap_list; static FrameRate frame_rate(100); @@ -125,28 +123,17 @@ void generate_contrib_menu() contrib_menu->additem(MN_LABEL,_("Contrib Levels"),0,0); contrib_menu->additem(MN_HL,"",0,0); + int i = 0; - - for(std::set::iterator it = worldmap_list.begin(); it != worldmap_list.end(); ++it) - { - WorldMapNS::WorldMap worldmap; - worldmap.loadmap((*it).c_str()); - contrib_menu->additem(MN_ACTION, worldmap.get_world_title(),0,0, i); - ++i; - } - - contrib_menu->additem(MN_HL,"",0,0); - - first_level_index = i; - for (std::set::iterator it = level_subsets.begin(); it != level_subsets.end(); ++it) + for (std::set::iterator it = level_subsets.begin(); + it != level_subsets.end(); ++it) { LevelSubset* subset = new LevelSubset(); subset->load(*it); - if(subset->hide_from_contribs) - { + if(subset->hide_from_contribs) { delete subset; continue; - } + } contrib_menu->additem(MN_GOTO, subset->title, 0, contrib_subset_menu, i); contrib_subsets.push_back(subset); ++i; @@ -158,6 +145,25 @@ void generate_contrib_menu() level_subsets.clear(); } +std::string get_level_name(const std::string& filename) +{ + try { + lisp::Parser parser; + std::auto_ptr root (parser.parse(filename)); + + const lisp::Lisp* level = root->get_lisp("supertux-level"); + if(!level) + return ""; + + std::string name; + level->get("name", name); + return name; + } catch(std::exception& e) { + std::cerr << "Problem getting name of '" << filename << "'.\n"; + return ""; + } +} + void check_levels_contrib_menu() { static int current_subset = -1; @@ -166,91 +172,52 @@ void check_levels_contrib_menu() if (index == -1) return; - if((unsigned)index < worldmap_list.size()) - { + LevelSubset& subset = * (contrib_subsets[index]); + + if(subset.has_worldmap) { WorldMapNS::WorldMap worldmap; - std::set::iterator it = worldmap_list.begin(); - for(int i = index; i > 0; --i) - ++it; - - std::string map_filename = *it; + worldmap.set_map_filename(subset.get_worldmap_filename()); // some fading fadeout(256); DrawingContext context; - context.draw_text(white_text, "Loading...", - Vector(screen->w/2, screen->h/2), CENTER_ALLIGN, LAYER_FOREGROUND1); - context.do_drawing(); - - worldmap.set_map_filename(map_filename); - - // hack to erase the extension - unsigned int ext_pos = it->find_last_of("."); - if(ext_pos != std::string::npos) - map_filename.erase(ext_pos, map_filename.size() - ext_pos); + context.draw_text(white_text, "Loading...", + Vector(screen->w/2, screen->h/2), CENTER_ALLIGN, LAYER_FOREGROUND1); + context.do_drawing(); // TODO: slots should be available for contrib maps - worldmap.loadgame(st_save_dir + "/" + map_filename + "-slot1.stsg"); + worldmap.loadgame(st_save_dir + "/" + subset.name + "-slot1.stsg"); worldmap.display(); // run the map Menu::set_current(main_menu); resume_demo(); - } - else if (index < (int)contrib_subsets.size() + first_level_index) - { - index -= first_level_index; - if (current_subset != index) - { - current_subset = index; - // FIXME: This shouln't be busy looping - LevelSubset& subset = * (contrib_subsets[index]); - - current_contrib_subset = ⊂ + } else if (current_subset != index) { + current_subset = index; + // FIXME: This shouln't be busy looping + LevelSubset& subset = * (contrib_subsets[index]); - contrib_subset_menu->clear(); + current_contrib_subset = ⊂ - contrib_subset_menu->additem(MN_LABEL, subset.title, 0,0); - contrib_subset_menu->additem(MN_HL,"",0,0); + contrib_subset_menu->clear(); - for (int i = 0; i < subset.get_num_levels(); ++i) - { - /** get level's title */ - std::string level_title = ""; + contrib_subset_menu->additem(MN_LABEL, subset.title, 0,0); + contrib_subset_menu->additem(MN_HL,"",0,0); - std::string filename = subset.get_level_filename(i); - std::string filepath; - filepath = st_dir + "/levels/" + filename; - if (access(filepath.c_str(), R_OK) != 0) - { - filepath = datadir + "/levels/" + filename; - if (access(filepath.c_str(), R_OK) != 0) - { - std::cerr << "Error: Level: couldn't find level: " << filename << std::endl; - continue; - } - } - - LispReader* reader = LispReader::load(filepath, "supertux-level"); - if(!reader) - { - std::cerr << "Error: Could not open level file. Ignoring...\n"; - continue; - } - - reader->read_string("name", level_title, true); - delete reader; - - contrib_subset_menu->additem(MN_ACTION, level_title, 0, 0, i); - } + for (int i = 0; i < subset.get_num_levels(); ++i) + { + /** get level's title */ + std::string filename = subset.get_level_filename(i); + std::string title = get_level_name(filename); + contrib_subset_menu->additem(MN_ACTION, title, 0, 0, i); + } - contrib_subset_menu->additem(MN_HL,"",0,0); - contrib_subset_menu->additem(MN_BACK, _("Back"), 0, 0); + contrib_subset_menu->additem(MN_HL,"",0,0); + contrib_subset_menu->additem(MN_BACK, _("Back"), 0, 0); - titlesession->get_current_sector()->activate(); - titlesession->set_current(); - } - } + titlesession->get_current_sector()->activate(); + titlesession->set_current(); + } } void check_contrib_subset_menu() @@ -330,9 +297,6 @@ void title(void) logo = new Surface(datadir + "/images/title/logo.png", true); img_choose_subset = new Surface(datadir + "/images/status/choose-level-subset.png", true); - /* Generating contrib maps by only using a string_list */ - worldmap_list = FileSystem::dfiles("levels/worldmap", "", "icyisland.stwm"); - titlesession->get_current_sector()->activate(); titlesession->set_current(); @@ -383,10 +347,14 @@ void title(void) context.draw_text(white_small_text, " SuperTux " PACKAGE_VERSION "\n", Vector(0, screen->h - 70), LEFT_ALLIGN, LAYER_FOREGROUND1); context.draw_text(white_small_text, - _("Copyright (c) 2003 SuperTux Devel Team\n" - "This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n" - "are welcome to redistribute it under certain conditions; see the file COPYING\n" - "for details.\n"), Vector(0, screen->h - 70 + white_small_text->get_height()), LEFT_ALLIGN, LAYER_FOREGROUND1); + _( +"Copyright (c) 2003 SuperTux Devel Team\n" +"This game comes with ABSOLUTELY NO WARRANTY. This is free software, and you\n" +"are welcome to redistribute it under certain conditions; see the file COPYING\n" +"for details.\n" + ), + Vector(0, screen->h - 70 + white_small_text->get_height()), + LEFT_ALLIGN, LAYER_FOREGROUND1); /* Don't draw menu, if quit is true */ Menu* menu = Menu::current(); @@ -477,7 +445,6 @@ void title(void) /* Free surfaces: */ free_contrib_menu(); - worldmap_list.clear(); delete titlesession; delete bkg_title; delete logo;