static std::vector<LevelSubset*> contrib_subsets;
static LevelSubset* current_contrib_subset = 0;
+static int first_level_index;
static std::set<std::string> worldmap_list;
-static LevelEditor* leveleditor;
+static FrameRate frame_rate(100);
+
+/* If the demo was stopped - because game started, level
+ editor was excuted, etc - call this when you get back
+ to the title code.
+ */
+void resume_demo()
+{
+ // FIXME: shouldn't be needed if GameSession
+ // didn't relay on global variables
+ titlesession->get_current_sector()->activate();
+ titlesession->set_current();
+
+ frame_rate.update();
+}
void update_load_save_game_menu(Menu* pmenu)
{
contrib_menu->additem(MN_LABEL,_("Contrib Levels"),0,0);
contrib_menu->additem(MN_HL,"",0,0);
int i = 0;
- for (std::set<std::string>::iterator it = level_subsets.begin(); it != level_subsets.end(); ++it)
- {
- LevelSubset* subset = new LevelSubset();
- subset->load(*it);
- contrib_menu->additem(MN_GOTO, subset->title, 0, contrib_subset_menu, i);
- contrib_subsets.push_back(subset);
- ++i;
- }
- i = level_subsets.size();
for(std::set<std::string>::iterator it = worldmap_list.begin(); it != worldmap_list.end(); ++it)
{
WorldMapNS::WorldMap worldmap;
}
contrib_menu->additem(MN_HL,"",0,0);
+
+ first_level_index = i;
+ for (std::set<std::string>::iterator it = level_subsets.begin(); it != level_subsets.end(); ++it)
+ {
+ LevelSubset* subset = new LevelSubset();
+ subset->load(*it);
+ 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;
+ }
+
+ contrib_menu->additem(MN_HL,"",0,0);
contrib_menu->additem(MN_BACK,_("Back"),0,0);
level_subsets.clear();
if (index == -1)
return;
- if (index < (int)contrib_subsets.size())
+ if((unsigned)index < worldmap_list.size())
+ {
+ WorldMapNS::WorldMap worldmap;
+ std::set<std::string>::iterator it = worldmap_list.begin();
+ for(int i = index; i > 0; --i)
+ ++it;
+
+ std::string map_filename = *it;
+
+ // 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);
+
+ // TODO: slots should be available for contrib maps
+ worldmap.loadgame(st_save_dir + "/" + map_filename + "-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;
/** get level's title */
std::string level_title = "<no title>";
- LispReader* reader = LispReader::load(subset.get_level_filename(i), "supertux-level");
+ 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";
- return;
+ continue;
}
reader->read_string("name", level_title, true);
titlesession->set_current();
}
}
- else if((unsigned)index < worldmap_list.size() + (int)contrib_subsets.size())
- {
- WorldMapNS::WorldMap worldmap;
- std::set<std::string>::iterator it = worldmap_list.begin();
- for(int i = index - contrib_subsets.size(); i > 0; --i)
- ++it;
-
- std::string map_filename = *it;
-
- 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);
-
- // TODO: slots should be available for contrib maps
- worldmap.loadgame(st_save_dir + "/" + map_filename + "-slot1.stsg");
-
- worldmap.display(); // run the map
-
- Menu::set_current(main_menu);
- }
}
void check_contrib_subset_menu()
session.run();
player_status.reset();
Menu::set_current(main_menu);
- titlesession->get_current_sector()->activate();
- titlesession->set_current();
+ resume_demo();
}
}
}
/* --- TITLE SCREEN --- */
void title(void)
{
- random_timer.init(true);
-
walking = true;
+ LevelEditor* leveleditor;
+ random_timer.init(true);
Ticks::pause_init();
- titlesession = new GameSession(datadir + "/levels/misc/menu.stl", ST_GL_DEMO_GAME);
+ titlesession = new GameSession("misc/menu.stl", ST_GL_DEMO_GAME);
/* Load images: */
bkg_title = new Surface(datadir + "/images/background/arctis.jpg", false);
/* --- Main title loop: --- */
frame = 0;
- FrameRate frame_rate(100);
frame_rate.set_frame_limit(false);
random_timer.start(rand() % 2000 + 2000);
leveleditor->run();
delete leveleditor;
Menu::set_current(main_menu);
- frame_rate.update();
+ resume_demo();
break;
case MNID_CREDITS:
+ fadeout(500);
display_text_file("CREDITS", SCROLL_SPEED_CREDITS, white_big_text , white_text, white_small_text, blue_text );
+ fadeout(500);
Menu::set_current(main_menu);
break;
case MNID_QUITMAINMENU:
if(event.key.keysym.sym == SDLK_DELETE)
{
int slot = menu->get_active_item_id();
- std::stringstream stream;
- stream << slot;
+ std::stringstream stream;
+ stream << slot;
std::string str = _("Are you sure you want to delete slot") + stream.str() + "?";
if(confirm_dialog(bkg_title, str.c_str()))
update_load_save_game_menu(load_game_menu);
Menu::set_current(main_menu);
- frame_rate.update();
+ resume_demo();
}
else if (process_load_game_menu())
{
- // FIXME: shouldn't be needed if GameSession doesn't relay on global variables
- titlesession->get_current_sector()->activate();
- titlesession->set_current();
- //titletux.level_begin();
- frame_rate.update();
+ resume_demo();
}
}
else if(menu == contrib_menu)