X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=424b62778b94754e9ce7478cf491c3bb15868a74;hb=6e85c29076267d353d426427bdb64c0684297d01;hp=f96b1048c39e2f72967caeb1d15aa2b4ff1cd59d;hpb=531fe244e8ff6304a223aa50058ebdae8e899660;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index f96b1048c..424b62778 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -362,6 +362,17 @@ WorldMap::load_map() } void +WorldMap::on_escape_press() +{ + std::cout << "on escape press" << std::endl; + + if(!Menu::current()) + Menu::set_current(worldmap_menu); + else + Menu::set_current(0); +} + +void WorldMap::get_input() { enter_level = false; @@ -370,9 +381,9 @@ WorldMap::get_input() SDL_Event event; while (SDL_PollEvent(&event)) { - if(show_menu) + if (Menu::current()) { - current_menu->event(event); + Menu::current()->event(event); } else { @@ -386,8 +397,7 @@ WorldMap::get_input() switch(event.key.keysym.sym) { case SDLK_ESCAPE: - Menu::set_current(worldmap_menu); - show_menu = !show_menu; + on_escape_press(); break; case SDLK_LCTRL: case SDLK_RETURN: @@ -419,6 +429,8 @@ WorldMap::get_input() case SDL_JOYBUTTONDOWN: if (event.jbutton.button == JOY_B) enter_level = true; + else if (event.jbutton.button == JOY_START) + on_escape_press(); break; default: @@ -427,7 +439,7 @@ WorldMap::get_input() } } - if (!show_menu) + if (!Menu::current()) { Uint8 *keystate = SDL_GetKeyState(NULL); @@ -503,30 +515,52 @@ WorldMap::update() { if (enter_level && !tux->is_moving()) { - for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) + Level* level = at_level(); + if (level) { - if (i->x == tux->get_tile_pos().x && - i->y == tux->get_tile_pos().y) + if (level->x == tux->get_tile_pos().x && + level->y == tux->get_tile_pos().y) { - std::cout << "Enter the current level: " << i->name << std::endl;; + std::cout << "Enter the current level: " << level->name << std::endl;; halt_music(); - GameSession session(datadir + "levels/" + i->name, + + GameSession session(datadir + "levels/" + level->name, 1, ST_GL_LOAD_LEVEL_FILE); - session.run(); - if (1) // FIXME: insert exit status checker here - i->solved = true; + switch (session.run()) + { + case GameSession::LEVEL_FINISHED: + level->solved = true; + break; + case GameSession::LEVEL_ABORT: + // Reseting the player_status might be a worthy + // consideration, but I don't think we need it + // 'cause only the bad players will use it to + // 'cheat' a few items and that isn't necesarry a + // bad thing (ie. better they continue that way, + // then stop playing the game all together since it + // is to hard) + break; + case GameSession::GAME_OVER: + quit = true; + break; + case GameSession::NONE: + // Should never be reached + break; + } play_music(song, 1); - show_menu = 0; - menu_reset(); + Menu::set_current(0); if (!savegame_file.empty()) savegame(savegame_file); return; } } - std::cout << "Nothing to enter at: " - << tux->get_tile_pos().x << ", " << tux->get_tile_pos().y << std::endl; + else + { + std::cout << "Nothing to enter at: " + << tux->get_tile_pos().x << ", " << tux->get_tile_pos().y << std::endl; + } } else { @@ -534,16 +568,20 @@ WorldMap::update() tux->update(0.33f); } - if(show_menu) + if(Menu::current()) { - if(current_menu == worldmap_menu) + if(Menu::current() == worldmap_menu) { switch (worldmap_menu->check()) { case 2: // Return to game - menu_reset(); break; - case 5: // Quit Worldmap + case 3: + if (!savegame_file.empty()) + savegame(savegame_file); + break; + + case 6: // Quit Worldmap quit = true; break; } @@ -643,8 +681,7 @@ WorldMap::draw_status() void WorldMap::display() { - show_menu = 0; - menu_reset(); + Menu::set_current(0); quit = false; @@ -669,12 +706,18 @@ WorldMap::display() get_input(); update(); - menu_process_current(); + if(Menu::current()) + { + Menu::current()->action(); + Menu::current()->draw(); + mouse_cursor->draw(); + } flipscreen(); SDL_Delay(20); } + halt_music(); free_music(song); } @@ -734,14 +777,21 @@ WorldMap::loadgame(const std::string& filename) reader.read_int("score", &player_status.score); reader.read_int("distros", &player_status.distros); + if (player_status.lives < 0) + player_status.lives = 3; + lisp_object_t* tux_cur = 0; if (reader.read_lisp("tux", &tux_cur)) { Point p; + std::string back_str = "none"; + LispReader tux_reader(tux_cur); tux_reader.read_int("x", &p.x); tux_reader.read_int("y", &p.y); - + tux_reader.read_string("back", &back_str); + + tux->back_direction = string_to_direction(back_str); tux->set_tile_pos(p); } @@ -757,16 +807,10 @@ WorldMap::loadgame(const std::string& filename) { std::string name; bool solved = false; - std::string back_str =""; - Direction back = NONE; LispReader level_reader(data); level_reader.read_string("name", &name); level_reader.read_bool("solved", &solved); - if (level_reader.read_string("back", &back_str)) - back = string_to_direction(back_str); - - std::cout << "Name: " << name << " " << solved << std::endl; for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) { @@ -783,4 +827,7 @@ WorldMap::loadgame(const std::string& filename) } // namespace WorldMapNS -/* EOF */ +/* Local Variables: */ +/* mode:c++ */ +/* End: */ +