#include <ctype.h>
#endif
-#include "defines.h"
#include "app/globals.h"
#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 "player_status.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"
+#include "textscroller.h"
static Surface* bkg_title;
static Surface* logo;
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 FrameRate frame_rate(100);
*/
void resume_demo()
{
- // FIXME: shouldn't be needed if GameSession
- // didn't relay on global variables
- titlesession->get_current_sector()->activate();
+ player_status.reset();
+ titlesession->get_current_sector()->activate("main");
titlesession->set_current();
frame_rate.update();
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 = 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<std::string>::iterator it = level_subsets.begin(); it != level_subsets.end(); ++it)
+ 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)
- {
+ 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;
level_subsets.clear();
}
+std::string get_level_name(const std::string& filename)
+{
+ try {
+ lisp::Parser parser;
+ std::auto_ptr<lisp::Lisp> 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;
if (index == -1)
return;
- if((unsigned)index < worldmap_list.size())
- {
+ LevelSubset& subset = * (contrib_subsets[index]);
+
+ if(subset.has_worldmap) {
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;
+ 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_WIDTH/2, SCREEN_HEIGHT/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]);
+ } else if (current_subset != index) {
+ current_subset = index;
+ // FIXME: This shouln't be busy looping
+ LevelSubset& subset = * (contrib_subsets[index]);
- current_contrib_subset = ⊂
+ current_contrib_subset = ⊂
- contrib_subset_menu->clear();
+ contrib_subset_menu->clear();
- contrib_subset_menu->additem(MN_LABEL, subset.title, 0,0);
- contrib_subset_menu->additem(MN_HL,"",0,0);
+ contrib_subset_menu->additem(MN_LABEL, subset.title, 0,0);
+ contrib_subset_menu->additem(MN_HL,"",0,0);
- for (int i = 0; i < subset.get_num_levels(); ++i)
- {
- /** get level's title */
- std::string level_title = "<no title>";
-
- 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("main");
+ titlesession->set_current();
+ }
}
void check_contrib_subset_menu()
world->play_music(LEVEL_MUSIC);
- tux->key_event((SDLKey) keymap.right,DOWN);
+ tux->key_event((SDLKey) keymap.right, true);
if(random_timer.check()) {
random_timer.start(float(rand() % 3000 + 3000) / 1000.);
walking = !walking;
} else {
if(walking)
- tux->key_event((SDLKey) keymap.jump,UP);
+ tux->key_event((SDLKey) keymap.jump, false);
else
- tux->key_event((SDLKey) keymap.jump,DOWN);
+ tux->key_event((SDLKey) keymap.jump, true);
}
// Wrap around at the end of the level back to the beginnig
if(world->solids->get_width() * 32 - 320 < tux->get_pos().x)
{
- tux->level_begin();
+ world->activate("main");
world->camera->reset(tux->get_pos());
}
{
walking = true;
LevelEditor* leveleditor;
+ MusicRef credits_music;
Ticks::pause_init();
- titlesession = new GameSession("misc/menu.stl", ST_GL_DEMO_GAME);
+ titlesession = new GameSession(get_resource_filename("levels/misc/menu.stl"),
+ ST_GL_DEMO_GAME);
/* Load images: */
bkg_title = new Surface(datadir + "/images/background/arctis.jpg", false);
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->get_current_sector()->activate("main");
titlesession->set_current();
/* --- Main title loop: --- */
if (Menu::current() == main_menu)
- context.draw_surface(logo, Vector(screen->w/2 - logo->w/2, 30),
+ context.draw_surface(logo, Vector(SCREEN_WIDTH/2 - logo->w/2, 30),
LAYER_FOREGROUND1+1);
context.draw_text(white_small_text, " SuperTux " PACKAGE_VERSION "\n",
- Vector(0, screen->h - 70), LEFT_ALLIGN, LAYER_FOREGROUND1);
+ Vector(0, SCREEN_HEIGHT - 50), 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 are welcome to\n"
+"redistribute it under certain conditions; see the file COPYING for details.\n"
+ ),
+ Vector(0, SCREEN_HEIGHT - 50 + white_small_text->get_height() + 5),
+ LEFT_ALLIGN, LAYER_FOREGROUND1);
/* Don't draw menu, if quit is true */
Menu* menu = Menu::current();
break;
case MNID_CREDITS:
fadeout(500);
- display_text_file("credits.txt", SCROLL_SPEED_CREDITS, white_big_text , white_text, white_small_text, blue_text );
+ credits_music = SoundManager::get()->load_music(datadir + "/music/credits.ogg");
+ SoundManager::get()->play_music(credits_music);
+ display_text_file("credits.txt");
fadeout(500);
Menu::set_current(main_menu);
break;
/* Free surfaces: */
free_contrib_menu();
- worldmap_list.clear();
delete titlesession;
delete bkg_title;
delete logo;
delete img_choose_subset;
}
-
-// EOF //
-