X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap.h;h=4bf2b69ceb96071c1a84e5dd312df9fd47d86ef7;hb=6f801c22d97251799740317fb1d0caf2e744b321;hp=2f97619f6c82ce5e645527af90bdd3da51d6afb5;hpb=81d9d93bbc51d890f18cc8255e51d516d571e49a;p=supertux.git diff --git a/src/worldmap.h b/src/worldmap.h index 2f97619f6..4bf2b69ce 100644 --- a/src/worldmap.h +++ b/src/worldmap.h @@ -16,35 +16,50 @@ // 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 HEADER_WORLDMAP_HXX -#define HEADER_WORLDMAP_HXX +#ifndef SUPERTUX_WORLDMAP_H +#define SUPERTUX_WORLDMAP_H #include #include -namespace WorldMapNS { +#include "math/vector.h" +#include "audio/musicref.h" +#include "video/screen.h" +#include "statistics.h" +#include "timer.h" -struct Point -{ - Point() : x(0), y(0) {} +namespace SuperTux { + class Menu; +} - Point(int x_, int y_) - : x(x_), y(y_) {} +extern Menu* worldmap_menu; - int x; - int y; -}; +namespace WorldMapNS { -struct Pointf -{ - float x; - float y; -}; +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 + }; -struct Tile +class Tile { - texture_type sprite; +public: + Tile(); + ~Tile(); + + void draw(DrawingContext& context, Vector pos); + + std::vector images; + float anim_fps; // Directions in which Tux is allowed to walk from this tile bool north; @@ -52,8 +67,15 @@ struct Tile bool south; bool west; + /** One way tile */ + int one_way; + /** 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 @@ -61,38 +83,170 @@ class TileManager private: typedef std::vector Tiles; Tiles tiles; - static TileManager* instance_ ; - TileManager(); public: - static TileManager* instance() { return instance_ ? instance_ : instance_ = new TileManager(); } + TileManager(); + ~TileManager(); - void load(); Tile* get(int i); }; +enum Direction { D_NONE, D_WEST, D_EAST, D_NORTH, D_SOUTH }; + +std::string direction_to_string(Direction d); +Direction string_to_direction(const std::string& d); +Direction reverse_dir(Direction d); + +class WorldMap; + +class Tux +{ +public: + Direction back_direction; +private: + WorldMap* worldmap; + Surface* largetux_sprite; + Surface* firetux_sprite; + Surface* smalltux_sprite; + + Direction input_direction; + Direction direction; + Vector tile_pos; + /** Length by which tux is away from its current tile, length is in + input_direction direction */ + float offset; + bool moving; + + void stop(); +public: + Tux(WorldMap* worldmap_); + ~Tux(); + + void draw(DrawingContext& context, const Vector& offset); + void action(float elapsed_time); + + void set_direction(Direction dir); + + bool is_moving() const { return moving; } + Vector get_pos(); + Vector get_tile_pos() const { return tile_pos; } + void set_tile_pos(Vector p) { tile_pos = p; } +}; + /** */ class WorldMap { private: - texture_type tux_sprite; + Tux* tux; + bool quit; + + Surface* leveldot_green; + Surface* leveldot_red; + Surface* messagedot; + Surface* teleporterdot; + + std::string name; + std::string music; + std::vector tilemap; int width; int height; + + int start_x; + int start_y; - enum Direction { NONE, WEST, EAST, NORTH, SOUTH }; - Direction tux_direction; - Point tux_tile_pos; - /** Length by which tux is away from its current tile, length is in - input_direction direction */ - float tux_offset; - bool tux_moving; + 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 + { + 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 */ + bool vertical_flip; + + /** Filename of the extro text to show once the level is + successfully completed */ + std::string extro_filename; + + /** Go to this world */ + 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; + bool south; + bool west; + }; + + /** Variables to deal with the passive map messages */ + Timer2 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; - Tile* at(Point pos); + Vector offset; + std::string savegame_file; + + 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(); @@ -105,18 +259,49 @@ public: void get_input(); /** Update Tux position */ - void update(); + void update(float delta); /** Draw one frame */ - void draw(); + void draw(DrawingContext& context, const Vector& offset); + + 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 */ + bool path_ok(Direction direction, Vector pos, Vector* new_pos); + + /* Save map to slot */ + void savegame(const std::string& filename); + /* 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); + + const std::string& get_world_title() const + { return name; } + + const int& get_start_x() const + { return start_x; } + + const int& get_start_y() const + { return start_y; } + + void set_map_filename(std::string filename) + { map_filename = filename; } + +private: + void on_escape_press(); }; } // namespace WorldMapNS -void worldmap_run(); - #endif /* Local Variables: */ /* mode:c++ */ -/* End */ +/* End: */