X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.cpp;h=85eb56ec8f38e2798a9de1aadd730d18e1c9fadc;hb=b56d18cd12b1892a7588b1fe620b1df26f7e7d4f;hp=8c7e3fa3342e8ffec3e55361af4fa8c625e8a87f;hpb=eb4ce0c7020f9fd57c4434eb3b173041ef91f591;p=supertux.git diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 8c7e3fa33..85eb56ec8 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); } } } @@ -181,12 +245,13 @@ Tux::update(float delta) { // We reached the next tile, so we check what to do now offset -= 32; - if (worldmap->at(tile_pos)->stop) + if (worldmap->at(tile_pos)->stop || worldmap->at_level()) { stop(); } 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); @@ -299,11 +370,11 @@ WorldMap::get_input() SDL_Event event; while (SDL_PollEvent(&event)) { - if(show_menu) - { - current_menu->event(event); - } - else + if(!show_menu && event.key.keysym.sym == SDLK_ESCAPE) + Menu::set_current(worldmap_menu); + + current_menu->event(event); + if(!show_menu) { switch(event.type) { @@ -314,10 +385,6 @@ WorldMap::get_input() case SDL_KEYDOWN: switch(event.key.keysym.sym) { - case SDLK_ESCAPE: - Menu::set_current(worldmap_menu); - show_menu = !show_menu; - break; case SDLK_LCTRL: case SDLK_RETURN: enter_level = true; @@ -487,9 +554,24 @@ WorldMap::at(Point p) && p.x < width && p.y >= 0 && p.y < height); + return TileManager::instance()->get(tilemap[width * p.y + p.x]); } +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 &*i; + } + + return 0; +} + + void WorldMap::draw(const Point& offset) { @@ -503,8 +585,12 @@ WorldMap::draw(const Point& offset) for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) { - leveldot_green->draw(i->x*32 + offset.x, - i->y*32 + offset.y); + if (i->solved) + leveldot_green->draw(i->x*32 + offset.x, + i->y*32 + offset.y); + else + leveldot_red->draw(i->x*32 + offset.x, + i->y*32 + offset.y); } tux->draw(offset); @@ -553,8 +639,7 @@ WorldMap::draw_status() void WorldMap::display() { - show_menu = 0; - menu_reset(); + show_menu = false; quit = false; @@ -579,7 +664,11 @@ WorldMap::display() get_input(); update(); - menu_process_current(); + if(show_menu) + { + menu_process_current(); + mouse_cursor->draw(); + } flipscreen(); SDL_Delay(20); @@ -607,7 +696,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) @@ -659,16 +749,29 @@ WorldMap::loadgame(const std::string& filename) { while(level_cur) { - std::string name; - bool solved = false; - LispReader level_reader(level_cur); - level_reader.read_string("name", &name); - level_reader.read_bool("solved", &solved); + lisp_object_t* sym = lisp_car(lisp_car(level_cur)); + lisp_object_t* data = lisp_cdr(lisp_car(level_cur)); - for(Levels::iterator i = levels.begin(); i != levels.end(); ++i) + if (strcmp(lisp_symbol(sym), "level") == 0) { - if (name == i->name) - i->solved = solved; + 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) + { + if (name == i->name) + i->solved = solved; + } } level_cur = lisp_cdr(level_cur);