X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.h;h=f44ba506064c68736cfd0c97da02bd06a50adbd0;hb=546364c9567ef212ea9276201facf73f5ada696a;hp=5113c74a3147e21bb445a9260895d8f51a67c073;hpb=7aa8d548d147972a10dc88600abc1ebefb6d8687;p=supertux.git diff --git a/src/worldmap.h b/src/worldmap.h index 5113c74a3..f44ba5060 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -23,19 +23,40 @@ #include #include -#include "vector.h" -#include "musicref.h" -#include "screen/screen.h" +#include "math/vector.h" +#include "audio/musicref.h" +#include "video/screen.h" +#include "statistics.h" +#include "special/timer.h" + +extern Menu* worldmap_menu; namespace WorldMapNS { +enum WorldMapMenuIDs { + MNID_RETURNWORLDMAP, + MNID_QUITWORLDMAP + }; + +// For one way tiles +enum { + BOTH_WAYS, + NORTH_SOUTH_WAY, + SOUTH_NORTH_WAY, + EAST_WEST_WAY, + WEST_EAST_WAY + }; + class Tile { public: Tile(); ~Tile(); - - Surface* sprite; + + void draw(DrawingContext& context, Vector pos); + + std::vector images; + int anim_speed; // Directions in which Tux is allowed to walk from this tile bool north; @@ -43,6 +64,9 @@ public: bool south; bool west; + /** One way tile */ + int one_way; + /** Stop on this tile or walk over it? */ bool stop; @@ -98,7 +122,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(); @@ -114,9 +138,10 @@ private: bool quit; - Surface* level_sprite; Surface* leveldot_green; Surface* leveldot_red; + Surface* messagedot; + Surface* teleporterdot; std::string name; std::string music; @@ -131,14 +156,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 */ @@ -148,18 +199,15 @@ 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 goto_worldmap; + std::string next_worldmap; /** Quit the worldmap */ bool quit_worldmap; + /** If false, disables the auto walking after finishing a level */ + bool auto_path; + // Directions which are walkable from this level bool north; bool east; @@ -167,15 +215,21 @@ public: bool west; }; + /** Variables to deal with the passive map messages */ + Timer passive_message_timer; + std::string passive_message; + private: std::string map_filename; + typedef std::vector SpecialTiles; + SpecialTiles special_tiles; + typedef std::vector Levels; Levels levels; MusicRef song; - Direction input_direction; bool enter_level; Vector offset; @@ -184,6 +238,14 @@ private: 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(); + + Timer frame_timer; + public: WorldMap(); ~WorldMap(); @@ -203,7 +265,9 @@ public: Vector get_next_tile(Vector pos, Direction direction); 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 */ @@ -211,7 +275,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); @@ -225,6 +290,9 @@ 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(); };