X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;ds=sidebyside;f=src%2Fworldmap.h;h=5899f8c14f0bf962045f77287c1e42bd6380c533;hb=c0093d25093395cb62fc2526ab42be65a9f015b8;hp=72c793792750b6a711de36c7419e129048f1a105;hpb=ca9da109c06b5d4a4f8c9c2087b7f317e746be42;p=supertux.git diff --git a/src/worldmap.h b/src/worldmap.h index 72c793792..5899f8c14 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -16,7 +16,6 @@ // You should have received a copy of the GNU General Public License // along with this program; if not, write to the Free Software // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - #ifndef SUPERTUX_WORLDMAP_H #define SUPERTUX_WORLDMAP_H @@ -26,7 +25,14 @@ #include "math/vector.h" #include "audio/musicref.h" #include "video/screen.h" - +#include "lisp/lisp.h" +#include "control/controller.h" +#include "statistics.h" +#include "timer.h" +#include "tile_manager.h" + +class Sprite; +class Menu; extern Menu* worldmap_menu; namespace WorldMapNS { @@ -34,41 +40,15 @@ namespace WorldMapNS { enum WorldMapMenuIDs { MNID_RETURNWORLDMAP, MNID_QUITWORLDMAP - }; - -class Tile -{ -public: - Tile(); - ~Tile(); - - Surface* sprite; - - // Directions in which Tux is allowed to walk from this tile - bool north; - bool east; - bool south; - bool west; - - /** Stop on this tile or walk over it? */ - bool stop; - - /** When set automatically turn directions when walked over such a - tile (ie. walk smoothly a curve) */ - bool auto_walk; }; -class TileManager -{ -private: - typedef std::vector Tiles; - Tiles tiles; - -public: - TileManager(); - ~TileManager(); - - Tile* get(int i); +// For one way tiles +enum { + BOTH_WAYS, + NORTH_SOUTH_WAY, + SOUTH_NORTH_WAY, + EAST_WEST_WAY, + WEST_EAST_WAY }; enum Direction { D_NONE, D_WEST, D_EAST, D_NORTH, D_SOUTH }; @@ -85,9 +65,8 @@ public: Direction back_direction; private: WorldMap* worldmap; - Surface* largetux_sprite; - Surface* firetux_sprite; - Surface* smalltux_sprite; + Sprite* tux_sprite; + Controller* controller; Direction input_direction; Direction direction; @@ -102,10 +81,10 @@ public: Tux(WorldMap* worldmap_); ~Tux(); - void draw(DrawingContext& context, const Vector& offset); + void draw(DrawingContext& context); 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(); @@ -121,9 +100,10 @@ private: bool quit; - Surface* level_sprite; Surface* leveldot_green; Surface* leveldot_red; + Surface* messagedot; + Surface* teleporterdot; std::string name; std::string music; @@ -138,14 +118,40 @@ private: TileManager* tile_manager; public: + struct SpecialTile + { + Vector pos; + + /** Optional flags: */ + + /** Position to swap to player */ + Vector teleport_dest; + + /** Message to show in the Map */ + std::string map_message; + bool passive_message; + + /** Hide special tile */ + bool invisible; + + /** Only applies actions (ie. passive messages) when going to that direction */ + bool apply_action_north; + bool apply_action_east; + bool apply_action_south; + bool apply_action_west; + }; + struct Level { - int x; - int y; + Vector pos; + std::string name; std::string title; bool solved; + /** Statistics for level tiles */ + Statistics statistics; + /** Optional flags: */ /** Check if this level should be vertically flipped */ @@ -155,12 +161,6 @@ public: successfully completed */ std::string extro_filename; - /** Position to swap player */ - int swap_x, swap_y; - - /** Message to show in the Map */ - std::string display_map_message; - /** Go to this world */ std::string next_worldmap; @@ -177,23 +177,37 @@ public: bool west; }; + /** Variables to deal with the passive map messages */ + Timer2 passive_message_timer; + std::string passive_message; + private: std::string map_filename; + std::string levels_path; + + typedef std::vector SpecialTiles; + SpecialTiles special_tiles; typedef std::vector Levels; Levels levels; MusicRef song; - Direction input_direction; - bool enter_level; - Vector offset; std::string savegame_file; + + std::string intro_filename; + bool intro_displayed; void get_level_title(Level& level); void draw_status(DrawingContext& context); + + // to avoid calculating total stats all the time. This way only + // when need, it is calculated. + Statistics total_stats; + void calculate_total_stats(); + public: WorldMap(); ~WorldMap(); @@ -209,11 +223,13 @@ public: void update(float delta); /** Draw one frame */ - void draw(DrawingContext& context, const Vector& offset); + void draw(DrawingContext& context); Vector get_next_tile(Vector pos, Direction direction); - Tile* at(Vector pos); + const Tile* at(Vector pos); + WorldMap::Level* at_level(); + WorldMap::SpecialTile* at_special_tile(); /** Check if it is possible to walk from \a pos into \a direction, if possible, write the new position to \a new_pos */ @@ -221,7 +237,8 @@ public: /* Save map to slot */ void savegame(const std::string& filename); - /* Load map from slot */ + /* Load map from slot + You should call set_map_filename() before this */ void loadgame(const std::string& filename); /* Load map directly from file */ void loadmap(const std::string& filename); @@ -235,8 +252,12 @@ public: const int& get_start_y() const { return start_y; } + void set_map_filename(std::string filename) + { map_filename = filename; } + private: void on_escape_press(); + void parse_special_tiles(const lisp::Lisp* lisp); }; } // namespace WorldMapNS