From: Ricardo Cruz Date: Wed, 28 Jul 2004 10:47:49 +0000 (+0000) Subject: Changes in worldmap: X-Git-Url: https://git.verplant.org/?a=commitdiff_plain;h=d81a522523e4b2da55ffd446eb936090e24a3b9c;p=supertux.git Changes in worldmap: - Fixed bugs created by myself due to the Level SpecialTile replacement variable names. - Changed movement code a bit - could use a deeper look. Now possible to change direction during movement. Also movement stops when the Menu is called. Saving (and loading?) doesn't seem to work. Not sure who faults it is, but I prefer to blaim the new library path code. :) SVN-Revision: 1649 --- diff --git a/src/worldmap.cpp b/src/worldmap.cpp index 5401090d7..747aa7d91 100644 --- a/src/worldmap.cpp +++ b/src/worldmap.cpp @@ -247,10 +247,17 @@ Tux::stop() { offset = 0; direction = D_NONE; + input_direction = D_NONE; moving = false; } void +Tux::set_direction(Direction dir) +{ +input_direction = dir; +} + +void Tux::action(float delta) { if (!moving) @@ -271,7 +278,6 @@ Tux::action(float delta) } 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); @@ -294,43 +300,65 @@ Tux::action(float delta) } else { - if (worldmap->at(tile_pos)->auto_walk) + if (worldmap->at(tile_pos)->auto_walk || direction != input_direction) { // Turn to a new direction Tile* tile = worldmap->at(tile_pos); - Direction dir = D_NONE; - - if (tile->north && back_direction != D_NORTH) - dir = D_NORTH; - else if (tile->south && back_direction != D_SOUTH) - dir = D_SOUTH; - else if (tile->east && back_direction != D_EAST) - dir = D_EAST; - else if (tile->west && back_direction != D_WEST) - dir = D_WEST; - - if (dir != D_NONE) - { - direction = dir; + + if(direction != input_direction && + ((tile->north && input_direction == D_NORTH) || + (tile->south && input_direction == D_SOUTH) || + (tile->east && input_direction == D_EAST) || + (tile->west && input_direction == D_WEST))) + { // player has changed direction during auto-movement + direction = input_direction; + back_direction = reverse_dir(direction); + } + else if(direction != input_direction) + { // player has changed to impossible tile back_direction = reverse_dir(direction); + stop(); } else { + Direction dir = D_NONE; + + if (tile->north && back_direction != D_NORTH) + dir = D_NORTH; + else if (tile->south && back_direction != D_SOUTH) + dir = D_SOUTH; + else if (tile->east && back_direction != D_EAST) + dir = D_EAST; + else if (tile->west && back_direction != D_WEST) + dir = D_WEST; + + if (dir != D_NONE) + { + direction = dir; + input_direction = direction; + back_direction = reverse_dir(direction); + } + else + { // Should never be reached if tiledata is good stop(); return; + } } - } + } // Walk automatically to the next tile - Vector next_tile; - if (worldmap->path_ok(direction, tile_pos, &next_tile)) + if(direction != D_NONE) { + Vector next_tile; + if (worldmap->path_ok(direction, tile_pos, &next_tile)) + { tile_pos = next_tile; - } - else - { + } + else + { puts("Tilemap data is buggy"); stop(); + } } } } @@ -364,7 +392,6 @@ WorldMap::WorldMap() leveldot_green = new Surface(datadir + "/images/worldmap/leveldot_green.png", true); leveldot_red = new Surface(datadir + "/images/worldmap/leveldot_red.png", true); - input_direction = D_NONE; enter_level = false; name = ""; @@ -384,9 +411,9 @@ WorldMap::~WorldMap() void WorldMap::load_map() { - lisp_object_t* root_obj = lisp_read_from_file(datadir + "/special_tiles/worldmap/" + map_filename); + lisp_object_t* root_obj = lisp_read_from_file(datadir + "/levels/worldmap/" + map_filename); if (!root_obj) - Termination::abort("Couldn't load file", datadir + "/special_tiles/worldmap/" + map_filename); + Termination::abort("Couldn't load file", datadir + "/levels/worldmap/" + map_filename); if (strcmp(lisp_symbol(lisp_car(root_obj)), "supertux-worldmap") == 0) { @@ -411,7 +438,8 @@ WorldMap::load_map() reader.read_int("start_pos_x", start_x); reader.read_int("start_pos_y", start_y); } - else if (strcmp(lisp_symbol(lisp_car(element)), "special_tiles") == 0) + else if (strcmp(lisp_symbol(lisp_car(element)), "special-tiles") == 0 || + strcmp(lisp_symbol(lisp_car(element)), "levels") == 0) { lisp_object_t* cur = lisp_cdr(element); @@ -494,7 +522,7 @@ void WorldMap::get_level_title(SpecialTile& special_tile) /** get special_tile's title */ special_tile.title = ""; - LispReader* reader = LispReader::load(datadir + "/special_tiles/" + special_tile.level_name, "supertux-special_tile"); + LispReader* reader = LispReader::load(datadir + "/levels/" + special_tile.level_name, "supertux-level"); if(!reader) { std::cerr << "Error: Could not open special_tile file. Ignoring...\n"; @@ -510,7 +538,10 @@ WorldMap::on_escape_press() { // Show or hide the menu if(!Menu::current()) + { Menu::set_current(worldmap_menu); + tux->set_direction(D_NONE); // stop tux movement when menu is called + } else Menu::set_current(0); } @@ -519,7 +550,6 @@ void WorldMap::get_input() { enter_level = false; - input_direction = D_NONE; SDL_Event event; while (SDL_PollEvent(&event)) @@ -546,6 +576,20 @@ WorldMap::get_input() case SDLK_RETURN: enter_level = true; break; + + case SDLK_LEFT: + tux->set_direction(D_WEST); + break; + case SDLK_RIGHT: + tux->set_direction(D_EAST); + break; + case SDLK_UP: + tux->set_direction(D_NORTH); + break; + case SDLK_DOWN: + tux->set_direction(D_SOUTH); + break; + default: break; } @@ -555,16 +599,16 @@ WorldMap::get_input() if (event.jaxis.axis == joystick_keymap.x_axis) { if (event.jaxis.value < -joystick_keymap.dead_zone) - input_direction = D_WEST; + tux->set_direction(D_WEST); else if (event.jaxis.value > joystick_keymap.dead_zone) - input_direction = D_EAST; + tux->set_direction(D_EAST); } else if (event.jaxis.axis == joystick_keymap.y_axis) { if (event.jaxis.value > joystick_keymap.dead_zone) - input_direction = D_SOUTH; + tux->set_direction(D_SOUTH); else if (event.jaxis.value < -joystick_keymap.dead_zone) - input_direction = D_NORTH; + tux->set_direction(D_NORTH); } break; @@ -580,20 +624,6 @@ WorldMap::get_input() } } } - - if (!Menu::current()) - { - Uint8 *keystate = SDL_GetKeyState(NULL); - - if (keystate[SDLK_LEFT]) - input_direction = D_WEST; - else if (keystate[SDLK_RIGHT]) - input_direction = D_EAST; - else if (keystate[SDLK_UP]) - input_direction = D_NORTH; - else if (keystate[SDLK_DOWN]) - input_direction = D_SOUTH; - } } Vector @@ -678,7 +708,7 @@ WorldMap::update(float delta) // do a shriking fade to the special_tile shrink_fade(Vector((special_tile->x*32 + 16 + offset.x),(special_tile->y*32 + 16 + offset.y)), 500); - GameSession session(datadir + "/special_tiles/" + special_tile->level_name, + GameSession session(datadir + "/levels/" + special_tile->level_name, ST_GL_LOAD_LEVEL_FILE, special_tile->vertical_flip); switch (session.run()) @@ -805,7 +835,7 @@ WorldMap::update(float delta) else { tux->action(delta); - tux->set_direction(input_direction); +// tux->set_direction(input_direction); } Menu* menu = Menu::current(); @@ -1032,13 +1062,13 @@ WorldMap::savegame(const std::string& filename) << " (tux (x " << tux->get_tile_pos().x << ") (y " << tux->get_tile_pos().y << ")\n" << " (back \"" << direction_to_string(tux->back_direction) << "\")\n" << " (bonus \"" << bonus_to_string(player_status.bonus) << "\"))\n" - << " (special_tiles\n"; + << " (levels\n"; for(SpecialTiles::iterator i = special_tiles.begin(); i != special_tiles.end(); ++i) { if (i->solved && !i->level_name.empty()) { - out << " (special_tile (name \"" << i->level_name << "\")\n" + out << " (level (name \"" << i->level_name << "\")\n" << " (solved #t))\n"; } } @@ -1109,14 +1139,14 @@ WorldMap::loadgame(const std::string& filename) } lisp_object_t* level_cur = 0; - if (reader.read_lisp("special_tiles", level_cur)) + if (reader.read_lisp("levels", level_cur)) { while(level_cur) { lisp_object_t* sym = lisp_car(lisp_car(level_cur)); lisp_object_t* data = lisp_cdr(lisp_car(level_cur)); - if (strcmp(lisp_symbol(sym), "special_tile") == 0) + if (strcmp(lisp_symbol(sym), "level") == 0) { std::string name; bool solved = false; diff --git a/src/worldmap.h b/src/worldmap.h index 37b4133d0..3e03400ef 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -105,7 +105,7 @@ public: void draw(DrawingContext& context, const Vector& offset); void action(float elapsed_time); - void set_direction(Direction d) { input_direction = d; } + void set_direction(Direction dir); bool is_moving() const { return moving; } Vector get_pos(); @@ -185,7 +185,6 @@ private: MusicRef song; - Direction input_direction; bool enter_level; Vector offset;