X-Git-Url: https://git.verplant.org/?a=blobdiff_plain;f=src%2Fworldmap%2Fworldmap.hpp;h=87c83a9385fbb5914748c8b5a6a9746aac243946;hb=5667d7e94d85f968ab914bc457edd689fc907253;hp=e8f651aed3c516736578573b15238c831c7b5723;hpb=52de79ad8301a395a5a2999ecbdf31731c0b65f8;p=supertux.git diff --git a/src/worldmap/worldmap.hpp b/src/worldmap/worldmap.hpp index e8f651aed..87c83a938 100644 --- a/src/worldmap/worldmap.hpp +++ b/src/worldmap/worldmap.hpp @@ -24,7 +24,6 @@ #include #include "math/vector.hpp" -#include "video/screen.hpp" #include "lisp/lisp.hpp" #include "control/controller.hpp" #include "statistics.hpp" @@ -34,10 +33,14 @@ #include "game_object.hpp" #include "console.hpp" #include "../level.hpp" +#include "worldmap/special_tile.hpp" +#include "worldmap/sprite_change.hpp" +#include "worldmap/teleporter.hpp" +#include "worldmap/spawn_point.hpp" +#include "worldmap/direction.hpp" class Sprite; class Menu; -class SpawnPoint; class GameObject; class TileMap; @@ -57,20 +60,24 @@ enum { WEST_EAST_WAY }; -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); /** - * Screen that displays a worldmap + * Screen that runs a WorldMap, which lets the player choose a Level. */ class WorldMap : public Screen { + static Color level_title_color; + static Color message_color; + static Color teleporter_message_color; private: Tux* tux; + TileSet *tileset; + bool free_tileset; + static WorldMap* current_; std::auto_ptr worldmap_menu; @@ -79,13 +86,12 @@ private: std::string name; std::string music; + std::string init_script; typedef std::vector GameObjects; GameObjects game_objects; - TileMap* solids; - - std::auto_ptr tile_manager; - + std::list solid_tilemaps; + public: /** Variables to deal with the passive map messages */ Timer passive_message_timer; @@ -103,19 +109,37 @@ private: SpriteChanges sprite_changes; typedef std::vector SpawnPoints; SpawnPoints spawn_points; + std::vector teleporters; Statistics total_stats; + HSQOBJECT worldmap_table; + typedef std::vector ScriptList; + ScriptList scripts; + + Color ambient_light; + std::string force_spawnpoint; /**< if set, spawnpoint will be forced to this value */ + + bool in_level; + + /* variables to track panning to a spawn point */ + Vector pan_pos; + bool panning; + public: - WorldMap(const std::string& filename); + WorldMap(const std::string& filename, const std::string& force_spawnpoint = ""); ~WorldMap(); void add_object(GameObject* object); + + void try_expose(GameObject* object); + void try_unexpose(GameObject* object); static WorldMap* current() { return current_; } virtual void setup(); + virtual void leave(); /** Update worldmap state */ virtual void update(float delta); @@ -123,7 +147,18 @@ public: virtual void draw(DrawingContext& context); Vector get_next_tile(Vector pos, Direction direction); - const Tile* at(Vector pos); + + /** + * gets a bitfield of Tile::WORLDMAP_NORTH | Tile::WORLDMAP_WEST | ... values, + * which indicates the directions Tux can move to when at the given position. + */ + int available_directions_at(Vector pos); + + /** + * returns a bitfield representing the union of all Tile::WORLDMAP_XXX values + * of all solid tiles at the given position + */ + int tile_data_at(Vector pos); size_t level_count(); size_t solved_level_count(); @@ -134,9 +169,13 @@ public: */ void finished_level(Level* level); + /** returns current Tux incarnation */ + Tux* get_tux() { return tux; } + LevelTile* at_level(); SpecialTile* at_special_tile(); SpriteChange* at_sprite_change(const Vector& pos); + Teleporter* at_teleporter(const Vector& pos); /** Check if it is possible to walk from \a pos into \a direction, if possible, write the new position to \a new_pos */ @@ -154,16 +193,44 @@ public: const std::string& get_title() const { return name; } - + + /** + * runs a script in the context of the worldmap (and keeps a reference to + * the script (so the script gets destroyed when the worldmap is destroyed) + */ + HSQUIRRELVM run_script(std::istream& in, const std::string& sourcename); + + /** + * switch to another worldmap. + * filename is relative to data root path + */ + void change(const std::string& filename, const std::string& force_spawnpoint=""); + + /** + * moves Tux to the given spawnpoint + */ + void move_to_spawnpoint(const std::string& spawnpoint, bool pan =false); + + /** + * returns the width (in tiles) of a worldmap + */ + float get_width() const; + + /** + * returns the height (in tiles) of a worldmap + */ + float get_height() const; + private: void get_level_title(LevelTile& level); void draw_status(DrawingContext& context); void calculate_total_stats(); - void load(const std::string& filename); + void load(const std::string& filename); void on_escape_press(); - void parse_special_tile(const lisp::Lisp* lisp); - void parse_sprite_change(const lisp::Lisp* lisp); + + Vector get_camera_pos_for_tux(); + void clamp_camera_position(Vector& c); }; } // namespace WorldMapNS