X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=424b62778b94754e9ce7478cf491c3bb15868a74;hb=6e85c29076267d353d426427bdb64c0684297d01;hp=7ee5449a416201295a3d1af4caf40f0759213e71;hpb=2bfbd8758c9711db09d2f952377ceb8e50c05585;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 7ee5449a4..424b62778 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -31,6 +31,57 @@ namespace WorldMapNS { +Direction reverse_dir(Direction direction) +{ + switch(direction) + { + case WEST: + return EAST; + case EAST: + return WEST; + case NORTH: + return SOUTH; + case SOUTH: + return NORTH; + case NONE: + return NONE; + } + return NONE; +} + +std::string +direction_to_string(Direction direction) +{ + switch(direction) + { + case WEST: + return "west"; + case EAST: + return "east"; + case NORTH: + return "north"; + case SOUTH: + return "south"; + default: + return "none"; + } +} + +Direction +string_to_direction(const std::string& directory) +{ + if (directory == "west") + return WEST; + else if (directory == "east") + return EAST; + else if (directory == "north") + return NORTH; + else if (directory == "south") + return SOUTH; + else + return NONE; +} + TileManager* TileManager::instance_ = 0; TileManager::TileManager() @@ -162,13 +213,26 @@ Tux::update(float delta) if (!moving) { if (input_direction != NONE) - { // We got a new direction, so lets start walking when possible + { + WorldMap::Level* level = worldmap->at_level(); + + // We got a new direction, so lets start walking when possible Point next_tile; - if (worldmap->path_ok(input_direction, tile_pos, &next_tile)) + if ((!level || level->solved) + && worldmap->path_ok(input_direction, tile_pos, &next_tile)) { tile_pos = next_tile; moving = true; direction = input_direction; + back_direction = reverse_dir(direction); + } + else if (input_direction == back_direction) + { + std::cout << "Back triggered" << std::endl; + moving = true; + direction = input_direction; + tile_pos = worldmap->get_next_tile(tile_pos, direction); + back_direction = reverse_dir(direction); } } } @@ -187,6 +251,7 @@ Tux::update(float delta) } else { + // Walk automatically to the next tile Point next_tile; if (worldmap->path_ok(direction, tile_pos, &next_tile)) { @@ -271,6 +336,12 @@ WorldMap::load_map() Level level; LispReader reader(lisp_cdr(element)); level.solved = false; + + level.north = true; + level.east = true; + level.south = true; + level.west = true; + reader.read_string("name", &level.name); reader.read_int("x", &level.x); reader.read_int("y", &level.y); @@ -291,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; @@ -299,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 { @@ -315,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: @@ -348,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: @@ -356,7 +439,7 @@ WorldMap::get_input() } } - if (!show_menu) + if (!Menu::current()) { Uint8 *keystate = SDL_GetKeyState(NULL); @@ -432,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 { @@ -463,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; } @@ -487,20 +596,21 @@ WorldMap::at(Point p) && p.x < width && p.y >= 0 && p.y < height); + return TileManager::instance()->get(tilemap[width * p.y + p.x]); } -bool +WorldMap::Level* WorldMap::at_level() { for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) { if (i->x == tux->get_tile_pos().x && i->y == tux->get_tile_pos().y) - return true; + return &*i; } - return false; + return 0; } @@ -571,8 +681,7 @@ WorldMap::draw_status() void WorldMap::display() { - show_menu = 0; - menu_reset(); + Menu::set_current(0); quit = false; @@ -597,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); } @@ -625,7 +740,8 @@ WorldMap::savegame(const std::string& filename) << " (lives " << player_status.lives << ")\n" << " (score " << player_status.score << ")\n" << " (distros " << player_status.distros << ")\n" - << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << "))\n" + << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << ")" + << " (back \"" << direction_to_string(tux->back_direction) << "\"))\n" << " (levels\n"; for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) @@ -661,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); } @@ -684,13 +807,11 @@ WorldMap::loadgame(const std::string& filename) { std::string name; bool solved = false; - + LispReader level_reader(data); level_reader.read_string("name", &name); level_reader.read_bool("solved", &solved); - std::cout << "Name: " << name << " " << solved << std::endl; - for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) { if (name == i->name) @@ -706,4 +827,7 @@ WorldMap::loadgame(const std::string& filename) } // namespace WorldMapNS -/* EOF */ +/* Local Variables: */ +/* mode:c++ */ +/* End: */ +