X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Ftitle.cpp;h=9afb6675b39bb9bf0f6c84c4c0ecb934d55843ef;hb=4ae84b0a937d84f50feb0494f1a61b4d6c650c89;hp=4874916c120a25063fc115489eeaa0627ca04ab2;hpb=5a542dea3c6043703683b68fcaa774f6cb0d9127;p=supertux.git diff --git a/src/title.cpp b/src/title.cpp index 4874916c1..9afb6675b 100644 --- a/src/title.cpp +++ b/src/title.cpp @@ -22,6 +22,7 @@ #include #include +#include #include #include #include @@ -36,49 +37,47 @@ #include #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 "game_session.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 "gettext.h" #include "misc.h" -#include "camera.h" +#include "textscroller.h" +#include "file_system.h" +#include "control/joystickkeyboardcontroller.h" +#include "control/codecontroller.h" +#include "main.h" static Surface* bkg_title; static Surface* logo; -static Surface* img_choose_subset; +//static Surface* img_choose_subset; static bool walking; -static Timer2 random_timer; +static Timer random_timer; static int frame; static GameSession* titlesession; +static CodeController* controller; 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); /* If the demo was stopped - because game started, level editor was excuted, etc - call this when you get back @@ -86,24 +85,21 @@ 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(); + //frame_rate.update(); } -void update_load_save_game_menu(Menu* pmenu) +void update_load_save_game_menu(Menu* menu) { - for(int i = 2; i < 7; ++i) - { - // FIXME: Insert a real savegame struct/class here instead of - // doing string vodoo - std::string tmp = slotinfo(i - 1); - pmenu->item[i].kind = MN_ACTION; - pmenu->item[i].change_text(tmp.c_str()); - } + printf("update loadsavemenu.\n"); + for(int i = 1; i < 6; ++i) { + MenuItem& item = menu->get_item_by_id(i); + item.kind = MN_ACTION; + item.change_text(slotinfo(i)); + } } void free_contrib_menu() @@ -123,41 +119,49 @@ void generate_contrib_menu() free_contrib_menu(); - contrib_menu->additem(MN_LABEL,_("Contrib Levels"),0,0); - contrib_menu->additem(MN_HL,"",0,0); + contrib_menu->add_label(_("Contrib Levels")); + contrib_menu->add_hl(); + 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_menu->add_submenu(subset->title, 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); - + contrib_menu->add_hl(); + contrib_menu->add_back(_("Back")); + 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,176 +170,125 @@ 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_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(user_dir + "/save/" + 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; + 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->add_label(subset.title); + contrib_subset_menu->add_hl(); - 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->add_entry(i, title); + } - contrib_subset_menu->additem(MN_HL,"",0,0); - contrib_subset_menu->additem(MN_BACK, _("Back"), 0, 0); + contrib_subset_menu->add_hl(); + contrib_subset_menu->add_back(_("Back")); - titlesession->get_current_sector()->activate(); - titlesession->set_current(); - } - } + titlesession->get_current_sector()->activate("main"); + titlesession->set_current(); + } } void check_contrib_subset_menu() { int index = contrib_subset_menu->check(); - if (index != -1) - { - if (contrib_subset_menu->get_item_by_id(index).kind == MN_ACTION) - { - std::cout << "Starting level: " << index << std::endl; - - GameSession session( - current_contrib_subset->get_level_filename(index), ST_GL_PLAY); - session.run(); - player_status.reset(); - Menu::set_current(main_menu); - resume_demo(); - } - } + if (index != -1) { + if (contrib_subset_menu->get_item_by_id(index).kind == MN_ACTION) { + GameSession session( + current_contrib_subset->get_level_filename(index), ST_GL_PLAY); + session.run(); + player_status.reset(); + Menu::set_current(main_menu); + resume_demo(); + } + } } void draw_demo(float elapsed_time) { - Sector* world = titlesession->get_current_sector(); - Player* tux = world->player; + static float last_tux_x_pos = -1; + static float last_tux_y_pos = -1; + Sector* sector = titlesession->get_current_sector(); + Player* tux = sector->player; - world->play_music(LEVEL_MUSIC); - - tux->key_event((SDLKey) keymap.right,DOWN); + sector->play_music(LEVEL_MUSIC); + + controller->update(); + controller->press(Controller::RIGHT); - if(random_timer.check()) { - random_timer.start(float(rand() % 3000 + 3000) / 1000.); - walking = !walking; + if(random_timer.check() || + (walking && fabsf(last_tux_x_pos - tux->get_pos().x)) < .1) { + walking = false; } else { - if(walking) - tux->key_event((SDLKey) keymap.jump,UP); - else - tux->key_event((SDLKey) keymap.jump,DOWN); + if(!walking && fabsf(tux->get_pos().y - last_tux_y_pos) < .1) { + random_timer.start(float(rand() % 3000 + 3000) / 1000.); + walking = true; + } } + if(!walking) + controller->press(Controller::JUMP); + last_tux_x_pos = tux->get_pos().x; + last_tux_y_pos = tux->get_pos().y; // 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->camera->reset(tux->get_pos()); - } - - tux->can_jump = true; - float last_tux_x_pos = tux->get_pos().x; - world->action(elapsed_time); - - - // disabled for now, since with the new jump code we easily get deadlocks - // Jump if tux stays in the same position for one loop, ie. if he is - // stuck behind a wall - if (last_tux_x_pos == tux->get_pos().x) - { - walking = false; - } + if(sector->solids->get_width() * 32 - 320 < tux->get_pos().x) { + sector->activate("main"); + sector->camera->reset(tux->get_pos()); + } - world->draw(*titlesession->context); + sector->update(elapsed_time); + sector->draw(*titlesession->context); } /* --- TITLE SCREEN --- */ -void title(void) +void title() { walking = true; - LevelEditor* leveleditor; - - Ticks::pause_init(); + //LevelEditor* leveleditor; + MusicRef credits_music; + controller = new CodeController(); 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); + logo = new Surface(datadir + "/images/engine/menu/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(); + Player* player = titlesession->get_current_sector()->player; + player->set_controller(controller); + /* --- Main title loop: --- */ frame = 0; @@ -345,7 +298,8 @@ void title(void) Menu::set_current(main_menu); DrawingContext& context = *titlesession->context; - while (Menu::current()) + bool running = true; + while (running) { // Calculate the movement-factor Uint32 ticks = SDL_GetTicks(); @@ -361,39 +315,40 @@ void title(void) elapsed_time /= 2; SDL_Event event; - while (SDL_PollEvent(&event)) - { - if (Menu::current()) - { - Menu::current()->event(event); - } - // FIXME: QUIT signal should be handled more generic, not locally - if (event.type == SDL_QUIT) - Menu::set_current(0); + main_controller->update(); + while (SDL_PollEvent(&event)) { + if (Menu::current()) { + Menu::current()->event(event); } + main_controller->process_event(event); + if (event.type == SDL_QUIT) + throw std::runtime_error("Received window close"); + } /* Draw the background: */ draw_demo(elapsed_time); - - + 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) 2005 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(); if(menu) { menu->draw(context); - menu->action(); + menu->update(); if(menu == main_menu) { @@ -405,24 +360,29 @@ void title(void) break; case MNID_LEVELS_CONTRIB: // Contrib Menu - puts("Entering contrib menu"); generate_contrib_menu(); break; - case MNID_LEVELEDITOR: - leveleditor = new LevelEditor(); +#if 0 + case MNID_LEVELEDITOR: { + LevelEdtiro* leveleditor = new LevelEditor(); leveleditor->run(); delete leveleditor; Menu::set_current(main_menu); resume_demo(); break; + } +#endif 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 = sound_manager->load_music( + get_resource_filename("/music/credits.ogg")); + sound_manager->play_music(credits_music); + display_text_file("credits.txt"); fadeout(500); Menu::set_current(main_menu); break; case MNID_QUITMAINMENU: - Menu::set_current(0); + running = false; break; } } @@ -441,7 +401,7 @@ void title(void) if(confirm_dialog(bkg_title, str.c_str())) { - str = st_save_dir + "/slot" + stream.str() + ".stsg"; + str = user_dir + "/save/slot" + stream.str() + ".stsg"; printf("Removing: %s\n",str.c_str()); remove(str.c_str()); } @@ -465,11 +425,15 @@ void title(void) } } - mouse_cursor->draw(context); - + // reopen menu of user closed it (so that the app doesn't close when user + // accidently hit ESC) + if(Menu::current() == 0) { + Menu::set_current(main_menu); + } + context.do_drawing(); - frame_rate.update(); + //frame_rate.update(); /* Pause: */ frame++; @@ -477,10 +441,8 @@ void title(void) /* Free surfaces: */ free_contrib_menu(); - worldmap_list.clear(); delete titlesession; delete bkg_title; delete logo; - delete img_choose_subset; + //delete img_choose_subset; } -